在优化前,需先明确资源占用的具体情况,避免盲目调整:
top -p $(pgrep nginx | tr '\n' ',')实时查看Nginx进程的CPU、内存占用;ps -o pid,rss,command -p $(pgrep nginx)查看每个进程的实际物理内存(RSS)消耗。pmap -x $(pgrep nginx | head -n1) | tail -n 10查看单个Nginx进程的内存映射,识别内存消耗高的模块(如缓存、缓冲区)。tail -f /var/log/nginx/error.log | grep -i "memory"查看错误日志中的内存相关警告;使用vmstat 1 3监控系统内存使用趋势,判断是否存在内存泄漏。worker_processes设置为CPU核心数(auto可自动匹配),避免过多进程导致上下文切换开销。例如:worker_processes auto;
events块中,根据服务器内存和CPU调整worker_connections(每个worker的最大连接数),一般设置为1024-4096。例如:events {
worker_connections 2048;
multi_accept on; # 批量接受连接,减少上下文切换
}
http {
client_body_buffer_size 8k; # 客户端请求体缓冲区
client_max_body_size 10m; # 限制上传文件大小(根据需求调整)
large_client_header_buffers 4 8k; # 请求头缓冲区(默认4个16k,可减小)
}
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
location /static/ {
proxy_cache my_cache;
proxy_pass http://backend;
proxy_cache_valid 200 302 10m; # 缓存200/302状态码10分钟
}
}
proxy_cache、fastcgi_cache等模块,避免内存浪费。keepalive_timeout(默认75s),减少空闲连接的资源占用。例如:http {
keepalive_timeout 30s; # 根据业务调整(如30s-60s)
keepalive_requests 100; # 每个连接最多处理100个请求
}
/etc/sysctl.conf中添加以下配置,优化TCP连接处理:net.ipv4.tcp_tw_reuse = 1 # 复用TIME-WAIT连接
net.ipv4.tcp_fin_timeout = 30 # TIME-WAIT超时30秒
net.core.somaxconn = 4096 # 监听队列最大长度
vm.swappiness = 10 # 减少Swap使用(0-100,值越小越优先用内存)
执行sysctl -p使配置生效。dd if=/dev/zero of=/swapfile bs=1G count=8
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
永久生效可添加/swapfile none swap sw 0 0到/etc/fstab。apt-get clean删除已下载的软件包缓存。rm -rf /var/log/nginx/*.log删除旧日志(需提前备份),或使用logrotate自动轮转日志。limit_conn模块限制单个IP的并发连接数,防止恶意请求占用资源。例如:limit_conn_zone $binary_remote_addr zone=perip:10m;
server {
location / {
limit_conn perip 20; # 每个IP最多20个并发连接
}
}
proxy_cache off; # 关闭代理缓存
# ssl_session_cache shared:SSL:20m; # 注释掉SSL会话缓存
nginx -s reload重新加载配置,避免直接restart导致连接中断;若内存占用过高,可使用systemctl restart nginx强制重启(需谨慎)。Prometheus + Grafana监控Nginx的active connections、memory usage、request rate等指标,设置告警阈值(如内存使用率>80%时报警)。nginx -t定期验证配置文件语法,避免错误配置导致资源浪费;通过nginx -V查看已启用的模块,禁用不必要的模块(如--with-http_gunzip_module若无需gzip解压)。通过以上步骤,可系统性解决Debian下Nginx资源占用高的问题,兼顾短期应急与长期稳定性。优化过程中需根据服务器实际负载(如并发量、静态资源占比)调整参数,避免过度优化。