2021年了还不会Nginx???没事,看完包会!(手动狗头)

Nginx

官方文档:http://nginx.org/en/docs/

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器。

反向代理

2021年了还不会Nginx???没事,看完包会!(手动狗头)_第1张图片

  1. 正向代理:正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。
  2. 反向代理:反向代理对用户则是不可知的,比如我们访问百度网站,百度的代理服务器对外的域名为baidu.com。具体内部的服务器节点我们不知道,现实中我们通过访问百度的代理服务器后,代理服务器给我们转发请求到他们N多的服务器节点中的一个给我们进行搜索后将结果返回。Nginx就是一反向代理服务器。

负载均衡

客户端发送多个请求到服务器,服务器随后分发处理请求到不同的服务器。服务器处理完毕后,再将结果返回给客户端。
2021年了还不会Nginx???没事,看完包会!(手动狗头)_第2张图片

策略

  1. 轮询(默认
    每个请求会按时间顺序平均分配到不同的后端服务器。
  2. weight
    权重方式,在轮询策略的基础上指定轮询的几率。与访问的几率呈正比
  3. ip hash
    依据ip分配方式,指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端请求一致发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。
  4. fair
    响应时间方式,按照服务器端的响应时间来分配请求,响应时间短的优先分配。
    必须下载Nginx的upstr_fair模块

配置

在http模块内写入upstream模块,默认的策略时轮询。

upstream backend {
         #轮询
server 192.168.1.101:8888;    
server 192.168.1.102:8888;    
server 192.168.1.103:8888;
}

upstream backend {
         #weight
server 192.168.1.101 weight=1;    
server 192.168.1.102 weight=2;    
server 192.168.1.103 weight=3;
}

upstream backend {
        #ip hash 
ip_hash;    
server 192.168.1.101:7777;    
server 192.168.1.102:8888;    
server 192.168.1.103:9999;
}

upstream backend {
         #fair
server 192.168.1.101;    
server 192.168.1.102;    
server 192.168.1.103;    
fair;
}

其中还有:
down表示目前此server不参与负债均衡
 
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回
proxy_next_upstream 模块定义的错误 

fail_timeout:max_fails次失败后,暂停的时间

backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。
用空格隔开即可

在location模块也要进行配置,具体看下面。

动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析的速度,降低原来单个服务器的压力。
2021年了还不会Nginx???没事,看完包会!(手动狗头)_第3张图片

Nginx下载

首先分别下载:

  1. yum install gcc
  2. yum install gcc-c++
  3. yum install openssl openssl-devel
  4. yum install pcre
  5. yum install zlib
    yum install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel
  6. ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

find / -name nginx.conf 查找 / 目录下 name 为nginx.conf的文件就可以查看nginx的congf文件。

conf配置

Nginx由三块构成:全局块,events块,http块(http全局块,server块)。

全局块

从配置文件开始到events块之间的内容,主要是设置一些影响Nginx服务器整体运行的配置指令。
2021年了还不会Nginx???没事,看完包会!(手动狗头)_第4张图片
user nginx :配置允许运行Nginx的用户组。
worker_processes :允许生成的worker数量,越大处理并发数量也就越多,auto表示自适应。
error_log :错误日志的路径。
pid :pid文件。

events块

events块的指令主要影响Nginx服务器与用户的网络连接
在这里插入图片描述
worker_connections:一个worker支持的最大连接数为1024。

一个请求占用2个或者4个连接数(client和server)。

最大并发数:
若为静态访问 worker_connections * worker_processes /2
若为动态访问 worker_connections * worker_processes /4

http块

http块是Nginx服务器配置中最频繁的部分,代理、缓存、日指定以等绝大多数功能和第三方模块的配置都在这里。包括:http全局块,server块。

http全局块

可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
2021年了还不会Nginx???没事,看完包会!(手动狗头)_第5张图片
sendfile:指定是否使用sendfile系统调用来传输文件。sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝。

keepalive-timeout:连接超时时间xx秒。

log_format main:日志格式:addr地址 user用户名 time时间等等。

access_log:log的存放路径,并按log_format格式。每次访问都会记录。

tcp_nopush:防拥塞。

tcp_nodelay:无延迟。

include:nginx支持那些多媒体类型,mime.types
2021年了还不会Nginx???没事,看完包会!(手动狗头)_第6张图片
default_type:若在mime.types里面没有类型就默认为octet-stream流类型。

server块

server块与虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机完成一样,该技术的产生是为了节省互联网服务器硬件成本。配置虚拟主机的相关参数,一个http中可以有多个server。
2021年了还不会Nginx???没事,看完包会!(手动狗头)_第7张图片
listen:default_server针对于端口,不针对server_name,也就是当有多个不同server_name的server都监听同一端口,但是没有找到匹配的,这时就会默认使用default_server这个server。

listen可以以ip:port的方式,这时就会先寻找ip和port都匹配的server,再从这些server中匹配server_name,同样没找到还是使用default。

default可以手动添加,不添加的话系统默认是第一个server块。

—————————————————————————

server_name:server_name为虚拟服务器的识别路径。不同的域名会通过请求头中的HOST字段,匹配到特定的server块,转发到对应的应用服务器中去。

server_name也支持正则匹配,匹配书顺序:完全匹配-通配符在前-通配符在后-正则匹配-default。

—————————————————————————

location:

= 表示精准匹配
^~ 前缀匹配,以某字符串开头 用来匹配目录
~ 表示区分大小写的正则匹配 开头
~* 表示区分大小写的正则匹配 结尾
/ 和 /xx/yy/zz 都是通用匹配
在这里插入图片描述

精准匹配会被第一个处理,若找到停止搜索。
通用匹配/xx/yy/zz。
前缀匹配,在找的时就停止搜索正则。
正则匹配,按照定义的顺序。
最后交给通用匹配/。
location = 
location ~* \.(gif|jpg|jpeg)$  匹配以gif,jpg,jepg结尾的
location /    因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
location /documents/   匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索,只有后面的正则表达式没有匹配到时,才会采用这一条
location ~ /documents/Abc   匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索,只有后面的正则表达式没有匹配到时,这一条才会采用这一条
location ^~ /images/   匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
用法:1.用 =/ ^~来加载静态资源 2./ 转发动态请求到后端

proxy_pass用于反向代理,前面的负载均衡就需要此语句实现。

upstream mysvr {
              
server 127.0.0.1:7878;      
server 192.168.10.121:3333 backup;  #热备    
}    
error_page 404 https://www.baidu.com; #错误页    
server {
             
keepalive_requests 120; #单连接请求上限次数。        
listen       4545;   #监听端口        
server_name  127.0.0.1;   #监听地址               
location  ~*^.+$ {
      #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。           
#root path;  #根目录           
#index vv.txt;  #设置默认页          
proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表           deny 127.0.0.1;  #拒绝的ip           
allow 172.18.5.54; #允许的ip                  
 } 

Nginx结构

2021年了还不会Nginx???没事,看完包会!(手动狗头)_第8张图片

Nginx工作原理

Nginx是基于Reactor模型,Reactor模式又是基于IO复用模型。
(什么是Reactor?什么是IO复用模型?后面会出Netty基础概念)

master&worker

nginx启动后会有一个master进程和多个worker进程。
在这里插入图片描述
master主要用来管理worker进程,而worker负责实际的处理,相互之间是独立的,一个请求只能在一个worker中处理。
2021年了还不会Nginx???没事,看完包会!(手动狗头)_第9张图片
master在listen后,fork出多个进程,每个worker都会去争抢处理client的connect请求。

这种机制的好处:
这种机制的好处:

  1. 热部署 nginx -s reload:当改变配置时不用将nginx关掉只需要reload,master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程。而在改变之前就开始处理任务的worker不会做出任何改变,在执行完后再重新加载新配置。新的worker就会以新的配置去执行。
  2. 每个worker都是独立的进程,不需要加锁,有一个出错了其他的worker会继续争抢任务,增加了容错性。
  3. 采用了io多路复用机制,每个进程里只有一个主线程,通过异步非阻塞的方式处理请求,这样能极大发挥cpu性能,worker数量最好与cpu核数相等。

你可能感兴趣的:(nginx,java,linux)