全局配置
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;
}
}
}