Nginx是一款开源的、跨平台的高性能web服务器,它有着高性能,稳定性高,配置简单,模块结构化,资源消耗低的优点。同时支持反向代理、负载均衡、缓存的功能。其采用多进程+epoll(IO多路复用)模型,也对互联网高并发连接业务有着很好的支持。
- 限流:Nginx的限流模块,是基于漏桶算法实现的,在高并发的场景下非常实用。
- 配置高可用集群(双机热备):当主 Nginx 服务器宕机之后,切换到备份 Nginx 服务器。首先安装 keepalived,然后编辑 /etc/keepalived/keepalived.conf 配置文件,并在配置文件中增加 vrrp_script 定义一个外围检测机制,并在 vrrp_instance 中通过定义 track_script 来追踪脚本执行过程,实现节点转移。
- 静态代理:Nginx擅长处理静态文件,是非常好的图片、文件服务器。把所有的静态资源的放到nginx上,可以使应用动静分离,性能更好。
下图是一个简单nginx架构:
Master进程的作用是?
读取并验证配置文件nginx.conf;管理worker进程;
Worker进程的作用是?
每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;注意Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程。
一、基本命令:
- 启动nginx: nginx
- 以特定目录下的配置文件启动:nginx -c /特定目录/nginx.conf
- 重新加载配置: nginx -s reload 执行这个命令后,master进程会等待worker进程处理完当前请求,然后根据最新配置重新创建新的worker进程,完成Nginx配置的热更新。
- 立即停止服务: nginx -s stop
- 从容停止服务: nginx -s quit 执行该命令后,Nginx在完成当前工作任务后再停止。
- 检查配置文件是否正确 : nginx -t
- 检查特定目录的配置文件是否正确: nginx -t -c /特定目录/nginx.conf
- 查看版本信息: nginx -v
二、配置文件:
main events { ... } http{ server{ location { ... } } }
Nginx默认的配置文件主要有 main、events、http、server、location 五个块组成。其中 http 、server、location 属于嵌套关系。
- main:全局指令。主要控制Nginx子进程所属的用户和用户组、派生子进程数、错误日志位置与级别、pid位置、子进程优先级、进程对应cpu、进程能够打开的文件描述符数目等。
- events:控制nginx处理连接的方式。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- http:nginx处理http请求的主要配置块。
- server:nginx中主机配置块,可用于配置多个虚拟主机。
- location:server中对应目录级别的控制块,可以有多个。
########### 每个指令必须有分号结束。################# #user administrator administrators; #配置用户或者组,默认为nobody nobody。 #worker_processes 2; #允许生成的进程数,默认为1 #pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址 error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg events { accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off #use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport worker_connections 1024; #最大连接数,默认为512 } 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方式传输文件,默认为off,可以在http块,server块,location块。 sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。 keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。 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 } } }
其中location根据不同前缀的使用方式,大致分为普通location和正则location。多个正则location之间会按照先后顺序进行匹配,匹配成功后,就不会继续匹配后面定义的location。多个普通location之间遵循“最大匹配原则”,匹配度最高的location将会被执行,同时也可以利用 =精准匹配和 ^~非正则匹配可以在正则匹配之前优先匹配,禁止执行原有的正则匹配。因此 当多种类型的 location 匹配同时出现时,最终执行结果为“= ”匹配优先于"^~"匹配,“^~”匹配优先于正则匹配,正则匹配优先于普通的最大前缀匹配 只要优先的location 匹配成功,就不会执行其他的location 。
三、nginx路径符号匹配
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
- = 表示精确匹配
- ^~ 表示uri以某个常规字符串开头,大多情况下用来匹配url路径,nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
- ~ 正则匹配(区分大小写)
- ~* 正则匹配(不区分大小写)
- !~ 和 !~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
- / 任何请求都会匹配
四、nginx中server的匹配顺序
在开始处理一个http请求时,nginx会取出header头中的host,与nginx.conf中每个server的server_name进行匹配,以此决定到底由哪一个server块来处理这个请求。
server_name与host匹配优先级如下:
- 完全匹配
- 通配符在前的,如*.test.com
- 在后的,如www.test.*
- 正则匹配,如~^\.www\.test\.com$
如果都不匹配
- 优先选择listen配置项后有default或default_server的
- 找到匹配listen端口的第一个server块
五、其他
负载均衡:Nginx通过反向代理可以实现服务的负载均衡,避免了服务器单节点故障,把请求按照一定的策略转发到不同的服务器上,达到负载的效果。
- 轮询:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
- 加权轮询:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
- ip_hash(源地址哈希法):根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客户端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
- 随机:通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。
- least_conn(最小连接数法):由于后端服务器的配置不尽相同,对于请求的处理有快有慢,最小连接数法根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
rewrite指令
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理。rewrite 四种flag使用介绍:
- redirect;# 临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
- permanent;# 永久重定向,重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301
- last;# 重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用
- break;# 重写完成后停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用