全局配置

  • worker_processes auto;

启动工作进程的数量,auto代表服务器有多少核心,就启动多少个进程。

  • worker_rlimit_nofile 20480

工作进程最大打开的文件数,同Linux概念中的ulimit -n 20480

  • worker_rlimit_core 500M;

表示工作进程所使用的Core文件大小的最大值。

进程在Crash的时候会产生Core文件,可供后续获取更详细的调试信息。

  • worker_shutdown_timeout 3;

当安全结束一个工作进程时,会停止对工作进程分配新连接,并等待他处理完当前的任务后再退出,如果设置了超时时间,超时后nginx会强制关闭工作进程的连接。

event配置

  • accept_mutex off;

这个配置默认是开启的,高并发模式下,关闭它会提升一定的QPS。

当一个新连接到达时,如果激活了accept_mutex,那么多个Worker将以串行方式来处理,其中有一个Worker会被唤醒,其他的Worker继续保持休眠状态;

如果没有激活accept_mutex,那么所有的Worker都会被唤醒,不过只有一个Worker能获取新连接,其它的Worker会重新进入休眠状态,这就是「惊群问题」

从系统的层面上来说,也就是进程之间会产生一定数量的上下文切换,但我们的工作进程一般与CPU相关,并不会有特别多的进程,所以建议关闭。

另外nginx从1.11.3版本之后也增加了对NGX_EXCLUSIVE_EVENT选项的支持,这样就可以避免多worker的epoll出现的惊群效应,从此之后accept_mutex从默认的on变成了默认off。

  • worker_connections 20480;

这个参数就是工作进程最大支持的连接数,理论上是越多越好,但也会受最大可打开的文件数限制,也就是需要和worker_rlimit_nofile参数保持一致即可。

http配置

  • server_tokens off;

隐藏nginx版本号。

  • client_max_body_size 0

设置nginx上传文件的大小,一般会设置为0,也就是不限制。

后续我们可以在程序中灵活的进行判断。

  • open_file_cache max=1000 inactive=60;

缓存打开的文件描述符,max指缓存的最大数量,inactive则指缓存文件多久没有活跃则移除,这是一个优化参数。

  • access_log logs/access.log main buffer=30000 flush=3;

这是一个日志写入优化参数。

在高并发环境下,每秒都会产生大量的日志,产生一条日志数据就写一条,会产生大量不必要的IO损耗。

buffer指缓存区大小,如果数据超过缓冲区大小的,会把数据写入磁盘。
flush指间隔多少秒,就写入一次磁盘。

以上条件满足任何一点,都会产生写入操作。

  • 上游服务长连接

让上游服务支持以HTTP1.1协议发送请求,同时支持Keep-alive,也就是所谓的长连接。

http {
    upstream backend {
        server 0.0.0.1;
        balancer_by_lua_block {
            edge.balancer_phase()
        }

        keepalive 300;
    }

    server {
        listen       80;
        listen       443 ssl;

        location / {
            set $upstream_connection         '';

            proxy_http_version 1.1;
            proxy_set_header   Connection        $upstream_connection;
        }
    }
}