一、更改进程数与连接数(基础性能优化)
核心目的:让Nginx进程与服务器硬件资源匹配,提升并发处理能力,避免进程切换开销或连接数瓶颈,是所有优化的基础。
1. 核心配置修改(nginx.conf)
编辑Nginx主配置文件,路径通常为 /etc/nginx/nginx.conf,修改以下参数:
-
进程数配置: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进程
-
连接数配置:调整每个worker进程的最大连接数,同时配合系统内核参数优化,避免连接数不足导致请求被拒绝。 配置示例(events块中): events { use epoll; # 启用epoll事件模型(Linux最优,高效处理大量并发连接) worker_connections 10240; # 每个worker最大连接数,默认1024,推荐10000+ }
2. 系统内核参数适配(必做)
修改系统内核配置文件 /etc/sysctl.conf,避免系统层面限制连接数:
-
添加以下参数: net.core.somaxconn = 65535 # 系统最大监听队列长度,避免连接排队被拒绝 net.ipv4.tcp_max_tw_buckets = 5000 # 减少TIME_WAIT连接,释放端口资源 net.ipv4.tcp_syncookies = 1 # 开启SYN Cookie,防止SYN洪水攻击
-
生效配置:sysctl -p (无需重启系统,立即生效)
3. 验证配置
-
检查配置语法:nginx -t (无报错则配置正确)
-
重载配置:systemctl reload nginx (不中断服务,平滑生效)
-
查看进程: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. 手动切割(临时方案)
适用于临时清理日志,命令如下(以按天切割为例):
-
备份当前日志:mv /var/log/nginx/access.log /var/log/nginx/access_$(date +%Y%m%d).log
-
重启Nginx生成新日志:systemctl reload nginx (reload不中断服务,优于restart)
2. 自动切割(推荐,定时执行)
通过Linux定时任务(crontab)+ 脚本,实现每天凌晨自动切割日志,步骤如下:
-
创建日志切割脚本:vim /usr/local/nginx/shell/nginx_log_cut.sh (路径可自定义)
-
脚本内容(复制粘贴,修改日志路径适配自身环境):
#!/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 -
给脚本添加执行权限:chmod +x /usr/local/nginx/shell/nginx_log_cut.sh
-
设置定时任务:crontab -e ,添加以下内容(每天凌晨0点执行): 0 0 * * * /usr/local/nginx/shell/nginx_log_cut.sh
-
查看定时任务: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. 验证压缩效果
-
重载Nginx配置:systemctl reload nginx
-
验证方法:通过浏览器F12(开发者工具)→ Network → 查看对应资源的Response Headers,若出现
Content-Encoding: gzip,说明压缩生效。
五、GoAccess监控安装(实时可视化监控)
核心目的:GoAccess是一款轻量级、实时的Nginx日志分析工具,支持终端交互和网页可视化,可快速查看访问量、IP来源、请求路径、状态码等核心指标,无需复杂配置,适合快速监控Nginx运行状态。
1. 安装GoAccess(CentOS系统为例)
-
添加GoAccess官方源(避免yum安装版本过低): rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm yum install -y goaccess # 安装GoAccess
-
Ubuntu系统安装命令: sudo apt update sudo apt install -y goaccess
-
验证安装: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代理,实现网页访问监控,步骤如下:
-
生成实时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 表示后台运行,& 表示脱离终端,避免关闭终端后监控停止。
-
配置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; }
-
重载Nginx:systemctl reload nginx
-
访问监控页面:在浏览器输入 http://服务器IP/goaccess ,即可看到实时可视化监控面板,包含访问量、IP、请求路径、状态码等指标。
4. 注意事项
-
确保Nginx访问日志格式为默认的COMBINED格式,否则需调整--log-format参数。
-
若监控页面无法实时更新,需开放服务器80端口(或自定义端口),确保浏览器能正常访问。
-
可结合日志切割,让GoAccess分析历史日志,查看过往访问情况。
六、通用注意事项
-
所有配置修改前,备份Nginx配置文件:cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak ,避免配置错误导致Nginx无法启动。
-
配置修改后,先执行 nginx -t 检查语法,无报错再执行 systemctl reload nginx 重载配置,避免服务中断。
-
优化和监控需结合自身业务场景,如静态资源多的网站,重点优化静态缓存和网页压缩;高并发场景,重点调整进程数和连接数。
-
定期检查日志和监控数据,及时发现异常(如4xx/5xx状态码突增、CPU/内存占用过高),快速排查问题。