nginx配置性能优化
大多数的Nginx安装指南告诉你例如以下基础知识——通过apt-get安装。改动这里或那里的几行配置。好了,你已经有了一个Webserver了。并且,在大多数情况下,一个常规安装的nginx对你的站点来说已经能非常好地工作了。
然而。假设你真的想挤压出Nginx的性能。你必须更深入一些。
在本指南中。我将解释Nginx的那些设置能够微调。以优化处理大量client时的性能。
须要注意一点,这不是一个全面的微调指南。这是一个简单的预览——那些能够通过微调来提高性能设置的概述。你的情况可能不同。
主要的 (优化过的)配置
我们将改动的唯一文件是nginx.conf,当中包括Nginx不同模块的全部设置。
你应该可以在server的/etc/nginx文件夹中找到nginx.conf。
首先,我们将谈论一些全局设置,然后按文件里的模块挨个来。谈一下哪些设置可以让你在大量client訪问时拥有良好的性能,为什么它们会提高性能。本文的结尾有一个完整的配置文件。
高层的配置
nginx.conf文件里,Nginx中有少数的几个高级配置在模块部分之上。
-
user
www-data; -
pid
/var/run/nginx.pid; -
worker_processes
auto; -
worker_rlimit_nofile
100000;
user和pid应该按默认设置 - 我们不会更改这些内容。由于更改与否没有什么不同。
worker_processes
最优值取决于很多因素。包含(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式。
不能确定的时候,将其设置为可用的CPU内核数将是一个好的開始(设置为“auto”将尝试自己主动检測它)。
worker_rlimit_nofile
Events模块
events模块中包括nginx中全部处理连接的设置。
-
events
{ -
worker_connections
2048; -
multi_accept
on; -
use
epoll; -
}
worker_connections
记住,最大客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么优点。
multi_accept
use
(值得注意的是假设你不知道Nginx该使用哪种轮询方法的话,它会选择一个最适合你操作系统的)
HTTP 模块
HTTP模块控制着nginx http处理的全部核心特性。由于这里仅仅有非常少的配置,所以我们仅仅节选配置的一小部分。全部这些设置都应该在http模块中,甚至你不会特别的注意到这段设置。
-
http
{ -
server_tokens
off; -
sendfile
on; -
tcp_nopush
on; -
tcp_nodelay
on; -
...
-
}
server_tokens
sendfile
sendfile()能够在磁盘和TCP socket之间互相拷贝数据(或随意两个文件描写叙述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件复制到这个缓冲区,write()将缓冲区数据写入网络。
sendfile()是马上将数据从磁盘读到OS缓存。由于这样的拷贝是在内核完毕的。sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(很多其它有关于sendfile)。
tcp_nopush
tcp_nodelay
-
access_log
off; -
error_log
/var/log/nginx/error.log crit;
access_log
关闭这个选项能够让读取磁盘IO操作更快(aka,YOLO)
error_log
-
keepalive_timeout
10; -
client_header_timeout
10; -
client_body_timeout
10; -
reset_timedout_connection
on; -
send_timeout
10;
keepalive_timeout
client_header_timeout 和client_body_timeout
我们也能够把这个设置低些。
reset_timeout_connection
send_timeout
这个设置不会用于整个转发器,而是在两次client读取操作之间。假设在这段时间内。client没有读取不论什么数据,nginx就会关闭连接。
-
limit_conn_zone
$binary_remote_addr zone=addr:5m; -
limit_conn
addr 100;
limit_conn_zone
limit_conn
-
include
/etc/nginx/mime.types; -
default_type
text/html; -
charset
UTF-8;
include
default_type
charset
-
gzip
on; -
gzip_disable
"msie6"; -
#
gzip_static on; -
gzip_proxied
any; -
gzip_min_length
1000; -
gzip_comp_level
4; -
gzip_types
text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip
gzip_disable
gzip_static
这要求你预先压缩你的文件(在这个样例中被凝视掉了)。从而同意你使用最高压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。
gzip_proxied
gzip_min_length
gzip_comp_level
gzip_type
-
#
cache informations about file descriptors, frequently accessed files -
#
can boost performance, but you need to test those values -
open_file_cache
max=100000 inactive=20s; -
open_file_cache_valid
30s; -
open_file_cache_min_uses
2; -
open_file_cache_errors
on; -
##
-
#
Virtual Host Configs -
#
aka our settings for specific servers -
##
-
include
/etc/nginx/conf.d/*.conf; -
include
/etc/nginx/sites-enabled/*;
open_file_cache
open_file_cache_valid
open_file_cache_min_uses
open_file_cache_errors
我们也包含了server模块。这些是在不同文件里定义的。假设你的server模块不在这些位置。你就得改动这一行来指定正确的位置。
一个完整的配置
-
user
www-data; -
pid
/var/run/nginx.pid; -
worker_processes
auto; -
worker_rlimit_nofile
100000; -
events
{ -
worker_connections
2048; -
multi_accept
on; -
use
epoll; -
}
-
http
{ -
server_tokens
off; -
sendfile
on; -
tcp_nopush
on; -
tcp_nodelay
on; -
access_log
off; -
error_log
/var/log/nginx/error.log crit; -
keepalive_timeout
10; -
client_header_timeout
10; -
client_body_timeout
10; -
reset_timedout_connection
on; -
send_timeout
10; -
limit_conn_zone
$binary_remote_addr zone=addr:5m; -
limit_conn
addr 100; -
include
/etc/nginx/mime.types; -
default_type
text/html; -
charset
UTF-8; -
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; -
open_file_cache
max=100000 inactive=20s; -
open_file_cache_valid
30s; -
open_file_cache_min_uses
2; -
open_file_cache_errors
on; -
include
/etc/nginx/conf.d/*.conf; -
include
/etc/nginx/sites-enabled/*; -
}
编辑完配置后,确认重新启动nginx使设置生效。
-
sudo
service nginx restart