nginx配置文件详解(1.8.1)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx配置文件详解(1.8.1)相关的知识,希望对你有一定的参考价值。

全局区:

user nginx nginx; #nginx的用户,和用户组

worker_processes 1; #工作进程个数等于逻辑cpu个数

error_log logs/error.log notice; #错误日志的存放路径,及等级[debug|info|warn|error|crit]

pid logs/nginx.pid;

worker_rlimit_nofile 204800;

#指定进程可以打开的最大描述符

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文

件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。 

现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。

这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。

events {
    use epoll;   //使用网络IO模型,Linux系统采用epoll,freebsd采用kqueue
    worker_connections  65535;  //最大连接数
}


http {
    server_tokens off; #隐藏nginx的版本
    include       mime.types; #设定mime类型,由mime.types文件定义  

    default_type  application/octet-stream;

    #default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置php环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。   

    server_names_hash_bucket_size 128;

#不能带单位!配置个主机时必须设置该值,否则无法运行Nginx或测试时不通过,该设置与server_names_hash_max_size 共同控制保存服务器名的HASH表,hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。若hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。若报出hash max size 或 hash bucket size的提示,则我们需要增加server_names_hash_max_size的值。

    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  logs/access.log  main;


    keepalive_timeout  65; #连接超时时间

     tcp_nodelay     on;  #打开TCP_NODELAY在包含 了keepalive才有 效



    gzip  on; #打开GZIP压缩,实时压缩输 出数据流

    gzip_min_length 1k; #文件大于1K就进行压缩
    gzip_buffers  4 16k; #设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间    

    gzip_http_version 1.0;

     #用于识别http协议的版本,早期的浏览器不支持gzip压缩,用户会看到乱码,

     所以为了支持前期版本加了此选项,目前此项基本可以忽略

    gzip_comp_level 2;

#一般来说gzip_comp_level的值不会在性能方面有多大的差别,设为为4-5即可。 一味的增加它是没有意义的只是浪费的CPU的周期。

#设置gzip压缩等级,等级越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大.等级是1-9

    gzip_types text/plain application/x-javascript text/css  application/xml;
    gzip_vary on;

#和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩

    client_header_buffer_size 4k; 客户端请求头部的缓冲区大小,根据系统分页大小来设置.

    #一般一个请求头的大小都不会超过1k,由于一般系统分业都要大于4K,所以这里设置为

    分页的大小4k,分页大小可以用getconf PAGESIZE这个命令来获得 

    large_client_header_buffers 4 128k;

     #4为个 数,128k为大 小,默认是4k。申请4个128k。当http 的URI太长或者request header过大时 会报414 Request URI too  large或400  bad request,这是很有可能是cookie中写入的值太大造成的,因为header中的其 他参数的size一般 比较固定,只有cookie可能 被写入较大的数据,这时可以调大上述两个值,相应的浏览器中cookie的字 节数上限会增大。

 


    client_max_body_size 300M; #设置nginx上传文件的大小

    open_file_cache max=65535 inactive=60s;

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

    sendfile        on; #打开系统sendfile()函数的支持

    tcp_nopush      on;

    #此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用

}



location / {

root html;

index index.html index.htm;

auth_basic "nginx"; //提示和httpd.conf中的authNam字段是一样的意思.

auth_basic_user_file password;//放置用户名:和密码的文件   htpasswd -c password tom

                                                                                           输入两个密码就行了.

}

#server中有以下参数

1.down 表示单前的server暂时不参与负载

2.weight 默认为1.weight越大,负载的权重就越大。

3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

4.fail_timeout:max_fails次失败后,暂停的时间。

5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。


proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=staticfilecache:80m inactive=1d max_size=2500m;

##设置缓存目录为二级目录,共享内存区大小,非活动时间,最大容量,注意临时目录要跟缓存目录在同一个分区。

proxy_temp_path /tmp/nginx/proxy;

##设置临时目录

proxy_connect_timeout 300;

#nginx跟后端服务器连接超时时间(代理连接超时)

proxy_read_timeout 120;

#连接成功后,后端服务器响应时间。

proxy_send_timeout 120;

#后端服务器数据回传时间



proxy_buffering on;

#该指令开启从后端被代理服务器的响应内容缓冲.

#如果缓冲区开启,nginx假定被代理的后端服务器会以最快速度响应,并把内容保存在由指令proxy_buffer_size 和 proxy_buffers指定的缓冲区里边.

#如果响应内容无法放在内存里边,那么部分内容会被写到磁盘上。

#如果缓冲区被关闭了,那么响应内容会按照获取内容的多少立刻同步传送到客户端。

#nginx不尝试计算被代理服务器整个响应内容的大小,nginx能从服务器接受的最大数据,是由指令proxy_buffer_size指定的.

#对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作

proxy_buffer_size 4k;

#设置代理服务器保存用户头信息的缓冲区大小。

#该指令设置缓冲区大小,从代理后端服务器取得的第一部分的响应内容,会放到这里.

#小的响应header通常位于这部分响应内容里边.

#默认来说,该缓冲区大小等于指令 proxy_buffers所设置的;但是,你可以把它设置得更小.

proxy_buffers 8 4k;

#该指令设置缓冲区的大小和数量,从被代理的后端服务器取得的响应内容,会放置到这里. 默认情况下,一个缓冲区的大小等于内存页面大小,可能是4K也可能是8K,这取决于平台。内存页面大小可以用getconf PAGESIZE命令获取。

proxy_temp_file_write_size 64k;

#设定缓存文件夹大小,大于这个值,将从upstream服务器传送。

proxy_busy_buffers_size 16k;

#高负载下缓冲大小。proxy_busy_buffers_size是用来控制同时传输到客户端的buffer数量的.

#http://blog.sina.com.cn/s/blog_5410860001011fq1.html

####


autoindex on;

# 防止目录浏览,应该也可以用在server中。

include /etc/nginx/conf.d/*.conf;

}


conf.d下的配置文件

upstream test{

server 192.168.0.1:3000;

server 192.168.0.2:3000;

}

#轮询检查,每个请求按时间顺序逐一分配到不同的后端服务器 ,如果后端服务器down掉,能自动剔除。


upstream www.a.com{

server 10.1.230.215:80 weight=2 max_fails=3 fail_timeout=20s;

server 10.1.230.216:80 weight=2 max_fails=3 fail_timeout=20s;

server 10.1.230.217:80 weight=2 max_fails=3 fail_timeout=20s;

server 10.1.230.218:80 backup;

keepalive 32;

#做反向代理时很有用。设置保存的最大连接数。这样可以减少不必要的连接建立时间。从而减小网络之间的流量

check interval=3000 rise=2 fall=5 timeout=1000;

#需要nginx_upstream_check_module模块支持

#interval检测时间间隔单位是毫秒

#rise请求2次正常的话,标记为up

#fall表示请求5次都失败,标记为down

#timeout表示超时时间单位是毫秒

#前段nginx做反代,如果后端服务器宕掉的话,nginx是不能把这台realserver提出upstream的,所以还会有请求转发到后端的这台realserver上面去,虽然nginx可以在localtion中启用proxy_next_upstream来解决返回给用户的错误页面,方法在:http://www.linuxyan.com/web-server/67.html,大家可以参考一下,但这个还是会把请求转发给这台服务器的,然后再转发给别的服务器,这样就浪费了一次转发,这次借助与淘宝技术团队开发的nginx模快nginx_upstream_check_module来检测后方realserver的健康状态,如果后端服务器不可用,则所以的请求不转发到这台服务器。

#http://www.linuxyan.com/web-server/90.html

}

#weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

#server中有以下参数

1.down 表示单前的server暂时不参与负载

2.weight 默认为1.weight越大,负载的权重就越大。

3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

4.fail_timeout:max_fails次失败后,暂停的时间。

5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。


upstream php{

ip_hash;

server 10.1.230.217:80;

server 10.1.230.215:80;

server 10.1.230.216:80;

server 10.1.230.218:80;

check interval=3000 rise=2 fall=5 timeout=1000;

}

#ip_hash方式,每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session 的问题。


upstream backend {

server server1;

server server2;

fair;

}

#fair,第三方按后端服务器的响应时间来分配请求,响应时间短的优先分配。


upstream backend {

server squid1:3128;

server squid2:3128;

hash  $request_uri;

hash_method crc32;

}

#url_hash(第三方)按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法



proxy_temp_path /tmp/nginx/temp;

#设置临时目录

proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

#设置缓存目录为二级目录,共享内存区大小,非活动时间,最大容量,注意临时目录要跟缓存目录在同一个分区。


autoindex on;

# 防止目录浏览


server {

listen 80;

#侦听80端口

server_name www.a.com;

#定义使用www.xx.com访问

access_log /var/log/nginx/www.a.com-access_log main;


#######负载均衡配置#########


location ~ /\.ht {

deny all;

# 防止.ht文件被请求

}

if ($host = ‘a.com‘) {

rewrite ^/(.*)$ http://www.a.com/$1 permanent;

}

#如果访问地址是a.com,则转向www.a.com




location =/ {

proxy_pass http://www.a.com;

include  /etc/nginx/conf.d/proxy.conf;

proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;

#proxy_next_upstream用来定义故障转移策略,当后端服务节点返回500、502、503、504和执行超时等错误时,自动将请求转发到upstream负>载均衡组中的另一台服务器,实现故障转移

}

#访问首页负载到www.a.com这组服务器。这里并不包括http://www.a.com/index.html,因为下面html会被缓存。


location ^~/(images|doc)/ {

#所有访问http://www.a.com/images/....或者http://www.a.com/doc/...都被缓存。保存24小时。

include  /etc/nginx/conf.d/proxy.conf;

proxy_pass http://www.a.com;

proxy_cache cache_one;

#对不同的HTTP状态码设置不同的缓存名称

proxy_cache_key $host$uri$is_args$args;

#proxy_cache_key 指定了包含在缓存中的缓存关键字(默认情况下服务器的主机名并没有包含到缓存关键字中)

proxy_cache_valid 200 304 12h;

#以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内

expires 24h;

#设置过期时间为24H

}


location /login {

proxy_pass http://www.a.com;

include  /etc/nginx/conf.d/proxy.conf;

proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;

}

#访问http://www.a.com/login匹配这条规则。


location  里:

fastcgi_connect_timeout 300;

#指定连接到后端fastcgi的超时时间

fastcgi_send_timeout 300;

#向FastCGI 传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI 传送请求的超时时间。

fastcgi_read_timeout 300;

#接收FastCGI 应答的超时时间,这个值是指已经完成两次握手后接收FastCGI 应答的超时时间。

fastcgi_buffer_size 256k;

#指定读取FastCGI 应答第一部分需要用多大的缓冲区,一般第一部分应答不会超过1k,由于页面大小为32k,所以这里设置为32k。

fastcgi_buffers 2 256k;

#指定本地需要用多少和多大的缓冲区来缓冲FastCGI 的应答。

#定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“16 16k”、“4 64k”等。

fastcgi_busy_buffers_size 256k;

#这个指令我也不知道是做什么用,只知道默认值是fastcgi_buffer_size的两倍。http://www.linuxidc.com/Linux/2010-08/27874.htm

fastcgi_temp_file_write_size 256k;

#在写入fastcgi_temp_path 时将用多大的数据块,默认值是fastcgi_buffer_size 的两倍。



#fastcgi_cache_path /tmp/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=2m;

#这个指令为FastCGI 缓存指定一个路径,目录结构等级,关键字区域存储时间和非活动删除时间。并指定的缓存名称TEST。

#这里最好是放在server段中来调用。如果在这里调用,会对其它站点产生混乱。

#fastcgi_cache TEST;

#开启FastCGI 缓存。个人感觉开启缓存非常有用,可以有效降低CPU 负载,并且防止502 错误。

#fastcgi_cache_valid 200 302 1h;

#fastcgi_cache_valid 301 1d;

#fastcgi_cache_valid any 1m;

#为指定的应答代码指定缓存时间,如上例中将200,302 应答缓存一小时,301 应答缓存1 天,其他为1 分钟。

#fastcgi_cache_min_uses 2;

#缓存在fastcgi_cache_path 指令inactive 参数值时间内的最少使用次数,如上例,如果在5 分钟内某文件1 次也没有被使用,那么这个文件将被移除。

#设置链接请求几次就被缓存

#fastcgi_cache_use_stale error timeout invalid_header http_500;

#不知道这个参数的作用,猜想应该是让nginx 知道哪些类型的缓存是没用的。

#以上为nginx 中FastCGI 相关参数


本文出自 “12208412” 博客,请务必保留此出处http://12218412.blog.51cto.com/12208412/1874154

以上是关于nginx配置文件详解(1.8.1)的主要内容,如果未能解决你的问题,请参考以下文章

nginx配置文件详解

[后端]nginx配置文件详解

Nginx配置文件详解

通过现象看本质——Nginx配置文件详解

nginx配置文件详解

Nginx配置文件优化详解