Nginx配置性能优化

在大多数情况下, 一个常规安装的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