说明

这个配置文件几乎参照了官方最新版本的配置规范来进行编写的,且使用中文的形式尽可能进行详细描述。

在参考或者使用前请酌情调整,且部分功能可能取决于你的nginx版本,在应用配置之前务必使用nginx -t进行配置文件测试。

以下配置文件的语法已经经过实机测试,如果你在测试时提示语法错误,请重点关注Nginx版本或者对应的模块是否缺失。

# 最后编辑:2020年11月21日17:18:34


# Nginx使用的用户,决定了Nginx以什么样的用户来运行
# 语法:user user_name group_name
# 默认:root
user www www;

# Pid进程文件目录
pid /run/nginx.pid;

# Nginx进程数(设置auto则对应为CPU核心数量)
worker_processes auto;

# Nginx CPU时钟控制(进阶功能,请谨慎使用)
# 语法: worker_cpu_affinity Core1 Core2....
worker_cpu_affinity 01 10;
    # 双核:worker_cpu_affinity 01 10;
    # 四核:worker_cpu_affinity 0001 0010 0100 1000;  
    # 八核:worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000;

# 每个Worker进程打开的最多文件描述符数目
worker_rlimit_nofile 65535;

# Nginx 主程序日志设置(用于记录Nginx主程序出现错误之后应该被记录在哪里)
error_log logs/nginx_error.log;
error_log logs/nginx_error.log notice;
error_log logs/nginx_error.log info;

#事件模块设置(每个)
events {

    # 开启或者禁用sockets互斥锁
    # 语法:on或者off,默认值:on
    accept_mutex on;

    # 定义每个worker进程等待多长时间才能再次获取资源
    # 语法 Numeric (time),默认值:500ms
    accept_mutex_delay 500ms;

    # 定义Nginx是否一次同意从监听队列所有到来的连接
    # 语法:on或者off,默认值:off
    multi_accept on;

    # 每个进程允许的最大连接数
    # 语法:数值,默认值:无
    worker_connections 1024;

    # 为匹配的IP客户端写入详细的日志,这些错误信息将会存储 error_log 日志文件中,并且需要 error_log 指令的值为debug级别
    # 语法:IP地址或者一整个CIDR地址段,默认值:空
    # debug_connection 192.168.1.0/24;

    # 定义Nginx使用的队列处理模型
    # 可用的参数:/dev/poll, epoll, eventport, kqueue,rtsig, or select
    # 默认值:在编译时nginx自动指定或手动指定
    use epoll;
        # 接受下列参数:
        # 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最高效的方式
}

http {
    include mime.types;
    default_type application/octet-stream;

    # 设置NGINX缓存数据目录
        client_body_temp_path /tmp/client_temp;
        proxy_temp_path       /tmp/proxy_temp;
        fastcgi_temp_path     /tmp/fastcgi_temp;
        uwsgi_temp_path       /tmp/uwsgi_temp;
        scgi_temp_path        /tmp/scgi_temp;

    # 开启DDNS支持(用于反向代理没有固定IP地址的后端)
        resolver 223.5.5.5;
        resolver_timeout 5s;

    # 缓存设置,调整缓冲区的大小。如果缓冲区大小过低则 Nginx 必须写入临时文件,导致磁盘不断读取和写入,过大会消耗更多的物理内存。
        # 处理客户端缓冲区大小,即发送到 Nginx 的任何 POST 操作。如表单提交。
        client_body_buffer_size 32k;
        # 与上一个指令类似,它只能处理客户端标头大小。对于所有意图和目的,一般来说都是设置为1k即可。
        client_header_buffer_size 1k;
        # 客户端请求的最大允许大小。如果超过最大大小,则 Nginx 将返回一个413错误给浏览器(请求实体太大)。
        client_max_body_size 32m;
        # 大型客户端标头的最大缓冲区数和大小,适用于Header数据较多的客户端。
        large_client_header_buffers 2 1k;

    # 传输模式设置
        # 开启文件高效传输模式
        sendfile on;
        # 激活非阻塞传输功能
        tcp_nopush on;
        # 数据在传输的过程中不进缓存
        tcp_nodelay   on;

    # 超时设置,如果设置得当可以显著提升Nginx性能。
        # 指令负责服务器等待请求后发送客户端正文或客户端标头的时间。如果超过这个时间仍未发送正文或标头,服务器将发出 408 错误(request_timeout)。
        client_body_timeout 12;
        client_header_timeout 12;
        # 分配与客户端保持长连接活动的超时时间。Nginx 将在这段时间后将会与客户端关闭连接。
        keepalive_timeout 120;
        # 操作超时时间,客户端在这个时间之后仍然没有操作,nginx会关闭与客户端的谅解。
        send_timeout 10;

    # 日志类型开关
        log_not_found on;
        log_subrequest off;

    #代理缓存设置
        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
        proxy_cache_revalidate on;
        proxy_cache_min_uses 3;
        proxy_cache_background_update on;
        proxy_cache_lock on;

    # gzip设置
    # Gzip 可以帮助减少 Nginx 处理的网络传输量。但是如果盲目的调高压缩量将会导致CPU花费大量的时间在压缩数据上面。
        # 决定是否开启gzip模块,on表示开启,off表示关闭;
        gzip on;

        # IE5.5和IE6 SP1使用msie6参数来禁止gzip压缩,指定哪些不需要gzip压缩的浏览器(将和User-Agents进行匹配),依赖于PCRE库
        gzip_disable "MSIE [1-6]\.";

        # nginx做为反向代理时启用
        gzip_proxied any;
            # 接受下列参数:
            # off(关闭所有代理结果的数据的压缩)
            # expired(启用压缩,如果header头中包括"Expires"头信息)
            # no-cache(启用压缩,header头中包含"Cache-Control:no-cache")
            # no-store(启用压缩,header头中包含"Cache-Control:no-store")
            # private(启用压缩,header头中包含"Cache-Control:private")
            # no_last_modefied(启用压缩,header头中不包含"Last-Modified")
            # no_etag(启用压缩,如果header头中不包含"Etag"头信息)
            # auth(启用压缩,如果header头中包含"Authorization"头信息)

        # 设置允许压缩的页面最小字节(从header头的Content-Length中获取) ,当返回内容大于此值时才会使用gzip进行压缩,以K为单位,当值为0时,所有页面都进行压缩。建议大于1k。
        gzip_min_length 10k;
        # 设置gzip压缩等级,等级越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大;等级1-9,最小的压缩最快 但是消耗cpu。
        gzip_comp_level 2;
        # 设置gzip压缩的数据匹配类型,gzip会对命中下面格式的内容进行压缩处理。
        gzip_types text/plain
            text/css
            application/json
            application/x-javascript
            text/xml
            application/xml
            application/xml+rss
            text/javascript;
        # 设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间,param2:int(k) 后面单位是k。这里设置以16k为单位,按照原始数据大小以16k为单位的4倍申请内存。
        gzip_buffers 4 16k;
        # 启用应答头"Vary: Accept-Encoding",这个选项可以让前端的缓存服务器缓存经过gzip压缩的页面; 这个可以不写,表示在传送数据时,给客户端说明我使用了gzip压缩。
        gzip_vary on;

    # Nginx限速模块
        # 日志配置,设置当达到最大限制连接数后,记录日志的等级。
        # 语法:limit_conn_log_level info | notice | warn | error
        # 默认值:error
        limit_conn_log_level error;

        # 连接数限制(以下为著名的漏桶算法配置)
        # 该指令描述会话状态存储区域。键的状态中保存了当前连接数,键的值可以是特定变量的任何非空值(空值将不会被考虑)。
        # $variable定义键,zone=name定义区域名称,后面的limit_conn指令会用到。size定义各个键共享内存空间大小。
        # 语法:limit_conn_zone $variable zone=name:size;
        # 默认值:无
        limit_conn_zone $binary_remote_addr zone=connlimit:10m;
            # $remote_addr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
            # $binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
            # 1M共享空间可以保存3.2万个32位的状态,1.6万个64位的状态。
            # 如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。

        # 指定每个给定键值的最大同时连接数,当超过这个数字时被返回503 (Service Temporarily Unavailable)错误。
        # 语法:limit_conn zone_name number
        # 默认值:无
        limit_conn connlimit 1;
            # 同一IP同一时间只允许有一个连接。
            # limit_conn指令可以从上级继承。

        # 最大请求数限制(原理同上)
        limit_req_zone $binary_remote_addr zone=reqlimit:10m rate=10r/s;
            # 10r/s为每秒只允许10个请求,超过请求将返回503错误。

        # 指定每个给定键值的最大同时请求数(原理同上)
        limit_req zone=reqlimit burst=5 nodelay;
            # burst参数允许突发处理5个请求,nodely将允许突发请求进入时立刻处理无需排队。

        # 对每个连接的速率限制,参数rate的单位是字节/秒,设置为0将关闭限速。
        # 注意是按连接限速而不是按IP限制,因此如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的2倍。
        # 语法:limit_rate rate
        # 默认值:0
        limit_rate 0;

        # 触发限制后的返回值,需要Nginx版本高于1.3.15。指定当超过限制时,返回的状态码。
        # 语法:limit_conn_status code;
        # 默认值:503
        limit_conn_status 503;

    # 错误跳转,定义错误页面会被跳转到哪个站点。
    # error_page 404 http://xxx.xxx.com/404.html;
    # error_page 500 502 503 504  http://xxx.xxx.com/50x.html;

    # 安全设置
        # Nginx版本号开关,决定了nginx错误页面页脚会不会显示nginx的版本号。
        server_tokens off;
        # 隐藏HTTP头中关于nginx的信息。
        proxy_hide_header X-Powered-By;
        proxy_hide_header Server;

    # FastCGI设置
        # Nginx服务器和后端FastCGI服务器连接的超时时间
        fastcgi_connect_timeout  240;
        # Nginx允许FastCGI服务器返回数据的超时时间,即在规定时间内后端服务器必须传完所有的数据,否则Nginx将断开这个连接
        fastcgi_send_timeout     240;
        # Nginx从FastCGI服务器读取响应信息的超时时间,表示连接建立成功后,Nginx等待后端服务器的响应时间
        fastcgi_read_timeout     240;
        # Nginx FastCGI 的缓冲区大小,用来读取从FastCGI服务器端收到的第一部分响应信息的缓冲区大小
        fastcgi_buffer_size      64k;
        # 设定用来读取从FastCGI服务器端收到的响应信息的缓冲区大小和缓冲区数量
        fastcgi_buffers        4 64k;
        # 用于设置系统很忙时可以使用的 proxy_buffers 大小
        fastcgi_busy_buffers_size    128k;

    # PHP后端定义
    upstream php {
        #交予后端PHP服务器处理,权重模式,失败后20秒后重试使用这个后端,一共失败3次后移出负载均衡队列。
        ip_hash;
        server 10.0.3.131:9000 weight=1 max_fails=3 fail_timeout=20s;
        server 10.0.3.129:9000 weight=1 max_fails=3 fail_timeout=20s;
    }

    # 通用HTTPS跳转规则
    # 有了这条规则存在,纯HTTPS的站点无需再重复编写HTTP-->HTTPS的跳转server块,会被下面这条规则统一rewrite到HTTPS(详见:[《几行配置搞定全Server的HTTPS跳转》][1])
    server {
        # 监听IPv4+ipv6的80端口
        listen 80 default_server;
        listen [::]:80 default_server;

        # 如果子主机都匹配失败了,就会到达这条规则。
        server_name _;

        # 将客户端重定向到Https
        rewrite ^(.*)$ https://$host$1 permanent;
    }

    # 导入其他目录的虚拟服务器配置文件
    include conf.d/*.conf;
}