首页 > 代码库 > Nginx(三):nginx.conf配置文件说明 【1】 配置参数说明

Nginx(三):nginx.conf配置文件说明 【1】 配置参数说明

Nginx配置文件说明,不一定最全,但是最细,适合初学者或者概念不清晰者,如有理解错误的地方请指正。


#nginx的worker进程用哪个用户和组进行登录,如果在编译时指定了,这里是禁用的,而且不会显示
#你的设置,为了便于识别,在保持禁用的同时你修改为实际用户和组
#user  nginx nginx;

#【和优化有关】
#启动几个worker进程,从Nginx1.9.10开始可以使用auto值,进行自动设置
#每个worker进程都是单线程进程,所以你叫它进程或者线程都行。这个值最大设置
#为系统显示的CPU核心总数-1,当然你超过也行,但是这样就出现CPU的进程切换,影响性能
worker_processes  2;

#【和优化有关】
#设定nginx的worker进程工作在哪几个CPU核心上,上面的worker进程数量最好和这里的数量对应
#也就是1对1,也可以2对1,2对2,2对4。下面0和1表示CPU掩码,4核心就是4位,2核心就是2位
#如果是4核心的话,0001表示第一个核心 0010表示第二个核心,如果你是2核心呢,就用 01 10 来表示
#几核心就是几位数,1表示使用,0表示不使用,从Nginx1.9.10可以使用auto值,进行自动设置
#你这样绑定只是说明每个CPU只运行一个Nginx进程,但是并不能保证其他进程不会跑到这些CPU核心上去
#再说白一点就是你现在了worker进程的范围,但是你没有限制其他进程,如果想限制这些CPU核心不能被其他进程使用
#你就只能做CPU隔离,在操作系统启动的时候就隔离出去。但这样对于内核级别的进程比如中断还是可能会跑过去,所以
#真正做到严格隔离也可以,就是比较麻烦。
worker_cpu_affinity 0100 1000;


#【和优化有关】
#用于指定单个worker进程可以打开最大文件描述符数量,每个连接都会打开一个文件,所以对于并发非常大的
#场景这个值应该设置的大一点,默认配置文件中没有,但是受限于Linux系统设置,默认是1024个,所以你
#可以修改,比如改成10000个。
worker_rlimit_nofile 5000;

#【和优化有关】
#worker进程的优先级,指的是系统的nice值,-20到+19.默认是0,nice值越小,优先级越高。
worker_priority -10;

#定义SSL硬件加速器,如果支持HTTPS的话,每一个都创建SSL会话,加密、解密、会话建立和断开等这些对CPU的占用率
#非常高,一个服务器可以承载的HTTPS会话大概是HTTP会话的1/5左右。服务器可以安装硬件的SSL会话加速器,那么
#你这里就可以指定,这样SSL会话就不会占用CPU资源。这个就跟高端服务器网卡带特殊芯片一样都是为了减轻CPU负担。
#ssl_engine device;

#时间解析度,默认情况下每次内核事件的调用,在返回时都会执行一次gettimeofday(),表示获取一下系统当前时间
#也就是自1970年1月1日到现在,而且是微秒级别的。以实现内核时钟来更新Nginx缓存时钟的,
#早期Linux系统执行gettimeofday()的代价很大,所以频繁执行则会导致系统性能降低,
#这里这个值就是设置多久调用一次gettimeofday(),而不管这段时间内有多少次系统事件调用。不过现在的计算机
#在执行gettimeofday()时代价已经很小了,所以可以不用设置。
#timer_resolution 100ms;

# 错误日志路径,这个error_log变量可以设置在任何地方,可以在main主配置文件中
#可以在http配置段中,可以在location配置段中,可以在stream配置段中以及server和mail配置段中
#这个如果在编译时指定了,那么也是禁用的,而且不会显示具体路径,所以为了便于识别你最好保持禁用
#同时把后面的值设置为你实际的路径,后面为日志级别,debug级别必须在编译安装时要--with-debug启用debug功能
#它有debug、info、notice、warn、error、crit、alert、emerg,默认级别是error。
#error级别包括error、crit、alert、emerg级别的信息。
error_log  /var/log/nginx/error.log error;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#PID文件,Nginx进程作为系统的守护进程运行,就需要在某个文件中保存进程的ID号。
#路径编译时指定则这里会被禁用,同时不会显示实际路径,为了便于识别在保持禁用的同时你修改为实际路径
#pid        /var/run/nginx/nginx.pid;

#锁文件,这个和events中的accept_mutex有关,如果这个参数是off,那么就不会出现锁文件。这个文件位置
#如果在编译安装时指定,则配置文件中就不会出现这个lock_file参数。不过为了便于识别,你可以加上但是
#请保持注释状态。
#lock_file /var/lock/nginx.lock

#【和调试有关】
#设置Nginx是否工作在单进程模式下,默认为on,通常Nginx工作在一个master进程和N个worker进程模式中
#在这种模式下定位问题比较困难,所以可以设置为off,这样让Nginx工作在单进程模式下。也就是不让worker
#在后台运行,也就是不让worker进程工作在守护进程模式,而是工作在前台,所有信息都输出到标准输出,也就是
#终端。
#daemon [on|off];

#【和调试有关】
#是否以一个master和多个worker模式运行,默认为on,正常情况下就是这样。为了调试和追踪问题,可以不启动
#master,而只开启一个worker,以方便追踪问题。然后在配合daemon off来让所有信息输出到前台。
#master_process [on|off];

#事件配置段,主要影响Nginx服务器与用户的网络连接。
events {
    #设置使用事件模型,一般不用设置,因为Nginx会自动选择当前系统中所支持的最有效率的IO模型。
	#select、poll是标准方法大多系统都支持。
	#kqueue:是FreeBSE 4.1+  OpenBSD 2.9+和Mac OS X上用的
	#epool:在Linux 2.6+开始支持
	#/dev/poll:这个和select、poll是同一种机制,在Solaris和HP Unix上select或者poll被称作/dev/poll
    #use [epoll|rtsig|select|poll|kqueue|/dev/poll]
	
    #一个worker可以接受多个请求,如果一下来了几百个请求,是否允许一个worker全接受。
	#如果该参数被设为OFF,那么一个worker process进程一次只接收一个请求,如果是ON,则一次接收所有请求
	#设置为on显然就快的多,如果是off,则还需要master进程额外调度。默认是off。
    multi_accept on;
	
	#是否打开负载均衡锁,一个master进程,多个worker进程,由master调度请求给worker,一个请求进来该分配给哪个worker呢?所以这个就
	#是实现多个worker进程负载均衡的,on为开启这个功能。但是做负载均衡调度是有开销的,主进程进行调度,CPU上下文切换,所以关闭虽然会导致
	#worker的负载不均衡,但是减少不必要的开销,反而会更快。此功能默认是OFF的。如果是OFF,也就关闭负载均衡,那么一个新请求进来时
	#所有的工作进程都会收到通知,如果连接数量小于工作进程数量时,则会出现资源争抢(惊群概念,抢的是互斥锁,持有锁的进程可以处理请求)。
	#如果设置为ON由于使用负载均衡所以就不会出现锁文件;如果设置为OFF,也就不均衡,则会出现锁,
	#那锁文件和worker接受请求有什么关系?锁文件只有一个,worker进程有多个
	#当前哪一个worker持有锁文件,那么哪一个worker就可以接收用户请求。所以关闭这个功能就不会有锁,那么任何
	#worker进程都可以接受请求,这样master才能针对worker进程做负载均衡。
	#所以这个参数设置为OFF时,都会把multi_accetp设置为on,避免争抢过度,尽量让一个工作进程接收请求,那么当一个worker所接受的连接数
	#达到其设置的最大值的7/8时,master进程就尽可能的把后续请求分配给其他worker进程。
	accept_mutex off;
	
	#因为只有一个锁,所以其他worker进程持有这个锁的时候,其他worker进程如果也想要这个锁,那么它就要等待
	#那么它最大等待多久呢?就是这个参数设定的。单位为毫秒。也就是说锁被别的worker进程持有,其他的worker
	#请求锁失败后,间隔多少毫秒可以发起第二次请求。默认500ms,不过如果accept_mutex是off,那就没有必要设置
	#这个参数了。
	#accept_mutex_delay NNms
	
	#设置每个worker进程最大连接数,一个连接就是一个socket套接字,一个套接字请求就需要打开一个文件,
	#如果Nginx作为web服务器,worker_rlimit_nofile要大于等于worker_connections,因为Nginx自己也要打开一些文件。
	#如果Nginx作为代理服务器,worker_rlimit_nofile要是worker_connections的2倍,原因是Nginx作为代理的时候
	#面向请求是一个套接字,面向后端应用服务器也是一个套接字,所以一个请求在Nginx上要使用2个套接字,所以
	#worker_rlimit_nofile要是worker_connections的2倍
	#你修改了这个值可能会收到一个错误信息就是open file resource limit:1024,虽然查看cat /proc/sys/fs/file-max看到
	#的值比较大,但是这个是针对系统来说的,系统可以打开最多的fd数量,默认的进程最大打开文件数还是1024,ulimit -n来查看。
	#你调高了系统的并不代表改变了进程可以打开的个数。修改方法可以在/etc/rc.local脚本,加上ulimit -n NUMBER来让系统启动后就
	#使用这个值。或者修改/etc/secrity/limits.conf,增加 noproc和nofile的值。如果不想修改系统,你就修改Nginx的worker_rlimit_nofile。
    worker_connections  4096;
}



#http配置段,用于定义web服务的一些重要属性,代理、缓存、日志以及其他HTTP有关的特性等。
http {
    #包含外部文件路径
	#include sites/.*  表示包含当前路径下的sites目录中的所有文件。 
    include       mime.types;
    default_type  application/octet-stream;
    
	#定义日志格式,main是一个日志格式名称,后面都是服务器端变量组成的
    #log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
    #                  ‘$status $body_bytes_sent "$http_referer" ‘
    #                  ‘"$http_user_agent" "$http_x_forwarded_for"‘;
	
	log_format detaile    ‘[$time_local] [$http_x_forwarded_for] [$http_x_via]‘
                          ‘[$http_x_hm_trace_id] [$cookie_x_hm_tuid] [$http_x_hm_tuid] [$sent_http_x_damai_lk] [nginx] [$host] ‘
                          ‘[$server_addr] [$request_method] [$http_referer] [http://$host$uri] [$args] [$status] ‘
                          ‘[$body_bytes_sent] [$request_time] [$upstream_addr] [$upstream_status] [$upstream_response_time] ‘
                          ‘[$http_user_agent] [$http_rule_name]‘;
	#以下为主要变量说明
	# $http_x_forwarded_for:保存的就是X-Forwarded-For信息
	# $host:客户端请求的Host头域值
	# $server_add:服务器IP地址
	# $request_method:请求方法
	# $http_referer:表示从哪个链接跳转过来
	# $status:服务器响应代码
	# $request_time:从接受用户请求的第一个字节到发送完响应数据的实际,包括接受请求数据的实际、程序响应时间、输出数据时间
	# $upstream_add:后端被代理服务器的地址
	# $upstream_response_time:表示Nginx向被代理服务器建立连接开始到接收完数据然后断开连接的时间,这个时间肯定比$request_time的时间短
	
    
	#这个访问日志如果在编译时指定则这里会被禁用,同时不会显示实际路径,为了便于识别
	#在保持禁用的同时你修改为实际路径。这个访问日志格式使用的是上面定义的main格式。
    access_log  /var/log/nginx/access.log  detaile;
	#下面这个加了一个 buffer 参数,含义是日志先同步到缓存中,这样提升性能,避免每产生
	#一条日志都立即写入磁盘文件。
	#access_log /var/log/nginx/access.log  main buffer=32k
    
	#是否启用sendfile功能
    sendfile        on;
	
	#只有在sendfile启用时,改参数启用才生效
	#该参数可以定义在http{}段中,也可以定义在server{}段中、location{}段中
    #tcp_nopush     on;
	
	#是否启用AIO机制,默认是OFF,在Linux 2.6.22内核及后续版本才支持。
	#该参数可以定义在http{}段中,也可以定义在server{}段中、location{}段中
	#aio on|off 

    #保持长连接的时长默认为75秒,指定客户端连接保持活动的超时时间,超过这个时间服务器就自动断开连接
	#这个选项有2个值 keepalive_timeout ARG1 ARG2;第二参数是可选项,其指定使用keep-alive消息头保持活动连接的有效时间
	#如果不设置第二个参数那么Nginx不会向客户端某些浏览器(如火狐)发送keep-alive消息头以保持活动连接,
	#超时之后客户端就自动断开连接。该参数可以定义在http{}段中,也可以定义在server{}段中、location{}段中
    keepalive_timeout  75;
	
	#一次长连接允许发起的最大请求数量,用户与服务器建立连接后,通过此连接可以发起的最多多少次请求
	#该参数可以定义在http{}段中,也可以定义在server{}段中、location{}段中
	keepalive_request 100;
	
	#对某些老版本的浏览器不使用长连接,none表示对老版本浏览器不做禁用 msie6 表示对微软的IE6禁用长连接
	#该参数可以定义在http{}段中,也可以定义在server{}段中、location{}段中
	#keepalive_disable [msie6|safari|none]
    
	#对keepalive连接是否使用TCP_NODELAY选项,因为TCP传输数据接收端没接收到一个报文都会发确认信息
	#这个确认信息很小,这个信息大小通常比tcp一个段还小,所以在一个TCP段中,没有被填充的就用0代替,
	#这样其实是比较浪费的,所以为了提升TCP性能,通常会采用延迟确认,也就是几个确认信息打包一起发送
	#如果你开启了keepalive那么就压禁用tcp_nodelay,因为一旦开启,浏览器请求
	#的内容发送到服务器,服务器不马上确认,那么浏览器就会以为资源找不到。
	#该功能是TCP不延迟确认,ON为启用,OFF是不启用。默认是启用,也就是不延迟确认。
	#该参数可以定义在http{}段中,也可以定义在server{}段中、location{}段中
	tcp_nodelay on
	
	#客户端请求首部超时时间,定义服务器读取客户端请求首部的最长时间,如果在段时间内
	#客户端无法完成发送完整的客户端请求首部信息,则返回给客户端408超时错误信息。默认60秒。
	#该参数可以定义在http{}段中,也可以定义在server{}段中。
	client_header_timeout 60s;
	
	#读取HTTP请求的包体的超时时长,道理和上面一样。默认也是60秒
	#该参数可以定义在http{}段中,也可以定义在server{}段中。
	client_body_timeout 60s;
	
	#发送响应超时时长,服务器端要发送响应数据给客户端,客户端不接收或者因某种原因客户端没有收到,那么服务端最多等多久
	#这个不是说整个响应的传输时长。这个超时时间生效条件是在客户端和服务器成功建立连接之后,
	#这个参数可以设置在在http{}段中、server{}段中以及location {}段中
	send_timeout 60s;
	
	#设置读取客户端请求头的缓冲区大小,通常来说1K就够用,但是如果客户端请求中包含一个比较大的cookies或者是来自WAP客户端,
	#那么1K就不够了,这是可能收到Nginx 400的错误,而且不是每次都收到,所以排查困难。一般这个大小都是系统分页的倍数。可用
	#getconf PAGESIZE来获取。
	client_header_buffer_size 4k;
	
	#设置允许的客户端最大请求包体大小,客户端发一个特别大的请求,服务器拒绝。默认1M。
	#这个参数可以设置在http{}段中、server{}段中以及location {}段中。
	#在允许用户上传时的场景下,设置这个很有用。用户上传时它的body首部中的Content-length就会
	#有上传的这个包的大小。
	client_max_body_size 1m;
	
	#限制客户端每秒上传的字节数量,就是为了避免把服务器带宽都占用了。默认0,无限制。
	#这个参数可以设置在在http{}段中、server{}段中、location {}段中以及if in location中
	limit_rate 0;
	
	#nginx向客户端发送响应报文时,如果超出了设定的时长,那么就开始限速,这里限制的是
	#客户端的下载速率,这个速率是从limit_rate中获取的。所以这里不需要指定,只需要指定
	#超时时间就可以,默认是0,也就是没有时长限制。
	#这个参数可以设置在在http{}段中、server{}段中、location {}段中以及if in location中
	limit_rate_after 0;
	
	#是否开启gzip功能,也就是在服务器响应客户端是是否把响应数据进行压缩,默认为off
	#这个参数可以设置在在http{}段中、server{}段中、location {}段中
    gzip  on;
	
	#gzip实现压缩的时候使用缓冲的大小,第一个参数是缓存空间个数,第二个是缓存大小。默认情况下
	#size大小为一个内存页,4K或者8K,取决不同平台。
	#这个参数可以设置在在http{}段中、server{}段中、location {}段中
	gzip_buffers 32 4k;
	
	#压缩级别,默认为1,表示压缩程度最低,压缩率高。9表示压缩程度最高,压缩率最低,也最浪费时间。
	#这个参数可以设置在在http{}段中、server{}段中、location {}段中
	gzip_comp_level 1;
	
	#对哪种浏览器不压缩,因为有些不支持。
	#这个参数可以设置在在http{}段中、server{}段中、location {}段中
	gzip_disable msie6;
	
	#对哪些格式内容使用压缩,默认为text/html,但实际上你开启压缩功能,Nginx会对所有text/html页面进行压缩。
	gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript
	
	#用于设置在使用压缩功能时,是否发送带有Vary:Accept-Econding头的响应信息。该参数主要是告诉数据接收方,数据经过了压缩
	#开启效果是客户端接收的响应头部中增加了 Accept-Ecoding:gzip的信息。
	gzip_vary on;
	
	#内容长度大于多少字节时才压缩,默认20。因为对于数据量大压缩才明显,小数据压缩不明显而且还消耗资源。也就是
	#当响应页面大于该值时才启用压缩。响应页面大小可以通过HTTP响应头中的Content-Length指令获取。不过由于ngx_http_gzip_module
	#通常使用Chunked动态编码压缩,所以Conten-Length或不存在或者被忽略,该指令不起作用。
	#这个参数可以设置在在http{}段中、server{}段中、location {}段中
	gzip_min_length 20;
	
	#因为早期的浏览器不支持HTTP客户端不支持压缩,因此用户会看到乱码,可以针对不同HTTP协议版本选择性开启
	#默认是针对http 1.1协议开启。也就是只有客户端使用http 1.1及以上版本的才进行压缩。这个是针对客户端使用
	#的HTTP协议版本做选择性开启的。上面的gzip_disable是针对客户端。
	#这个参数可以设置在在http{}段中、server{}段中、location {}段中
	gzip_http_version 1.1
	
	#当开启是,如果客户端浏览器不支持压缩,那么Nginx将返回解压后的数据;如果支持压缩将忽略此选项。
	gunzip_static on;
	
	#开启压缩功能的一些问题:很多WEB服务器都支持压缩比如IIS、Tomcat、Apache等。如果前端Nginx也开启了压缩,就相当于数据经过了
	#2层压缩,比如如果Nginx和Tomcat都开启对JavaScript脚本进行压缩的话,在很多浏览器都会出现脚本运行异常的情况,只有在chrome
	#浏览器正常。表现的现象是首次运行正常,再次刷新就304.你把其中一台服务器的压缩功能关闭就可以了。
	
	#是否打开文件缓存功能,它缓存的是文件描述符、大小、修改时间、目录结构以及查找文件时的错误,比如文件没有找到
	#如果要开启的话 open_file_cache max=N [inactive=time],设置一个最大缓存条目,如果满了则根据LNU算法进行置换,
	#以及每个缓存元素的活动时长,默认60秒,也就是说在指定时间内没有被访问过,就会被从缓存中移除。
	#这个参数可以设置在在http{}段中、server{}段中、location {}段中
	open_file_cache off;
	
	#设置是否缓存在文件查找是出现的文件查找错误信息。这些错误信息是因为启用了open_file_cache功能才会有的
	#默认是OFF则表示不缓存错误信息,这个参数可以设置在在http{}段中、server{}段中、location {}段中
	#该参数要在open_file_cache on时才有意义
	open_file_cache_errors off;
	
	#设置多久检测一次缓存内容的是否有效,默认60秒,该参数要在open_file_cache on时才有意义
	#这个参数可以设置在在http{}段中、server{}段中、location {}段中
	open_file_cache_valid 60s;
	
	#在非活动时长内,一个缓存条目被访问的次数超过这里定义的次数,那么这个条目即便超过了非活动时长
	#也不会被删除。这个非活动时长就是open_file_cache max=N inactive=60s;中定义的。
	open_file_cache_min_use 1;
	
	#控制如果客户端请求首部是一个无效信息,服务器是否忽略。默认是on,就是忽略。
	ignore_invalid_headers on;
	
	#当用户访问一个文件,如果该文件不存在,是否把这个信息记录到错误日志中。默认是开启。on。
	#这个参数可以设置在在http{}段中、server{}段中、location {}段中
	log_not_found on;
	
	#设置Nginx使用的DNS服务器地址,默认使用本机网络中设置的
	#这个参数可以设置在在http{}段中、server{}段中、location {}段中
	#resolver 127.0.0.1
	
	#设置DNS解析超时时长,默认是30秒。
	#这个参数可以设置在在http{}段中、server{}段中、location {}段中
	#resolver_time 30s;
	
	#是否在错误页面中显示Nginx版本号,默认是显示的,也就是ON
    #这个参数可以设置在在http{}段中、server{}段中、location {}段中
	server_tokens off;
	
	
	#用于更改Nginx服务接收到的客户端请求的头信息,然后将新的请求头发送后端被代理服务器,
	#下面的含义是把请求发送给后端时,该请求的头中的Host,设置为客户端原始请求时的Host头
	proxy_set_header Host $host;
	#用客户端请求时的location返回响应头信息
	proxy_redirect default;
	#
	proxy_set_header X-Real-IP $remote_addr;
	#Nginx与后端被代理服务器尝试建立连接的超时时间,默认为60秒
	proxy_connect_timeout 600; 
	#Nginx向后端被代理服务器发送read请求后,等待响应的超时时间,默认60秒
    proxy_read_timeout 600; 
	#Nginx向后端被代理服务器发送write请求后,等待响应的超时时间,默认60秒
    proxy_send_timeout 600; 
	#用于配置存放HTTP报文头的哈希表容量,默认为512个字符。一般都设置为1024,这个大小是哈希表的总大小,
	#并不是设定了这个参数Nginx就会一次全部申请出来。需要用的时候才会申请,但是当真正需要使用的时候也不是一次全部申请,
	#而是会设置一个单次申请最大值,就是后面的参数。
	proxy_headers_hash_max_size 1024;
	#用于设置Nginx服务器申请存放HTTP报文头的哈希表容量的单位大小,默认为64个字符。一般配置为128。
	#这个大小是单次申请最多申请多大,也就是每次用需要申请,但是每次申请最大申请多少,整个哈希表大小不可超过上面设置的值。
	proxy_headers_hash_bucket_size 128;
	
	#用于开启cache功能,同时给cache起一个名字。cache功能默认是关闭的。开启之后Nginx会检查被代理服务器响应数据HTTP头中的
	#Cache_Control、Expirex头域信息。当Cache_Control被设置为no-cache、no-store、private或者max-age=0时并且Expires包含一个
	#过期时间时,Nginx不会缓存这些数据。这个通常定义在某个location中,表示对特定location的开启缓存。
	proxy_cache mycache;
	#开启Cache功能后,客户端请求Nginx代理服务器先从本地Cache中查询,如果想忽略哪些数据不从缓存中查找,就可以设置这个参数。
	proxy_cache_bypass $cookie_nocache;
	#是否开启缓存锁功能。某些数据项可以同时被多个请求返回的响应数据填充。开启之后,Nginx服务器同时只能有一个请求填充缓存中
	#的某一项数据,不允许其他请求操作。其他请求如果也想填充就必须等到锁释放,可以这样理解就是多个客户端请求一个缓存中不存在
	#的内容,因为请求都要先去缓存中查找,没有才会去后端服务器,所以多个客户端同时请求一个内容,但是发现缓存缓存中没有,
	#如果开启这个参数,那么这些请求中只有第一个请求被允许发往后端服务器,当它得到返回结果后,缓存中这时候就有内容了,
	#然后Nginx用这个内容响应给其他请求。如果不启用的话,那么Nginx就会把请求相同内容的多个请求都代理到后端。
	proxy_cache_lock on;
	#设置上面那个锁定时长,默认5秒。
	proxy_cache_lock_time 5s;
	#设置用户请求相同内容达到多少次Nginx才缓存,默认是1次。
	proxy_cache_min_uses 2;
	#设置缓存路径和缓存策略。第一个参数是路径、第二个是缓存目录为几级,一般为2级、第三个参数是定义一个共享内存区用于存储键和元数据
	#检索键从内存中查找并定义内存大小,1M内存可以缓存8000个键、第四个参数是缓存数据的磁盘空间最大可使用多少、最后一个是定义非活动
	#时长,在该时长内一个数据没有被访问则进行删除而无论数据是否过期。
	proxy_cache_path /var/temp/nginx/ levels=1:2 key_zone=mycache:10m max_size=1g inactive=60m;
	#关闭把数据写入缓存前写入其他临时目录,关闭后则写入同一目录。建议关闭。
	use_temp_path off;
	
    
	#该指令设置后端服务器指令,NAME为自定义名称,默认是轮询方式调度,如果某个服务器出现错误,请求将会依次交给组内
	#下一个服务器进行处理,直到返回正常响应,如果都失败了,就返回最后一个服务器的响应。HTTP 404不算请求失败。
	#通常这些都配置在单独的文件中,通过include指令引入到主配置文件中。upstream只能配置在http段中。
	upstream UPSTREAM_NAME {
	   #下面三种都是调度方式,默认不配置任何调度方式的话则为轮询,
	   #ip_hash表示同一IP的调度到同一服务器,如果有此参数,则wight失效。不能一起使用。
	   ip_hash;
	   #最少连接负载算法,在考虑权重的同时也考虑后端哪个服务器当前连接最少,最少的优先,如果这样的服务器有多台,则按加权轮询,选择权重最大的
	   least_conn;
	   #按URL的哈希值来分配,相同的分配到同一服务器,如果有此参数,则wight失效。不能一起使用。
	   url_hash;
	   
	   server IP:[PORT] weight=NUMBER max_fails=NMBER fail_timeout=NUMBER;
	   #后端服务器2台,IP地址为50.1和50.2,权重均为10,如果30s内连续请求3次失败,则该服务器在之后的30秒内被认为是无效
	   #也就是down状态。
	   server 192.168.50.1 wight=10 max_fails=3 fail_timeout=30s;
	   server 192.168.50.2 wight=10 max_fails=3 fail_timeout=30s;
	   
	   #max_fails=number:表示请求失败次数,在一定时间内(由fail_timeout指定),请求失败几次则该服务器被认定为无效。
	   #fail_timeout=time:除了上面那个作用以为,还有一个作用就是,如果服务被认定无效,则无效时间为多久,在这个时长内则不进行检查。
	   #backup:标记该服务器为备用服务器,其他服务器正常是被标记为backup的服务器不做请求处理,只有其他都失效或者繁忙时才会分配到这里
	   #down:标记该服务器为永久失效
	   #resolve:
	   #route=string:设置路由名称
	   #service=name:设置SRV记录名称
	}
	
	#用于自行设定健康标准,该参数与health_check配合使用,在health_check中指定
	match MATCH_NAME {
	   #status 、header这些都是设定测试标准的,如果设置了多条,那么只有全部满足才算健康
	   #表示状态码是什么
	   status 200;
	   status ! 500;
	   status 200 204;
	   status ! 301 302;
	   status 301-303 307;
	   #表示响应头中的字段包含什么值
	   header Content-Type = text/html;
	   header Connection ~ close;
	   header Host;
	   #表示响应body中包含什么内容
	   body ~ "Welcome to nginx";
	   body !~ "maintenance mode";
	   
	}
	
	#虚拟主机配置,Nginx中没有Apache那种中心主机概念,它所有的主机都是虚拟主机,如果是多站点
    #我们通常会把主配置文件中的server {}全部注释,把虚拟主机单独建立配置文件,里面只需要包含
	#server {}段即可,然后在主配置文件中引用。至于所有虚拟主机共享的配置,就放在主配置文件的
	#http{}段中定义。如果要单独为某个虚拟主机设置,那么你就写在server}{}中。
    server {
	    #监听端口 格式 IP:PORT PORT *:PORT,另外端口后面还可以加一些其他参数
		#default_server,定义此server为http中的默认server
		#ssl,表示建立连接的时候必须使用ssl,这个一般定义在443上
		#http2 ,表示支持http2
		#rcvbuf=size sndbuf=sized  接收和发送缓冲大小
		#backlog=num 设置监听函数listen()允许多少连接处于挂起状态也就是SYN队列有多大,FreeBSD默认为-1,其他为511
		#listen 80 default_server rcvbuf=1024 sndbuf=1024
		#reuseport 允许多个套接字监听在同一IP+PORT上,内核能够在这些套接字中对连接请求进行负载均衡。原有的模式是一个套接字连接请求
		#所有工作进程进行争抢锁(当accept_mutex off时),也就是多个工作进程都盯着这一个套接字,当使用reuseport时,每个工作进程都盯着
		#属于自己的套接字,这样就减少了争抢锁,然后系统内核决定把连接请求分配给哪个工作进程。设置了该项,accept_mutex会无效。
        listen       80;
		
		#主机名称,后面可以配置多个主机名
		#server_name www.a.com www.b.com www.c.com 那么多个名称如何匹配呢?首先取出请求首部信息,然后进行
		#精确匹配,匹配到了就响应。支持使用通配符和正则表达式。比如 *.a.com  www.a.* 但是通配符只能用在
		#三或者两段字符串组成的域名的首部或者尾部。
        server_name  localhost;
		
		#这里的root和location中的root是一个意思,就是去哪里找资源。但是如果定义在http段中,
		#那么这个root对所有location都是有效,也就是会继承。但是通常都会定义在location中。
		#root html;
		
		#为了实现快速主机名查找,Nginx使用HASH来保存主机名,这里就是定义HASH表的大小
		#server_names_hash_bucket_size 32|64|128;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        
		#定义location段。
		#location后面写的匹配规则,而{}里面写的是匹配后怎么办。
		# = 表示精确匹配,用于匹配标准URI,也就是不带正则的URI换句话说URI是以正常字符出现;^~ 非精确匹配,用户匹配标准URI,也就是不带正则的URI
		# ~ 表示匹配带正则的URI,但是区分大小写; ~* 表示匹配带正则的URI,但是不区分大小写。
		# = 大于 没有修饰符的 大于 ^~ 大于 ~ 或 ~*
        location / {
		    #匹配location之后,去本地哪里找请求资源,默认是/usr/nginx/html/
			#root /var/html; 你自己也可以指定路径而不用默认的。但是你要知道 / 符号表示的是
			#root所指定的路径, / 符号后面的路径你还需在 root所定义的路径下面再建立。
            root   html;
			#定义主页文件名称
            index  index.html index.htm;
			
			#是否允许目录形式显示,默认是OFF为不允许。除非你是一个可以让下载的网址。
			#这个参数可以设置在在http{}段中、server{}段中、location {}段中
			autoindex off;
			
			#在一个location内用于限定客户端可以使用的HTTP方法,get、head是安全方法通常不做限制,但是对于其他的
			#比如PUT、POST、DELETE等都是危险方法,通常只允许特定主机使用这些方法访问服务器。
			#下面的意思是说除了GET、POST方法其他都拒绝,但是来自192.168.154.0网段的可以使用任何方法,换句话说
			#就是除了来自192.168.154.0网段的请求可以使用任何HTTP方法之外,其他网络只能使用GET POST 方法
			limit_except GET POST {
			    #访问控制,由于默认是允许,所以你设置白名单的时候,最后一定要加deny all; 它子上而下进行匹配
				#allow deny 可以用在location{}段中,server{}段中,limit_except GET POST{}段中。
			    allow 192.168.154.0/24;
				deny all;
			}
        }
		
		location /aaa {
		  #针对match配置段中的服务器组做健康检查,如果不加参数在均保持默认值,该功能只能设置在location中
		  health_check [可选参数];
		  health_check match=MATCH_NAME;
		  # interval=time 表示2次健康检查之间的时间间隔,默认5秒
		  # jitter=time   表示
		  # fails=number  表示检查几次失败,则标记该服务器为不健康的,默认1次
		  # uri=uri   表示定义健康检查的uri,默认为/
		  # passes=number 表示几次检查成功后,则标记该服务器为健康的,默认为1次
		  # match=name   表示设置用哪个标准来确定服务器健康与否,默认为状态码2xx或3xx,这个NAME是标准名称,为match段定义的名字。
		  # port=number  表示健康检查时用哪个端口去检查后端服务器的健康状态,默认和server里的端口相同
		  
		  #代理到UPSTREAM_NAME中所定义的后端服务器上
		  proxy_pass http://UPSTREAM_NAME;
		  
		  #X-Real-Ip和X-Forwarded-For没有具体含义,实际上叫什么名字都是行
		  #获取用户真实IP放到X-Real-IP变量中,传递给被代理服务器
		  proxy_set_header X-Real-IP $remote_addr;
		  #再设置一次X-Forwarded-For头,让后端被代理服务器可以获取这个头域信息。
		  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		}
		
		location ^~ /documents/ {
		    #配置根,访问http://www.a.com/documents 对应实际磁盘路径为/web/documents
		    root /web/;
			#一次查找,如果都找不到就使用最后定义的uri来响应用户,$uri表示用户请求的任何内容
			#/404.html表示最后的uri,这个必须存在。
			try_files $uri /documents/bbb.html /404.html
		}
		
		location ^~ /book/ {
		    root /web;
			#所有请求/book/任意内容并且以.doc .docx .pdf 的都重定向到/libary下面,一般在location中
			#使用rewrite会使用break作为标识符,避免死循环,另外还可以写在IF字句中。
			rewrite ^/book/(.*\.(doc|docx|pdf))$ /libary/$1 break;
			#访问/book/下面的任何内容都重定向到/libary/下面
			rewrite ^/book/(.*)$ /libary/$1 break;
			#这个的意思其实可以上面的意义,但是不同的是它没有具体匹配什么东西,只要是/结尾就重定向
			#这个一般用在反向代理比较多,或者用在 location / {} 里面,比如80强制443访问。
			#rewrite ^/.*$ http://www.a.com 
			
			#是否把重写内容写入错误日志,默认为notice级别,默认是OFF
			#在很繁忙的服务器不建议打开,拍错的时候可以。
			rewrite_log on;
			#给这个location配置一个错误日志输出文件,于此location有关的错误日志都输出到这里
			#因为上面开启了 rewrite_log 所以重定向的也会到这里,但日志级别需要是notice才可以。如果
			#是error则不会记录,因为重定向这种事件本身就达不到error这个级别,所以不会记录。
			error_log /var/log/nginx/error1.log notice;
		}
		
		location ^~ /images/ {
		    #配置别名,访问http://www.a.com/images/ 对应实际磁盘路径为/web
		    alias /web/;
		}
        
        error_page  404  /404.html;
		location = /404.html {
		    root /web/error_page;
		}

        # redirect server error pages to the static page /50x.html
        #重定向错误页面用的,这里定义错误代码 以及定向为那个页面
        error_page   500 502 503 504  /50x.html;
		#定义错误代码页面资源存放位置,精确匹配/50x.html
        location = /50x.html {
            root   html;
        }
        
		#启用状态页面
		location /status {
		    stub_status;
			#对状态页的访问不记录到
			access_log off;
		}
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
		#表示定义处理任何以.php结尾的请求
        location ~ \.php$ {
		    #这里这个root是你实际php页面或者程序存放的目录,如果你的Nginx和PHP-FPM不在一台服务器上
			#那这里的root就是你PHP-FPM服务器上存放php文件的目录。如果Nginx和PHP-FPM在一台服务器上
			#这里的root也是你PHP页面存放目录,这里只是让你概念上有个明确的区分。
            root           /srv/phpScripts;
			#后端PHP-FPM服务器地址和端口
            fastcgi_pass   127.0.0.1:9000;
			#启用或禁用响应缓冲区,默认为on
			fastcgi_buffering on;
			#定义用Nginx用多大的缓冲区来接收FastCGI的应答头,也就是响应的第一部分,这部分通常包含很小的头信息
			#,默认情况下这个大小等于一个内存页,4K或者8K,取决不同平台,当然也可以设置的更小一点。
			#可以配置在http、server、location段中
			fastcgi_buffer_size 4K;
			#这个和上面的有区别,这里有数量和大小。这个是设置从FastCGI来的应答,本地用多少和多大缓冲区读取。
			#这样可以处理大部分请求,比较的请求将被缓冲到磁盘。fastCGI_buffer=fastcgi_buffer_size+number*size
			fastcgi_buffers 8 4k;
			#定义一个共享内存区域用于做缓存。相同区域可以分布在不同的地方。参数值可以包含变量。
			#默认为off。可以配置在http、server、location段中,这里只定义缓存名称,没有定义大小。
			fastcgi_cache zone1;
			#定义缓存关键字,针对这些关键字进行缓存,关键字也可以包含变量。默认为none.
			fastcig_cache_key none;
			#定义缓存路径(磁盘),levels设置的是缓存目录的目录分级和子目录数量。keys_zone的值是
			#fastcgi_cache定义的共享内存,用于存放所有活动的关键字以及数据。这里10m表示共享内存大小
			#为10M。非活动数据是指10分钟内没有用到的。这个时间可以设置 inactive=time
			fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=zone1:10m;
			#设置用户请求的URL请求几次才被缓存,默认为1次
			fastcgi_cache_min_uses 1;
			#设置建立与fastcgi的连接时的超时时间默认60秒,最大不能设置超过75秒。
			fastcgi_connect_timeout 
			#这里是定义默认fastcig的默认主页,也就是自动在用户请求的路径后面添加index.php,这个值将
			#存储在变量$fastcgi_script_name中
            fastcgi_index  index.php;
			#这里是脚本文件请求的路径,$document_root则表示用户请求的uri。
			#SCRIPT_FILENAME这是参数,后面的是值,参数可以被PHP所读取。所以fastcgi_parm就是为了
			#给PHP内置的这些参数传递变量的。
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
			#请求参数
			fastcgi_param  QUERY_STRING    $query_string;
			#请求头中的方法
            fastcgi_param  REQUEST_METHOD  $request_method;
			#请求头中的Content-Type字段
            fastcgi_param  CONTENT_TYPE    $content_type;
			#请求头中的Content-length字段
            fastcgi_param  CONTENT_LENGTH  $content_length;
			#客户端IP
			fastcgi_param  REMOTE_ADDR     $remote_addr; 
			#客户端端口
            fastcgi_param  REMOTE_PORT     $remote_port;
            #服务器IP地址			
            fastcgi_param  SERVER_ADDR     $server_addr; 
			#服务器端口
            fastcgi_param  SERVER_PORT     $server_port;
            #服务器名,域名在server配置中指定的server_name			
            fastcgi_param  SERVER_NAME     $server_name; 
            include        fastcgi_params;
        }

        # deny access to .htaccess files, if Apache‘s document root
        # concurs with nginx‘s one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
	
    #    SSL证书
    #    ssl_certificate      cert.pem;
	#    SSL证书的私钥
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
	#    支持什么协议,下面这些也都是默认支持的
	#    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	
	#    SSL超时时间,如果服务器性能比较好可以把时间调整长一点。但是也要看具体应用
	#因为SSL建立和释放更消耗资源,可以评估一下,是频繁的建立和断开更消耗资源,还是长一点
	#的超时时间更消耗。通常也要看具体场景,如果用户打开网站通常都是需要浏览一会儿,比如购物网站
	#那么超时时间建议设置长一点,但是付款环节通常都是比较快速,通常这个页面没有长时间浏览的必要,
	#另外为了安全考虑这个阶段的超时时间要短一点。
    #    ssl_session_timeout  5m;

	#    加密选项
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
	#    是否允许服务器来挑选使用什么加密
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}


本文出自 “小恶魔的家” 博客,请务必保留此出处http://littledevil.blog.51cto.com/9445436/1901390

Nginx(三):nginx.conf配置文件说明 【1】 配置参数说明