nginx配置文件常用基本配置指令
一、配置文件结构
#全局块 ... #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;