web系统优化之nginx配置优化与Linux内核参数优化分析

一、进程相关的优化

1、worker_processes
  • 含义:指定工作进程数。(在nginx架构中分为主进程(master process)和工作进程(master process),主进程负责管理工作进程,工作进程用来处理客户端的请求)
  • 推荐值:推荐与cpu核数相同或比cpu核数小1(留一核给主进程用,假如服务器是2个CPU,每个CPU有4核,那么可以设置为8)
  • 扩展知识:
    (1)查看cpu的个数(物理个数)
    1. cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
    (2)查看cpu的核数
    1. cat /proc/cpuinfo| grep "cpu cores"| uniq
2、worker_rlimit_nofile
  • 含义:最大打开的文件描述符的数量,该值受linux内核打开的最大文件数限制(可以通过ulimit -n来查看或修改)
  • 推荐值:与ulimit -n参数相等(可以根据系统需要来设置),如设置为65535(当nginx中有open too many files可以通过修改ulimit的值为解决)
  • 扩展知识:
(1)查看系统最大打开的文件描述符数
  1. ulimit -n

可以通过ulimit -n 来临时修改

(2)永久修改最大打开的文件描述符数
  1. /etc/security/limits.conf
  2. *hard nofile 65535
  3. *soft nofile 65536
  • 通过修改这两个值即可(soft的值不能大于hard,hard表示硬性决定)
  • 再通过sysctl -p /etc/security/limits.conf即可生效
3、event类型选择
  1. event {
  2. use epoll;
  3. }
  • 含义:指定事件循环使用的类型(linux中有epoll,poll,select等)
  • 推荐值:epoll
4、worker_connections
  • 含义:表示每个工作进程最大的连接数
  • 推荐值:这个值应该不大于worker_rlimit_nofile的值,可使用公式:
    1. worker_connections * worker_processes <= worker_rlimit_nofile
5、accept_multi
  • 含义:开启后让工作进程可以同时接收受所有新的连接
  • 推荐值:on(这个值要根据自己实际的测试来决定是开启还是关闭)

二、Http与TCP相关参数优化

1、keepalive_timeout
  • 含义:设置网络长连接过期时间
  • 推荐值:65
2、keepalive_requests
  • 含义:保持长连接的请求数
  • 推荐值:根据系统需要自行设定
3、sendfile
  • 含义:是否开启IO多路复用(对于io频繁的建议开启)
  • 推荐值:on
4、tcp_nopush
  • 含义:接收的数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞
  • 推荐值:on(它在sendfile打开后才起作用)
5、缓冲区的设置
(1)client_body_buffer_size
  • 含义:设置请求体缓冲区大小
  • 推荐:128k
(2)client_max_body_size
  • 含义:设置请求体的最大限制(一般在上传时出现413错误码时,一般是这个参数不够大造成的)
  • 推荐值:根据应用场景设置
(3)client_header_buffer_size
  • 含义:设置请求头缓冲区大小
  • 推荐值:1k
(4)large_client_header_buffers
  • 含义:设置较大的请求头缓冲区个数和缓冲区大小
  • 推荐值:4 4k;
(5)output_buffers
  • 含义:设置用于从磁盘读取响应的缓冲区的数量和大小
  • 推荐值:1 32k;
(6)postpone_output
  • 含义:用于缓存网络数据包的小数据块
  • 推荐值:1460
6、系统连接数限制

/etc/sysctl.conf

  1. #网络最大连接数
  2. net.core.somaxconn = 65536
  3. #表示系统同时保持TIME_WAIT的最大数量(主要用于保存的连接队列缓冲区)
  4. net.ipv4.tcp_max_tw_buckets = 1440000
  5. #ipv4本地端口号的区间范围
  6. net.ipv4.ip_local_port_range 1024 65000
  7. #超时限制端口必须处于非活动状态的时间,然后才能重新用于另一个连接
  8. net.ipv4.tcp_fin_timeout 15
  9. #TCP窗口缩放选项是将传输控制协议中允许的接收窗口大小增加到其先前最大值65,535字节以外的选项
  10. net.ipv4.tcp_window_scaling = 1
  11. #在内核开始丢弃它们之前,确定要保留在队列中的数据包数
  12. net.ipv4.tcp_max_syn_backlog = 3240000
7、超时限制
  1. client_header_timeout 3m;
  2. client_body_timeout 3m;
  3. send_timeout 3m;
8、集群优化

使用upstream时适当高速keepalive值可以起来一定的优化作用(保持长连接的连接数)

  1. upstream apiserver {
  2. server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
  3. keepalive 200;
  4. }

三、文件系统优化

1、静态资源配置优化
(1)文件描述符缓存
  1. open_file_cache max=1000 inactive=20s;
  2. open_file_cache_valid 30s;
  3. open_file_cache_min_uses 5;
  4. open_file_cache_errors off;
(2)文件缓存 expires

含义:设置缓存有效期

  1. location ~* .(woff|eot|ttf|svg|mp4|webm|jpg|jpeg|png|gif|ico|css|js)$ {
  2. expires 365d;
  3. }
(3)静态资源压缩
  1. #是否开启压缩
  2. gzip on;
  3. #压缩级别(1-9)
  4. gzip_comp_level 4;
  5. #最小压缩文件的大小
  6. gzip_min_length 1000;
  7. #压缩文件的格式(哪些文件用于压缩)
  8. gzip_types: text/html application/x-javascript text/css application/javascript text/javascript text/plain text/xml application/json application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xml font/eot font/opentype font/otf image/svg+xml image/vnd.microsoft.icon;
  9. #对于IE浏览器不开启
  10. gzip_disable "MSIE [1-6].";

四、完整配置示例

  1. pid /var/run/nginx.pid;
  2. worker_processes 2;
  3. events {
  4. worker_connections 65536;
  5. use epoll;
  6. multi_accept on;
  7. }
  8. http {
  9. keepalive_timeout 65;
  10. keepalive_requests 100000;
  11. sendfile on;
  12. tcp_nopush on;
  13. client_body_buffer_size 128k;
  14. client_max_body_size 10m;
  15. client_header_buffer_size 1k;
  16. large_client_header_buffers 4 4k;
  17. output_buffers 1 32k;
  18. postpone_output 1460;
  19. client_header_timeout 3m;
  20. client_body_timeout 3m;
  21. send_timeout 3m;
  22. open_file_cache max=1000 inactive=20s;
  23. open_file_cache_valid 30s;
  24. open_file_cache_min_uses 5;
  25. open_file_cache_errors off;
  26. gzip on;
  27. gzip_min_length 1000;
  28. gzip_buffers 4 4k;
  29. gzip_types text/html application/x-javascript text/css application/javascript text/javascript text/plain text/xml application/json application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xml font/eot font/opentype font/otf image/svg+xml image/vnd.microsoft.icon;
  30. gzip_disable "MSIE [1-6].";
  31. # [ debug | info | notice | warn | error | crit | alert | emerg ]
  32. error_log /var/log/nginx.error_log warn;
  33. log_format main '$remote_addr - $remote_user [$time_local] '
  34. '"$request" $status $bytes_sent '
  35. '"$http_referer" "$http_user_agent" '
  36. '"$gzip_ratio"';
  37. log_format download '$remote_addr - $remote_user [$time_local] '
  38. '"$request" $status $bytes_sent '
  39. '"$http_referer" "$http_user_agent" '
  40. '"$http_range" "$sent_http_content_range"';
  41. server {
  42. listen 127.0.0.1;
  43. server_name 127.0.0.1;
  44. root /var/www/html;
  45. access_log /var/log/nginx.access_log main;
  46. location / {
  47. proxy_pass http://127.0.0.1/;
  48. proxy_redirect off;
  49. proxy_set_header Host $host;
  50. proxy_set_header X-Real-IP $remote_addr;
  51. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  52. proxy_connect_timeout 90;
  53. proxy_send_timeout 90;
  54. proxy_read_timeout 90;
  55. proxy_buffer_size 4k;
  56. proxy_buffers 4 32k;
  57. proxy_busy_buffers_size 64k;
  58. proxy_temp_file_write_size 64k;
  59. proxy_temp_path /etc/nginx/proxy_temp;
  60. }
  61. location ~* .(woff|eot|ttf|svg|mp4|webm|jpg|jpeg|png|gif|ico|css|js)$ {
  62. expires 365d;
  63. }
  64. }
  65. }