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