一、Nginx 功能的介绍
1.1 Nginx 的URL重写应用
常用的URL重写模块命令有if 、rewrite 、set 、breake 等。
1.1.1 if 命令
语法:if(condition){…}
默认值:none
使用字段:server 、location
正则表达式:
- ~表示区分大小写匹配; 不匹配 : ! ~
2) ~* 表示不区分大小写匹配 ;不匹配 !~*
3) -f 和!-f 判断是否存在文件
4) -d 和!-d 判断是否存在目录
5)-e 和!-e 判断是否存在文件或目录
6)-x 和 !-e 判断文件是否可执行
nginx 配置文件中有很多内置变量:
$remote_port :表示客户端端口;
$remote_addr :表示客户端IP地址;
$remote_user :表示用户名,由ngx_http_auth_basic_module认证
$request_filename :表示当前请求的文件的路径名,由root或alias与URL request 组合。
$server_name :表示请求到达的服务器的端口号。
等等。。。
1.1.2 rewrite 命令
语法: rewrite regex flag
默认值:none
使用字段:server 、location 、 if
——flag 标记:
last 和 break 用来实现URL重写,浏览器地址栏中的URL地址不变。
last :表示完成rewrite 之后搜索相应的URI或location。
break :表示终止匹配,不再匹配后面的规则;
redirect :将返回302临时重定向,在浏览器地址栏显示跳转后的URL地址;
permanent :将返回301永久重定向,在浏览器地址栏会显示跳转后的URL地址;
1.1.3 set 命令
set命令可以设置一个变量并赋值,其值可以是文本、变量或它们组合。
语法 :set variable value
默认值 :none
使用字段 :server location if
1.1.4 break 命令
表示完成当前的设置的规则后,不再匹配后面的重写规则。
语法 :break
默认值 :none
使用字段 :server \location \if
二 、Nginx 作为Web 缓存服务器
下载ngx_cache_purge模块:http://labs.frickle.com/nginx_ngx_cache_purge/,该模块是用来清理nginx 缓存的一个插件,nginx自身带的缓存模块,通过proxy_cache命令来实现数据的缓存。
#tar -zxvf ngx_cache_purge-2.3.tar.gz -C /usr/local/webserver/nginx/
#cd /usr/local/src/nginx-1.12.2/
#./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --add-module=/usr/local/webserver/nginx/ngx_cache_purge-2.3 --with-http_stub_status_module --with-http_ssl_module
#make && make install
#nginx -V
#配置nginx.conf ##参考《高性能Linux服务器构建实战》
#nginx -s reload
#]# ps -ef | grep nginx
root 61911 1 0 21:22 ? 00:00:00 nginx: master process nginx
nginx 61915 61911 0 21:22 ? 00:00:00 nginx: worker process
nginx 61916 61911 0 21:22 ? 00:00:00 nginx: cache manager process ##多出一个管理缓存服务和文件的进程
nginx 61917 61911 0 21:22 ? 00:00:00 nginx: cache loader process
三、Nginx 作为负载均衡服务器
Nginx的负载均衡是通过upstream命令实现的,它的负载均衡的机制是基于内容和应用的7层交换负载均衡实现的。Nginx负载均衡默认对后端服务器有健康检测能力,但仅限于端口检测。
http
{
upstream myserver {
server 192.168.2.10:80 weight=1 max_fails=3 fail_timeout=20s;
server 192.168.2.20:80 weight=2 max_fails=3 fail_timeout=20s;
}
}
四 、Nginx 性能优化
4.1 编译安装
- 减小Ngnix编译后的文件大小
在编译nginx时,认以debug模式进行,为了减小文件大小,在编译前取消debug模式。
找到nginx源码文件,找到
]# pwd
/usr/local/src/nginx-1.12.2/auto/cc
#vim gcc ##注销以下两行,即可取消debug模式
171 # debug
172 #CFLAGS="$CFLAGS -g"
4.2 为特定的CPU指定CPU类型编译优化
在安装时,添加以下参数:
–with-cc-opt=’-o3’
–with-cpu-opt=cpu ##为特定的CPU编译
确定CPU类型:
]# cat /proc/cpuinfo | grep “model name”
model name : Intel® Core™ i7-8700 CPU @ 3.20GHz
4.2 第三方插件
1) 利用TCMalloc优化Nginx性能
TCMalloc 是由谷歌开放的开源工具,能够提供服务器在高并发下的性能,从而降低系统负载。要安装TCMalloc库,需要安装libunwind和google-perftools两个软件包。libunwind 库基于64位CPU和操作系统的程序提供了基本函数调用链和函数调用寄存器功能。(这里使用了yum网络源)
]# yum provides libunwind
]# yum -y install libunwind
]# yum -y install gperftools
重新编译:
#cd /usr/local/src/nginx-1.12.2/
#./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --add-module=/usr/local/webserver/nginx/ngx_cache_purge-2.3 --with-http_stub_status_module --with-http_ssl_module --with-google_perftools_module
#make && make install
为google-perftools添加线程目录:
#mkdir /tmp/tcmalloc
#chmod 0777 /tmp/tcmalloc
修改配置文件nginx.conf:
#vim nginx.conf ##在pid行下添加一行:
#pid logs/nginx.pid;
google_perftools_profiles /tmp/tcmalloc;
重新加载配置文件:
#nginx -s reload
#ps -ef | grep tcmalloc
#lsof -n | grep tcmalloc ##验证运行状态
4.3 系统内核参数优化
net.ipv4.tcp_max_tw_buckets = 6000 ###timewait的数量,默认是180000。
net.ipv4.ip_local_port_range = 1024 65000 ##允许系统打开的端口范围。
net.ipv4.tcp_tw_recycle = 1 ##启用timewait快速回收。
net.ipv4.tcp_tw_reuse = 1 ##开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。
net.ipv4.tcp_syncookies = 1 ##开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。
net.core.somaxconn = 262144 ##web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。
net.core.netdev_max_backlog = 262144 ##每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.ipv4.tcp_max_orphans = 262144 ##系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。
net.ipv4.tcp_max_syn_backlog = 262144 ##记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。
net.ipv4.tcp_timestamps = 0 时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种"异常"的数据包。
net.ipv4.tcp_synack_retries = 1 ##为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_syn_retries = 1 ##在内核放弃建立连接之前发送SYN包的数量。
net.ipv4.tcp_fin_timeout = 1 ###如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。该设置会有产生大量的死套接字而内存溢出的风险。
net.ipv4.tcp_keepalive_time = 30 ##当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。