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; # } #} }
时间: 2024-10-10 17:27:43