Nginx作为高性能的web服务端,经历了十几年的迭代更新,目前功能已经非常的完善而且稳定。它既可以作为http服务器,也可以用作反向代理和邮件服务器。它可以快速地响应静态网页的请求,也可以结合FastCGI等协议反向代理动态资源请求。本文将介绍nginx的一些性能优化配置,仅供参考。
配置文件
使用默认的包管理工具yum或apt安装的一般会生成以下配置文件
主配置文件:nginx.conf
子配置文件:conf.d/*.conf
主配置文件一般用来存放全局配置,events块,http块
子配置文件用来存放某个网站的具体配置,server块
全局配置
对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID路径,日志路径等。
启动Nginx工作进程的用户和组,worker进程以nginx的身份运行,master进程都是以root身份运行
user nginx;
工作进程的数量自动设置成CPU的数量
worker_processes auto;
将Nginx工作进程绑定到指定的CPU核心
worker进程具体运行在哪颗CPU上不是固定的,是活动的。造成CPU上的数据缓存失效,影响工作效率。默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
CPU的表示方法:
00000001:0号CPU
00000010:1号CPU
。。。
10000000:7号CPU
worker_cpu_affinity 00000001 00000010; #我的机器只有2颗CPU所以这里绑定2个
高并发配置
所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制。最好与ulimit -n 或者limits.conf的值保持一致。
worker_rlimit_nofile 65536;
events {
#设置单个工作进程的最大并发连接数
worker_connections 65536;
#使用epoll事件驱动,Nginx支持众多的事件驱动,比如:select、poll、epoll
use epoll;
#on为同一时刻一个请求轮流由work进程处理,而防止被同时唤醒所有worker,避免多个睡眠进程被唤醒的设置,默认为off,新请求会唤醒所有worker进程,此过程也称为"惊群"因此nginx刚安装完以后要进行适当的优化。建议设置为on
accept_mutex on;
#on时Nginx服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认为off,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。建议设置为on
multi_accept on;
}
同时还需要修改service文件
vim /usr/lib/systemd/system/nginx.service
在service文件里配置LimitNOFILE,参考配置如下
[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)"
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配置完后重新加载服务
systemctl daemon-reload
systemctl restart nginx
http配置块
隐藏nginx的版本
出于安全考虑,建议隐藏nginx的版本号。
server_tokens off;
修改上传文件的大小
nginx默认上传限制1M,如果用来做网站,建议调大这个值(php.ini也需要同时修改)。
client_max_body_size 20M;
client_body_buffer_size 1024K;
client_body_temp_path /data/client_body_temp/ 1 2 2;
同时修改 /etc/php/7.4/fpm/php.ini
upload_max_filesize = 20M
缓存打开过的文件信息
提高工作效率,缓存曾经读取的文件信息,下次访问可以直接从缓存区读取数据。
nginx可以缓存以下三种信息:
- (1) 文件元数据:文件的描述符、文件大小和最近一次的修改时间
- (2) 打开的目录结构
- (3) 没有找到的或者没有权限访问的文件的相关信息
可缓存的缓存项上限数量;达到上限后会使用LRU(Least recently used,最近最少使用)算法实现管理
max=N;
缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于指令所指定的次数的缓存项即为非活动项,将被删除
inactive=time;
open_file_cache_min_uses;
缓存项有效性的检查验证频率,默认值为60s
open_file_cache_valid time;
是否缓存查找时发生错误的文件一类的信息,默认值为off
open_file_cache_errors on | off;
open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项,默认值为1
open_file_cache_min_uses number;
例子:
open_file_cache max=10000 inactive=60s; #最大缓存10000个文件,非活动数据超时时长60s
open_file_cache_valid 60s; #每间隔60s检查一下缓存数据有效性
open_file_cache_min_uses 5; #60秒内至少被命中访问5次才被标记为活动数据
open_file_cache_errors on; #缓存错误信息
开启压缩功能
Nginx支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文件大小将比源文件显著变小,这样有助于降低出口带宽的利用率,降低企业的IT支出,不过会占用相 应的CPU资源。
gzip on;
gzip_vary on; #如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开