Nginx配置性能优化
Published: 2016-07-16 Updated: 2016-08-12
在大多数情况下, 一个常规安装的Nginx已经可以满足大部分的需求了. 然而如果你想压榨出Nginx的所有性能, 就需要了解哪些指令会影响Nginx性能, 这里将会简单粗暴的方法来提升Nginx的性能, 可能不会去深入解释各个配置项之间的联系. 经过一系列的网上搜索资料和测试, 我大概整理了一些能够提升Nginx性能的方法和参数, 这里写出来供大家参考.
默认配置 这里先贴出Nginx安装完的默认配置, 方便到时候做对比
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes 1; error_log /var/log/nginx/error.log; #error_log /var/log/nginx/error.log notice; #error_log /var/log/nginx/error.log info; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; index index.html index.htm; server { listen 80; server_name localhost; root /usr/share/nginx/html; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { } # redirect server error pages to the static page /40x.html # error_page 404 /404.html; location = /40x.html { } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # root html; # location / { # } #} # HTTPS server # #server { # listen 443; # server_name localhost; # root html; # ssl on; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_timeout 5m; # ssl_protocols SSLv2 SSLv3 TLSv1; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # } #} }
优化后的配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 # 运行用户 user www www; # 启动进程, 通常设置成和cpu的数量相等 worker_processes 4; # 记录最少的错误信息, 节省磁盘IO上的损耗 error_log /var/log/nginx/error.log crit; pid /var/run/nginx.pid; # 指定最大可打开文件个是, 这里直接设置成系统最大文件打开数 worker_rlimit_nofile 65535; events{ # epoll是多路复用IO(I/O Multiplexing)中的一种方式, # 仅用于linux2.6以上内核,可以大大提高nginx的性能 # 这个也是Windows系统上是用Nginx就是渣渣的原因, Windows不支持epoll模式 use epoll; #单个后台worker process进程的最大并发链接数 # 这里照样设置成系统最大文件打开数 worker_connections 65535; } # 前排说明: 经测试http中的配置, 貌似并没有对提升Nginx性能有多大帮助 # 这里建议还是使用默认值吧, 不过我这里仍然把收集到的一些信息列出来, 方便有心人查阅 http { # 设定mime类型,类型由mime.type文件定义 include mime.types; default_type application/octet-stream; # 设定日志格式 log_format '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件, #对于普通应用,必须设为 on, #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off, #以平衡磁盘与网络I/O处理速度,降低系统的uptime. sendfile on; # 告诉nginx不要缓存数据, 而是一段一段的发送--当需要及时发送数据时, 就应该给应用设置这个属性, 这样发送一小块数据信息时就不能立即得到返回值 tcp_nodelay on; # 设定请求缓冲 # 这里的配置比较接近默认配置 # 如果你内存紧张的话可以大大削减这里buffer的大小 server_names_hash_bucket_size 128; # 用于设置客户端请求的Header头缓冲区大小, 一般4KB大小足够了 # 没记错的话默认值好像是1k client_header_buffer_size 32k; # nginx默认会用client_header_buffer_size这个buffer来读取header值 large_client_header_buffers 4 32k; # 设置客户端能够上传的文件大小, 默认为1m client_max_body_size 8m; # 连接超时时间 keepalive_timeout 60; # fastcgi相关配置 # 指定同FastCGI服务器的连接超时时间 fastcgi_connect_timeout 300; # 指令为上游服务器设置等待一个FastCGI进程的传送数据时间,如果有一些直到它们运行完才有输出的长时间运行的FastCGI进程,那么可以修改这个值,如果你在上有服务器的error log里面发现一些超时错误,那么可以恰当的增加这个值。 # 指令指定请求服务器的超时时间,指完成了2次握手的连接,而不是完整的连接,如果在这期间客户端没有进行数据传递,那么服务器将关闭这个连接。 # 在Nginx+FastCGI 配置测试中, 其中在request_terminate_timeout设置为永不超时的情况下,nginx中fastcgi_read_timeout 的设置时间将影响到最终的超时时间。 fastcgi_send_timeout 300; # 前端FastCGI服务器的响应超时时间,如果有一些直到它们运行完才有输出的长时间运行的FastCGI进程,或者在错误日志中出现前端服务器响应超时错误,可能需要调整这个值。 fastcgi_read_timeout 300; # 读取fastcgi应答第一部分需要多大缓冲区,该值表示使用1个64kb的缓冲区读取应答第一部分(应答头),可以设置为fastcgi_buffers选项缓冲区大小 fastcgi_buffer_size 64k; # 指定本地需要多少和多大的缓冲区来缓冲fastcgi应答请求,假设一个php或java脚本所产生页面大小为256kb,那么会为其分配4个64kb的缓冲来缓存;若页面大于256kb,那么大于的256kb的部分会缓存到fastcgi_temp指定路径中,这并非是个好办法,内存数据处理快于硬盘,一般该值应该为站点中php/java脚本所产生页面大小中间值,如果站点大部分脚本所产生的页面大小为256kb,那么可把值设置为16 16k,4 64k等 fastcgi_buffers 4 64k; # 默认为fastcgi_buffer的2倍 fastcgi_busy_buffers_size 128k; # 开启压缩 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配置文件 include /etc/nginx/conf.d/*.conf; }
总结 经过一系列的测试发现, 如果只是把Nginx当做普通的web server使用, 默认的配置基本就能满足当前的使用了, 然后就是把worker_rlimit_nofile
, worker_connections
的值根据系统配置进行相应的调整(PS: 我这里比较暴力, 直接开到了最大), 基本就能把性能调到最佳了. 然后就是FastCGI
进程的问题里, 这个到时候另起一篇文章讲. OK, 完美
参考资料 http://linux008.blog.51cto.com/2837805/547236 http://www.nginx.cn/76.html https://mos.meituan.com/library/30/how-to-optimize-nginx/ http://www.linuxidc.com/Linux/2014-10/108012.htm http://www.2cto.com/os/201407/316653.html