定义
ngnix是一个高性能的Web服务器和反向代理服务器,可用于HTTP、HTTPS、POP3、SMTP、IMAP协议。它不仅可以实现负载均衡,还可以做接口限流、缓存功能。
优点(特点)
- 配置简单,容易上手。
- 跨平台:可在大多数 Unix like OS编译运行,也有Windows的移植版本。
- 非阻塞,高并发链接:由于使用epoll和kqueue网路I/O模型,数据复制时,磁盘I/O的第一阶段是非阻塞的,官方测试能支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。
- master/worker工作模式:一个master进程,多个worker进程。
- 事件驱动:通信机制采用epoll模型,支持更大的并发连接。
- 内存消耗低:处理大并发的请求内存消耗非常小。在3万并发连接下,开启10个nginx 进程只消耗150M内存(15M*10=150M)。
- 内置健康检查功能:负载均衡中其中一个服务器宕机,会做健康检查,之后的请求不会发送到宕机的服务器上,而是提交到其他的节点上。
- 节省带宽:支持GZIP压缩(gzip on),可以添加浏览器缓存本地的header头,提高响应客户端的速度。
- 支持热部署(平滑升级):可在不打断用户请求的情况下更新版本。
- 异步接收用户请求:ngnix服务器将浏览器请求全部接收下来再一次性发送给后端Web服务器,减轻Web服务器压力。
- 稳定性高:用于反向代理,宕机的概率极低。
- 网络依赖性较低:只要ping通就可以负载均衡而且可以有效区分内网和外网流量。
配置文件结构
nginx.conf
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
-
全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
user test #配置用户或组 worker_processes 10; #允许生成进程数,默认为1 worker_rlimit_nofile 65535; #worker进程最大打开文件数 daemon off; #非守护进程 error_log logs/error.log debug; #日志路径,可在全局块,http块,server块, #debug|info|notice|warn|error|crit|alert|emerg pid logs/nginx.pid; #ngnix进程运行文件存放地址
-
events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网络连接,开启多个网络连接序列化等。
events { accept_mutex on; #设置网络连接序列化,默认为on multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off use epoll; #事件驱动模型 select|poll|kqueue|epoll|resig|/dev/poll|eventport worker_connections 51200; #最大连接数,默认为512 }
-
http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
-
server块:配置虚拟主机的相关参数,一个http中可以有多个server。
-
location块:配置请求的路由,以及各种页面的处理情况。
http { include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型,默认为text/plain access_log off; #取消服务日志 log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式 access_log log/access.log myFormat; #combined为日志格式的默认值 sendfile on; #允许sendfile方式传输文件,可以在http块,server块,location块,默认为off。 sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。 keepalive_timeout 65; #连接超时时间,可以在http,server,location块,默认为75s。 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 } } }
功能
-
静态http服务器
nginx是一个http服务器,可以将服务器上的静态文件(如HTML、图片)通过http协议展现给客户端。server { listen80; # 端口号 location / { root /usr/share/nginx/html; # 静态文件路径 } }
-
反向代理服务器
客户端本来可以直接通过http协议访问某网站应用服务器,网站管理员在中间加上一个nginx服务器,客户端请求nginx,nginx请求应用服务器,然后将结果返回给客户端,此时nginx就是反向代理服务器。负载均衡、虚拟主机等,都基于反向代理实现。 (正向代理代理的是客户端,反向代理代理的是服务器)
nginx在做反向代理时,提供性能稳定并且配置灵活的转发功能。可以根据不同的正则匹配,采取不同的转发策略;可对返回结果进行错误页跳转,异常判断;如果被分发服务器存在异常,可以将请求重新转发给另一台服务器并自动去除异常服务器。
-
负载均衡
ngnix可以通过反向代理来实现负载均衡。
当网站访问量过大时,一台服务器已经无法处理请求,于是将同一应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。这时客户端发送的、ngnix反向代理服务器接收到的请求数量,就是负载量,请求数量按一定的规则分发到不同服务器的规则,就是均衡规则。所以将服务器接收到的请求按规则分发的过程,称为负载均衡。
带来的好处是,一台服务器挂了,只要还有其他服务器正常运行,就不会影响用户使用。
常见的负载均衡策略:
-
热备:如果有两台服务器,当第一台服务器发生故障时,才使用第二台服务器。
服务器处理请求的顺序:AAAAAAAA突然挂了BBBBBBB…
upstream mysvr { server 192.168.20.1:8080; #应用服务器A server 192.168.20.2:8080 backup; #应用服务器B 热备 }
-
轮询:将请求按顺序轮流分配到后端服务器上,不关心服务器实际的连接数和当前的系统负载。
服务器处理请求的顺序:ABABABAB…
upstream myapp { server 192.168.20.1:8080; #应用服务器A server 192.168.20.2:8080; #应用服务器B }
-
加权轮询:不同的后端服务器机器配置和当前系统负载可能并不相同,因此抗压能力也不相同。给配置高、负载低的机器分配较高的权重,让其处理更多请求;而配置低、负载高的机器分配较低的权重,降低其系统负载。将请求顺序且按照权重分配到后端服务器。
服务器处理请求的顺序:ABBCCCABBCCC…
upstream myapp { server 192.168.20.1:8080 weight=1; #应用服务器A,处理1/6请求 (weight默认为1) server 192.168.20.2:8080 weight=2; #应用服务器B,处理1/3请求 server 192.168.20.3:8080 weight=3; #应用服务器C,处理1/2请求 }
-
源地址哈希法(ip hash):对客户端ip地址进行哈希计算得到一个数,用该数对服务器列表大小取模,得到该客户端要访问服务器的序号。在后端服务器列表不变时,同一个客户端ip的请求将被分发到同一台服务器进行处理,有效解决session不共享的问题。
upstream myapp { ip_hash; #根据客户端ip地址hash值将请求分配给固定的一个服务器处理 server 192.168.20.1:8080; server 192.168.20.2:8080; }
-
随机法:通过系统的随机算法,根据后端服务器大小随机选取一台服务器进行处理。
-
加权随机法:与加权轮询法类似,对不同机器分配不同权重。不同的是,它按权重随机请求后端服务器而不会顺序访问。
-
虚拟主机
有的网站由于访问量太小,为节省成本,将多个站点部署在同一台服务器上。
在服务器8080和8081分别开了一个应用,客户端通过不同的域名访问,根据server_name可以反向代理到对应的应用服务器。虚拟主机是通过http请求头中的host是否匹配server_name来实现的。
server { listen 80 default_server; server_name _; return 444; # 过滤其他域名的请求,返回444状态码 } server { listen 80; server_name a.com; location / { proxy_pass http://localhost:8080; # 对应端口号8080 } } server { listen 80; server_name b.com; location / { proxy_pass http://localhost:8081; # 对应端口号8081 } }
-
浏览器缓存
nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。配合着第三方的ngx_cache_purge,对指定的URL缓存内容进行增删管理。