优化Nginx内存使用需从配置调整、缓存优化、连接管理、系统级设置等多维度入手,以下是具体步骤:
worker_processes设为服务器CPU核心数(可通过grep processor /proc/cpuinfo | wc -l查看),或使用auto让Nginx自动适配。例如:worker_processes auto;
这能充分利用多核CPU,避免进程过多导致的上下文切换开销。events块中调整worker_connections(每个工作进程的最大并发连接数),需结合服务器内存和网络带宽设置(如1024-4096)。例如:events {
worker_connections 1024;
use epoll; # Linux系统下推荐使用epoll事件模型,提升并发处理效率
}
http块中添加:gzip on;
gzip_comp_level 6; # 压缩级别(1-9,6为平衡压缩率与速度的最佳值)
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1024; # 仅压缩大于1KB的文件
expires和add_header设置浏览器缓存,减少重复请求对内存的消耗。例如:location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
expires 365d; # 缓存1年
add_header Cache-Control "public, no-transform";
}
keepalive_timeout 30s;
client_header_timeout(请求头超时)、client_body_timeout(请求体超时)和send_timeout(响应超时),避免空闲连接堆积。例如:client_header_timeout 10s;
client_body_timeout 10s;
send_timeout 10s;
合理配置缓冲区参数,避免内存过度分配。在http或server块中添加:
client_body_buffer_size 16k; # 处理请求体的缓冲区大小(默认8k/16k)
client_header_buffer_size 1k; # 处理请求头的缓冲区大小
client_max_body_size 8m; # 允许上传的最大文件大小(根据业务需求调整)
worker_rlimit_nofile限制每个worker进程的最大文件描述符数(间接控制内存),例如:worker_rlimit_nofile 65535;
echo "1000000000" > /sys/fs/cgroup/memory/nginx/memory.limit_in_bytes
echo $(pgrep -f nginx) > /sys/fs/cgroup/memory/nginx/cgroup.procs
ssl_session_cache shared:SSL:20m; # 共享内存缓存大小
ssl_session_timeout 10m; # 会话超时时间
ssl_session_tickets off; # 关闭会话票证(可选,进一步减少内存)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
top、htop或ps命令查看Nginx进程的内存占用(RES字段):ps -eo pid,comm,rss | grep nginx
Valgrind工具检测内存泄漏(需在测试环境运行):valgrind --tool=memcheck --leak-check=full /usr/sbin/nginx -g "daemon off;"
limit_conn模块限制单个IP的并发连接数,缓解内存压力:limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 20; # 每个IP最多20个并发连接
reload平滑重启(不中断服务)或restart强制重启:sudo systemctl reload nginx # 平滑重启
sudo systemctl restart nginx # 强制重启
通过以上步骤,可系统性优化Ubuntu上Nginx的内存使用,提升服务器性能和稳定性。需根据实际业务负载调整参数,避免过度优化。