1Nginx 服务优化
1.1 隐藏版本号
在生产环境中, 需要隐藏Nginx 的版本号, 以避免泄漏Ngi nx 的版本, 使攻击者不能针对特定版本进行攻击。在隐藏版本号之前, 可以使用Fiddler 工具抓取数据包, 查看Nginx版本, 也可以在CentOS 中使用命令curl -I http :/1192 . 168.0 . 102/查看。
隐藏Nginx 版本号有两种方式, 第一种是修改Ngi nx 的主配置文件, 第二种是修改Nginx源码文件,指定不显示版本号
( 1 ) 修改配置文件方;
将N gi nx 主配置文件中的server_tokens 选项值设置为off,如没有该配置项,加上即可。
(root@www ~]# cd /usr/local/nginx/conf/
(root@www ~]# vim nginx.conf.......//省略内容
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; //关闭版本号
..........//省略内容
若使用了PHP 处理动态网页, 且PHP 配置文件中配置了fastcg i_param SERVER_SOFTWARE 选项, 则编辑ph p-fpm 配置文件, 将fastcgi_param SERVER_SOFTWARE 对应的值修改为fastcgi_param SERVER_ SOFTWARE nginx 。
再次访问网址, 只显示N ginx, 版本号已经隐藏。
( 2 ) 设置版本信息
Nginx 源码文件ng inx-1.1 2 .0/src/core/nginx . h 包含了版本信息, 可以随意设置, 然后重新编译安装, 隐藏版本信息。
[root@localhost nginx-1.12.0]# cat src/core/nginx.h
#define nginx_version 1012000
#define NGINX_VERSION "1.12.0" //修改版本号
#define NGINX_VER "IIS/" NGINX_VERSION //修改服务器类型[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx/ --user=nginx --group=nginx --with-http_stub_status_module && make && make install
[root@localhost nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.confserver_tokens on; //打开版本号
[root@localhost nginx-1.12.0]# systemctl restart nginx
1.2:修改用户和组
Nginx 运行时进程需要有用户与组的支持, 用以实现对网站文件读取时进行访问控制。主进程由root 创建, 子进程由指定的用户与组创建。Nginx 默认使用nobody 用户帐号与组帐号, 一般也要进行修改。修改Nginx 用户与组有两种方法, 一种是在编译安装时指定用户与组, 另一种是修改配置文件指定用户与组。
( 1 ) 指定用户与组的参数
编译Nginx 时指定用户与组, 就是配置Ngi nx 时, 在/configure 后面指定用户与组的参数
[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx/
--user=nginx //指定用户名是nginx
--group=nginx //指定用户组是nginx
--with-http_stub_status_module && make && make install
( 2 ) 配置用户与组
修改Nginx 配置文件nginx .conf 指定用户与组。
[root@www nginx-1 .12.0]#cd /usr/local/nginx/conf/
[root@www conf]# vim nginx.conf
user nginx nginx; //修改用户为nginx ,组为nginx
重启Nginx 服务并查看进程运行情况, 从执行结果中可以得出Nginx 服务的主进程由root 帐户创建, 子进程则由nginx 创建
1.3:配置网页缓存时间
当Nginx 将网页数据返回给客户端后, 可设置缓存时间, 以便在日后进行相同内容的请求时直接返回, 以避免重复请求, 加快访问速度。缓存时间一般针对静态资源进行设置,对动态网页不用设置缓存时间。
( 1 ) 以图片作为缓存对象, 复制logo.jpg 图片到Nginx 的工作目录, 访问http ://192.168. 0.102/logo.jpg , 使用浏览器右键点击“查看元素”->“ 网络'-> “消息头'可以看到响应报文中没有图片的缓存信息
( 2 ) 修改Nginx 的配置文件, 在新locati on 段加入expires 参数, 指定缓存的时间,1d表示一天
[root@www conf]# vi nginx.conf
location ~ \.(gif|jpg|png)$ {
root html;
expires 1d;
}
( 3 ) 重启Nginx 服务后, 利用浏览器可以看到响应报文中含有Expires 参数, 如下图所示。其中的Cah ee-Control :max-age=86400 表示缓存时间是86400 秒, 也就是缓存一天的时间, 一天之内浏览器访问这个页面, 都是用缓存中的数据, 而不需要向Nginx 服务器重新发出请求, 减少了服务器的使用带宽。
1.4:日志切割
Nginx 没有类似Apache 的cronlog 日志分割处理功能, 但是可以通过Nginx 的信号控制功能脚本来实现日志的自动切割, 并将脚本加入到Linux 的计划任务中, 让脚本在每天的固定时间执行, 便可实现日志切割功能。下面是具体操作步骤。
( 1) 编写脚本/opt/fenge .sh , 把Nginx 的日志文件/usr/local/nginx/logs/access. log 移动到目录/var/log/nginx 下面, 以当前时间做为日志文件的名称, 然后用ki ll-USR1 创建新的日志文件/us r/local/nginx/logs/access. log , 最后删除30 天之前的日志文件。
#!/bin/bash
# Filename: fenge.sh
d=$(date -d "-1 day" "+%Y%m%d")
logs_path="/var/log/nginx"
pid_path="/usr/local/nginx/logs/nginx.pid"
[ -d $logs_path ] || mkdir -p $logs_path //创建日志文件目录
mv /usr/local/nginx/logs/access.log ${logs_path}/test.com-access.log-$d
kill -USR1 $(cat $pid_path) //重建新日志文件
find $logs_path -mtime +30 |xargs rm -rf //删除30 天之前的日志文件
( 2 ) 执行/opt/fenge.sh ,测试日志文件是否被切割。
[root@www logs]#chmod +x /o ptlfenge.sh II添加权限
[root@www logs]# /optlfenge.sh II执行分割脚本
[root@www~]#Is /var/log/nginx
test.com-access.log-20200123 II按日期分割了日志文件
[root@www~]#ls/us r/local/n g i nx/logs/ access.log //原来的日志文件重新创建
-rw-r--r-- 1 nginx root O 2 月15 18:57 /usr/local/ng i nx/logs/access.log
( 3 ) 设置crontab 任务,定期执行脚本自动进行日志分割。
[root@www~]#crontab -e
30 1 * * * /opt/fenge.sh
即每天的凌晨1: 30 分执行/o pt/feng e . sh 脚本, 进行日志分割。
2.5 设置连接超时
在企业网站中,为了避免同一个客户长时间占用连接, 造成资源浪费, 可设置相应的连接超时参数,实现控制连接访问时间。可以修改配置文件n gi nx . conf ,设置keepalive_timeout超时时间。
[root@www cont]# vi nginx.conf
http {......... //省略内容
#keepalive_timeout 0;
keepal ive_timeout 65 180; II默认是65 秒,设置超时是180 秒
......... //省略内容
keepalive_timeout 第一个参数指定了与客户端的keep-alive 连接超时时间,服务器将会在这个时间后关闭连接。可选的第二个参数指定了在响应头Keep-Alive: timeout=time 中的time 值。这个头能够让一些浏览器主动关闭连接, 这样服务器就不必去关闭连接了。没有这个参数, Ngi nx 不会发送Keep-Alive 响应头。
除Kee pal ive_ti meout 参数之外, 还可以增加其它超时参数, 比如C lient_header _ti meout 参数可用于指定等待客户端发送请求头的超时时间、Client_body _t i meou t 参数可用千指定请求体读超时时间。
[root@www conf]# vi nginx.conf
http {......... //省略内容
keepalive_timeout 65 180;
client_header_timeout 80;
client_body_timeout 80;
.......... //省略内容
因为请求头和请求体只有在特殊情况下才能显示效果, 这里不再演示。
2 Nginx 深入优化
2.1 更改进程数
在高并发环境中, 需要启动更多的N gi nx 进程以保证快速响应, 用以处理用户的请求,避免造成阻塞。使用p s aux 命令查看N gi nx 运行进程的个数。从命令执行结果可以看出master p rocess 是N gi nx 的主进程, 开启了1 个: worker process 是子进程, 子进程也是开启了1 个。
[root@www conf]# ps aux I grep nginx
root 1241 0.0 0.0 20220 616? Ss 17:06 0:00 nginx: master process
/usr/loca l/sbin/nginx
nginx 1242 0.0 0.0 20664 1540? S 17:06 0:00 nginx: worker process
修改Nginx 的配置文件的worker_p rocesses 参数, 一般设为CPU 的个数或者核数,
在高并发的情况下可设置为CPU 个数或者核数的2 倍, 可以查看CPU 的核数以确定参数。
[root@www cont]# cat /p roc/cpuinfo I grep -c "physical"
4
参数设置为4 , 和CPU 的核数相同。运行进程数多一些, 响应客户端访问请求时, Nginx
就不会临时启动新的进程提供服务,减少了系统的开销, 提升了服务速度。
[root@www conf]# vi nginx.conf
worker_p rocesses 4;
修改完后, 重启服务,使用p s aux 查看运行进程数的变化情况。从下面执行结果中可
以看出开启了1 个主进程和4 个子进程, 参数设置起到了作用。
[root@www conf]# systemctl restart nginx
[root@www conf]# ps aux I grep nginx
「oot 1868 0.0 0.0 20220 620? Ss 20:20 0:00 nginx: maste
process /usr/Iocal/sbin/nginx
nginx 1869 0.0 0.0 20664 1324? S 20:20 0:00 nginx: worker process
nginx 1870 0.0 0.0 20664 1324? S 20:20 0:00 nginx: worker process
nginx 1871 0.0 0.0 20664 1248? S 20:20 0:00 nginx: worker process
nginx 1872 0.0 0.0 20664 1304? S 20:20 0:00 nginx: worker process
默认情况下, Nginx 的多个进程可能更多的跑在一颗CPU 上。为了充分利用硬件多核多CPU, 可以分配不同的进程给不同的CPU 处理。在一台4 核CPU 服务器上,可以设置每个进程分别由不同的CPU 核心处理, 达到CPU 的性能最大化。
[root@www cont]# vi nginx.conf
worker_precesses 4;
worker_cpu_affinity 0001 0010 0100 1000;
2.2 配置网页压缩
Nginx的ng x_http_gz ip_module 压缩模块提供了对文件内容压缩的功能,允许Nginx服务器将输出内容发送到客户端之前进行压缩,以节约网站的带宽,提升用户的访问体验。默认Nginx已经安装该模块,只需要在配置文件中加入相应的压缩功能参数对压缩性能进行优化即可。
- gzipon开启gzip压缩输出;
- gz ip_min_length1 k:用千设置允许压缩的页面最小字节数;
- gzip_buffers 4 16k表示申请4 个单位为16k 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip 压缩结果;
- gz ip_h ttp_version 1 . 0 用千设置识别h ttp 协议版本,默认是1 . 1, 目前大部分浏览器已经支持g zip 解压,但处理较慢,也比较消耗服务器CPU 资源;
- gzip_comp_ level 2用来指定gzip 压缩比, 1 压缩比最小,处理速度最快; 9 压缩比最大,传输速度快,但处理速度最慢,使用默认即可;
- gzip_types text/p la i n 压缩类型,是对哪些网页文档启用压缩功能;
- gzip_ vary on 选项可以让前端的缓存服务器缓存经过gz ip 压缩的页面。
修改Ngi nx 的配置文件,加入压缩功能参数。
[root@www cont)# vi nginx.conf
http {...... //省略部分内容
gzip on; //取消注释
gzip buffers 4 64k;
gzip http_ ve 「s i on 1.1;
gzip_comp_level 2;
gzip_min_length 1k;
gzip_vary on;
gzip_types text/plain text/javascript applicati on/x-javascript text/css text/xml application/xml
appli ca ti on/xm l+ rss ;
在Nginx工作目录建立一个超过1K 大小的ht ml 文件,然后使用浏览器访问网址验证,显示使用gzip 进行了压缩,如图所示。
2.3 配置防盗链
在企业网站服务中, 一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失, 也避免了不必要的带宽浪费。Nginx 的防盗链功能也非常强大,在默认情况下,只需要进行很简单的配置,即可实现防盗链处理。
( 1 ) 防盗链需要准备两台主机模拟盗链,下表是主机的配置说明。
IP地址 | 域名 | 用途 |
192.168.0.102 | www.bt.com | 源主机 |
192.168.0.104 | www.test.com | 盗链主机 |
( 2 ) 修改Wi ndows 的C :\ Windows \System32\dr ivers\etc\hosts 文件,设置域名和IP
映射关系。
192.168.0.102 www.bt.com
192.168.0.104 www.test.com
( 3 ) 修改两台CentOS 的hosts 文件,设置域名和IP 映射关系。
[root@www cont]# vi /etc/hosts
192.168.0.102 www.bt.com
192.168.0.104 www.test.com
( 4 ) 把图片logo .jpg 放到源主机C bt. com ) 的工作目录下。
[root@www~)#cd /usr/local/nginx/html/
[root@www html]# Is
50x.html index.html logo.jpg
( 5 ) 在盗链主机( test. com ) 的工作目录编写盗链页面i ndex . ht ml ,盗取源主机C bt. com )
的图片。
[root@localhost ~]#cd /usr/local/nginx/html/
[root@localhost html]# vi index.html
<!DOCTYPE html>
<html>
<head>
//省略部分
<p><em>Thank you for using nginx.</em></p>
<img src="http ://www.bt. com/logo.jpg"/>
</body>
</html>
( 6 ) 配置Nginx 防盗链
Nginx 的防盗链原理是加入location 项, 用正则表达式过滤图片类型文件, 对于信任的网址可以正常使用, 不信任的网址返回相应的错误图片。在源主机的配置文件中加入以下代码:
location ~* \.(jpeg|jpg)$ {
valid_referers *.benet.com benet.com;
if ($invalid_referer){
rewrite ^/ http://www.benet.com/error.png;
}
}
- ~* \ (jpg |gif l swf)$: 这段正则表达式表示匹配不区分大小写, 以.jpg 或.gif 或.swf 结尾的文件;
- Valid_referers 设置信任的网站, 可以正常使用图片;
- 后面的网址或者域名: referer 中包含相关字符串的网址;
- if 语句: 如果链接的来源域名不在valid_referers 所列出的列表中,$invalid_referer 为1, 则执行后面的操作, 即进行重写或返回403 页面。
把图片error.png 放到源主机的工作目录下。
重启服务器, 重新访问http://www.test.com/index. html , 显示的是被重写的图片, 说明防盗链配置成功。
2.4FPM参数优化
Nginx 的PHP 解析功能实现方法如果是交由FPM 处理的, 为了提高PHP 的处理速度,可对FPM 模块进行参数的调整。
( 1 ) 安装带FPM 模块的PHP 环境, 保证PHP 可以正常运行
( 2 ) FPM 进程有两种启动方式, 由pm 参数指定, 分别是static 和dynamic, 前者将产生固定数量的fpm 进程, 后者将以动态的方式产生fpm 进程。
Static 的方式可以使用pm. max_children 指定启动的进程数量。Dynamic 方式的参数要根据服务器的内存与服务负载进行调整, 参数如下表所示
选项 | 描述 |
---|---|
Pm. max_ children | 指定启动最大的进程数量 |
Pm .start_servers | 动态方式下初始的fpm 进程数量 |
Pm.min_spare_servers | 动态方式下最小的fpm 空闲进程数 |
Pm_max_spare_servers | 动态方式下最大的空闲进程数 |