一,优化方向

1)worker_processes 8;

nginx进程数,建议按照cpu数目来指定,一般为它的倍数。


2)worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。


3)worker_rlimit_nofile 102400;

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。


4)use epoll;

使用epoll的I/O模型


5)worker_connections 102400;

每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。


6)keepalive_timeout 60;

keepalive超时时间。


7)client_header_buffer_size 32k;

客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。


8)open_file_cache max=102400 inactive=20s;

这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后***缓存。


9)open_file_cache_valid 30s;

这个是指多长时间检查一次缓存的有效信息。


10)open_file_cache_min_uses 1;

open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。


11)gzip_types

使用gzip对静态文件进行压缩,减少网络带宽,增加传输速率



二,配置文件详解:

#user  www www;
#如果服务器是多cpu的话,可以用如下指令指定nginx工作进程的数量,官方配置一般为server的cpu个数(或cpu核心数)的2倍。它能够把工作负载平均分配到多个处理器上,也能减少进程在磁盘I/O阻塞上的延迟时间。
worker_processes  8;
pid        logs/nginx.pid;
error_log  logs/error.log;
#指定单个worker_process进程能够打开的文件描述符个数,如果并发的请求量过大,单个进程的打开的文件描述符数量大于这个数,就会向客户端返回502错误
worker_rlimit_nofile 10240;

#定义事件机制的指令,使用合适的事件处理机制,从而增加nginx的性能
events {
    #linux的内核版本为2.6以上的,故使用epoll事件模型,它比select模型高效很多。主要表现在:
    1,每个进程能够打开的fd的个数是没有限制的    2,由于网络延迟等原因,任一时间只有部分的socket是"活跃"的,而select/poll每次调用都会线性扫描全部的集合(轮询方式),导致效率呈现线性下降。但是epoll不存在这个问题,它只会对"活跃"的socket进行操作---这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的,如果fd就绪就会通知进程,增加了效率。于是,只有"活跃"的socket才会主动去调用callback函数,其他idle状态的socket则不会。
    use epoll;

    #定义每个worker_process工作进程能够处理的连接数
    worker_connections  10240;
}

http {
    #mime.types文件中定义了web服务器常用的所有MIME类型,也可以通过修改此文件,来自定义类型。MIME TYPE的作用是告诉浏览器所请求的文件媒体类型。
    include       mime.types;
    #此指令用于定义默认的MIME类型,当nginx无法识别文件属于何种MIME类型时,则告诉浏览器此文件类型为“二进制数据类型”
    default_type  application/octet-stream;

    #定义log的格式,可以使用nginx的通用变量和一些只有在写日志时才存在的变量进行定义。根据需要需要定义log的格式,可以从log中获取有用的信息,便于我们分析一些故障和做一些统计工作等。
    log_format  main '"$time_local","$remote_addr","$http_x_forwarded_for","$http_host","$request","$http_referer","$http_user_agent","$upstream_http_x_s_m","$cookiesize","$http_x_sohupassport_userid","$status","$cookie__smuid","$request_time","$body_bytes_sent","$upstream_addr","$upstream_status","$upstream_response_time","$http_accept","$http_q_ua","m-nginx-94"';

    log_format  hz_main  '"[$time_local]","$remote_addr","$http_x_forwarded_for","$http_x_sohupassport_userid","$request","$request_length","$request_time","$body_bytes_sent","$status","$http_referer","$http_user_agent","$uid","$fr","$upstream_addr","$upstream_status","$upstream_response_time","m-nginx-94"';

    ##########如下三行的意思为:    nginx首先调用tcp_cork,阻塞下层的数据发送,然后调用send_file发送数据,然后当前的请求结束,最终会调用tcp_close或者tcp_shutdown(设置linger_timeout)来关闭连接,而当关闭连接(我们的keepalived设置的为0)的同时,内核会将写buf中缓存的数据发送出去,这样,就不需要我们关闭tcp_cork,因为内核会帮我们做这个,于是减少了一次系统调用。
    #启用sendfile()函数。sendfile()是作用于数据拷贝在两个文件描述符之间的操作函数.这个拷贝操作是内核中操作的,所以称为"零拷贝".sendfile函数比起read和write函数高效得多,因为read和write是要把数据拷贝到用户应用层操作.
    sendfile        on;

    #该指令允许或者禁止使用FreeBSD的TCP_NOPUSH,或者是Linux的TCP_CORK套接字,这个仅在sendfile开启的时候才有用。
    tcp_nopush     on;
    #默认情况下数据发送时,内核不会马上发送,会等待较多的字节组成一个数据包,这样能提供IO的发送效率,对于大量数据的传送石非常有益的。但是,如果每次只发送很少字节的程序中,等待时间就会长,由于我们的web服务器一次不会传输大量数据,故禁用内核这个等待功能,会提高nginx传送数据的效率。
    tcp_nodelay on; 
    #设定客户端到服务器端连接的超时时间,对于提供静态内容的网站是非常有用的,但是连接保持不释放也非常消耗nginx服务器的资源。设置为0即表示不启用这个功能,动态网站一般禁用。
    keepalive_timeout  0;

    #开启gzip压缩功能,对用户请求的页面进行压缩处理,以达到节省网络带宽,提高网站速度的作用。
    gzip  on;
    #允许压缩的页面最小字节数。建议值为大于1024字节,小于1K的压缩可能无效果
    gzip_min_length  1000;
    #设置系统获取几个单位的缓存用于存储gzip压缩结果数据流。此设置为:按照原始数据大小以16K为单位的4倍大小申请内存空间。如果不设置的话,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩的结果。
    gzip_buffers     4 16k;
    #指定需要被压缩的文件媒体类型
    gzip_types       text/* text/css text/vnd.wap.wml application/javascript application/x-javascript
    application/xml application/xhtml application/xhtml+xml application/wml application/action;
    #设置压缩比,值为1-9,压缩比最大,处理速度会越慢
    gzip_comp_level  9;
    #nginx做反向代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用压缩
    gzip_proxied     any;
    #识别http协议的版本,只有1.1版本的压缩,因为可能早期的浏览器或http客户端可能不支持gzip压缩
    gzip_http_version 1.1;
    #如果IE1-6的浏览器的gzip压缩,因为他们不支持
    gzip_disable "MSIE [1-6].(?!.*SV1)";
    #gzip_vary的作用是在http响应中增加一行“Vary: Accept-Encoding”,目的是改变反向代理服务器的缓存策略,反向代理服务器会根据后端服务器是否带Vary头采用不同的缓存策略。
    gzip_vary on;
    #设置nginx获取几个单位的缓存空间,用于存放要向客户端发送的数据。此设置为:按照原始数据大小以32K为单位的4倍大小申请内存空间。
    output_buffers   4 32k;
    #当nginx向客户端发送的数据达到1460字节的时候,才向客户端发送数据,提高效率
    postpone_output  1460;
    #设定服务器名称(即server_name指令所设置)哈希表的框大小,值越大能设置的server_name可以越多。参数哈希框大小总是等于哈希表的大小,即处理器高速缓存区(32)的倍数,这将加速处理器中key的搜索速度,减少内存的存取数。
    server_names_hash_bucket_size 128;
    #用于设置客户端请求的Header头缓冲区的大小,一般1kb就够用
    client_header_buffer_size 32k;
    #设置nginx允许接收的客户端请求内容的最大值,及客户端请求Header头信息中设置的Content-Lenth大最大值。如果超出该指令设置的最大值,nginx将返回“Request Entity Too Large”的错误信息(HTTP的413错误码)
    client_max_body_size 8m;
    #设置客户端请求的Header头缓冲区大小,默认为4K。客户端请求行不能超过设置的第一个数,请求的Header头信息不能大于设置的第二个数,否则会报"Request URI too large"(414)或“Bad request”(400)错误。如果客户端的Cookie信息较大,则需增加缓冲区大小
    large_client_header_buffers 4 256k;
    #设置nginx读取客户端请求Header头信息的超时时间,如果超过该指令设置的时间,nginx将返回"Requet time out"错误信息(HTTP的408错误码)
    client_header_timeout  1m;
    #设定nginx读取客户端请求内容的超时时间,如果超过该指令设置的时间,nginx将返回"Request time out"错误信息(HTTP状态码408)
    client_body_timeout    1m;
    #设置发送给客户端的应答超时时间。指两次tcp握手,还没有转为established状态的时间。如果这个时间,客户端没有响应,Nginx则关闭连接
    send_timeout           1m;

    #该指令判断nginx是否会拦截HTTP状态码为400及以上的代码应答。on之后,nginx将会拦截error_page指令明确指定的错误状态码,如果来自被代理服务器的应答状态码不匹配一个error_page指令,应答将被正常发送。
    proxy_intercept_errors on;

    secret    /opt/apps/wcms2_0/conf/secret.key;

    #包含配置文件,并且支持文件名的匹配,例:"include extra/*.conf" 
    include       extra/upstreamA.conf;
    include       extra/upstreamOther.conf;
    include       extra/upstreamTest.conf;
    include       extra/m.sohu.com.conf;
    include       extra/ucweb.m.sohu.com.conf;
    include       extra/a.m.sohu.com.conf;
    include       extra/b.m.sohu.com.conf;
    include       server-status.conf;
    include       extra/uc.m.sohu.com.conf;
    include       extra/hz.m.sohu.com.conf;
    include       extra/2012.m.sohu.com.conf;
}