千家信息网

Nginx深度优化(二)

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,Nginx作为现在最流行的Web应用程序,对其优化十分重要。通过Nginx初步优化、深度优化Nginx(一)已经可以对Nginx进行大量的优化来满足基本的需要,但是作为一名合格的运维工程师来说,仅仅掌
千家信息网最后更新 2026年11月02日Nginx深度优化(二)

Nginx作为现在最流行的Web应用程序,对其优化十分重要。通过Nginx初步优化、深度优化Nginx(一)已经可以对Nginx进行大量的优化来满足基本的需要,但是作为一名合格的运维工程师来说,仅仅掌握以上对Nginx进行优化的方法显然是远远不足的。所以就需要本篇博文进一步对Nginx进行优化。

博文大纲:
一、安装nginx服务器
二、Nginx配置优化
(1)Nginx 运行工作进程个数
(2)Nginx 事件处理模型
(3)开启高效传输模式
(4)连接超时时间
(5)fastcgi调优
(6)expires 缓存调优
(7)防盗链
(8)内核参数优化

一、安装nginx服务器

获取Nginx软件包

[root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel         //安装nginx依赖[root@localhost ~]# useradd -s /sbin/nologin -M nginx          //创建nginx用户[root@localhost ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/src[root@localhost ~]# cd /usr/src/nginx-1.14.0/[root@localhost nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --user=nginx \ --group=nginx --with-http_dav_module --with-http_stub_status_module \ --with-http_addition_module --with-http_sub_module --with-http_flv_module \ --with-http_mp4_module --with-pcre --with-http_ssl_module \ --with-http_gzip_static_module  && make && make install//对nginx进行编译安装,对源码包进行编译安装时,可以使用./configure --help 来获取配置选项详细介绍

配置选项解释:

  • --with-http_dav_module:增加 PUT,DELETE,MKCOL:创建集合,COPY 和 MOVE 方法;
  • --with-http_stub_status_module:获取 Nginx 的状态统计信息;
  • --with-http_addition_module:作为一个输出过滤器,支持不完全缓冲,分部分相应请求;
  • --with-http_sub_module:允许一些其他文本替换 Nginx 相应中的一些文本;
  • --with-http_flv_module:提供支持 flv 视频文件支持;
  • --with-http_mp4_module:提供支持 mp4 视频文件支持,提供伪流媒体服务端支持;
  • --with-http_ssl_module:启用 ngx_http_ssl_module;
[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin        //创建符号链接[root@localhost ~]# nginx -t           //检查Nginx配置文件语法[root@localhost ~]# nginx             //启动Nginx

对于nginx命令常用的几个选项:

  • -v:显示版本信息;
  • -V:显示版本信息及配置选项参数;
  • -t:测试配置文件是否有语法错误;
  • -T:测试配置文件并将配置文件显示出来;
  • -q:在配置期间抑制非错误信息;
  • -s (stop, quit, reopen, reload ):向主进程发送信号:停止、退出、重新打开、重新加载;
  • -c:设置配置文件;
  • -g:从配置文件中设置全局指令;

二、Nginx配置优化

[root@localhost ~]# ps -ef | grep nginx          //列出Nginx程序所产生的进程root     120790      1  0 22:49 ?        00:00:00 nginx: master process nginxnginx    120791 120790  0 22:49 ?        00:00:00 nginx: worker processroot     120873   1928  0 22:57 pts/0    00:00:00 grep --color=auto nginx//第三条可以忽略,它是因为grep命令所产生的

从显示信息中可以看出,work进程是Nginx程序用户,但master进程是root。其中,master是监控进程,也称为Nginx的主进程;work进程是工作进程,部分情况还会出现cache相关进程。

关系图如下:

从图中也可以看出master是管理员,work进程才是为用户提供服务的!

(1)Nginx 运行工作进程个数

建议:一般设置 CPU 的核心或者核心数 x2 。

[root@localhost ~]# cat /proc/cpuinfo | grep processor | wc -l1//通过这条命令可以查看到当前服务器的cpu是一个[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf           //编辑Nginx配置文件worker_processes  2;       //工作进程数,建议是CPU数或者是CPU个数的两倍,最大可以开启8个worker_cpu_affinity 01 10;     //运行CPU亲和力worker_rlimit_nofile 65535;             //最多打开的文件个数[root@localhost ~]# ulimit -n1024//可以看出系统默认限制打文件的个数是1024文件个数除了nginx配置文件进行限制意外,还需修改文件资源限制文件,如下:[root@localhost ~]# vim /etc/security/limits.conf        ………………                           //省略部分内容#                 *               soft    nofile          65535                 //添加软限制打开文件的个数*               hard    nofile          65535               //添加新限制打开文件的个数*               soft      noproc       65535               //添加软连接可以打开的进程个数*               hard     noproc       65535              //添加硬限制可以打开的进程个数[root@localhost ~]# su -                                  //切换用户即可生效上一次登录:三 12月  4 22:29:45 CST 2019从 192.168.1.253pts/0 上[root@localhost ~]# ulimit -n65535//可以看出文件个数已经变成了65535,证明修改的文件已经生效[root@localhost ~]# nginx -s reload                 //重新加载nginx服务配置文件[root@localhost ~]# ps -ef | grep nginxroot     120790      1  0 22:49 ?        00:00:00 nginx: master process nginxnginx    121276 120790  0 23:21 ?        00:00:00 nginx: worker processnginx    121277 120790  0 23:21 ?        00:00:00 nginx: worker processroot     121279 121226  0 23:22 pts/0    00:00:00 grep --color=auto nginx//由于worker_processes设置为2,可以看出当前已经产生了两个work进程

(2)Nginx 事件处理模型

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf       ………………                           //省略部分内容events {    use epoll;                             worker_connections  65535;              multi_accept on;                           }

配置项解释:

  • use epol :使Nginx采用epoll事件模型;
  • work_connections :是单个 worker 进程允许客户端最大连接数,这个数值一般根据服务器性 能和内存来制定,实际最大值就是 worker 进程数乘以 work_connections 实际我们填入一个 65535,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了;
  • multi_accept :告诉 nginx 收到一个新连接通知后接受尽可能多的连接

(3)开启高效传输模式

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf       ………………                           //省略部分内容http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    tcp_nopush     on;

配置项解释:

  • Include mime.types:媒体类型, include 只是一个在当前文件中包含另一个文件内容的指令 ;
  • default_type application/octet-stream:默认媒体类型足够;
  • sendfile on:开启高效文件传输模式,sendfile 指令指定 nginx 是否调用 sendfile 函数来 输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,以平衡磁盘与网络 I/O 处理速度,降低系统的负载。
    注意:如果图片显示不正常把这个改成 off。
  • tcp_nopush on; 必须在 sendfile 开启模式才有效,防止网路阻塞,积极的减少网络报文 段的数量(告诉 nginx 在一个数据包里发送所有头文件,而不一个接一个的发送。

(4)连接超时时间

主要目的就是保护服务器资源、CPU、内存、控制连接数,因为建立连接也是需要消耗资源的。

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf       ………………                           //省略部分内容http {        keepalive_timeout 60;        tcp_nodelay on;        client_header_buffer_size 4k;        open_file_cache max=102400 inactive=20s;        open_file_cache_valid 30s;        open_file_cache_min_uses 1;        client_header_timeout 15;        client_body_timeout 15;        reset_timedout_connection on;        send_timeout 15;        server_tokens off;        client_max_body_size 10m;

配置项解释:

  • keepalived_timeout:客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接;
  • tcp_nodelay;也是防止网络阻塞,不过要包涵在 keepalived 参数才有效;
  • client_header_buffer_size 4k:客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于 1k,所以这里设置为分页大小。分页大小可以用命令 getconf PAGESIZE 取得;
  • open_file_cache max=102400 inactive=20s:这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存;
  • open_file_cache_valid 30s:这个是指多长时间检查一次缓存的有效信息;
  • open_file_cache_min_uses 1:open_file_cache 指令中的 inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在 inactive 时间内一次没被使用,它将被移除;
  • client_header_timeout:设置请求头的超时时间。我们也可以把这个设置低些,如果超过这个时间没有发送任何数据,nginx 将返回 request time out 的错误;
  • client_body_timeout:设置请求体的超时时间。我们也可以把这个设置低些,超过这个时间没有发送任何数据,和上面一样的错误提示;
  • reset_timeout_connection 告诉 nginx 关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间;
  • send_timeout 响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx 关闭连接;
  • server_tokens 并不会让 nginx 执行的速度更快,但它可以关闭在错误页面中的 nginx 版本数字,这样对于安全性是有好处的;
  • client_max_body_size 上传文件大小限制;

(5)fastcgi调优

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf       ………………                           //省略部分内容http {        fastcgi_connect_timeout 600;        fastcgi_send_timeout 600;        fastcgi_read_timeout 600;        fastcgi_buffer_size 64k;        fastcgi_buffers 4 64k;        fastcgi_busy_buffers_size 128k;        fastcgi_temp_file_write_size 128k;        fastcgi_temp_path /usr/local/nginx/nginx_tmp;        fastcgi_intercept_errors on;        fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128m        inactive=1d max_size=10g;

配置项解释:

  • Cache: 写入缓存区;
  • Buffer: 读取缓存区;
  • fastcgi_connect_timeout 600:指定连接到后端 FastCGI 的超时时间;
  • fastcgi_send_timeout 600:向 FastCGI 传送请求的超时时间;
  • fastcgi_read_timeout 600:指定接收 FastCGI 应答的超时时间;
  • fastcgi_buffer_size 64k:指定读取 FastCGI 应答第一部分需要用多大的缓冲区,默认的缓冲区 大小为 fastcgi_buffers 指令中的每块大小,可以将这个值设置更小;
  • fastcgi_buffers 4 64k:指定本地需要用多少和多大的缓冲区来缓冲 FastCGI 的应答请求,如果 一个 php 脚本所产生的页面大小为 256KB,那么会分配 4 个 64KB 的缓冲区来缓存,如果页 面大小大于 256KB,那么大于 256KB 的部分会缓存到fastcgi_temp_path 指定的路径中,但是 这并不是好方法,因为内存中的数据处理速度要快于磁盘。一般这个值应该为站点中 php 脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为 256KB,那么可 以把这个值设置为"8 32K"、"4 64k"等;
  • fastcgi_busy_buffers_size 128k:建议设置为 fastcgi_buffers 的两倍,繁忙时候的 buffer;
  • fastcgi_temp_file_write_size 128k:在写入 fastcgi_temp_path 时将用多大的数据块,默认值是 fastcgi_buffers 的两倍,该数值设置小时若负载上来时可能报 502 Bad Gateway;
  • fastcgi_temp_path /usr/local/nginx1.10/nginx_tmp:缓存临时目录;
  • fastcgi_intercept_errors on:这个指令指定是否传递 4xx 和 5xx 错误信息到客户端,或者允许 nginx 使用 error_page 处理错误信息;
  • fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cache levels=1:2
    keys_zone=cache_fastcgi:128m inactive=1d max_size=10g:fastcgi_cache 缓存目录,可以设置目录层级,比如 1:2 会生成 16*256 个子目录,cache_fastcgi 是这个缓存空间的名字,cache 是用多少内存(这样热门的 内容 nginx 直接放内存,提高访问速度),inactive 表示默认失效时间,如果缓存数据在失效 时间内没有被访问,将被删除,max_size 表示最多用多少硬盘空间;
  • fastcgi_cache cache_fastcgi:表示开启 FastCGI 缓存并为其指定一个名称。开启缓存非常有 用,可以有效降低 CPU 的负载,并且防止 502 的错误放生。cache_fastcgi 为 proxy_cache_path 指令创建的缓存区名称;
  • fastcgi_cache_valid 200 302 1h:用来指定应答代码的缓存时间,实例中的值表示将 200 和 302 应答缓存一小时,要和 fastcgi_cache 配合使用;
  • fastcgi_cache_valid 301 1d:将 301 应答缓存一天 ;
  • fastcgi_cache_valid any 1m:将其他应答缓存为 1 分钟;
  • fastcgi_cache_min_uses 1:该指令用于设置经过多少次请求的相同 URL 将被缓存;
  • fastcgi_cache_key http://$host$request_uri :该指令用来设置web缓存的Key值,nginx根据Key 值 md5 哈希存储.一般根据$host(域名)、$request_uri(请求的路径)等变量组合成 proxy_cache_key;
  • fastcgi_pass:指定 FastCGI 服务器监听端口与地址,可以是本机或者其它;

总结:

  • nginx 的缓存功能有:proxy_cache / fastcgi_cache ;
  • proxy_cache 的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态;
  • fastcgi_cache 的作用是缓存 fastcgi 生成的内容,很多情况是 php 生成的动态的内容;
  • proxy_cache 缓存减少了 nginx 与后端通信的次数,节省了传输时间和后端宽带;
  • fastcgi_cache缓存减少了nginx与php的通信的次数,更减轻了php和数据库(mysql)的压力;

(6)expires 缓存调优

缓存,主要针对于图片,css,js 等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存 365d,css,js,html 可以缓存个 10 来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的拓展名列出来。

Expires 缓存配置在 server 字段里面。如下:

location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ { expires 30d;                             //缓存时间为30天 #log_not_found off;                 //是否在 error_log 中记录不存在的错误 access_log off;                            //不记录日志}location ~* \.(js|css)$ { expires 7d;               log_not_found off;     access_log off;              }

expire 功能优点:

  • expires 可以降低网站购买的带宽,节约成本,同时提升用户访问体验;
  • 减轻服务的压力,节约服务器成本,是 web 服务非常重要的功能。 expire 功能
    缺点:被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。解决办法: 第一个缩短缓存时间,例如:1 天,但不彻底,除非更新频率大于 1 天;第二个对缓存的对象改名。

网站不希望被缓存的内容
1)网站流量统计工具;
2)更新频繁的文件(google 的 logo);

(7)防盗链

其实Nginx的防盗链与Apache的防盗链原理是一模一样,只是配置文件略微有点不同而已。

location ~* ^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {             valid_referers none blocked  www.benet.com benet.com;             if ($invalid_referer) {                            #return 302  http://www.benet.com/img/nolink.jpg;        //要么定义到另一个网站,返回状态码为302                    return 404;                      //要么访问状态码404                    break;                                                        }                                  access_log off;                      } 

很简单的,这里就不进行配置验证了,对防盗链不了解的朋友可以参考深度优化Apache其中对Apache的优化有详细的介绍!

(8)内核参数优化

将所需的参数编写在/etc/sysctl.conf 文件中,使其生效即可!

常用的参数有:

  • fs.file-max = 999999:这个参数表示进程(比如一个 worker 进程)可以同时打开的最大句柄数,这个参数直线限制最大并发连接数,需根据实际情况配置;
  • net.ipv4.tcp_max_tw_buckets = 6000:这个参数表示操作系统允许 TIME_WAIT 套接字数量的最大值,如果超过这个数字,TIME_WAIT 套接字将立刻被清除并打印警告信息。该参数默认为 180000,过多的 TIME_WAIT 套接字会使 Web 服务器变慢;
    注意:主动关闭连接的服务端会产生 TIME_WAIT 状态的连接;
  • 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 连接。这对于服务器来说很有意义,因为服务器上总会有大量 TIME-WAIT 状态的连接;
  • net.ipv4.tcp_keepalive_time = 30:这个参数表示当 keepalive 启用时,TCP 发送 keepalive 消息的频度。默认是 2 小时,若将其设置的小一些,可以更快地清理无效的连接;
  • net.ipv4.tcp_syncookies = 1:开启 SYN Cookies,当出现 SYN 等待队列溢出时,启用 cookies 来处理;
  • net.core.somaxconn = 40960:web 应用中 listen 函数的 backlog 默认会给我们内核参数的net.core.somaxconn 限制到 128,而 nginx 定义的 NGX_LISTEN_BACKLOG 默认为 511,所以有必要调整这个值;
    注意:对于一个 TCP 连接,Server 与 Client 需要通过三次握手来建立网络连接.当三次握手成功后,我们可以看到端口的状态由 LISTEN 转变为 ESTABLISHED,接着这条链路上就可以开始传送数据了.每一个处于监听(Listen)状态的端口,都有自己的监听队列.监听队列的长度与如somaxconn 参数和使用该端口的程序中 listen()函数有关;
    somaxconn 参数:定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为 128,对于一个经常处理新连接的高负载 web 服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。大的侦听队列对防止拒绝服务也会有所帮助;
  • net.core.netdev_max_backlog = 262144:每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目;
  • net.ipv4.tcp_max_syn_backlog = 262144:这个参数标示 TCP 三次握手建立阶段接受 SYN 请求队列的最大长度,默认为 1024,将其设置得大一些可以使出现 Nginx 繁忙来不及 accept 新连接的情况时,Linux 不至于丢失客户端发起的连接请求;
  • net.ipv4.tcp_rmem = 10240 87380 12582912:这个参数定义了 TCP 接受缓存(用于 TCP 接受滑动窗口)的最小值、默认值、最大值;
  • net.ipv4.tcp_wmem = 10240 87380 12582912:这个参数定义了 TCP 发送缓存(用于 TCP 发送滑动窗口)的最小值、默认值、最大值;
  • net.core.rmem_default = 6291456:这个参数表示内核套接字接受缓存区默认的大小;
  • net.core.wmem_default = 6291456:这个参数表示内核套接字发送缓存区默认的大小;
  • net.core.rmem_max = 12582912:这个参数表示内核套接字接受缓存区的最大大小;
  • net.core.wmem_max = 12582912:这个参数表示内核套接字发送缓存区的最大大小;
  • net.ipv4.tcp_syncookies = 1:该参数与性能无关,用于解决 TCP 的 SYN非法操作;

-------- 本文至此结束,感谢阅读 --------

缓存 文件 参数 时间 配置 进程 服务 大小 最大 内容 服务器 个数 数据 信息 客户 客户端 指令 错误 限制 内核 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 A股互联网金融科技公司 科技创新与互联网经济 互联网科技卖菜 互联网下的科技发展 朗新科技与工业互联网 狮子座互联网科技 润盈互联网科技 中国最先进互联网科技公司 须眉科技是互联网公司吗 宁夏科技产业互联网案例 浙南科技城互联网大厦建设工程 中和天地互联网科技有限公司 为客找房互联网科技公司怎么样 上海钢联属于互联网科技股吗 广州梦谷互联网科技有限公司领导 云鲸互联网络科技有限公司 广西科技产业互联网是什么 长沙渺峰互联网科技有限公司 玉溪新华互联网科技怎么选 前海云享互联网科技 湖南永感互联网科技有限公司 无线互联网科技 融势互联网科技 深圳育鹏互联网科技有限公司招聘 徐州市互联网科技有限公司 保险科技服务互联网营销体系 互联网金融科技元年 济南小医互联网科技有限公司招聘 长沙易易互联网科技有限公司 互联网大会出现的黑科技
0