一、配置文件结构

#全局块
...

#events块 
events { 
    ... 
}

#stream块,可以有多个upstream,server块
stream {

    #upstream块,供负载均衡使用
    upstream name{
        ...       
    }
    
    #server块,不包含location块
    server {
        ...
    }
}

#http块,一个http块可以有多个upstream,server块
http {
    
    #http全局块
    ...
    
    #upstream块,供负载均衡使用
    upstream name{
        ...       
    }
     
    #server块,一个server块可以有多个location块
    server {
        #server全局块
        ...
        
        #location块
        location {
            ...
        }
    }
}

 

 

二、配置文件的基础配置指令

##运行nginx进程的用户及用户组,只有被设置的用户和用户组才有权限运行nging进程 
##语法:  user username[groupname], 默认: user nobody; worker 的用户为 nobody,Master 的用户为 root
##若用户在configure执行命令时,使用了参数--user=usergroup 和 --group=groupname,此时nginx.conf将使用参数中指定的用户和用户组
user  nobody;

##工作进程数,默认1,通常是CPU数量或者CPU数量的2倍 
##设置为auto时nginx进程自动检测,根据CPU数量调整
worker_processes auto; 
 
##全局错误日志存放路径和名称,日志记录级别: [debug|info|notice|warn|error|crit|slter|emerg],默认error
##此处使用的是相对路径,相对nginx的安装目录 
##可以在全局块、http块、server块、以及location块中配置
error_log logs/error.log    info; 

##PID文件位置
pid  logs/nginx.pid;  

##一个nginx work进程打开的最多文件描述符数目
##理论值为最多打开文件数(ulimit -n)与nginx进程数相除,建议与ulimit -n 的值保持一致
worker_rlimit_nofile 65535;


###events块设置###
events {   
    ##单个worker进程的最大连接数
    ##nginx的最大连接数=worker_processes*worker_connections
    worker_connections 1024;     
    
    ##每个worker进程同时接收多个新连接 
    ##默认off,每个worker进程每次只接受一个新连接
    multi_accept on;  
    
    ##use [kqueue|rtsig|epoll|/dev/poll|select|poll]
    ##Linux 2.6以上版本使用epoll,FreeBSD使用kqueue,window不指定
    use epoll;        
}

http {   
    ##文件扩展名与文件类型映射表 
    include mime.types; 
    ##默认文件类型     
    default_type application/octet-stream;     

    ##日志格式设置,main为日志格式的名字,只能在http块配置  
    ##$remote_addr: 客户端ip地址
    ##$http_x_forwarded_for: 记录客户端真实ip
    ##$remote_user: 客户端用户名称
    ##$time_local: 访问时间与时区
    ##$request: 请求的url与http协议
    ##$status: 请求状态
    ##$body_bytes_sent: 发送给客户端文件主体内容大小
    ##$http_referer: 从哪个页面链接访问过来的
    ##$http_user_agent: 客户端浏览器的相关信息
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
        
        
    ##nginx访问日志,main为log_format设置的日志格式名字
    ##与log_format配合使用,可以在http块,server块和location块中配置
    access_log  logs/access.log  main;  
       
    ##开启高效传输模式,将文件的回写过程交给数据缓冲,而不是放在应用中
    ##可以在http块,server块和location块中配置
    sendfile    on;
    ##一个数据包中发送所有头文件,而不是单独发,防止网络阻塞,需要开启sendfile   
    tcp_nopush    on;  
    ##不缓存数据,而是立即发送数据,防止网络阻塞,需要开启sendfile   
    tcp_nodelay     on;      

    ##与客户端建立连接后,保持连接(即长连接)的最长时间,单位是秒(默认75s)
    keepalive_timeout 90;  
      
    ##开启gzip压缩输出,默认off
    gzip on; 
    
    ##隐藏nginx版本号  
    server_tokens   off;
    
    ###服务器主机配置,一个http中可以配置多个server###
    server {   
        ##监听的本机端口              
        listen        80;
        
        ##监听的主机名或IP或域名
        ##后面可以跟多个主机名称,处理HTTP请求时,nginx会取出header头中的Host,与每个server中的server_name进行匹配,以此决定到底由那一个server来处理这个请求
        ##有可能一个Host与多个server块中的server_name都匹配,这时会根据匹配优先级来选择实际处理的server块
        server_name    localhost; 
        
        #编码,默认koi8-r
        charset koi8-r;
        
        #日志
        access_log  /var/log/nginx/host.access.log  main;
        error_log   logs/error.log;
        
        #匹配规则
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;

        }
        
        #404 返回页面
        error_page  404              /404.html;

        #其他错误代码返回页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

 

三、配置文件其他常用的配置指令

一)客户端相关配置指令

属于ngx_http_core_module模块,可在http块、server块、location块中设置

更多详情请参考官网:http://nginx.org/en/docs/http/ngx_http_core_module.html

#指定客户端请求主体缓冲区的大小,若请求主体大于缓冲区,那么整个请求主体或某些部分都将写入临时文件中
#默认大小等于两个页面大小,具体取决于平台是8K还是16K
client_body_buffer_size  16k;

#客户端请求正文的临时文件的存放目录,默认client_body_temp
client_body_temp_path [level1 [level2 [level3]]];

#读取客户端请求主体的超时时间,单位s,默认60s
#仅在两次连续读取操作之间的一段时间内设置超时,而不是为整个请求主体的传输设置超时
#如果客户端在此时间内未传输任何内容,则nginx请求终止并返回408(即请求超时)错误
client_body_timeout 60;  

#客户端请求头的缓冲区大小,默认1K
#请求头超过该值时,使用指令large_client_header_buffers设置更大缓冲区的大小
client_header_buffer_size 32k; 

#大型客户端请求中请求头缓存区个数和每个区的大小,默认 4 8k        
large_client_header_buffers 4 32k; 

#读取客户端请求头超时时间,单位s,默认60s
##如果客户端在此时间内未传输请求头,则nginx请求终止并返回408(即请求超时)错误
client_header_timeout 60; 

#客户端请求的最大主体大小,默认1MB
#如果请求中主体的大小超过配置的值,则会向客户端返回413(请求实体太大)错误
#为0时将禁用客户端请求主体大小的检查
client_max_body_size 1m;

#与客户端建立连接后,保持连接(即长连接)的最长时间,单位s,默认75s
keepalive_timeout 75s;

#与客户端建立连接后,客户端发送请求的最大次数,当最大请求次数达到时,连接被关闭,默认100
#使用过多的最大请求数可能会导致过多的内存使用
keepalive_requests    100;

#响应客户端时间,Nginx发送数据到客户端的超时时间,单位s,默认60s
#仅在两个连续的写操作之间设置,而不用于传输整个响应
#如果客户端在此时间内未收到任何信息,则连接将关闭
send_timeout 60;

 

二)gzip压缩相关配置指令

属于ngx_http_gzip_module模块,可在http块,server块,location块中设置,一般在http块中设置

更多详情请参考官网: http://nginx.org/en/docs/http/ngx_http_gzip_module.html

#开启gzip压缩输出,默认off
gzip on;   

#压缩缓冲区的个数和每个区的大小
#默认情况下,缓冲区大小等于一个内存页。根据平台的不同,它可以是4K或8K
gzip_buffers 16 8k;  

#压缩等级,1-9,等级越高,压缩效果越好,节约宽带,但CPU消耗大,默认为1   
gzip_comp_level 1; 

#压缩所需的最低HTTP版本请求
#默认1.1,前端如果是squid2.5请使用1.0      
gzip_http_version 1.1;  

#允许压缩的页面的最小字节数,默认20
gzip_min_length 1024;  

#要压缩文件的类型,默认text/html
#无论是否指定,"text/html"类型总会被压缩 
gzip_types text/plain     application/x-javascript     text/css     application/xml;

#如果gzip,gzip_static,gunzip开启,是否启用 "Vary: Accept-Encoding" 响应头部字段,默认off
gzip_vary on;

 

三)FastCGI相关配置指令

属于ngx_http_fastcgi_module模块,允许将请求传递到FastCGI服务器

可在http块,server块,location块中设置

更多详情请参考官网: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html

配置示例:

location / {
  fastcgi_pass   localhost:  9000;
  fastcgi_index  index.php;

  fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;
  fastcgi_param  QUERY_STRING     $query_string;
  fastcgi_param  REQUEST_METHOD   $request_method;
  fastcgi_param  CONTENT_TYPE     $content_type;
  fastcgi_param  CONTENT_LENGTH   $content_length;
}

 

指令:

#读取从FastCGI服务器接收到的响应的第一部分的缓冲区的大小
#默认情况下,缓冲区大小等于一个内存页。根据平台的不同,它可以是4K或8K
fastcgi_buffer_size 4k;

#启用或禁用来自FastCGI服务器的响应缓冲,默认on
fastcgi_buffering on;

#从FastCGI服务端收到的响应信息的缓冲区大小以及缓冲区数量
#认情况下,一个缓冲区的大小相当于一个页面的大小。根据平台的不同设置为4K/8K
fastcgi_buffers 8 8k; 

#系统很忙时可以使用的fastcgi_buffers大小
fastcgi_busy_buffers_size 16k;

#Nginx服务器和后端FastCGI服务器连接的超时时间,单位s,默认60s
fastcgi_connect_timeout 60s;

#从FastCGI服务端读取响应信息的超时时间,单位s,默认60s
#超时仅在两次连续的读取操作之间设置,而不用于传输整个响应
#如果FastCGI服务器在此时间内未传输任何内容,则连接将关闭
fastcgi_read_timeout 60s; 

#传递给FastCGI服务器的参数
#parameter: 传递的参数
#value: 参数值,可以是字符串、变量及其它们的组合
fastcgi_param parameter value;

#请求传输到FastCGI服务端的超时时间,单位s,默认60s
#超时仅在两个连续的写操作之间设置,而不用于整个请求的传输
#如果FastCGI服务器在此时间内未收到任何信息,则连接将关闭
fastcgi_send_timeout 60s;

#整个响应都无法放入由fastcgi_buffer_size和fastcgi_buffers 伪指令设置的缓冲区中,则可以将一部分响应保存到临时文件中,默认1024m
#需要设置fastcgi_buffering on;
fastcgi_max_temp_file_size 1024m;

#限制每次写入临时文件的数据量的大小
#需要设置fastcgi_buffering on;
fastcgi_temp_file_write_size 6k;

#从FastCGI服务器接收到数据存放的临时文件,默认fastcgi_temp
fastcgi_temp_path fastcgi_temp;

 

四)upstream相关配置指令

属于ngx_http_upstream_module模块,仅可在stream模块中设置

更多详情请参考官网: http://nginx.org/en/docs/http/ngx_http_upstream_module.html

#负载均衡调度算法,轮询,默认,将请求传递到随机选择的服务器,同时考虑服务器的权重
random;

#负载均衡调度算法,key可以包含文本,变量,以及它们的组合
hash key [consistent];
    
#负载均衡调度算法,每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
ip_hash;

#后端服务器组,address可以是ip:port,域名
#parameters支持如下参数:  
#weight=number: 请求发送到后端服务器的权重比,默认1
#max_conns=number: 后端服务器的最大连接数量,默认值为零,表示没有限制
#max_fails: 与后端服务器连接失败的最大重连次数,默认1
#fail_timeout: 与后端服务器连接失败后重新发起请求的时间,默认10
#backup: 备份服务器,其它所有的非backup机器不可用时,请求backup机器,此台机器压力最轻
#down: 标记服务器为不可用
server address [parameters];

#定义共享zone的name和size,以保留在工作进程之间共享的组的配置和运行时状态
zone name size;

#设置后端服务器与nginx work进程之间保持连接的最大空闲数量
#当这个数量被突破时,使用最少的连接将被关闭
keepalive    1000;

 

五)反向代理相关配置指令

属于ngx_http_proxy_module模块,可在http块,server块,location块中设置

更多详情请参考官网: http://nginx.org/en/docs/http/ngx_http_proxy_module.html

1 proxy buffer(代理缓冲)相关配置指令

代理缓冲的作用以及过程:

实现了被代理服务器与客户端的异步响应

启用代理服务器缓冲后,nginx服务器首先会尽可能的从被代理服务器那里收取响应数据,将其保存到buffer中,buffer的大小由 proxy_buffer_size 指令和 proxy_buffers 指令决定;
如果在接收过程中,发现buffer没有足够大小来接收一次响应的数据,nginx服务器会将部分接收到的数据临时存放到磁盘的临时文件中;
磁盘上的临时文件路径由 proxy_temp_path 指令设置,临时文件每次写入大小和总大小由 proxy_max_temp_file_size 指令和 proxy_temp_file_write_size 指令决定;
一次响应数据被接收完成或者buffer已经装满,nginx服务器开始向客户端传输数据;
每个bufter装满数据后,在从开始向客户端发送一直到buffer中的数据全部传输给客户端的整个过程中,它都处于BUSY状态,期间对它进行的其他操作都会失败;
同时处于BUSY状态的buffer总大小由 proxy_busy_buffers_size 指令限制,不能超过该指令设置的大小

当代理缓冲关闭时,nginx服务器只要接收到响应数据就会同步地传递给客户端

 

指令:

#是否启用代理服务器响应缓冲,默认on
proxy_buffering on;

#从被代理服务器接收一次响应数据的缓冲区的个数和每个buffer的大小,总大小=num*size
#默认情况下,每个缓冲区大小等于一个内存页。根据平台的不同,它可以是4K或8K
proxy_buffers  8 8k;  

#用于读取从代理服务器接收到的响应的第一部分的缓冲区的大小
#默认情况下,缓冲区大小等于一个内存页。根据平台的不同,它可以是4K或8K
proxy_buffer_size  8k;

#BUSY状态下的缓冲区的总大小,默认8K或16K  
proxy_busy_buffers_size size;

#存放从被代理服务器接收到的数据的临时文件
#path: 临时文件路径
#level: 在path下的第几级目录下存放临时文件,level_1表示path目录下名字长度为level_1的一级目录,level_2表示path目录下名字长度为level_2的二级目录
proxy_temp_path path [level_1 [level_2]];

#每次写入临时文件的数据大小
proxy_temp_file_write_size 16k;  

#临时文件的总大小,默认1024M
proxy_max_temp_file_size 1024m;

 

2 proxy cache(代理缓存)相关配置指令

代理缓存的作用以及过程:

实现了nginx服务器对客户端请求的快速响应,减少响应时间

nginx服务器一方面通过proxy buffer机制将数据异步传递给客户端,另一方面根据proxy cache机制将这些数据缓存到本地硬盘上;
当客户端下次重新访问相同的数据时,nginx服务器直接从硬盘检索到对应的数据返回给客户端,从而减少与被代理服务器的响应时间
proxy cache机制依赖于proxy buffer机制,只有在proxy buffer机制启用的时候proxy cache才会生效

 

指令:

#启动proxy cache,默认关闭,zone是使用的共享空间的名称,对应proxy_cache_path指令的keys_zone的值
proxy_cache zone(off);
 
#缓存时的密钥,支持nginx内置变量,默认$scheme $proxy_host $request_uri;
proxy_cache_key $scheme $proxy_host $request_uri;

#当客户端向被代理服务器发送相同请求到达number次后,nginx服务器才会对该请求的响应数据做缓存,number默认1
proxy_cache_min_uses 1;

#缓存存放目录
#path: 缓存存放路径,如/app/nginx_cachedata
#levels=1:2: 设置目录结构,表示path下还有两级目录
#keys_zone: 设置缓存空间的名称和大小,如keys_zone=cachedata:  500m
#inactive: 缓存内容的有效期,超过有效期自动清除缓存,如inactive=7d
#max_size: 缓存空间的最大值,达到最大值时,回一次删除访问量最少的缓存内容,如max_size=10g
#use_temp_path: 默认on,表示缓存数据会首先写入临时文件,写完后重命名并保存到缓存路径下。若为 off,则nginx会将缓存文件直接写入指定的缓存目录,而不使用proxy_temp_path指定的临时存储路径
proxy_cache_path path levels=1:2 keys_zone=name:size inactive=time max_size=size use_temp_path=on;

#根据返回的HTTP状态码设置缓存时间
proxy_cache_valid code time;

 

3 反向代理相关配置指令

#与被代理服务器建立连接的超时时间,单位s,默认60s
proxy_connect_timeout     60s;   

#禁止指定请求头转发到被代理服务器
proxy_hide_header field;

#被代理服务器的HTTP协议版本,默认1.0
proxy_http_version 1.1;

#设置被代理服务器
proxy_pass  URL;

#允许被禁止转发的请求头转发到被代理服务器
proxy_pass_header field;

#nginx向被代理服务器发送数据后,等待响应的超时时间,单位s,默认60s  
#超时仅在两次连续的读取操作之间设置,而不用于传输整个响应
#如果代理服务器在此时间内未传输任何内容,则连接将关闭  
proxy_read_timeout        60s;  

#更改被代理服务器返回的响应头中的Location头域和Refresh头域
proxy_redirect off;

#nginx发送数据给被代理服务器的超时时间,默认60s
#超时仅在两个连续的写操作之间设置,而不用于整个请求的传输
#如果代理服务器在此时间内未收到任何信息,则连接将关闭
proxy_send_timeout        60s; 

#重新定义传递给代理服务器的请求体
#value: 包含文本,变量,或者它们的组合
proxy_set_body value;

#在传递给代理服务器的请求标头中重新定义或附加字段
#field: 要传递的字段名
#value: 包含文本,变量,或者它们的组合
proxy_set_header field value;