生产可用的nginx主配置文件及各配置项释义

Nginx 主配置文件说明

  • 以下节选自编译安装的 openresty,文件位置为:/usr/local/openresty/nginx/conf/nginx.conf,关于 Openresty 的编译安装,本博客有文详述,下面直接上干货!
  • 以下主配置文件中并未启用本地使用缓存功能,因为 Nginx 本地使用缓存功能且使用 CDN 回源的时候,发布了静态资源后可能导致不能及时回源,建议在这种场景下关闭缓存,毕竟 CDN 已经起到了缓存的作用且离用户更近;
# 指定启动nginx使用的用户(不指定为nobody)
user	nginx nginx;

# 定义作为web服务器/反向代理服务器时的 worder process 进程数
worker_processes	auto;
# 开启多核支持,且自动根据CPU个数均匀分配 worder process 进程数
worker_cpu_affinity	auto;
# 指定一个nginx进程可以打开的最多文件描述符数目
worker_rlimit_nofile 	65535;

# error_log配置,等级类型:[ debug | info | notice | warn | error | crit ]
error_log  /var/log/nginx/error.log  notice;
# nginx的进程pid位置;
pid        /var/run/nginx.pid;

# 连接处理相关设置
events{
    # 使用epoll的 I/O 模型,必开项,极其有利于性能
    use		       epoll;
    # 设置是否允许一个worker可以接受多个请求,默认是off;
    # 值为OFF时,一个worker process进程一次只接收一个请求,由master进程自动分配worker(nginx精于此道,故建议设置为off);
    # 值为ON则一次可接收所有请求,可避免master进程额外调度,但是在高瞬时值的情况下可能导致tcp flood;
    multi_accept off;
    # 每个工作进程的并发连接数(默认为1024)
    # 理论上nginx最大连接数 = worker_processes * worker_connections
    worker_connections 65535;
}

http {
    # mime.types 指定了nginx可以接受的 Content-Type,该文件默认位于nginx.conf的同级目录
    include       mime.types;
    # 设置默认文件类型,application/octet-stream 表示未知的应用程序文件,浏览器一般不会自动执行或询问执行
    default_type  application/octet-stream;
    # 设置日志的记录格式
    log_format main escape=json '{ "time": "$time_iso8601", '
        '"remote_addr": "$remote_addr", '
        '"status": "$status", '
        '"bytes_sent": "$bytes_sent", '
        '"host": "$host", '
        '"request_method": "$request_method", '
        '"request_uri": "$request_uri", '
        '"request_time": "$request_time", '
        '"response_time": "$upstream_response_time",'
        '"http_referer": "$http_referer", '
        '"body_bytes_sent": "$body_bytes_sent", '
        '"http_user_agent": "$http_user_agent", '
        '"http_x_forwarded_for": "$http_x_forwarded_for", '
        '"cookie": "$http_cookie" '
        '}';

    # 用来指定日志文件的存放路径及内容格式
    access_log  /var/log/nginx/access.log  main;
    # 不记录404错误的日志
    log_not_found	off;
    # 隐藏nginx版本号
    server_tokens	off;
    # 开启0拷贝,提高文件传输效率
    sendfile	on;
    # 配合 sendfile 使用,启用后数据包会累计到一定大小之后才会发送,减小额外开销,提高网络效率;
    tcp_nopush	on;
    # 启用后表示禁用 Nagle 算法,尽快发送数据
    # 与 tcp_nopush 结合使用的效果是:先填满包,再尽快发送
    # Nginx 只会针对处于 keep-alive 状态的 TCP 连接才会启用 tcp_nodelay
    tcp_nodelay	on;
    # 指定客户端与服务端建立连接后发送一个 request body 的超时时间,超时Nginx将返回http 408
    client_body_timeout	10;
    # 开启从client到nginx的连接长连接支持,指定每个 TCP 连接最多可以保持多长时间
    # keepalive_timeout的值应该比 client_body_timeout 大
    keepalive_timeout	60;
    # keepalive_requests指令用于设置一个keep-alive连接上可以服务的请求的最大数量,当最大请求数量达到时,连接将被关闭
    keepalive_requests	1000;

    # 客户端请求头部的缓冲区大小,设置等于系统分页大小即可,如果header过大可根据实际情况调整;
    # 查看系统分页:getconf PAGESIZE
    client_header_buffer_size	    32k;
    # 设置客户端请求的Header头缓冲区大小,如果客户端的Cookie信息较大,按需增加
    large_client_header_buffers	    4 64k;
    # 化读取$request_body变量时的I/O性能
    client_body_in_single_buffer    on;
    # 设定request body的缓冲大小,仅在 Nginx被设置成使用内存缓冲时有效(使用文件缓冲时该参数无效)
    client_body_buffer_size	    128k;

    # 开启proxy忽略客户端中断,避免499错误
    proxy_ignore_client_abort	    on;
    # 默认的情况下nginx引用header变量时不能使用带下划线的变量,设置underscores_in_headers为 on取消该限制
    underscores_in_headers	    on;
    # 默认的情况下nginx会忽略带下划线的变量,设置ignore_invalid_headers为off取消该限制
    ignore_invalid_headers	    off;
    # 设置客户端向服务端发送一个完整的 request header 的超时时间,优化弱网场景下nginx的性能
    client_header_timeout	9;
    # 设置向客户端传输数据的超时时间
    send_timeout		60;
    # 用于启用文件功能时用限制文件大小;
    client_max_body_size	50m;

    # 文件压缩配置,对文本文件效果较好,对图像类应用效果一般反而徒增服务器资源消耗
    gzip		on;
    # 兼容http 1.0
    gzip_http_version	1.0;
    # 压缩比,数值越大:压缩的程度越高、空间占用越低、压缩效率越低、资源消耗越大
    gzip_comp_level	6;
    # 设置压缩门限,小于该长度将不会进行压缩动作(数据过小的情况下,压缩效果不明显)
    gzip_min_length	1k;
    # 用于在nginx作为反向代理时,根据请求头中的“Via”字段决定是否启用压缩功能,默认值为off,any表示对所有请求启动压缩;
    gzip_proxied	any;
    # 用于在启动gzip压缩功能时,在http响应中添加Vary: Accept-Encoding头字段告知接收方使用了gzip压缩;
    gzip_vary		on;
    # 当Agent为IE6时禁用压缩:IE6对Gzip不友好,所以不压缩
    gzip_disable	msie6;
    # 设置系统用于存储gzip的压缩结果数据流的缓存大小(4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存)
    gzip_buffers	4 64k;
    # 指定需要压缩的文件mime类型
    gzip_types		text/xml text/plain text/css application/javascript application/x-javascript application/xml application/json application/rss+xml;

    # 作为反向代理服务器配置
    # 当请求未携带“Host”请求头时将Host设置为虚拟主机的主域名
    proxy_set_header        Host $host;
    # 设置真实客户端IP
    proxy_set_header        X-Real-IP $remote_addr;
    # 简称XFF头,即HTTP的请求端真实的IP,在有前置cdn或者负载均衡可能会被修改;如果要提取客户端真实IP,需要根据实际情况调整,如若后端程序获得对X-Forwarded-For兼容性不好的话(没有考虑到X-Forwarded-For含有多个IP的情况),建议设置为:$http_x_forwarded_for
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    # 启用nginx和后端server(upstream)之间长连接支持(必设项,否则很影响nginx性能),HTTP协议中从1.1版本才支持长连接;启用时需要评估upstream的keepalive参数(默认是关闭的,比较懒的同学可以设置为500)
    proxy_http_version 1.1;
    # 每次访问完后端server后如何处理本次连接,默认配置是close(会给后端server带来大量的TIME_WAIT连接,降低后端server性能),设置为""结合proxy_http_version设置连接保持;
    proxy_set_header Connection "";
    # 用于对发送给客户端的URL进行修改,使用不到的话可以关闭
    proxy_redirect          off;
    # 设置缓冲区的大小和数量,用于放置被代理的后端服务器取得的响应内容
    proxy_buffers           64 8k;
    # 设置和后端建立连接的超时时间,单位秒
    proxy_connect_timeout   60;
	# 设置Nginx向后端被代理服务器发送read请求后,等待响应的超时时间,默认60秒
    proxy_read_timeout 60;
	# 设置Nginx向后端被代理服务器发送write请求后,等待响应的超时时间,默认60秒
    proxy_send_timeout 60;
    # 用于配置存放HTTP报文头的哈希表容量,默认为512个字符。一般都设置为1024,这个大小是哈希表的总大小,
    #设定了这个参数Nginx不是一次全部申请出来,需要用的时候才会申请;
    #但是当真正需要使用的时候也不是一次全部申请,而是会设置一个单次申请最大值(proxy_headers_hash_bucket_size)
    proxy_headers_hash_max_size 1024;
    #用于设置Nginx服务器申请存放HTTP报文头的哈希表容量的单位大小,默认为64个字符。一般配置为128。
    #这个大小是单次申请最多申请多大,也就是每次用需要申请,但是每次申请最大申请多少,整个哈希表大小不可超过上面设置的值。
    proxy_headers_hash_bucket_size 128;

    # 设置缓存临时目录
    proxy_temp_path	/var/cache/nginx/proxy_temp;
    # 设置缓存目录、目录结构及缓存数据保留策略
    proxy_cache_path	/var/cache/nginx/proxy_cache levels=1:2 keys_zone=cache_one:512m inactive=1d max_size=2g;

    # 预防 DDOS 攻击配置策略
    #limit_req_zone          $binary_remote_addr  zone=req:20m   rate=3r/s;
    #limit_req               zone=req  burst=60;
    #limit_zone              conn $binary_remote_addr  20m;
    #limit_conn              conn 5;
    #limit_rate              50k;

    # 设置nginx可以捕获的服务器名字(server_name)的最大数量
    server_names_hash_max_size    1024;
    # 设置nginx中server_name支持的最大长度
    server_names_hash_bucket_size 128;

    include conf.d/*.conf;
}