nginx_01 配置文件

1. worker进程
1.1 worker_processes
    该参数表示启动几个工作进程,建议和本机CPU核数保持一致,每一核CPU处理一个进程。

1.2 worker_connections 建议为10240
    该参数用来配置每个Nginx worker进程最大处理的连接数,这个参数也决定了该Nginx服务器最多能处理多少客户端请求


2. http和tcp连接
2.1 use epoll
    使用epoll模式的事件驱动模型,该模型为Linux系统下最优方式。

2.2 multi_accept on
    使每个worker进程可以同时处理多个客户端请求。

2.3 sendfile on
    使用内核的FD文件传输功能,可以减少user mode和kernel mode的切换,从而提升服务器性能。

2.4 tcp_nopush on
    当tcp_nopush设置为on时,会调用tcp_cork方法进行数据传输。
    使用该方法会产生这样的效果:当应用程序产生数据时,内核不会立马封装包,而是当数据量积累到一定量时才会封装,然后传输。

2.5 tcp_nodelay on
    不缓存data-sends(关闭 Nagle 算法),这个能够提高高频发送小数据报文的实时性。
    (关于Nagle算法)
    【假如需要频繁的发送一些小包数据,比如说1个字节,以IPv4为例的话,则每个包都要附带40字节的头,
    也就是说,总计41个字节的数据里,其中只有1个字节是我们需要的数据。
    为了解决这个问题,出现了Nagle算法。
    它规定:如果包的大小满足MSS,那么可以立即发送,否则数据会被放到缓冲区,等到已经发送的包被确认了之后才能继续发送。
    通过这样的规定,可以降低网络里小包的数量,从而提升网络性能。】

2.6 keepalive_timeout
    定义长连接的超时时间,建议30s,太短或者太长都不一定合适,当然,最好是根据业务自身的情况来动态地调整该参数。

2.7 keepalive_requests
    定义当客户端和服务端处于长连接的情况下,每个客户端最多可以请求多少次,可以设置很大,比如50000

2.8 reset_timeout_connection on
    设置为on的话,当客户端不再向服务端发送请求时,允许服务端关闭该连接。

2.9 client_body_timeout
    客户端如果在该指定时间内没有加载完body数据,则断开连接,单位是秒,默认60,可以设置为10。

2.10 send_timeout
    这个超时时间是发送响应的超时时间,即Nginx服务器向客户端发送了数据包,但客户端一直没有去接收这个数据包。
    如果某个连接超过send_timeout定义的超时时间,那么Nginx将会关闭这个连接。单位是秒,可以设置为3。

2.11 server_tokens off
    隐藏响应头中的有关操作系统和web server(Nginx)版本号的信息,这样对于安全性是有好处的。


3. buffer和cache(以下配置都是针对单个请求)
3.1 client_body_buffer_size
    当客户端以POST方法提交一些数据到服务端时,会先写入到client_body_buffer中,如果buffer写满会写到临时文件里,建议调整为128k。

3.2 client_max_body_size
    浏览器在发送含有较大HTTP body的请求时,其头部会有一个Content-Length字段,client_max_body_size是用来限制Content-Length所示值的大小的。
    这个限制body的配置不用等Nginx接收完所有的HTTP包体,就可以告诉用户请求过大不被接受。会返回413状态码。
    例如,用户试图上传一个1GB的文件,Nginx在收完包头后,发现Content-Length超过client_max_body_size定义的值,
    就直接发送413(Request Entity Too Large)响应给客户端, 将该数值设置为0,则禁用限制,建议设置为10m。

3.3 client_header_buffer_size
    设置客户端header的buffer大小,建议4k。

3.4 large_client_header_buffers
    对于比较大的header(超过client_header_buffer_size)将会使用该部分buffer,两个数值,第一个是个数,第二个是每个buffer的大小。
    建议设置为4 8k

3.5 open_file_cache
    该参数会对以下信息进行缓存:
        打开文件描述符的文件大小和修改时间信息;
        存在的目录信息;
        搜索文件的错误信息(文件不存在无权限读取等信息)。
        格式:open_file_cache max=size inactive=time;
        max设定缓存文件的数量,inactive设定经过多长时间文件没被请求后删除缓存。
        建议设置 open_file_cache max=102400 inactive=20s;

3.6 open_file_cache_valid
    指多长时间检查一次缓存的有效信息。建议设置为30s。

3.7 open_file_cache_min_uses
    open_file_cache指令中的inactive参数时间内文件的最少使用次数,
    如,将该参数设置为1,则表示,如果文件在inactive时间内一次都没被使用,它将被移除, 建议设置为2。


4. 压缩 对于纯文本的内容,Nginx是可以使用gzip压缩的。使用压缩技术可以减少对带宽的消耗, 由ngx_http_gzip_module模块支持
    gzip on; //开启gzip功能
    gzip_http_version 1.1 表示只对 HTTP 1.1 版本的协议进行压缩;
    gzip_min_length 1024; //设置请求资源超过该数值才进行压缩,单位字节
    gzip_buffers 16 8k; //设置压缩使用的buffer大小,第一个数字为数量,第二个为每个buffer的大小
    gzip_comp_level 6; //设置压缩级别,范围1-9,9压缩级别最高,也最耗费CPU资源
    gzip_proxied any // 代表 Nginx 作为反向代理时依据后端服务器时返回信息设置一些 gzip 压缩策略;
    gzip_vary on // 表示是否发送 Vary:Accept_Encoding 响应头字段,实现通知接收方服务端作了 gzip 压缩;
    gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //指定哪些类型的文件需要压缩
    gzip_disable "MSIE 6\."; //IE6浏览器不启用压缩

5. 静态文件缓存
    对于静态文件,需要设置一个过期时间,这样可以让这些资源缓存到客户端浏览器,
    在缓存未失效前,客户端不再向服务期请求相同的资源,从而节省带宽和资源消耗。

    示例:
    location ~* ^.+\.(gif|jpg|png|css|js)$ {
      expires 1d; //1d表示1天,也可以用24h表示一天。
    }

6. 代理配置服务器 参数
    Nginx绝大多数情况下都是作为代理或者负载均衡的角色。

  http
  {
      proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g;
      ...;

      server {
          proxy_buffering on;
          proxy_buffer_size 4k;
          proxy_buffers 2 4k;
          proxy_busy_buffers_size 4k;
          proxy_temp_path /tmp/nginx_proxy_tmp 1 2;
          proxy_max_temp_file_size 20M;
          proxy_temp_file_write_size 8k;

          location /
          {
              proxy_cache my_zone;
              ...;
          }
      }
  }

7. SSL优化
    适当减少worker_processes数量,因为ssl功能需要使用CPU的计算。
    使用长连接,因为每次建立ssl会话,都会耗费一定的资源(加密、解密)
    开启ssl缓存,简化服务端和客户端的“握手”过程。

    ssl_session_cache   shared:SSL:10m; //缓存为10M
    ssl_session_timeout 10m; //会话超时时间为10分钟

8. 关于 epoll
    pass

9. 配置变量 与 正则
    $uri:当前请求的uri,不带参数
    $request_uri:请求的uri,带完整参数
    $host:http请求报文中host首部;如果请求中没有host首部,则以处理此请求的主机的主机名代替
    $hostname:nginx服务运行所在主机的主机名
    $remote_addr:客户端IP
    $remote_port: 客户端port
    $remote_user:使用用户认证时客户端用户输入的用户名
    $request_filename:用户请求中的URI经过本地root或alias转换后映射的本地的文件路径
    $request_method:请求方法
    $server_addr:服务器地址
    $server_name: 服务器名称
    $server_port:服务器端口
    $server_protocol:服务器向客户端发送响应时的协议,如http/1.1,http/1.0
    $scheme:在请求中使用的scheme 映射协议本身的协议
    $http_HEADER:匹配请求报文中指定的HEADER,$http_host匹配请求报文中的host首部
    $sent_http_HEADER:匹配响应报文中指定的HERDER,例如$http_content_type匹配相应报文中的content-type首部
    $document_root:当前请求映射到的root配置

10. 正则
    正则表达式匹配:
        ==: 等值比较;
        ~:与指定正则表达式模式匹配时返回"真",判断匹配与否时区分字符大小写;
        ~*:与指定正则表达式模式匹配时返回"真",判断匹配与否时不区分字符大小写;
        !~:与指定正则表达式模式不匹配时返回"真",判断匹配与否时区分字符大小写;
        !~*:与指定正则表达式模式不匹配时返回"真",判断匹配与否时不区分字符大小写;

    文件及目录匹配判断:
        -f, !-f:判断指定的路径是否为存在且为文件;
        -d, !-d:判断指定的路径是否为存在且为目录;
        -e, !-e:判断指定的路径是否存在,文件或目录均可;
        -x, !-x:判断指定路径的文件是否存在且可执行;

11. 简单模板
]# cat /usr/local/nginx/conf/nginx.conf
    user   www www;
    worker_processes 8;
    worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;
    error_log   /www/log/nginx_error.log   crit;
    pid         /usr/local/nginx/nginx.pid;
    worker_rlimit_nofile 65535;

    events
    {
       use epoll;
       worker_connections 65535;
    }

    http
    {
       include       mime.types;
       default_type   application/octet-stream;

       charset   utf-8;

       server_names_hash_bucket_size 128;
       client_header_buffer_size 2k;
       large_client_header_buffers 4 4k;
       client_max_body_size 8m;

       sendfile on;
       tcp_nopush     on;

       keepalive_timeout 60;

       fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
                     keys_zone=TEST:10m
                     inactive=5m;
       fastcgi_connect_timeout 300;
       fastcgi_send_timeout 300;
       fastcgi_read_timeout 300;
       fastcgi_buffer_size 16k;
       fastcgi_buffers 16 16k;
       fastcgi_busy_buffers_size 16k;
       fastcgi_temp_file_write_size 16k;
       fastcgi_cache TEST;
       fastcgi_cache_valid 200 302 1h;
       fastcgi_cache_valid 301 1d;
       fastcgi_cache_valid any 1m;
       fastcgi_cache_min_uses 1;
       fastcgi_cache_use_stale error timeout invalid_header http_500;
       open_file_cache max=204800 inactive=20s;
       open_file_cache_min_uses 1;
       open_file_cache_valid 30s;

       tcp_nodelay on;

       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
       {
         listen       8080;
         server_name   huan.wangshibo.com;
         index index.php index.htm;
         root   /www/html/;

         location /status
         {
             stub_status on;
         }

         location ~ .*\.(php|php5)?$
         {
             fastcgi_pass 127.0.0.1:9000;
             fastcgi_index index.php;
             include fcgi.conf;
         }

         location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
         {
           expires       30d;
         }

         log_format   access   '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" $http_x_forwarded_for';
         access_log   /www/log/access.log   access;
           }
    }