# 按照cpu的核数进行worker进程数的启动,通常是1C,1worker
worker_processes auto;
# 每个 worker 可用的句柄数
worker_rlimit_nofile 65535;
# 强制 CPU 亲和性, 在高并发情况下可以降低由于多核 CPU 的切换造成的寄存器等现场重建带来的性能损耗
worker_cpu_affinity 00000001 00000010;
events {
# 多路复用的事件驱动模型, Linux2.6+
use epoll;
# 每个 worker 进程支持的最大连接数, 使用 `cat /proc/sys/fs/file-max` 获取系统最大句柄数
worker_connections 102400;
# worker 进程是否可以同时接受多个网络连接
multi_accept on;
}
http {
include mime.types;
charset UTF-8;
log_format main '$http_x_forwarded_for - [$time_local] "$request" $status $body_bytes_sent $request_time "$http_referer" "sc
heme:[$scheme]" "$http_user_agent" $remote_addr "upstream:[$upstream_addr, $upstream_status, $upstream_response_time]"';
access_log logs/access.log main;
default_type application/octet-stream;
# 读取客户端请求体时的缓冲区, 请求体超过缓冲区大小时, 请求体的全部或部分将被写入临时文件, 默认为两个内存页大小
client_body_buffer_size 1024m;
# 允许的客户端最大请求体大小, 0为不限制
# 通过请求头中的 Content-Length 获取, 超过限定大小的请求将被返回 413
# 上传大对象,需要设置较大值,如10240m
client_max_body_size 0;
# 对哪种浏览器禁用长连接
keepalive_disable none;
# 允许在一个长连接上最多可处理多少个请求
keepalive_requests 10000;
# 指定每个 TCP 连接最多可以保持多长时间, 默认 75秒, 0 为禁止长连接
keepalive_timeout 65;
server_tokens off;
underscores_in_headers on;
gzip on;
gzip_vary on;
# 当请求头中的 UserAgent 字段满足这个正则时,响应不会启用 GZip
# 指令值 msie6 等价于 MSIE [4-6]\.,但性能更好一些
gzip_disable "msie6";
# 默认 Nginx 只会针对 HTTP/1.1 及以上的请求才会启用 GZip, 因为部分早期的 HTTP/1.0 客户端在处理 GZip 时有 Bug
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml applicati
on/xml+rss text/javascript application/javascript;
#gzip的压缩率,1-9,数字越大,压缩率越高,占用cpu也越高
gzip_comp_level 3;
# 提高 Nginx 静态资源托管效率
# sendfile 是一个系统调用,直接在内核空间完成文件发送,不需要先 read 再 write,没有上下文切换开销
sendfile on;
# 禁用 Nagle 算法, 尽快发送数据, 某些情况下可以节约 200ms
# Nagle 算法原理是:在发出去的数据还未被确认之前,新生成的小数据先存起来,凑满一个 MSS 或者等到收到确认后再发送
# Nginx 只会针对处于 keep-alive 状态的 TCP 连接才会启用 tcp_nodelay
tcp_nodelay on;
# 数据包会累计到一定大小之后才会发送,减小了额外开销,提高网络效率, 需要开启 sendfile
tcp_nopush on;
# tcp_nodelay 和 tcp_nopush 可以同时开启, 最终效果是先填满包,再尽快发送
server {
server_name localhost;
# 开启 reuseport, Nginx 会在指定的端口上监听多个 socket,每个 Worker 都能分到一个. 请求过来时,系统内核会自动通过不同的
socket 分配给对应的 Worker, 提高了分发效率
# backlog, 连接已建立、但还未被处理的请求队列大小, 队列满时将会拒绝连接 "Connection refused";
# backlog 太大, 可能导致等待时间长, 出现 "Broken pipe"
# backlog 太小, 可能导致 "502 Bad Gateway"}