1. 调整工作进程数(worker_processes)
worker_processes 是Nginx性能优化的核心参数,决定了Nginx启动的工作进程数量。推荐设置为服务器CPU核心数(可通过 grep -c processor /proc/cpuinfo 或 lscpu 命令查看),以充分利用多核CPU的并行处理能力。若不确定硬件配置,可使用 auto 参数让Nginx自动检测核心数(如 worker_processes auto;)。需注意,进程数超过核心数可能导致上下文切换频繁,反而降低性能。
2. 优化单进程最大连接数(worker_connections)
worker_connections 定义了每个工作进程能同时处理的最大连接数(包括客户端连接、后端代理连接等),默认值为512,需根据服务器内存和带宽调整。例如,若服务器有8核CPU,可将 worker_connections 设置为1024~8192(高并发场景),总并发连接数为 worker_processes × worker_connections。调整前需确认系统级文件描述符限制(见下文),避免进程无法打开足够连接。
3. 配置系统级文件描述符限制
worker_connections 的值受限于系统的最大文件描述符限制(ulimit -n)。需修改以下两个文件以提升限制:
/etc/security/limits.conf,添加 * soft nofile 65535 和 * hard nofile 65535(soft 为软限制,hard 为硬限制);/etc/systemd/system/nginx.service),在 [Service] 段添加 LimitNOFILE=65535,然后执行 systemctl daemon-reload 使配置生效。4. 启用高效事件模型(use epoll)
use epoll 指令用于指定Nginx使用epoll事件模型(Linux 2.6+内核推荐),相比传统的select/poll模型,epoll能显著提升高并发下的事件处理效率。需在 events 块中添加 use epoll;(如 events { use epoll; worker_connections 1024; })。
5. 控制并发连接接受方式(multi_accept)
multi_accept on; 指令允许每个工作进程一次性接受多个新连接,减少accept系统调用的次数,提升连接处理效率。需与 worker_connections 配合使用(如 events { worker_connections 1024; multi_accept on; })。
6. 限制单个IP并发连接(limit_conn_zone)
通过 limit_conn_zone 和 limit_conn 指令限制同一IP地址的并发连接数,防止恶意用户占用过多资源。例如:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m; # 定义共享内存区域(名称:addr,大小:10MB)
server {
location /download {
limit_conn addr 10; # 限制同一IP最多10个并发连接
}
}
}
此配置可有效防御CC攻击或异常用户的资源耗尽行为。
7. 限制请求速率(limit_req_zone)
使用 limit_req_zone 和 limit_req 指令限制同一IP地址的请求速率,防止突发流量冲击服务器。例如:
http {
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; # 定义共享内存区域(名称:req_zone,大小:10MB),速率:1次/秒
server {
location /api {
limit_req zone=req_zone burst=5 nodelay; # 允许突发5次请求,不延迟处理
}
}
}
burst 参数允许临时超出速率的请求数,nodelay 表示不延迟处理这些请求(否则会排队等待)。
8. 限制客户端请求大小(client_max_body_size)
client_max_body_size 指令限制客户端上传文件的最大大小(默认1MB),可根据业务需求调整(如设置为8MB:client_max_body_size 8m;)。过大的值可能导致内存耗尽,过小的值会阻止用户上传大文件(如图片、视频)。需在 http、server 或 location 块中配置。
9. 优化缓冲区大小(client_body_buffer_size/client_header_buffer_size)
client_body_buffer_size:设置客户端请求体的缓冲区大小(默认8KB或16KB),若请求体较大(如上传文件),可适当增加(如 client_body_buffer_size 128k;);client_header_buffer_size:设置客户端请求头的缓冲区大小(默认1KB),若请求头较大(如携带大量cookie),可调整为 4k 或 8k(如 client_header_buffer_size 4k;);large_client_header_buffers:设置大请求头的缓冲区数量和大小(如 large_client_header_buffers 4 4k; 表示4个4KB的缓冲区),用于处理超过 client_header_buffer_size 的请求头。10. 启用sendfile和TCP优化
sendfile on;:启用sendfile系统调用,直接在内核空间传输文件,减少数据从内核到用户空间的拷贝次数,提升静态文件传输效率;tcp_nopush on;:配合 sendfile 使用,在数据包填满后再发送,避免网络阻塞;tcp_nodelay on;:禁用Nagle算法,立即发送小数据包(如HTTP响应头),减少延迟。http 块中配置,能有效提升Nginx的文件传输性能。