nginx的配置文件说明
#运行nginx的用户
user root;
#进程数,官方建议为cpu核数,auto为按需自动调整
worker_processes auto;
#错误日志保存的路径
error_log /data/ngxlog/error.log;
#不同级别日志分开存储,可配置不同日志路径
#error_log logs/error.log notice;
#error_log logs/error.log info;
#指定pid文件路径,默认为以下路径
#pid logs/nginx.pid;
events {
#处理网络消息事件驱动器模型
#网上找到解析如下:
#其支持的类型有:select、poll、kqueue、epoll、rtsing、/dev/poll以及eventport
#* select:只能在Windows下使用,这个事件模型不建议在高负载的系统使用
#* poll:Nginx默认首选,但不是在所有系统下都可用
#* kqueue:这种方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系统中是最高效的
#* epoll: 这种方式是在Linux 2.6+内核中最高效的方式
#* rtsig:实时信号,可用在Linux 2.2.19的内核中,但不适用在高流量的系统中
#* /dev/poll: Solaris 7 11/99+,HP/UX 11.22+, IRIX 6.5.15+, and Tru64 UNIX 5.1A+操作系统最高效的方式
#* eventport: Solaris 10最高效的方式
use epoll;
#开启后同时接收多个新到达的网络连接
multi_accept on;
#每个work_process同时开启的最大连接数
worker_connections 65535;
}
http {
#定义nginx能识别的网络资源媒体类型(如,文本、html、js、css、流媒体等,cat conf/mime.types)
include mime.types;
#定义默认的type,如果不定义改行,默认为text/plain
default_type application/octet-stream;
#日志格式
log_format main escape=json '{"@timestamp":"$time_iso8601",'
'"@fields":{'
'"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"body_bytes_sent":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"status":"$status",'
'"request":"$request",'
'"request_method":"$request_method",'
'"http_referrer":"$http_referer",'
'"url":"$uri",'
'"request_body":"$request_body",'
'"body_bytes_sent":"$body_bytes_sent",'
'"http_x_forwarded_for":"$http_x_forwarded_for",'
'"http_user_agent":"$http_user_agent"}}';
#接入日志,main格式,全局
access_log /data/ngxlog/access.log main;
#安全优化-隐藏版本号
server_tokens off;
#收到请求数据包后会立即响应ack,会增加小包的数量,但是可以提高响应速度。在及时性高的通信场景中应该会有不错的效果。如果设置为off,会增加通信的延时,但是会提高带宽利用率。在高延时、数据量大的通信场景中应该会有不错的效果
tcp_nodelay on;
#保存服务器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果 hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大 hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.
# server_names_hash_max_size 默认1024,server_names_hash_bucket_size 默认256
# server_names_hash_max_size 1024;
server_names_hash_bucket_size 256;
#关闭反代缓冲,一收到后端的反馈就同时传给客户端。这个参数用来控制是否打开后端响应内容的缓冲区,如果这个设置为off,那么proxy_buffers和proxy_busy_buffers_size这两个指令将会失效。 但是无论proxy_buffering是否开启,对proxy_buffer_size都是生效的。
#1、 proxy_buffering启用时,要提防使用的代理缓冲区太大。这可能会吃掉你的内存,限制代理能够支持的最大并发连接数。
#2、对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作
proxy_buffering off;
#该指令设置缓冲区大小,从代理后端服务器取得的第一部分的响应内容,会放到这里.小的响应header通常位于这部分响应内容里边.
proxy_buffer_size 128k;
#该指令设置缓冲区的大小和数量,从被代理的后端服务器取得的响应内容,会放置到这里. 默认情况下,一个缓冲区的大小等于内存页面大小,可能是4K也可能是8K,这取决于平台。proxy_buffers由缓冲区数量和缓冲区大小组成的。总的大小为number*size。若某些请求的响应过大,则超过_buffers的部分将被缓冲到硬盘(缓冲目录由_temp_path指令指定), 当然这将会使读取响应的速度减慢, 影响用户体验. 可以使用proxy_max_temp_file_size指令关闭磁盘缓冲.
proxy_buffers 4 1m;
#proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由proxy_busy_buffers_size来控制的,建议为proxy_buffers中单个缓冲区大小的2倍),然后它继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中。
proxy_busy_buffers_size 2m;
#后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据,单位秒
#proxy_connect_timeout :后端服务器连接的超时时间_发起握手等候响应超时时间
#proxy_read_timeout:连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
#proxy_send_timeout :后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_send_timeout 15;
#临时文件由proxy_max_temp_file_size和proxy_temp_file_write_size这两个指令决定。 proxy_temp_file_write_size是一次访问能写入的临时文件的大小,默认是proxy_buffer_size和proxy_buffers中设置的缓冲区大小的2倍,Linux下一般是8k。proxy_max_temp_file_size指定当响应内容大于proxy_buffers指定的缓冲区时, 写入硬盘的临时文件的大小. 如果超过了这个值, Nginx将与Proxy服务器同步的传递内容, 而不再缓冲到硬盘. 设置为0时, 则直接关闭硬盘缓冲.
proxy_temp_file_write_size 8m;
#proxy_max_temp_file_size 0;
#当上游服务器响应头回来后,可以根据响应状态码的值进行拦截错误处理,与error_page 指令相互结合。用在访问上游服务器出现错误的情况下。
proxy_intercept_errors on;
#定义与FastCGI服务器建立连接的配置,通常是php
fastcgi_connect_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
#是否调用sendfile函数传输文件,默认为off,使用sendfile函数传输,可以减少user mode和kernel mode的切换,从而提升服务器性能。对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
sendfile on;
#该参数限定Nginx worker process每次调用sendfile()函数传输数据的最大值,默认值为0,如果设置为0则无限制。配合上边sendfile 选项一起使用。
#sendfile_max_chunk 128k;
#当tcp_nopush设置为on时,会调用tcp_cork方法进行数据传输。使用该方法会产生这样的效果:当应用程序产生数据时,内核不会立马封装包,而是当数据量积累到一定量时才会封装,然后传输。这样有助于解决网络堵塞问题。默认值为on。举例:快递员收快递、发快递,包裹累积到一定量才会发,节省运输成本。
#tcp_nopush on;
#启用gzip
gzip on;
# 开始压缩的最小长度(再小就不要压缩了,意义不在)
gzip_min_length 1000;
#配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_disable "msie6";
gzip_proxied any;
#缓冲(压缩在内存中缓冲几块? 每块多大?)
gzip_buffers 4 16k;
# 开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)
gzip_http_version 1.1;
#压缩级别(1-9,级别越高,压的越小,越浪费CPU计算资源)
gzip_comp_level 4;
# 对哪些类型的文件用压缩
gzip_types image/jpg text/plain application/x-javascript text/css application/xml image/png;
# 是否传输gzip压缩标志
gzip_vary on;
#max指定缓存数量 inactive是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=100000 inactive=20s;
#这个是指多长时间检查一次缓存的有效信息。也就是说即使我一直访问这个文件,30s后会检查此文件的更改信息是否变化,发现变化就更新
open_file_cache_valid 30s;
#open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件更改信息一直是在缓存中打开的
open_file_cache_min_uses 2;
#文件错误是否也同样缓存
open_file_cache_errors on;
#该参数有两个值,第一个值设置nginx服务器与客户端会话结束后仍旧保持连接的最长时间,单位是秒,默认为75s。
#第二个值可以省略,它是针对客户端的浏览器来设置的,可以通过curl -I看到header信息中有一项Keep-Alive: timeout=60,如果不设置就没有这一项。
#第二个数值设置后,浏览器就会根据这个数值决定何时主动关闭连接,Nginx服务器就不操心了。但有的浏览器并不认可该参数。
keepalive_timeout 65;
#指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。
client_body_timeout 10s;
#客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。
client_header_timeout 10;
#如果(请求行+请求头)的大小限制
client_header_buffer_size 128k;
#浏览器在发送含有较大HTTP包体的请求时,其头部会有一个Content-Length字段,client_max_body_size是用来限制Content-Length所示值的大小的。这个限制包体的配置不用等Nginx接收完所有的HTTP包体,就可以告诉用户请求过大不被接受。会返回413状态码。例如,用户试图上传一个1GB的文件,Nginx在收完包头后,发现Content-Length超过client_max_body_size定义的值,就直接发送413(Request Entity Too Large)响应给客户端。
large_client_header_buffers 4 128k;
#client_max_body_size 默认 1M,表示 客户端请求服务器最大允许大小,在“Content-Length”请求头中指定。如果请求的正文数据大于client_max_body_size,HTTP协议会报错 413 Request Entity Too Large。就是说如果请求的正文大于client_max_body_size,一定是失败的。如果需要上传大文件,一定要修改该值。
client_max_body_size 300m;
#Nginx分配给请求数据的Buffer大小,如果请求的数据小于client_body_buffer_size直接将数据先在内存中存储。如果请求的值大于client_body_buffer_size小于client_max_body_size,就会将数据先存储到临时文件中,在哪个临时文件中呢?client_body_temp 指定的路径中,默认该路径值是/tmp/。所以配置的client_body_temp地址,一定让执行的Nginx的用户组有读写权限。否则,当传输的数据大于client_body_buffer_size,写进临时文件失败会报错。
client_body_buffer_size 512k;
#定义一个叫“one”的记录区,总容量为 10M,以变量$binary_remote_addr作为会话的判断基准(即一个地址一个会话),外网NAT会受到影响
#location 节点中可以通过 limit_conn one 1; 进行限制,指定一个会话最大的并发连接数。
#limit_conn_zone $binary_remote_addr zone=one:10m;
#反向代理的上有服务器配置
#每个upstream节点可配置多个服务器ip,可根据weight分配调用权重
upstream shop{
server 127.0.0.1:8080;
}
upstream logistics{
#后端服务器列表
server 127.0.0.1:8080 weight=5;
server 192.168.1.1:8080 weight=10;
}
upstream https_shop{
server 127.0.0.1:8443;
}
upstream https_logistics{
server 127.0.0.1:8443 weight=5;
server 192.168.1.1:8443 weight=10;
}
#80端口服务器节点
#可以根据server_name 配置响应的的域名,从而区分多个服务
server {
#端口
listen 80;
server_name mydomain.cn;
charset utf8;
#限制向客户端传送响应的速率限制。参数 rate 的单位是字节/秒
#limit_rate 2m;
# access_log logs/host.access.log main;
#匹配根路径
location / {
#根目录
root /data/html;
#默认文件
index index.html index.htm;
}
#匹配shop路径
location ^~ /shop/ {
#反向代理 shop的upstream
proxy_pass http://shop;
#设置反向代理请求的几个header
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#验证客户端请求的referers
valid_referers none blocked mydomain.cn 192.168.12.11 192.168.11.15 localhost servicewechat.com;
if ($invalid_referer) {
return 403;
}
}
#匹配logistics路径
location ^~ /logistics {
proxy_pass http://logistics;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
valid_referers none blocked mydomain.cn 192.168.12.11 192.168.11.15 localhost servicewechat.com;
if ($invalid_referer) {
return 403;
}
}
#匹配Images路径
location ^~ /Images {
#路径别名
alias /data/resource/Images;
autoindex on;
access_log off;
#限速4兆
limit_rate 4m;
valid_referers none blocked mydomain.cn 192.168.12.11 192.168.11.15 localhost servicewechat.com;
if ($invalid_referer) {
return 403;
}
}
#error_page 404 /404.html;
# 重定向错误页
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#443端口服务器节点,https服务
server {
#开启ssl,https服务
listen 443 ssl;
server_name mydomian.cn; #填写绑定证书的域名
#ssl 配置,这里参考了腾讯配置指导
ssl_certificate /data/ssl/1_bundle.crt;
ssl_certificate_key /data/ssl/2_.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
location / {
root /data/html/;
index index.html index.htm index.php;
}
location ^~ /shop/ {
proxy_pass https://https_shop;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
valid_referers none blocked mydomain.cn 192.168.12.11 192.168.11.15 localhost servicewechat.com;
if ($invalid_referer) {
return 403;
}
}
location ^~ /logistics {
proxy_pass http://https_logistics;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
valid_referers none blocked mydomain.cn 192.168.12.11 192.168.11.15 localhost servicewechat.com;
if ($invalid_referer) {
return 403;
}
}
location ^~ /Images {
alias /data/resource/Images;
autoindex on;
access_log off;
limit_rate 4m;
valid_referers none blocked mydomain.cn 192.168.12.11 192.168.11.15 localhost servicewechat.com;
if ($invalid_referer) {
return 403;
}
}
}
}
http节点内可以增加类似如下的include配置,nginx会去指定目录读取conf文件进行配置。
include /etc/nginx/conf.d/*.conf;