Nginx 性能优化分析

Nginx(发音同engine x)是一款由俄罗斯程序员 Igor Sysoev 所开发轻量级的网页服务器反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。起初是供俄国大型的门户网站及搜索引擎 Rambler俄语Рамблер)使用。此软件 BSD-like 协议下发行,可以在 UNIXGNU/LinuxBSDMac OS XSolaris,以及 Microsoft Windows 等操作系统中运行。

大多数的博客安装教程都只是告诉你只需要 apt-get 然后照搬照抄一个 config,的确,对于一般的网站来说,这样已经足够,但如果想挤压 nginx性能,你还需要做很多。

从编译开始

原则:尽量使用较少的模块

nginx 和 php,或是早期的 apache 为了完成某项特定的功能会将该功能已动态连接库的形式包含在软件里面,在 linux 下面是 .so 后缀的文件。一般来说,用户在 configure 阶段,可以自己选择 --with 或者 --without 来决定是否使用它提供的模块。

我们可能会为了方便,将很多不需要的模块也编译了进去,但是,除非这个模块是你必须使用的,否则就不要指定编译它。

原因是这样,当你启动 nginx 或者 php 进程的时候,这些进程都会打开所有你所编译的这些动态连接库,每个动态链接库都会占用 linux 系统的 FD 资源,这个用 lsof 是可以很清楚的看到的。同样,你的 log 文件也是会占用 FD 资源。

以下是我使用 lsof | grep nginx 的其中一个进程的信息:

  1. root@iZ23by3qhekZ:~# lsof | grep nginx
  2. nginx      9019            root  cwd       DIR              202,1     4096          2 /
  3. nginx      9019            root  rtd       DIR              202,1     4096          2 /
  4. nginx      9019            root  txt       REG              202,1  1354848    1196596 /usr/sbin/nginx
  5. nginx      9019            root  DEL       REG                0,4               94509 /dev/zero
  6. nginx      9019            root  mem       REG              202,1    22808     533734 /usr/lib/perl5/auto/nginx/nginx.so
  7. nginx      9019            root  mem       REG              202,1    47712     786730 /lib/x86_64-linux-gnu/libnss_files-2.19.so
  8. nginx      9019            root  mem       REG              202,1    47760     786774 /lib/x86_64-linux-gnu/libnss_nis-2.19.so
  9. nginx      9019            root  mem       REG              202,1    97296     786762 /lib/x86_64-linux-gnu/libnsl-2.19.so
  10. nginx      9019            root  mem       REG              202,1    39824     786760 /lib/x86_64-linux-gnu/libnss_compat-2.19.so
  11. nginx      9019            root  mem       REG              202,1    22616    1187113 /usr/lib/x86_64-linux-gnu/libXdmcp.so.6.0.0
  12. nginx      9019            root  mem       REG              202,1    14456    1187109 /usr/lib/x86_64-linux-gnu/libXau.so.6.0.0
  13. nginx      9019            root  mem       REG              202,1   125392    1187117 /usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0
  14. nginx      9019            root  mem       REG              202,1    58120    1194202 /usr/lib/x86_64-linux-gnu/libjbig.so.0
  15. nginx      9019            root  mem       REG              202,1  1265072    1187125 /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
  16. nginx      9019            root  mem       REG              202,1    18416     786811 /lib/x86_64-linux-gnu/libgpg-error.so.0.10.0
  17. nginx      9019            root  mem       REG              202,1   467208    1194806 /usr/lib/x86_64-linux-gnu/libtiff.so.5.2.0
  18. nginx      9019            root  mem       REG              202,1  1677008    1194889 /usr/lib/x86_64-linux-gnu/libvpx.so.1.3.0
  19. nginx      9019            root  mem       REG              202,1    72776    1194979 /usr/lib/x86_64-linux-gnu/libXpm.so.4.11.0
  20. nginx      9019            root  mem       REG              202,1   244704    1194195 /usr/lib/x86_64-linux-gnu/libfontconfig.so.1.8.0
  21. nginx      9019            root  mem       REG              202,1   666080    1183394 /usr/lib/x86_64-linux-gnu/libfreetype.so.6.11.1
  22. nginx      9019            root  mem       REG              202,1   153936     786584 /lib/x86_64-linux-gnu/libpng12.so.0.50.0
  23. nginx      9019            root  mem       REG              202,1   281288    1194200 /usr/lib/x86_64-linux-gnu/libjpeg.so.8.0.2
  24. nginx      9019            root  mem       REG              202,1   524704     786520 /lib/x86_64-linux-gnu/libgcrypt.so.11.8.2
  25. nginx      9019            root  mem       REG              202,1   137400     786543 /lib/x86_64-linux-gnu/liblzma.so.5.0.0
  26. nginx      9019            root  mem       REG              202,1    14664     786750 /lib/x86_64-linux-gnu/libdl-2.19.so
  27. nginx      9019            root  mem       REG              202,1   104936     786464 /lib/x86_64-linux-gnu/libaudit.so.1.0.0
  28. nginx      9019            root  mem       REG              202,1  1840928     786768 /lib/x86_64-linux-gnu/libc-2.19.so
  29. nginx      9019            root  mem       REG              202,1  1608280    1186140 /usr/lib/libperl.so.5.18.2
  30. nginx      9019            root  mem       REG              202,1   190648    1187085 /usr/lib/x86_64-linux-gnu/libGeoIP.so.1.6.0
  31. nginx      9019            root  mem       REG              202,1   417992    1195250 /usr/lib/x86_64-linux-gnu/libgd.so.3.0.0
  32. nginx      9019            root  mem       REG              202,1    83816    1195369 /usr/lib/x86_64-linux-gnu/libexslt.so.0.8.17
  33. nginx      9019            root  mem       REG              202,1   247952    1195256 /usr/lib/x86_64-linux-gnu/libxslt.so.1.1.28
  34. nginx      9019            root  mem       REG              202,1  1461496    1183382 /usr/lib/x86_64-linux-gnu/libxml2.so.2.9.1
  35. nginx      9019            root  mem       REG              202,1   100728     786786 /lib/x86_64-linux-gnu/libz.so.1.2.8
  36. nginx      9019            root  mem       REG              202,1  1930528     786528 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
  37. nginx      9019            root  mem       REG              202,1   387256     786577 /lib/x86_64-linux-gnu/libssl.so.1.0.0
  38. nginx      9019            root  mem       REG              202,1   252032     786510 /lib/x86_64-linux-gnu/libpcre.so.3.13.1
  39. nginx      9019            root  mem       REG              202,1   183880    1201276 /usr/lib/x86_64-linux-gnu/liblua5.1.so.0.0.0
  40. nginx      9019            root  mem       REG              202,1  1071552     786531 /lib/x86_64-linux-gnu/libm-2.19.so
  41. nginx      9019            root  mem       REG              202,1   170064     786469 /lib/x86_64-linux-gnu/libexpat.so.1.6.0
  42. nginx      9019            root  mem       REG              202,1    55856     786572 /lib/x86_64-linux-gnu/libpam.so.0.83.1
  43. nginx      9019            root  mem       REG              202,1    43368     786756 /lib/x86_64-linux-gnu/libcrypt-2.19.so
  44. nginx      9019            root  mem       REG              202,1   141574     786769 /lib/x86_64-linux-gnu/libpthread-2.19.so
  45. nginx      9019            root  mem       REG              202,1   149120     786764 /lib/x86_64-linux-gnu/ld-2.19.so
  46. nginx      9019            root  DEL       REG                0,4               94512 /dev/zero
  47. nginx      9019            root    0u      CHR                1,3      0t0       5420 /dev/null
  48. nginx      9019            root    1u      CHR                1,3      0t0       5420 /dev/null
  49. nginx      9019            root    2w      REG              202,1   477929     274203 /var/log/nginx/error.log
  50. nginx      9019            root    3u     unix 0xffff88003af56900      0t0      94522 socket
  51. nginx      9019            root    4w      REG              202,1  3723615     270255 /var/log/nginx/access.log
  52. nginx      9019            root    5w      REG              202,1   477929     274203 /var/log/nginx/error.log
  53. nginx      9019            root    6u     IPv4              94510      0t0        TCP *:http (LISTEN)
  54. nginx      9019            root    7u     IPv4              94511      0t0        TCP *:https (LISTEN)
  55. nginx      9019            root    8u     unix 0xffff88003af55e80      0t0      94513 socket
  56. nginx      9019            root    9u     unix 0xffff88003af54600      0t0      94514 socket
  57. nginx      9019            root   10u     unix 0xffff88003af53b80      0t0      94515 socket
  58. nginx      9019            root   11u     unix 0xffff88003af57000      0t0      94516 socket
  59. nginx      9019            root   12u     unix 0xffff88003af52d80      0t0      94517 socket
  60. nginx      9019            root   13u     unix 0xffff88003af50e00      0t0      94518 socket
  61. nginx      9019            root   14u     unix 0xffff88003af53480      0t0      94519 socket
  62. nginx      9019            root   15u     unix 0xffff88003af54d00      0t0      94520 socket
  63. nginx      9019            root   16u     unix 0xffff88003af55080      0t0      94523 socket
  64. nginx      9019            root   17u     unix 0xffff88003af53800      0t0      94524 socket
  65. nginx      9019            root   18u     unix 0xffff88003af54980      0t0      94525 socket
  66. nginx      9019            root   19u     unix 0xffff88003af53f00      0t0      94526 socket
  67. nginx      9019            root   20u     unix 0xffff88003af54280      0t0      94527 socket
  68. nginx      9019            root   21u     unix 0xffff88003af51500      0t0      94528 socket
  69. nginx      9019            root   22u     unix 0xffff88003af52300      0t0      94529 socket

我这里列举了其中的一个进程,可以看到加载的动态链接库越多,他占用的 FD 和内存就会越多。所以,尽可能少的加载动态连接库,可以将更多的内存和 cpu 资源让给 TCP/IP 连接。

同理,例如 nginx 中的 gzip 参数,除非是特别大的带宽瓶颈,否则尽量避免使用。

nginx 的配置文件

nginx 中的高级配置在 nginx.conf 这个文件中。

先来看位于模块上的高级配置:

  1. user www-data;
  2. # 定义 nginx 运行的用户和用户组
  3. worker_processes 8;
  4. # nginx 进程数,最优设置取决于很多因素,建议设置为等于 CPU 总核心数。
  5. error_log /var/log/nginx/error.log info;
  6. # 全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
  7. pid /var/run/nginx.pid;
  8. # 进程文件
  9. worker_rlimit_nofile 65535;
  10. # 一个 nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值 ulimit -n)与 nginx 进程数相除,但是 nginx 分配请求并不均匀,所以建议与 ulimit -n 的值保持一致。

worker_processes 定义了 nginx 对外提供 web 服务时的 worker 进程数。最优值取决于许多因素,包括(但不限于)CPU 核的数量、存储数据的硬盘数量及负载模式。不能确定的时候,将其设置为可用的 CPU 内核数将是一个好的开始(设置为『auto』将尝试自动检测它)。

worker_rlimit_nofile 更改 worker 进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和 nginx 可以处理比『ulimit -a』更多的文件,所以把这个值设高,这样 nginx 就不会有『too many open files』的问题了。

接下来是 Events 模块:

  1. events {
  2. # 工作模式与连接数上限
  3. use epoll;
  4. # 参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络IO模型,如果跑在FreeBSD上面,就用kqueue模型。
  5. worker_connections 65535;
  6. # 单个进程最大连接数(最大连接数 = 连接数 * 进程数)
  7. }

worker_connections 设置可由一个 worker 进程同时打开的最大连接数。如果设置了上面提到的 worker_rlimit_nofile,我们可以将这个值设得很高。但同时最大客户数也由系统的 socket 限制。所以设置的过高没有太大的实际意义。

剩余的配置

  1. client_header_buffer_size 4k;
  2. # 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过 1k,不过由于一般系统分页都要大于 1k,所以这里设置为分页大小。分页大小可以用命令 getconf PAGESIZE 取得。
  3. open_file_cache max=102400 inactive=20s;
  4. # 这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
  5. # P.S. 这一点很关键,除非你遇到客户端刷新问题,否则不要拒绝缓存机制,这在性能优化里是非常有用的。
  6. open_file_cache_valid 30s;
  7. # 这个是指多长时间检查一次缓存的有效信息。
  8. open_file_cache_min_uses 1;
  9. # open_file_cache 指令中的 inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在 inactive 时间内一次没被使用,它将被移除。

关于内核参数的优化

  1. net.ipv4.tcp_max_tw_buckets = 6000
  2. # timewait 的数量,默认是 180000。(Deven:因此如果想把 timewait 降下了就要把 tcp_max_tw_buckets 值减小)
  3. # 启用 timewait 快速回收。
  4. net.ipv4.tcp_tw_reuse = 1
  5. net.ipv4.tcp_syncookies = 1
  6. # 开启 SYN Cookies,当出现 SYN 等待队列溢出时,启用 cookies 来处理。
  7. net.core.somaxconn = 262144
  8. # web 应用中 listen 函数的 backlog 默认会给我们内核参数的 net.core.somaxconn 限制到 128,而 nginx 定义的 NGX_LISTEN_BACKLOG 默认为 511,所以有必要调整这个值。

使用监控

学会使用监控可以有效直接地观察你的 nginx。

诸如 Nagios,Zabbix,Munin 的网络监控软件是支持 nginx 监控的。

建议使用一个叫做 ngxtop 的命令行工具,ngxtop 从界面到命名都借鉴了著名的 top 命令。ngxtop 是通过分析 nginx 或者其他的日志文件,使用类似 top 命令的界面实时展示出来的。

  1. sudo pip install ngxtop

可以使用上面这一条命令安装 ngxtop。(ngxtop 是用 python 编写的)

基本使用方法如下:

  1. ngxtop [options]
  2. ngxtop [options] (print|top|avg|sum) <var>
  3. ngxtop info

这里是一些通用选项。

  • -l : 指定日志文件的完整路径 (Nginx 或 Apache2)
  • -f : 日志格式
  • --no-follow: 处理当前已经写入的日志文件,而不是实时处理新添加到日志文件的日志
  • -t : 更新频率
  • -n : 显示行号
  • -o : 排序规则(默认是访问计数)
  • -a ..., --a ...: 添加表达式(一般是聚合表达式如: sum, avg, min, max 等)到输出中。
  • -v: 输出详细信息
  • -i : 只处理符合规则的记录

以下是一些内置变量:

  • bodybytessend
  • http_referer
  • httpuseragent
  • remote_addr
  • remote_user
  • request
  • status
  • time_local

例如:

列出最频繁的 20 个请求:

  1. ngxtop -n 20

获取 nginx 基本信息:

  1. ngxtop info

显示请求最多的客户端 IP 地址

  1. ngxtop top remote_addr

显示状态码是 404 的请求

  1. ngxtop -i 'status == 404' print request status

 

希望本文能给大家带来帮助。

如果我的文章对您有帮助,请我喝杯咖啡吧~

支付宝转账打赏⬆️

微信钱包转账打赏⬆️

目前评论:1   其中:访客  1   博主  0

  1. http://winwhy.com 0

    把我的祝福
    http://winwhy.com http://winwhy.com

评论加载中...

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: