Nginx配置中比较重要的优化项

在日常的运维工作中,经常会用到 nginx 服务,也时常会碰到 nginx 因高并发导致的性能瓶颈问题。这里简单梳理下 nginx 性能优化的配置。

Nginx 配置中比较重要的优化项

1)nginx 进程数,建议按照 cpu 数目来指定,一般跟 cpu 核数相同或为它的倍数。
worker_processes 8;
2)为每个进程分配 cpu,上例中将 8 个进程分配到 8 个 cpu,当然可以写多个,或者将一个进程分配到多个 cpu。
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
3)下面这个指令是指当一个 nginx 进程打开的最多文件描述符数目,理论值应该是系统的最多打开文件数(ulimit -n)与 nginx 进程数相除,但是 nginx 分配请求并不是那么均匀,所以最好与 ulimit -n 的值保持一致。
worker_rlimit_nofile 65535;
4)使用 epoll 的 I/O 模型,用这个模型来高效处理异步事件
use epoll;
5)每个进程允许的最多连接数,理论上每台 nginx 服务器的最大连接数为 worker_processes*worker_connections。
worker_connections 65535;
6)http 连接超时时间,默认是 60s,功能是使客户端到服务器端的连接在设定的时间内持续有效,当出现对服务器的后继请求时,该功能避免了建立或者重新建立连接。切记这个参数也不能设置过大!否则会导致许多无效的 http 连接占据着 nginx 的连接数,终 nginx 崩溃!
keepalive_timeout 60;
7)客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过 1k,不过由于一般系统分页都要大于 1k,所以这里设置为分页大小。分页大小可以用命令 getconf PAGESIZE 取得。
client_header_buffer_size 4k;
8)下面这个参数将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=102400 inactive=20s;
9)下面这个是指多长时间检查一次缓存的有效信息。
open_file_cache_valid 30s;
10)open_file_cache 指令中的 inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在 inactive 时间内一次没被使用,它将被移除。
open_file_cache_min_uses 1;

11)隐藏响应头中的有关操作系统和 web server(Nginx)版本号的信息,这样对于安全性是有好处的。
server_tokens off;
12)可以让 sendfile()发挥作用。sendfile()可以在磁盘和 TCP socket 之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile 是传送数据之前在用户空间申请数据缓冲区。之后用 read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到 OS 缓存。因为这种拷贝是在内核完成的,sendfile()要比组合 read()和 write()以及打开关闭丢弃缓冲更加有效(更多有关于 sendfile)。
sendfile on;
13)告诉 nginx 在一个数据包里发送所有头文件,而不一个接一个的发送。就是说数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。
tcp_nopush on;
14)告诉 nginx 不要缓存数据,而是一段一段的发送–当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。
tcp_nodelay on;
比如:

http {
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
……
}

15)客户端请求头部的缓冲区大小,这个可以根据系统分页大小来设置,一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于 1k,所以这里设置为分页大小。
client_header_buffer_size 4k;
客户端请求头部的缓冲区大小,这个可以根据系统分页大小来设置,一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于 1k,所以这里设置为分页大小。
分页大小可以用命令 getconf PAGESIZE 取得。
[root@test-huanqiu ~]# getconf PAGESIZE
4096
但也有 client_header_buffer_size 超过 4k 的情况,但是 client_header_buffer_size 该值必须设置为“系统分页大小”的整倍数。
16)为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=65535 inactive=60s;
17)open_file_cache 指令中的 inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在 inactive 时间内一次没被使用,它将被移除。
open_file_cache_min_uses 1;
18)指定多长时间检查一次缓存的有效信息。
open_file_cache_valid 80s;

常用 Nginx 标准配置

 

user   www www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;
error_log   /www/log/nginx_error.log   crit;
pid         /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 65535;

events
{
   use epoll;
   worker_connections 65535;
}

http
{
   include       mime.types;
   default_type   application/octet-stream;

   charset   utf-8;

   server_names_hash_bucket_size 128;
   client_header_buffer_size 2k;
   large_client_header_buffers 4 4k;
   client_max_body_size 8m;

   sendfile on;
   tcp_nopush     on;

   keepalive_timeout 60;

   fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
                 keys_zone=TEST:10m
                 inactive=5m;
   fastcgi_connect_timeout 300;
   fastcgi_send_timeout 300;
   fastcgi_read_timeout 300;
   fastcgi_buffer_size 16k;
   fastcgi_buffers 16 16k;
   fastcgi_busy_buffers_size 16k;
   fastcgi_temp_file_write_size 16k;
   fastcgi_cache TEST;
   fastcgi_cache_valid 200 302 1h;
   fastcgi_cache_valid 301 1d;
   fastcgi_cache_valid any 1m;
   fastcgi_cache_min_uses 1;
   fastcgi_cache_use_stale error timeout invalid_header http_500; 
   open_file_cache max=204800 inactive=20s;
   open_file_cache_min_uses 1;
   open_file_cache_valid 30s; 

   tcp_nodelay on;

   gzip on;
   gzip_min_length   1k;
   gzip_buffers     4 16k;
   gzip_http_version 1.0;
   gzip_comp_level 2;
   gzip_types       text/plain application/x-javascript text/css application/xml;
   gzip_vary on;

   server
   {
     listen       8080;
     server_name   huan.wangshibo.com;
     index index.php index.htm;
     root   /www/html/;

     location /status
     {
         stub_status on;
     }

     location ~ .*\.(php|php5)?$
     {
         fastcgi_pass 127.0.0.1:9000;
         fastcgi_index index.php;
         include fcgi.conf;
     }

     location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
     {
       expires       30d;
     }

     log_format   access   '$remote_addr - $remote_user [$time_local] "$request" '
               '$status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" $http_x_forwarded_for';
     access_log   /www/log/access.log   access;
       }
}

 

关于 FastCGI 的几个指令

1)这个指令为 FastCGI 缓存指定一个路径,目录结构等级,关键字区域存储时间和非活动删除时间。
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
2)指定连接到后端 FastCGI 的超时时间。
fastcgi_connect_timeout 300;
3)向 FastCGI 传送请求的超时时间,这个值是指已经完成两次握手后向 FastCGI 传送请求的超时时间。
fastcgi_send_timeout 300;
4)接收 FastCGI 应答的超时时间,这个值是指已经完成两次握手后接收 FastCGI 应答的超时时间。
fastcgi_read_timeout 300;
5)指定读取 FastCGI 应答第一部分 需要用多大的缓冲区,这里可以设置为 fastcgi_buffers 指令指定的缓冲区大小,上面的指令指定它将使用 1 个 16k 的缓冲区去读取应答的第一部分,即应答头,其实这个应答头一般情况下都很小(不会超过 1k),但是你如果在 fastcgi_buffers 指令中指 定了缓冲区的大小,那么它也会分配一个 fastcgi_buffers 指定的缓冲区大小去缓存。
fastcgi_buffer_size 16k;
6)指定本地需要用多少和多大的缓冲区来 缓冲 FastCGI 的应答,如上所示,如果一个 php 脚本所产生的页面大小为 256k,则会为其分配 16 个 16k 的缓冲区来缓存,如果大于 256k,增大 于 256k 的部分会缓存到 fastcgi_temp 指定的路径中, 当然这对服务器负载来说是不明智的方案,因为内存中处理数据速度要快于硬盘,通常这个值 的设置应该选择一个你的站点中的 php 脚本所产生的页面大小的中间值,比如你的站点大部分脚本所产生的页面大小为 256k 就可以把这个值设置为 16 16k,或者 4 64k 或者 64 4k,但很显然,后两种并不是好的设置方法,因为如果产生的页面只有 32k,如果用 4 64k 它会分配 1 个 64k 的缓冲区去缓存,而如果使用 64 4k 它会分配 8 个 4k 的缓冲区去缓存,而如果使用 16 16k 则它会分配 2 个 16k 去缓存页面,这样看起来似乎更加合理。
fastcgi_buffers 16 16k;
7)这个指令我也不知道是做什么用,只知道默认值是 fastcgi_buffers 的两倍。
fastcgi_busy_buffers_size 32k;
8)在写入 fastcgi_temp_path 时将用多大的数据块,默认值是 fastcgi_buffers 的两倍。
fastcgi_temp_file_write_size 32k;
9)开启 FastCGI 缓存并且为其制定一个名称。个人感觉开启缓存非常有用,可以有效降低 CPU 负载,并且防止 502 错误。但是这个缓存会引起很多问题,因为它缓存的是动态页面。具体使用还需根据自己的需求。
fastcgi_cache TEST
10)为指定的应答代码指定缓存时间,如上例中将 200,302 应答缓存一小时,301 应答缓存 1 天,其他为 1 分钟。
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
11)缓存在 fastcgi_cache_path 指令 inactive 参数值时间内的最少使用次数,如上例,如果在 5 分钟内某文件 1 次也没有被使用,那么这个文件将被移除。
fastcgi_cache_min_uses 1;
12)不知道这个参数的作用,猜想应该是让 nginx 知道哪些类型的缓存是没用的。
fastcgi_cache_use_stale error timeout invalid_header http_500;

另外,FastCGI 自身也有一些配置需要进行优化,如果你使用 php-fpm 来管理 FastCGI,可以修改配置文件中的以下值:
1)同时处理的并发请求数,即它将开启最多 60 个子线程来处理并发连接。

<value name=”max_children”>60</value>

2)最多打开文件数。

<value name=”rlimit_files”>65535</value>

3)每个进程在重置之前能够执行的最多请求数。

<value name=”max_requests”>65535</value>

关于内核参数的优化

1)timewait 的数量,默认是 180000。(Deven:因此如果想把 timewait 降下了就要把 tcp_max_tw_buckets 值减小)
net.ipv4.tcp_max_tw_buckets = 6000
2)允许系统打开的端口范围。
net.ipv4.ip_local_port_range = 1024 65000
3)启用 TIME-WAIT 状态 sockets 快速回收功能;用于快速减少在 TIME-WAIT 状态 TCP 连接数。1 表示启用;0 表示关闭。但是要特别留意的是:这个选项一般不推荐启用,因为在 NAT(Network Address Translation)网络下,会导致大量的 TCP 连接建立错误,从而引起网站访问故障。
net.ipv4.tcp_tw_recycle = 0

实际上,net.ipv4.tcp_tw_recycle 功能的开启,一般需要 net.ipv4.tcp_timestamps(一般系统默认是开启这个功能的)这个开关开启后才有效果;
当 tcp_tw_recycle 开启时(tcp_timestamps 同时开启,快速回收 socket 的效果达到),对于位于 NAT 设备后面的 Client 来说,是一场灾难!!会导致到 NAT 设备后面的 Client 连接 Server 不稳定(有的 Client 能连接 server,有的 Client 不能连接 server)。

tcp_tw_recycle 这个功能,其实是为内部网络(网络环境自己可控 ” -不存在 NAT 的情况)设计的,对于公网环境下,不宜使用。通常来说,回收 TIME_WAIT 状态的 socket 是因为“无法主动连接远端”,因为无可用的端口,而不应该是要回收内存(没有必要)。也就是说,需求是 Client 的需求,Server 会有“端口不够用”的问题吗?除非是前端机,需要大量的连接后端服务,也就是充当着 Client 的角色。

正确的解决这个总是办法应该是:
net.ipv4.ip_local_port_range = 9000 6553 #默认值范围较小
net.ipv4.tcp_max_tw_buckets = 10000 #默认值较小,还可适当调小
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10

4)开启重用功能,允许将 TIME-WAIT 状态的 sockets 重新用于新的 TCP 连接。这个功能启用是安全的,一般不要去改动!
net.ipv4.tcp_tw_reuse = 1
5)开启 SYN Cookies,当出现 SYN 等待队列溢出时,启用 cookies 来处理。
net.ipv4.tcp_syncookies = 1
6)web 应用中 listen 函数的 backlog 默认会给我们内核参数的 net.core.somaxconn 限制到 128,而 nginx 定义的 NGX_LISTEN_BACKLOG 默认为 511,所以有必要调整这个值。
net.core.somaxconn = 262144
7)每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.netdev_max_backlog = 262144
8)系统中最多有多少个 TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的 DoS 攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。
net.ipv4.tcp_max_orphans = 262144
9)记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有 128M 内存的系统而言,缺省值是 1024,小内存的系统则是 128。
net.ipv4.tcp_max_syn_backlog = 262144
10)时间戳可以避免序列号的卷绕。一个 1Gbps 的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。
net.ipv4.tcp_timestamps = 1

有不少服务器为了提高性能,开启 net.ipv4.tcp_tw_recycle 选项,在 NAT 网络环境下,容易导致网站访问出现了一些 connect 失败的问题。

个人建议:
关闭 net.ipv4.tcp_tw_recycle 选项,而不是 net.ipv4.tcp_timestamps;
因为在 net.ipv4.tcp_timestamps 关闭的条件下,开启 net.ipv4.tcp_tw_recycle 是不起作用的;而 net.ipv4.tcp_timestamps 可以独立开启并起作用。

11)为了打开对端的连接,内核需要发送一个 SYN 并附带一个回应前面一个 SYN 的 ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送 SYN+ACK 包的数量。
net.ipv4.tcp_synack_retries = 1
12)在内核放弃建立连接之前发送 SYN 包的数量。
net.ipv4.tcp_syn_retries = 1
13)如果套接字由本端要求关闭,这个参数 决定了它保持在 FIN-WAIT-2 状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是 60 秒。2.2 内核的通常值是 180 秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的 WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2 的危险性比 FIN-WAIT-1 要小,因为它最多只能吃掉 1.5K 内存,但是它们的生存期长些。
net.ipv4.tcp_fin_timeout = 30
14)当 keepalive 起用的时候,TCP 发送 keepalive 消息的频度。缺省是 2 小时。
net.ipv4.tcp_keepalive_time = 30

以下是一个常用的内核参数的标准配置

 

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1            //这四行标红内容,一般是发现大量 TIME_WAIT 时的解决办法
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 1            //在 net.ipv4.tcp_tw_recycle 设置为 1 的时候,这个选择最好加上
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1           //开启此功能可以减少 TIME-WAIT 状态,但是 NAT 网络模式下打开有可能会导致 tcp 连接错误,慎重。
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_conntrack_max = 6553500

tcp 参数引起的一个 nginx 故障:
net.ipv4.tcp_tw_recycle = 1 这个功能打开后,确实能减少 TIME-WAIT 状态,习惯上我都会将这个参数打开。
但是也因为这个参数踩过一次坑:
公司的一个发布新闻的 CMS 后台系统,采用 haproxy+keepalived 代理架构,后端的 real server 服务器外网 ip 全部拿掉。
现象:在某一天早上发文高峰期,CMS 后台出现访问故障,重启 php 服务后会立刻见效,但持续一段时间后,访问就又出现故障。
排查 nginx 和 php 日志也没有发现什么,后来 google 了一下,发现就是 net.ipv4.tcp_tw_recycle 这个参数捣的鬼!
这种网络架构对于后端的 realserver 来说是 NAT 模式,打开这个参数后,会导致大量的 TCP 连接建立错误,从而引起网站访问故障。
最后将 net.ipv4.tcp_tw_recycle 设置为 0,关闭这个功能后,后台访问即刻恢复正常

Nginx 安全配置小提示:
下面是一个常见安全陷阱和解决方案的列表,它可以辅助来确保你的 Nginx 部署是安全的。

1)禁用 autoindex 模块。这个可能在你使用的 Nginx 版本中已经更改了,如果没有的话只需在配置文件的 location 块中增加 autoindex off;声明即可。

2)禁用服务器上的 ssi (服务器端引用)。这个可以通过在 location 块中添加 ssi off; 。

3)关闭服务器标记。如果开启的话(默认情况下)所有的错误页面都会显示服务器的版本和信息。将 server_tokens off;声明添加到 Nginx 配置文件来解决这个问题。

4)在配置文件中设置自定义缓存以限制缓冲区溢出攻击的可能性。
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;

5)将 timeout 设低来防止 DOS 攻击。所有这些声明都可以放到主配置文件中。
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 65;
send_timeout 10;

6)限制用户连接数来预防 DOS 攻击。
limit_zone slimits $binary_remote_addr 5m;
limit_conn slimits 5;

7)试着避免使用 HTTP 认证。HTTP 认证默认使用 crypt,它的哈希并不安全。如果你要用的话就用 MD5(这也不是个好选择但负载方面比 crypt 好) 。

Nginx 调优方式总结

1、隐藏 Nginx 版本号(server_tokens off)
2、隐藏 Nginx 版本号和软件名(进入 nginx 的源码包里修改)
3、更改 Nginx 服务的默认用户
4、优化 Nginx worker 进程数
5、绑定 Nginx 进程到不同的 CPU 上
6、优化 Nginx 处理事件模型
7、优化 Nginx 单个进程允许的最大连接数
8、优化 Nginx worker 进程最大打开文件数
9、优化服务器域名的散列表大小
10、开启高效文件传输模式
11、优化 Nginx 连接超时时间
12、限制上传文件的大小
13、FastCGI 相关参数调优
14、配置 Nginx gzip 压缩
15、配置 Nginx expires 缓存
16、优化 Nginx 日志(日志切割)
17、优化 Nginx 站点目录
18、配置 Nginx 防盗链
19、配置 Nginx 错误页面优雅显示
20、优化 Nginx 文件权限
21、Nginx 防爬虫优化
22、控制 Nginx 并发连接数
23、集群代理优化

运维中常用 Nginx 监控与性能调优做法
1. Nginx 监控
nginx 有自带的监控模块,编译 nginx 的时候,加上参数 –with-http_stub_status_module

# 配置指令

./configure --prefix=/usr/local
--user=nginx
--group=nginx
--with-http_ssl_module
--with-http_realip_module
--http-client-body-temp-path=/usr/local/var/tmp/nginx/client
--http-proxy-temp-path=/usr/local/var/tmp/nginx/proxy
--http-fastcgi-temp-path=/usr/local/var/tmp/nginx/fcgi
--http-scgi-temp-path=/usr/local/var/tmp/nginx/scgi
--http-uwsgi-temp-path=/usr/local/var/tmp/nginx/uwsgi
--with-http_geoip_module
--with-http_stub_status_module

接着修改 nginx 配置文件,添加监控状态配置


location = /nginx_status {
             stub_status on;
             access_log off;
             allow 127.0.0.1;
             deny all;
}

最后就可以通过 “curl 127.0.0.1/nginx_status”访问 nginx 的状态了。

上面是很简单的一个模块,除了这个还有外部的工具比如:ngxtop 监控请求信息

安装 python-pip

# yum install epel-release

# yum install python-pip

安装 ngxtop

# pip install ngxtop

ngxtop 常用指令:

# ngxtop top remote_addr 查看访问最多的 IP

# ngxtop -i ‘status >= 400’ print request status http_referer #列出 4xx or 5xx 的相应

指定配置文件: # ngxtop -c /etc/nginx/nginx.conf

查询状态是 200:# ngxtop -c /etc/nginx/nginx.conf -i ‘status==200’

查询访问最多 ip: # ngxtop -c /etc/nginx/nginx.conf -g remote_addr

还有一种图像化工具 nginx-rrd,但是需要和 php 整合,这里就不介绍了。

2. 常用的 Nginx 优化配置

1)配置线程数和并发数 #############################
worker_processes 4 #cpu(取决于 cpu 的核数,一般为 cpu 核数或倍数。也可以配置成 auto,让 nginx 自己选择工作线程数)
events{
worker_connections 10240; #每一个进程打开的最大连接数,包含了 nginx 与客户端和 nginx 与 upstream 之间的连接(受限于操作系统)
multi_accept on; #可以一次建立多个连接
use epoll; # Linux 下多路复用 IO 接口 select/poll 的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统 CPU 利用率
}

2)配置后端 Server 的长连接 #############################
upstream server_pool{
server localhost:8080 weight=1 max_fails=2 fail_timeout=30s;
server localhost:8081 weight=1 max_fails=2 fail_timeout=30s;
keepalive 300; #300 个长连接
}
location /{
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
proxy_pass http://server_pool/;

}

3) 启用缓存、压缩。Nginx 的缓存还有很大的局限性,下面是静态文件压缩配置 #############################
gzip on;
gzip_disable “msie6”;
gzip_proxied any;
gzip_min_length 1000;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

4)其他优化 #############################
sendfile on; #减少文件在应用和内核之间的拷贝
tcp_nopush on; #当数据包达到一定大小再发送
tcp_nodelay off; #有数据随时发送(只用在应答需要非常快速的情况下

注意:测试 nginx 语法是否正确:nginx -t

5) 操作系统优化 #############################
1. 配置文件/etc/sysctl.conf
sysctl -w net.ipv4.tcp_syncookies=1 #防止一个套接字在有过多试图连接到达时引起过载
sysctl -w net.core.somaxconn=1024 #默认 128,连接队列
sysctl -w net.ipv4.tcp_fin_timeout=10 #timewait 的超时时间
sysctl -w net.ipv4.tcp_tw_reuse=1 #os 直接使用 timevait 的连接
sysctl -w net.ipv4.tcp_tw_recycle=0 #回收禁用

2. 配置文件/etc/security/limits.conf
hard nofile 204800
soft nofile 204800
soft core unlimited
soft stack 204800

 


来源:https://www.cnblogs.com/kevingrace/p/6094007.html

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...