[译] 战前准备,Nginx优化指南

    原文地址:http://blog.zachorr.com/nginx-setup/

    ———————————————————————-

    大多数Nginx的安装指南告诉你基础信息 —— apt-get 一个包,这里那里的修改几行,这样 你就得到了一个web 服务器!并且,在大多数的情况下,这样傻瓜式安装的Nginx 可以很好的为你的站点工作。但是,如果你真的想压榨出Nginx的性能,你将不得不一步一步慢慢来。在这个指南中,我将说明如何对Nginx的参数进行微调能更好的应付较大的访问量。仅仅是一个说明,这不是一个全面的微调综合指南。它是对调整一些设置能提交的性能的一些说明。你的水平可能不同(读者水平参差不齐)。

基础(优化)配置

    你只需要修改你的Nginx配置文件 nginx.conf,这里有全部的nginx的不同模块的设置项。你应该能够你的服务器的 /etc/nginx 目录下找到nginx.conf。首先,我将告诉你一些全局设置,然后在讨论各个模块的设置,谈论哪些设置能为大的访问量提供最佳性能,和为什么他们能有更好的性能,在文章的末尾你可以找到一个完整的配置文件。

顶级配置

    Nginx的nginx.conf配置文件中有少数几个配置选项,在其他模块配置之上。

user www-data;

pid /var/run/nginx.pid;

worker_processes auto;

worker_rlimit_nofile 100000;

    userpid 都应该使用默认设置。我们不用修改,他不会为我们的性能用户做什么。

    worker_processes 定义的是nginx为你的站点提供服务时可以启用的worker进程的数量。这个配置的最优值取决与很多的因素,包括(但不仅限于)CPU的核心数量,数据硬盘的数量以及负载模式。当你不确定的时候,将它设置为CPU的核心数是一个不错的开始(如果这个值是“auto”nginx将尝试自动检测)。

    worker_rlimit_nofile 更改这个限制,可以更改worder进程最大的文件打开数。如果没有设置,将使用操作系统的限制值。设置后你的系统和nginx能处理比 “ulimit -n” 更多的文件。所以我们要将这个值设置的高一些,这样nginx就再也不会出现 “too many open files” 的issue了。确保你的操作系统也更新了这些值。

Events模块

events模块中包含nginx所有处理链接的设置。

events {
    worker_connections 2048;

    multi_accept on;

    use epoll;
}

 

    worker_connections 设置了一个进程可以打开的最大并发链接数。如果你设置了上面提到的的提到的worker_rlimit_nofile我们就可以安全的将这个值设置的很高。

    multi_accept 告诉nginx收到一个新链接的通知后尽可能多的接收链接。(我不是很理解什么意思唉。。)

    use 设置可复用的客户端线程的轮询方式。如果你用的是Linux 2.6+,你应该设置为:epoll。如果你用的是*BSD,你应该设置为:kqueue。另外如果你没有设置这个参数,nginx将自动为你选择。想要知道更多的关于事件轮询?(去看一下维基百科吧。注意,想了解一切的话可能需要neckbeard和操作系统的课程基础。)

HTTP模块

    HTTP模块控制所有Nginx的http请求处理的核心功能。因为在这里有想当多的设置,所以我们只选择其中的一个部分。所有的设置都应该包含在HTTP模块当中,尽管他不会特别的突出这一小段。

http {

    sendfile on;

    tcp_nopush on;
    tcp_nodelay on;

    ...
}

 

    sendfile 允许使用sendfile()函数。sendfile() 复制数据在磁盘和TCP socket之间(或者是任意两个文件描述符)。Pre-sendfile,在拷贝数据之前,向用户空间申请数据缓冲区。之后将使用read()将文件数据拷贝到这个缓冲区。并且使用write()将缓冲区中的内如写入网络。sendfile()立即从磁盘读取数据写入到系统内存。因为这个拷贝在内核中完成,因此sendfile()要比组合使用read()和write() 以及 切换上下文内容/丢弃缓存更加高效。(阅读更多关于sendfile

    tcp_nopush 告诉nginx发送所有的头文件在一个包里面,而不是一个一个的发送。

    tcp_nodelay 告诉nginx不要缓存数据而是一段一段的发送数据 —— 需要时发送数据,他应该仅用户发送小而频繁信息而不用立即获相应的应用。

access_log off;

error_log /var/log/nginx/error.log crit;

 

    access_log 告诉nginx是否存储访问日志。关闭这个选择可以减少磁盘IO,增加速度。

    error_log 告诉nginx它应该只记录验证严重的错误。

    keepalive_timeout 20;

    client_header_timeout 20;
    client_body_timeout 20;

    reset_timedout_connection on;

    send_timeout 20;

    keepalive_timeout 给客户端分配 keep-alive 链接的超时时间。在超过这个时间之后服务器将关闭链接。我们将这个值设置的低一些,可以让nginx工作更长时间。

    client_header_timeout 和 client_body_timeout 设置请求头和请求内容各自的超时时间,我们把它设置的尽量低些。

    reset_timedout_connection 告诉nginx关闭不响应的客户端链接,他将清空与这个客户端相关连的内存。

    send_timeout 指定客户端的相应超时时间。这个超时并不会应用与整个转发器(entire transfer),而是在两次紧邻的客户端读取操作之间。如果客户端超过这个时间还没有读取数据,那么nginx将会关闭这个链接。

include /etc/nginx/mime.types;

default_type text/html;

charset UTF-8;

 

    include 这只是一个在当前文件中包含另一个文件内容的指令,在这里,我们用它来加载一个MIME类型的列表,方便以后使用。

    default_type 设置文件默认使用的MIME类型

    charset 设置我们头中默认的字符集

    以下两点设置对于定能的提升在伟大的  WebMasters StackExchange 中有解释。

gzip on;
    
# gzip_static on; gzip_proxied any;

gzip_min_length 256;
    
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 告诉nginx发送数据的时候使用gzip压缩数据。这样我们可以减少发送的数据量。

    gzip_static 告诉nginx在使用gzip压缩之前先查找具有相同名字的已经预压缩的资源。这就要求你需要预压缩你的文件。(这个选项被注释掉了),但是允许你使用高压所率并且nginx不再压缩这些文件。(阅读更多关于 gzip_static

    gzip_proxied 允许/禁止 响应的压缩基于请求或者相应。我们将它设置成 any ,因此将压缩所有的请求。

    gzip_min_length 设置应用gzip压缩的最小字节数。如果一个请求在1000字节以下,我们将不麻烦gzip压缩它,因为用gzip压缩这些数据会使处理请求的整个过程慢下来。

    gzip_comp_level 设置对我们数据的压缩等级。这个等级能被设置在1-9之间,9级压缩的最慢但是压缩率最高。我们将它设置为4,这是一个不错折中方案。

    gzip_types 设置需要gzip压缩的的数据类型。上面已经有一些了,你还可以添加更多。

    # 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 打开缓存同时也设置最大缓存数目以及缓存的时间。我们将设置一个相对比较大的值,并且我们可以在缓存处于非活动状态20s后清除它。

    open_file_cache_valid 指定 open_file_cache 中信息有效性的时间间隔。

    open_file_cache_min_uses 定义了 open_file_cache 中指令参数非活动状态的下最小的文件数。

    open_file_cache_errors 指定当搜索文件的时候是否缓存错误信息。它包括再次给配置文件中添加文件。我们引入我们的服务模块,定义在不同的文件中。如果你的服务模块不在那些位置上,你应该修改这一行来指定到正确的位置。

完整的配置文件

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 {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    access_log off;
    error_log /var/log/nginx/error.log crit;

    keepalive_timeout 20;
    client_header_timeout 20;
    client_body_timeout 20;
    reset_timedout_connection on;
    send_timeout 20;

    include /etc/nginx/mime.types;
    default_type text/html;
    charset UTF-8;

    gzip on;
    # gzip_static on;
    gzip_proxied any;
    gzip_min_length 256;
    gzip_comp_level 4;
    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 reload

 

另外:

是的!你的web服务器现在已经准备好了迎战之前困扰你的大量的访客军团。这不是加速你的网站的唯一的方式。我将写更多的文章来来介绍其他的方式加速你的站点。