Nginx性能优化与监控

一、更改进程数与连接数(基础性能优化)

核心目的:让Nginx进程与服务器硬件资源匹配,提升并发处理能力,避免进程切换开销或连接数瓶颈,是所有优化的基础。

1. 核心配置修改(nginx.conf)

编辑Nginx主配置文件,路径通常为 /etc/nginx/nginx.conf,修改以下参数:

  1. 进程数配置:worker_processes 建议设置为服务器CPU核心数(或auto自动匹配),避免进程过多导致CPU切换频繁,过少则浪费资源。 配置示例: worker_processes auto; # 推荐,自动识别CPU核心数 # 手动指定(如4核CPU):worker_processes 4; 补充:绑定CPU核心(可选,提升稳定性),添加以下配置: worker_cpu_affinity 0001 0010 0100 1000; # 4核CPU对应配置,每核绑定一个worker进程

  2. 连接数配置:调整每个worker进程的最大连接数,同时配合系统内核参数优化,避免连接数不足导致请求被拒绝。 配置示例(events块中): events { use epoll; # 启用epoll事件模型(Linux最优,高效处理大量并发连接) worker_connections 10240; # 每个worker最大连接数,默认1024,推荐10000+ }

2. 系统内核参数适配(必做)

修改系统内核配置文件 /etc/sysctl.conf,避免系统层面限制连接数:

  1. 添加以下参数: net.core.somaxconn = 65535 # 系统最大监听队列长度,避免连接排队被拒绝 net.ipv4.tcp_max_tw_buckets = 5000 # 减少TIME_WAIT连接,释放端口资源 net.ipv4.tcp_syncookies = 1 # 开启SYN Cookie,防止SYN洪水攻击

  2. 生效配置:sysctl -p (无需重启系统,立即生效)

3. 验证配置

  1. 检查配置语法:nginx -t (无报错则配置正确)

  2. 重载配置:systemctl reload nginx (不中断服务,平滑生效)

  3. 查看进程:ps -ef | grep nginx (可看到与CPU核心数匹配的worker进程)

二、静态缓存功能设置(减轻服务器负载)

核心目的:对HTML、CSS、JS、图片等静态资源设置缓存,让客户端(浏览器)缓存资源,减少重复请求,降低服务器IO压力,提升访问速度。

1. 配置位置

在Nginx的server块(对应具体网站配置)中添加缓存规则,通常网站配置路径为 /etc/nginx/conf.d/xxx.conf

2. 实操配置示例

针对常见静态资源类型,设置不同缓存时长(根据资源更新频率调整):

复制代码

location ~* \.(jpg|jpeg|png|gif|webp|ico)$ { # 图片类资源 expires 30d; # 缓存30天,更新频率低的资源可延长至90d add_header Cache-Control "public, max-age=2592000"; # 配合浏览器缓存(单位:秒,30天=2592000秒) etag on; # 启用ETag,基于文件内容生成标识,避免缓存失效误判 gzip on; # 配合网页压缩(后续模块讲解) access_log off; # 关闭静态资源访问日志,减少日志体积 } location ~* \.(css|js|json)$ { # 样式、脚本类资源 expires 7d; # 缓存7天,此类资源更新频率中等 add_header Cache-Control "public, max-age=604800"; # 7天=604800秒 etag on; gzip on; access_log off; } location ~* \.(html|htm)$ { # HTML文件(根据更新频率调整) expires 1d; # 缓存1天,避免页面更新后客户端无法及时获取 add_header Cache-Control "public, max-age=86400"; etag on; gzip on; }

3. 关键说明

  • expires:缓存时长,d(天)、h(小时)、m(分钟),如1h表示缓存1小时。

  • Cache-Control:告知浏览器缓存规则,public表示允许所有缓存(如CDN、浏览器),max-age指定缓存有效期。

  • etag on:当文件内容未改变时,浏览器会复用缓存,无需重新下载,提升效率。

三、日志切割(避免日志过大)

核心目的:Nginx默认日志会持续写入一个文件(access.log、error.log),长期运行会导致日志文件过大(几十G甚至上百G),占用磁盘空间,且难以排查历史日志,日志切割可按天/按小时分割日志,方便管理和排查。

1. 手动切割(临时方案)

适用于临时清理日志,命令如下(以按天切割为例):

  1. 备份当前日志:mv /var/log/nginx/access.log /var/log/nginx/access_$(date +%Y%m%d).log

  2. 重启Nginx生成新日志:systemctl reload nginx (reload不中断服务,优于restart)

2. 自动切割(推荐,定时执行)

通过Linux定时任务(crontab)+ 脚本,实现每天凌晨自动切割日志,步骤如下:

  1. 创建日志切割脚本:vim /usr/local/nginx/shell/nginx_log_cut.sh (路径可自定义)

  2. 脚本内容(复制粘贴,修改日志路径适配自身环境): #!/bin/bash ``# Nginx日志切割脚本,每天凌晨0点执行 ``LOG_PATH="/var/log/nginx" # Nginx日志存放路径 ``DATE=$(date +%Y%m%d) # 当前日期,格式:20260317 ``# 备份access.log ``mv $LOG_PATH/access.log $LOG_PATH/access_$DATE.log ``# 备份error.log ``mv $LOG_PATH/error.log $LOG_PATH/error_$DATE.log ``# 重载Nginx,生成新日志 ``systemctl reload nginx ``# 可选:删除30天前的日志,释放磁盘空间 ``find $LOG_PATH -name "access_*.log" -mtime +30 -delete ``find $LOG_PATH -name "error_*.log" -mtime +30 -delete

  3. 给脚本添加执行权限:chmod +x /usr/local/nginx/shell/nginx_log_cut.sh

  4. 设置定时任务:crontab -e ,添加以下内容(每天凌晨0点执行): 0 0 * * * /usr/local/nginx/shell/nginx_log_cut.sh

  5. 查看定时任务:crontab -l (确认任务添加成功)

3. 验证

第二天查看日志目录(/var/log/nginx),会生成access_20260317.log、error_20260317.log等按日期命名的日志文件,说明切割成功。

四、配置网页压缩(节省带宽,提升速度)

核心目的:对网页、静态资源(CSS、JS、HTML)进行压缩,减小文件体积,减少网络传输量,节省服务器带宽,同时提升客户端访问速度(尤其适合带宽有限的场景)。

1. 核心配置(nginx.conf的http块中)

编辑主配置文件 /etc/nginx/nginx.conf,在http块中添加以下压缩规则,全局生效:

复制代码

http { # 网页压缩核心配置 gzip on; # 开启gzip压缩(核心开关) gzip_min_length 1k; # 小于1k的文件不压缩(避免压缩开销大于收益) gzip_comp_level 6; # 压缩级别(1-9),级别越高压缩率越高,CPU占用越高,推荐6(平衡压缩率和CPU) gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml; # 需压缩的资源类型 gzip_vary on; # 告知浏览器当前资源已压缩,避免浏览器误判 gzip_disable "MSIE [1-6]\."; # 禁用IE1-6浏览器的压缩(此类浏览器不支持部分压缩格式) gzip_buffers 4 16k; # 压缩缓冲区大小,提升压缩效率 }

2. 局部配置(可选)

若需对特定网站单独配置压缩规则,可在对应server块中添加上述配置,优先级高于全局配置。

3. 验证压缩效果

  1. 重载Nginx配置:systemctl reload nginx

  2. 验证方法:通过浏览器F12(开发者工具)→ Network → 查看对应资源的Response Headers,若出现 Content-Encoding: gzip,说明压缩生效。

五、GoAccess监控安装(实时可视化监控)

核心目的:GoAccess是一款轻量级、实时的Nginx日志分析工具,支持终端交互和网页可视化,可快速查看访问量、IP来源、请求路径、状态码等核心指标,无需复杂配置,适合快速监控Nginx运行状态。

1. 安装GoAccess(CentOS系统为例)

  1. 添加GoAccess官方源(避免yum安装版本过低): rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm yum install -y goaccess # 安装GoAccess

  2. Ubuntu系统安装命令: sudo apt update sudo apt install -y goaccess

  3. 验证安装:goaccess -V (显示版本号即安装成功)

2. 实时终端监控(快速查看)

直接通过命令读取Nginx访问日志,实时查看监控数据:

goaccess /var/log/nginx/access.log -o /tmp/goaccess.html --real-time-html --time-format='%H:%M:%S' --date-format='%Y-%m-%d' --log-format=COMBINED

参数说明:

  • /var/log/nginx/access.log:Nginx访问日志路径(需与自身环境一致)

  • -o /tmp/goaccess.html:生成HTML格式的监控报告(可选)

  • --real-time-html:开启实时监控(每秒更新数据)

  • --time-format/--date-format:指定日志时间、日期格式,适配Nginx默认日志格式

执行命令后,终端会显示实时监控界面,按ESC键退出。

3. 网页可视化监控(推荐,可远程访问)

将GoAccess生成的HTML报告,通过Nginx代理,实现网页访问监控,步骤如下:

  1. 生成实时HTML监控报告(后台持续运行): nohup goaccess /var/log/nginx/access.log -o /usr/share/nginx/html/goaccess.html --real-time-html --time-format='%H:%M:%S' --date-format='%Y-%m-%d' --log-format=COMBINED & 说明:nohup 表示后台运行,& 表示脱离终端,避免关闭终端后监控停止。

  2. 配置Nginx代理(若未配置网站,可直接使用默认配置): 编辑网站配置文件(/etc/nginx/conf.d/xxx.conf),添加以下location: location /goaccess { root /usr/share/nginx/html; index goaccess.html; # 可选:设置访问权限,避免公开访问 allow 192.168.1.0/24; # 允许内网访问 deny all; }

  3. 重载Nginx:systemctl reload nginx

  4. 访问监控页面:在浏览器输入 http://服务器IP/goaccess ,即可看到实时可视化监控面板,包含访问量、IP、请求路径、状态码等指标。

4. 注意事项

  • 确保Nginx访问日志格式为默认的COMBINED格式,否则需调整--log-format参数。

  • 若监控页面无法实时更新,需开放服务器80端口(或自定义端口),确保浏览器能正常访问。

  • 可结合日志切割,让GoAccess分析历史日志,查看过往访问情况。

六、通用注意事项

  1. 所有配置修改前,备份Nginx配置文件:cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak ,避免配置错误导致Nginx无法启动。

  2. 配置修改后,先执行 nginx -t 检查语法,无报错再执行 systemctl reload nginx 重载配置,避免服务中断。

  3. 优化和监控需结合自身业务场景,如静态资源多的网站,重点优化静态缓存和网页压缩;高并发场景,重点调整进程数和连接数。

  4. 定期检查日志和监控数据,及时发现异常(如4xx/5xx状态码突增、CPU/内存占用过高),快速排查问题。

相关推荐
NGC_66112 小时前
从URL输入到页面显示:浏览器背后的完整工作流程解析
网络
未来龙皇小蓝2 小时前
【MySQL-索引调优】07:Sql使用索引注意点
数据库·sql·mysql·性能优化
川石课堂软件测试2 小时前
接口测试需要注意的一些BUG
网络·数据库·python·单元测试·bug·压力测试·tornado
Wyawsl2 小时前
nginx安全笔记
笔记·nginx·安全
小糖学代码2 小时前
计算机网络理论:2.物理层
网络·计算机网络
Xzq2105092 小时前
Reactor模式
linux·网络
badwomen__2 小时前
SRAM与DRAM:速度 vs 容量的永恒博弈
服务器·性能优化
Yan-英杰3 小时前
远程控制软件哪个安全?2026 ToDesk/向日葵/RayLink加密、隐私与防护全面对比评测
网络·人工智能·网络协议·tcp/ip·http
爱丽_3 小时前
把 HTTP 讲清楚
网络·网络协议·http