Nginx优化
1.Nginx服务优化
在企业信息化应用环境中, 服务器的安全性和响应速度需要根据实际情况进行相应参数配置, 以达到最优的用户体验。 Nginx 默认的安装参数只能提供最基本的服务, 需要调整如网页缓存时间、 连接超时、 网页压缩等相应参数, 才能发挥出服务器的最大作用。
1.1隐藏版本号
在生产环境中, 需要隐藏 Nginx 的版本号, 以避免泄漏 Nginx 的版本, 使攻击者不能针对特定版本进行攻击。 在隐藏版本号之前, 可以使用 Fiddler 工具抓取数据包, 查看 Nginx版本, 也可以在 CentOS 中使用命令 curl -I http://192.168.25.111/查看。
[root@localhost ~]# curl -I http://192.168.25.111/
HTTP/1.1 200 OK
Server: nginx/1.12.0 ///版本号
.......... ///省略内容
隐藏 Nginx 版本号有两种方式, 第一种是修改 Nginx 的主配置文件, 第二种是修改 Nginx源码文件, 指定不显示版本号。
(1) 修改配置文件方式
将 Nginx 主配置文件中的 server_tokens 选项值设置为 off, 如没有该配置项, 加上即可。
[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# vim nginx.conf
..........
http {
include mime.types;
default_type application/octet-stream;
server_tokens off;
.........
[root@localhost conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
若 使 用 了 PHP 处 理 动 态 网 页 , 且 PHP 配 置 文 件 中 配 置 了 fastcgi_paramSERVER_SOFTWARE 选 项 , 则 编 辑 php-fpm 配 置 文 件 , 将 fastcgi_paramSERVER_SOFTWARE 对应的值修改为fastcgi_param SERVER_SOFTWARE nginx。
再次访问网址, 只显示 Nginx, 版本号已经隐藏。
[root@localhost conf]# systemctl restart nginx
[root@localhost conf]# curl -I http://192.168.25.111
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 01 Feb 2024 12:40:20 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 612
Last-Modified: Fri, 05 Jan 2024 02:50:50 GMT
Connection: keep-alive
ETag: "65976e8a-264"
Accept-Ranges: bytes
(2)设置版本信息
Nginx 源码文件 nginx-1.12.0/src/core/nginx.h 包含了版本信息, 可以随意设置, 然后重新编译安装, 隐藏版本信息。
[root@localhost ~]# vim nginx-1.12.0/src/core/nginx.h
...........
#define NGINX_VERSION "1.1.1"
#define NGINX_VER "IIS" NGINX_VERSION
[root@localhost ~]# cd nginx-1.12.0/
[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_stub_status_module
[root@localhost nginx-1.12.0]# make && make install
[root@localhost nginx-1.12.0]# cd /usr/local/nginx/conf/
........
http {
include mime.types;
default_type application/octet-stream;
server_tokens on; ///打开版本号ON
[root@localhost conf]# systemctl restart nginx
[root@localhost conf]# curl -I http://192.168.25.111
HTTP/1.1 200 OK
Server: IIS1.1.1
2.修改用户与组
Nginx 运行时进程需要有用户与组的支持, 用以实现对网站文件读取时进行访问控制。主进程由 root 创建, 子进程由指定的用户与组创建。 Nginx 默认使用 nobody 用户帐号与组帐号, 一般也要进行修改。 修改 Nginx 用户与组有两种方法, 一种是在编译安装时指定用户与组, 另一种是修改配置文件指定用户与组。
(1) 指定用户与组的参数
编译 Nginx 时指定用户与组, 就是配置 Nginx 时, 在./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@localhost nginx-1.12.0]# cd /usr/local/nginx/conf/
[root@localhost conf]# vim nginx.conf
user nginx nginx; ///修改用户名为nginx,组为nginx
重启 Nginx 服务并查看进程运行情况, 从执行结果中可以得出 Nginx 服务的主进程由root 帐户创建, 子进程则由 nginx 创建。
[root@localhost conf]# systemctl restart nginx
[root@localhost conf]# ps aux | grep nginx
root 15803 0.0 0.0 20544 624 ? Ss 21:04 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 15805 0.0 0.1 22992 1400 ? S 21:04 0:00 nginx: worker process
root 15837 0.0 0.0 112724 988 pts/0 R+ 21:04 0:00 grep --color=auto nginx
3.设置连接超时
在企业网站中, 为了避免同一个客户长时间占用连接, 造成资源浪费, 可设置相应的连接超时参数, 实现控制连接访问时间。可以修改配置文件 nginx.conf, 设置 keepalive_timeout超时时间。
[root@localhost conf]# vim nginx.conf
............
http {
............
keepalive_timeout 0;
keepalive_timeout 65 180; ///默认是65秒,设置超时是180秒
..........
keepalive_timeout 第一个参数指定了与客户端的 keep-alive 连接超时时间, 服务器将会在这个时间后关闭连接。 可选的第二个参数指定了在响应头 Keep-Alive: timeout=time 中的 time 值。 这个头能够让一些浏览器主动关闭连接, 这样服务器就不必去关闭连接了。 没有这个参数, Nginx 不会发送 Keep-Alive 响应头。
除 Keepalive_timeout 参 数 之 外 , 还 可 以 增 加 其 它 超 时 参 数 , 比 如Client_header_timeout 参 数 可 用 于 指 定 等 待 客 户 端 发 送 请 求 头 的 超 时 时 间 、 Client_body_timeout 参数可用于指定请求体读超时时间。
[root@localhost conf]# vim nginx.conf
............
http {
............
keepalive_timeout 65 180;
client_header_timeout 80;
client_body_timeout 80;
因为请求头和请求体只有在特殊情况下才能显示效果, 这里不再演示。
4.更改进程数
在高并发环境中, 需要启动更多的 Nginx 进程以保证快速响应, 用以处理用户的请求,避免造成阻塞。 使用 ps aux 命令查看 Nginx 运行进程的个数。 从命令执行结果可以看出master process 是 Nginx 的主进程, 开启了 1 个; worker process 是子进程, 子进程也是开启了 1 个。
[root@localhost conf]# ps aux | grep nginx
root 15803 0.0 0.0 20544 624 ? Ss 21:04 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 15805 0.0 0.1 22992 1400 ? S 21:04 0:00 nginx: worker process
root 15939 0.0 0.0 112724 988 pts/0 S+ 21:15 0:00 grep --color=auto nginx
修改 Nginx 的配置文件的 worker_processes 参数, 一般设为 CPU 的个数或者核数,在高并发的情况下可设置为 CPU 个数或者核数的 2 倍, 可以查看 CPU 的核数以确定参数
[root@localhost conf]# cat /proc/cpuinfo | grep -c "physical"
2
参数设置为 2, 和 CPU 的核数相同。 运行进程数多一些, 响应客户端访问请求时, Nginx就不会临时启动新的进程提供服务, 减少了系统的开销, 提升了服务速度。
[root@localhost conf]# vim nginx.conf
worker_processes 2;
修改完后, 重启服务, 使用 ps aux 查看运行进程数的变化情况。 从下面执行结果中可以看出开启了 1 个主进程和 2 个子进程, 参数设置起到了作用。
[root@localhost conf]# systemctl restart nginx
[root@localhost conf]# ps aux | grep nginx
root 16018 0.0 0.0 112724 984 pts/0 S+ 21:18 0:00 grep --color=auto nginx
默认情况下, Nginx 的多个进程可能更多的跑在一颗 CPU 上。 为了充分利用硬件多核多 CPU, 可以分配不同的进程给不同的 CPU 处理。 在一台 4 核 CPU 服务器上, 可以设置每个进程分别由不同的 CPU 核心处理, 达到 CPU 的性能最大化。
5.配置网页压缩
Nginx 的 ngx_http_gzip_module 压缩模块提供了对文件内容压缩的功能, 允许 Nginx服务器将输出内容发送到客户端之前进行压缩, 以节约网站的带宽, 提升用户的访问体验。默认 Nginx 已经安装该模块, 只需要在配置文件中加入相应的压缩功能参数对压缩性能进行优化即可。
gzipon:开启 gzip 压缩输出;
gzip_min_length1k:用于设置允许压缩的页面最小字节数;
gzip_buffers 4 16k:表示申请 4 个单位为 16k 的内存作为压缩结果流缓存, 默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果;
gzip_http_version 1.0:用于设置识别 http 协议版本, 默认是 1.1, 目前大部分浏览器已经支持 gzip 解压, 但处理较慢, 也比较消耗服务器 CPU 资源;
gzip_comp_level 2:用来指定 gzip 压缩比, 1 压缩比最小, 处理速度最快; 9 压缩比最大, 传输速度快, 但处理速度最慢, 使用默认即可;
gzip_types text/plain:压缩类型, 是对哪些网页文档启用压缩功能;
gzip_vary on:选项可以让前端的缓存服务器缓存经过 gzip 压缩的页面。
修改 Nginx 的配置文件, 加入压缩功能参数
[root@localhost conf]# vim nginx.conf
............
http {
............
gzip on;
gzip_buffers 4 64k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_min_length 1k;
gzip_vary on;
gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xmlapplication/xml+rss;