Nginx 核心配置实战
前言
本文围绕 Nginx 在生产环境中的关键优化场景,从安全防护、性能提升、资源管控和运维便捷性四个方面系统梳理了十大核心配置实践。涵盖内容包括:版本信息隐藏、运行用户调整、静态资源缓存设置、日志切割策略、连接超时管理、进程数优化、页面压缩功能、防盗链机制、location 匹配规则详解以及重定向的实际应用。每一项配置均提供明确的目标说明、详细操作流程、配置注释及验证方式,兼顾理论深度与实操指导,既适用于初学者快速上手,也可作为资深运维人员的参考指南。
一、隐藏 Nginx 版本号(安全优化)
(一)核心目的
通过隐藏服务器暴露的 Nginx 版本信息,防止攻击者利用特定版本已知漏洞发起定向攻击,从而增强系统的安全性。
(二)两种实现方法(带详细注释)
方法一:修改主配置文件(推荐,无需重新编译)
步骤1:编辑 Nginx 主配置文件
vim /usr/local/nginx/conf/nginx.conf # 打开主配置文件进行编辑
步骤2:在 http 块中添加关闭版本号指令
在 http { } 配置块内加入以下参数以屏蔽版本显示:
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; # 关键配置:关闭版本号显示(默认 on 显示版本)
}
步骤3:重启服务并测试效果
systemctl restart nginx
curl -I http://192.168.10.22
查看返回头信息,若仅显示 Server: nginx 而无具体版本号,则表示配置成功。
方法二:通过源码编译自定义版本与服务器标识
步骤1:打开源码中的版本定义文件
vim /opt/nginx-1.20.2/src/core/nginx.h
步骤2:修改版本号和服务器类型字段
#define NGINX_VERSION "1.1.1"
#define NGINX_VER "IIS" NGINX_VERSION
可将版本伪装为任意值,并将服务器标识改为如 IIS 等其他类型,增加迷惑性。
步骤3:进入源码目录并执行重新编译安装
cd /opt/nginx-1.20.2/
二、调整 Nginx 运行用户与组(权限优化)
(一)核心目的
避免使用 root 用户启动 Nginx 主进程,降低因权限过高导致的安全风险,遵循最小权限原则。
(二)配置步骤(附详细注释)
步骤1:编辑主配置文件
vim /usr/local/nginx/conf/nginx.conf
步骤2:指定非特权用户运行工作进程
在配置文件最上方添加如下语句:
user www-data www-data;
确保该用户和组已存在,否则需提前创建。
步骤3:重启服务并确认生效
systemctl restart nginx
ps aux | grep nginx
检查 worker 进程是否由指定用户运行。
三、设置静态资源缓存时间(性能优化)
(一)核心目的
通过对静态文件(如 JS、CSS、图片)设置较长的浏览器缓存周期,减少重复请求,提升访问速度并减轻服务器负载。
(二)配置步骤(含详细注释)
步骤1:编辑主配置文件
vim /usr/local/nginx/conf/nginx.conf
步骤2:在 server 块中添加针对静态资源的缓存控制
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 7d;
add_header Cache-Control "public, no-transform";
}
此配置表示匹配常见静态资源后缀,并设置 7 天有效期。
步骤3:重启服务并测试响应头
systemctl restart nginx
curl -I http://your-domain.com/test.jpg
观察返回头中是否存在 Expires 或 Cache-Control 字段且值正确。
四、日志切割处理(运维优化)
(一)核心目的
防止访问日志无限增长,占用磁盘空间,影响系统稳定性和日志检索效率。
(二)配置流程(脚本 + 注释说明)
步骤1:创建日志切割脚本
vim /usr/local/nginx/logs/cut_log.sh
步骤2:编写自动化切割脚本(每行注释清晰)
#!/bin/bash
LOG_PATH="/usr/local/nginx/logs/access.log"
SAVE_PATH="/usr/local/nginx/logs/history/$(date +%Y-%m-%d).log"
mkdir -p /usr/local/nginx/logs/history
mv $LOG_PATH $SAVE_PATH
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
移动原日志文件,并发送 USR1 信号通知 Nginx 重新打开日志文件。
步骤3:赋予脚本执行权限并手动测试
chmod +x /usr/local/nginx/logs/cut_log.sh
sh /usr/local/nginx/logs/cut_log.sh
步骤4:配置定时任务实现每日自动切割
crontab -e
# 添加以下内容:
0 0 * * * /usr/local/nginx/logs/cut_log.sh
每天凌晨自动执行日志归档。
五、连接超时配置(性能优化)
(一)核心目的
合理设置连接保持时间,释放长时间空闲连接,节省系统资源,提高并发处理能力。
(二)配置步骤(详细注释)
步骤1:编辑主配置文件
vim /usr/local/nginx/conf/nginx.conf
步骤2:在 http 块中添加超时参数
keepalive_timeout 65;
client_header_timeout 15;
client_body_timeout 20;
send_timeout 25;
分别控制长连接存活时间、客户端头读取超时、请求体传输超时及响应发送超时。
步骤3:重启服务使配置生效
systemctl restart nginx
(三)参数说明
- keepalive_timeout:客户端连接保持时间
- client_header_timeout:等待客户端发送请求头的最大时间
- client_body_timeout:接收请求体数据的超时时间
- send_timeout:向客户端发送响应的超时限制
六、调整 Worker 进程数量(高并发优化)
(一)核心目的
根据服务器 CPU 核心数合理设置 worker_processes 数量,最大化利用多核处理能力,提升并发处理性能。
(二)配置步骤(详细注释)
步骤1:查看当前主机 CPU 核心数目
nproc
# 或使用 lscpu 查看详细信息
lscpu
步骤2:编辑主配置文件
vim /usr/local/nginx/conf/nginx.conf
步骤3:配置进程数并绑定 CPU 核心(可选)
worker_processes 4;
worker_cpu_affinity auto;
推荐设置为 CPU 核心数相同;启用 CPU 绑定可减少上下文切换开销。
步骤4:重启服务并验证进程状态
systemctl restart nginx
ps aux | grep nginx | grep worker
确认启动了预期数量的工作进程。
(三)适用场景
适用于高流量 Web 服务、API 网关、反向代理等需要处理大量并发连接的部署环境。
七、启用网页压缩功能(带宽优化)
(一)核心目的
开启 Gzip 压缩,减小 HTML、CSS、JS 等文本类响应体积,加快页面加载速度,节省网络带宽。
(二)配置步骤(详细注释)
步骤1:编辑主配置文件
vim /usr/local/nginx/conf/nginx.conf
步骤2:在 http 块中启用压缩模块配置
gzip on;
gzip_vary on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
启用压缩并定义压缩级别、支持类型及缓冲区大小。
步骤3:准备测试页面并重启服务
systemctl restart nginx
步骤4:测试压缩是否生效
curl -H "Accept-Encoding: gzip" -I http://your-domain.com/test.html
查看响应头是否包含 Content-Encoding: gzip。
八、配置防盗链机制(资源保护)
(一)核心目的
防止外部网站直接引用本站静态资源(如图片、视频),避免带宽浪费和资源滥用。
(二)部署环境
假设存在两个站点:源站(资源提供方)与盗链示例站点(第三方引用方)。
(三)配置步骤(详细注释)
阶段1:源服务器端配置
步骤1:准备测试资源和访问页面
放置一张测试图片(如 logo.png)并创建一个展示页用于本地访问。
步骤2:完成域名解析配置
确保测试域名能正常解析到服务器 IP 地址。
步骤3:添加防盗链规则至 location 块
location ~* \.(jpg|jpeg|png|gif)$ {
valid_referers none blocked *.example.com example.com;
if ($invalid_referer) {
return 403;
}
}
只允许来自指定域名或无 Referer 的请求访问图片资源。
阶段2:模拟盗链服务器配置
在另一台服务器上搭建网页,嵌入对源站图片的直接链接,模拟跨站盗用行为。
阶段3:进行访问测试与结果验证
分别从合法域名和非法来源尝试访问图片,确认合法请求可加载,盗链请求被拒绝(返回 403)。
九、Nginx location 匹配规则详解
(一)核心作用
控制不同 URI 请求的处理方式,决定如何转发、重写或响应客户端请求。
(二)三类主要匹配模式
- =:精确匹配
- ^~:前缀匹配(忽略正则)
- ~ 和 ~*:正则表达式匹配(区分大小写 / 不区分)
(三)匹配优先级顺序(由高至低)
- 精确匹配(=)
- 前缀匹配(^~),最长匹配胜出
- 正则匹配(按配置顺序执行,首个匹配即生效)
- 普通前缀匹配(无修饰符)
(四)经典配置实例解析
1. 精准匹配根路径(优化首页访问)
location = / {
root /var/www/html;
index index.html;
}
2. 前缀匹配静态资源目录(优先处理)
location ^~ /static/ {
alias /data/static/;
}
3. 正则匹配图片格式(按类型过滤)
location ~* \.(png|jpg|gif)$ {
expires 1y;
}
4. 动态请求转发(兜底处理)
location / {
proxy_pass http://backend;
}
(五)配置注意事项
- 注意修饰符之间的优先级差异
- 避免多个正则冲突或覆盖
- 使用
^~可阻止后续正则匹配,提升效率
十、Nginx 重定向配置(场景化实战)
(一)场景1:基于域名跳转(旧域名迁移)
需求场景
公司更换品牌域名,需将旧域名所有请求永久重定向至新域名。
配置步骤(详细注释)
步骤1:编辑主配置文件
vim /usr/local/nginx/conf/nginx.conf
步骤2:添加域名跳转规则
server {
listen 80;
server_name old-domain.com;
return 301 http://new-domain.com$request_uri;
}
使用 301 永久重定向,保留原始 URI 路径。
步骤3:配置 DNS 解析并重启服务
systemctl restart nginx
测试验证
访问 http://old-domain.com/page 应自动跳转至 http://new-domain.com/page。
(二)场景2:基于客户端 IP 实施访问跳转(维护模式)
需求场景
系统升级期间,仅允许管理员 IP 访问,其余用户跳转至维护页面。
配置步骤(详细注释)
步骤1:创建静态维护提示页面
echo "<html><body><h1>系统维护中,请稍后访问</h1></body></html>" > /usr/local/nginx/html/maintenance.html
步骤2:编辑主配置文件
vim /usr/local/nginx/conf/nginx.conf
步骤3:添加基于 IP 的条件跳转配置
if ($remote_addr != "192.168.10.1") {
return 302 /maintenance.html;
}
除指定 IP 外的所有访客均被引导至维护页。
步骤4:重启服务并测试效果
systemctl restart nginx
从不同 IP 源进行访问测试,确认分流逻辑正确。
总结
本文全面讲解了 Nginx 在实际生产环境中常用的十大核心配置技巧,覆盖安全、性能、资源管理和运维自动化等多个维度。每个配置均结合目标说明、操作步骤与验证方法,帮助读者理解“为什么做”和“怎么做”。建议在测试环境充分验证后再应用于线上系统,确保配置变更不影响业务连续性。
# 编译配置(保留基础编译参数示例)
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make && make install # 执行编译与安装流程
步骤4:启用版本号显示并进行验证
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens on; # 启用服务器版本信息输出,用于确认自定义修改生效
}
systemctl restart nginx
curl -I http://192.168.10.22 # 查看响应头中是否返回 Server: IIS1.1.1,若显示则表示伪装成功
user nginx nginx; # 关键配置:用户=nginx,组=nginx(需提前创建该用户组)
# 注:若未创建 nginx 用户,需先执行 useradd -M -s /sbin/nologin nginx
二、调整 Nginx 运行用户和组(提升权限安全性)
(一)主要目标
Nginx 默认以 nobody 身份运行,存在权限管理模糊的问题。通过创建专用账户(如 nginx),可实现更细粒度的权限控制,降低因权限过高引发的安全隐患。
(二)具体操作步骤(含详细说明)
步骤1:打开主配置文件进行编辑
vim /usr/local/nginx/conf/nginx.conf
步骤2:设定服务运行的用户与用户组
(配置内容见上文图片标记位置)
步骤3:重启服务并检查进程归属情况
systemctl restart nginx
ps aux | grep nginx
# 验证结果说明:主进程由 root 用户启动(因需绑定 80 等特权端口),工作子进程则以 nginx 用户运行,负责处理客户端请求,符合安全规范
server {
listen 80;
server_name www.yjs.com;
# 根路径配置
location / {
root html;
index index.html index.htm;
}
# 静态资源缓存配置:匹配图片类型文件
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
root html; # 资源所在目录(与根路径一致)
expires 1d; # 缓存时间:1d=1天(可选单位:s=秒、m=分、h=时、d=天、w=周)
}
}
三、设置静态资源缓存策略(提高访问性能)
(一)核心作用
针对图片、CSS、JS 等静态文件设置过期时间,浏览器在后续访问时可直接使用本地缓存,减少对服务器的重复请求,显著提升加载速度。注意:动态内容不应启用此类缓存。
(二)实施步骤(附注释说明)
步骤1:修改 Nginx 主配置文件
vim /usr/local/nginx/conf/nginx.conf
步骤2:在 server 配置块中添加缓存规则
(具体配置项参见上方图示)
步骤3:重启服务并测试效果
systemctl restart nginx
# 测试方式:使用 Linux 平台上的 Firefox 浏览器访问 http://192.168.10.23/game.jpg
# 检查方法:右键 → 查看元素 → 切换至“网络”选项卡 → 点击状态码为 200 的请求 → 查看响应头是否包含 Cache-Control:max-age=86400(即缓存一天)
四、实现日志自动切割(优化运维管理)
(一)设计目的
默认情况下,Nginx 将所有日志写入单一文件,长时间运行会导致文件体积过大,影响读取效率和故障排查。通过定时切割,按天分离日志文件,便于归档管理,并定期清理陈旧日志释放磁盘空间。
(二)实现方案(脚本编写与自动化调度)
步骤1:创建日志分割脚本
vim /opt/fenge.sh # 新建脚本文件
步骤2:填充脚本内容(每行均有解释)
#!/bin/bash
# 功能:实现 Nginx 日志按日期切割,保留最近30天记录
day=$(date -d "-1 day" "+%Y%m%d") # 获取前一天的日期,格式为 YYYYMMDD
logs_path="/var/log/nginx" # 自定义日志存储路径
pid_path="/usr/local/nginx/logs/nginx.pid" # Nginx 主进程 PID 文件所在位置
# 若目标目录不存在,则自动创建
[ -d $logs_path ] || mkdir -p $logs_path
# 将当前 access.log 移动到指定目录并重命名,附加日期标识
mv /usr/local/nginx/logs/access.log ${logs_path}/yjs.com-access.log-$day
# 向 Nginx 主进程发送 USR1 信号,触发日志重开动作(无需重启服务)
kill -USR1 $(cat $pid_path)
# 清理超过30天的历史日志文件,防止磁盘被占满
find $logs_path -mtime +30 -exec rm -rf {} \;
步骤3:赋予执行权限并手动测试
chmod +x /opt/fenge.sh
/opt/fenge.sh # 运行脚本验证功能是否正常
ls /var/log/nginx # 检查是否生成类似 yjs.com-access.log-20250801 的文件
ls /usr/local/nginx/logs/access.log # 确认新的 access.log 已重建
步骤4:配置定时任务实现每日自动执行
crontab -e # 编辑当前用户的计划任务列表
# 添加如下条目:每天凌晨1点准时运行切割脚本
0 1 * * * /opt/fenge.sh
五、连接超时设置(增强性能表现)
(一)主要意图
合理配置连接保持时间,避免无效连接长期占用系统资源,同时兼顾用户体验,提升并发处理能力。
HTTP Keep-Alive 模式能够保持 TCP 连接处于打开状态,通过合理设置超时时间,可有效避免长时间空闲的连接占用系统资源,从而在连接复用与资源消耗之间实现良好平衡。
(二)配置步骤(含详细说明)
步骤1:修改主配置文件
使用编辑器打开 Nginx 主配置文件:
vim /usr/local/nginx/conf/nginx.conf
步骤2:在 http 块中添加连接超时参数
在配置文件的 http 块内加入相关 Keep-Alive 超时设置,以控制连接保持时长。
http {
# 核心超时配置:第一个参数=服务器关闭连接超时时间;第二个参数=响应头告知浏览器主动关闭时间
keepalive_timeout 60 180; # 服务器60秒关闭闲置连接,浏览器180秒后主动关闭(避免死连接)
# 可选配置:客户端请求头超时(若客户端未按时发送完整请求头,返回408)
client_header_timeout 10s;
# 可选配置:客户端请求体超时(若客户端未按时发送请求体,返回408)
client_body_timeout 10s;
}
步骤3:重启服务使配置生效
完成修改后重启 Nginx 服务:
systemctl restart nginx
(三)参数解析
keepalive_timeout 0该参数用于关闭 Keep-Alive 功能,若启用则每个请求都将建立新的 TCP 连接,性能较差,通常不推荐使用。
浏览器默认的 Keep-Alive 超时时间约为60秒,建议服务器端配置与此保持一致(例如设置为60秒),以提升兼容性与效率。
六、调整工作进程数量(适用于高并发场景优化)
(一)主要目标
Nginx 默认仅启动一个工作进程,在高并发环境下增加 worker_processes 数量可以更好地利用多核 CPU 的处理能力,减少请求排队现象,显著提高响应速度和系统吞吐量。
(二)具体操作流程(附注释)
步骤1:查看服务器物理 CPU 核心数
执行以下命令获取当前主机的 CPU 核心总数:
cat /proc/cpuinfo | grep -c "physical id" # 示例输出:2 表示双核
步骤2:编辑主配置文件
继续使用 vim 编辑 Nginx 主配置文件:
vim /usr/local/nginx/conf/nginx.conf
步骤3:设置工作进程数并绑定 CPU 核心
通过配置 worker_processes 和 worker_cpu_affinity 实现进程与 CPU 的绑定,提升缓存命中率与性能表现。
# 工作进程数:建议设置为 CPU 核数或核数的2倍(如2核设为2,4核设为4或8)
worker_processes 2;
# CPU 绑定:让每个进程独占一个 CPU 核心,减少进程切换损耗(2核对应 01 10,4核对应 0001 0010 0100 1000)
worker_cpu_affinity 01 10;
步骤4:重启服务并验证配置结果
重启 Nginx 并检查运行中的进程情况:
systemctl restart nginx
ps aux | grep nginx # 观察子进程数量是否与配置值一致
(三)适用典型场景
- 面临大量并发访问的业务场景,如促销活动、秒杀系统等;
- CPU 资源分配不均,部分核心负载过高而其他核心闲置的情况。
七、启用网页内容压缩(带宽优化措施)
(一)核心目的
Nginx 可对响应内容(包括 HTML 页面、JavaScript 文件、图片等静态资源)启用 Gzip 压缩后再传输,大幅降低网络带宽消耗,加快用户页面加载速度。大多数情况下,Gzip 模块已默认安装。
(二)配置流程(详细说明)
步骤1:编辑主配置文件
进入配置目录并打开主文件进行编辑:
vim /usr/local/nginx/conf/nginx.conf
步骤2:在 http 块中开启 Gzip 压缩功能
添加相应的 gzip 开启指令及相关参数,定义压缩范围与条件。
http {
gzip on; # 开启 Gzip 压缩(默认 off)
gzip_min_length 1k; # 最小压缩文件大小(小于1k不压缩,避免小文件压缩耗时)
gzip_buffers 4 64k; # 压缩缓冲区:4个64k缓冲区(内存中临时存储压缩数据)
gzip_http_version 1.1; # 支持的 HTTP 版本(前端为 squid2.5 需改为1.0)
gzip_comp_level 6; # 压缩比率(1=最快/压缩比最小,9=最慢/压缩比最大,推荐6)
gzip_vary on; # 允许前端缓存服务器存储压缩页面(提升缓存复用率)
# 压缩类型:指定哪些文件启用压缩(覆盖常见静态+动态文件)
gzip_types text/plain text/javascript application/x-javascript text/css
text/xml application/xml application/xml+rss image/jpg image/jpeg
image/png image/gif application/x-httpd-php application/javascript
application/json;
}
步骤3:准备测试资源并重启服务
- 将一张图片复制到 Nginx 默认根目录下:
cp /root/game.jpg /usr/local/nginx/html/ - 创建一个简单的 index.html 页面,引用该图片:
vim /usr/local/nginx/html/index.html
内容如下:
<html><body><img src="game.jpg"/></body></html> - 重启 Nginx 服务以应用更改:
systemctl restart nginx
步骤4:验证压缩效果
可通过 Linux 系统上的 Firefox 浏览器访问测试地址:
http://192.168.10.23
右键页面 → 查看元素 → 切换至“网络”选项卡 → 点击状态码为 200 的请求 → 查看响应头中是否存在 Content-Encoding: gzip 字段,存在即表示压缩成功启用。
八、实施防盗链策略(保护静态资源)
(一)核心目标
通过校验 HTTP 请求头中的 Referer 字段,限制仅允许指定域名(如本域)访问服务器上的静态资源(如图片、视频等),防止外部网站直接链接这些资源,避免不必要的带宽浪费。
(二)部署环境说明
- 资源持有服务器(源站):IP 地址 192.168.10.22,域名 www.benet.com
- 用于测试盗链行为的客户端服务器:IP 地址 192.168.10.17,域名 www.zjl.com
(三)配置步骤详解
阶段1:源服务器端配置
步骤1:准备所需资源及首页文件
进入 Nginx 的 Web 根目录:
cd /usr/local/nginx/html
上传两张图片:game.jpg(正常展示图)、error.png(盗链时显示的提示图)。
创建或编辑 index.html 文件:
vim index.html
内容为:
<html><body><img src="game.jpg"/></body></html>
步骤2:配置本地域名映射
将两个测试域名写入 hosts 文件,便于解析:
echo "192.168.10.22 www.benet.com" >> /etc/hosts
echo "192.168.10.17 www.zjl.com" >> /etc/hosts
步骤3:编辑 Nginx 配置文件并添加防盗链规则
打开配置文件:
vim /usr/local/nginx/conf/nginx.conf
在对应的 server 块中添加防盗链控制逻辑:
server {
listen 80;
server_name www.benet.com;
# 防盗链规则:匹配图片类型文件(不区分大小写)
location ~* \.(jpg|gif|swf)$ {
# 信任的访问来源(合法场景)
valid_referers none blocked *.benet.com benet.com;
# none:允许直接输入资源URL访问(无 Referer 字段,如地址栏输入)
# blocked:允许不带 http:// 协议的请求访问
# *.benet.com/benet.com:仅允许本域名及子域名访问
# 非法引用处理:若来源不在信任列表,跳转提示图(或 return 403 禁止访问)
if ($invalid_referer) {
rewrite ^/ http://www.benet.com/error.png; # 跳转到盗链提示图
# return 403; # 可选:直接返回403(更严格)
}
}
location / {
root html;
index index.html index.htm;
}
}
阶段2:盗链服务器配置
登录 IP 为 192.168.10.17 的测试机,进入其 Nginx 根目录:
cd /usr/local/nginx/html
创建一个用于模拟盗链的页面:
vim index.html
内容如下:
<html><body><img src="http://www.benet.com/game.jpg"/></body></html>
同时确保该机器也配置了相同的域名解析规则:
echo "192.168.10.22 www.benet.com" >> /etc/hosts
完成配置后,访问该页面时若无法正常加载图片而显示 error.png,则说明防盗链机制已生效。
Refererecho "192.168.10.17 www.zjl.com" >> /etc/hosts 阶段3:验证测试 # 源服务器上重启 Nginx 服务 nginx -t && systemctl restart nginx # 盗链服务器启动 Nginx systemctl start nginx # 测试结果如下: # 1. 合法访问地址:http://www.benet.com → 正常显示 game.jpg 图片 # 2. 非法盗链访问:http://www.zjl.com → 显示 error.png 或返回 403 禁止访问页面 九、Nginx location 配置规则深度解析 (一)核心功能说明 location 指令用于匹配客户端请求的 URI 路径,依据不同的匹配规则将请求进行分发处理。例如静态资源可直接响应,动态请求则转发至后端应用服务器。它是 Nginx 配置中最关键的部分之一。 (二)三种主要匹配方式 | 匹配类型 | 符号标识 | 核心特性说明 | |------------------|-------------|--------------| | 精准匹配 | = | 必须与 URI 完全一致,优先级最高,一旦匹配成功即终止后续查找 | | 前缀匹配(高优) | ^~ | 匹配以指定路径开头的请求,采用最长前缀原则,且高于正则匹配优先级,命中后停止搜索 | | 正则匹配 | ~ / ~* | 使用正则表达式进行匹配,其中 ~ 表示区分大小写,~* 表示不区分大小写 | | 正则反向匹配 | !~ / !~* | 排除满足特定条件的请求,实现反向过滤 |→ 仅精确匹配该路径,其他如附加参数或子路径均不生效location = /abc {}→ 可匹配以指定路径开始的请求/abc、/abc//abc/123→ 匹配类似location ^~ /images/ {}和/images/1.jpg等请求路径/images/user/avatar.png→ 区分大小写的正则匹配~→ 不区分大小写模式下的匹配行为~*→ 成功匹配形如~ \.jpg$的请求(区分大小写).jpg→ 可匹配~* \.jpg$,忽略大小写差异.jpg/.JPG→ 排除所有以!~ \.jpg$结尾的请求路径 (三)匹配顺序优先级(由高到低) 1. 精准匹配(=) 若存在完全一致的 URI,则立即执行并结束匹配流程。 2. 前缀匹配(^~) 成功匹配后不再继续检查任何正则规则。 3. 正则匹配(~ 和 ~*) 按照配置文件中出现的先后顺序依次尝试,首个命中即生效。 4. 普通前缀匹配(无特殊符号) 在未触发正则的情况下,选择最长前缀路径进行响应。 5. 通用匹配(/) 所有规则均未匹配时的默认兜底规则。 (四)典型配置案例详解 1. 根路径精准匹配(优化首页加载).jpg2. 静态资源目录使用前缀匹配(提升处理效率)location = / { root html; index index.html index.htm; } # 效果:仅匹配访问根路径 http://www.example.com/,不匹配 /data、/images 等路径 # 场景:网站首页高频访问,精准匹配提升效率3. 利用正则匹配筛选图片资源(按文件类型控制)location ^~ /static/ { root /webroot/static/; } # 效果:匹配所有以 /static/ 开头的请求(如 /static/css/style.css),优先于正则匹配 # 场景:静态资源目录,避免被其他正则规则覆盖,提升访问速度4. 动态请求统一转发至后端服务(作为最后一条规则)location ~* \.(gif|jpg|jpeg|png)$ { root /webroot/images/; expires 7d; # 缓存7天 } # 效果:不区分大小写匹配图片文件,统一处理缓存 # 场景:所有图片资源的集中管理(五)配置建议与注意事项 - 正则表达式规则遵循“书写顺序”决定优先级,应将高频或高优先级规则置于前面。 - 对重要目录推荐使用 `^~` 前缀匹配,防止被后续正则意外覆盖。 - 尽量减少正则使用的频率,优先选用前缀匹配以提高性能和可读性。 十、Nginx 重定向实战应用场景 (一)场景一:域名迁移跳转(旧域名平滑过渡) 需求背景 原网站域名 www.yjs.com 需迁移到新域名 www.benet.com,但旧域名仍需保留访问入口,并确保原有路径及参数完整传递(如 `/test/1.html` 跳转后保持不变)。 实施步骤(含详细注释) 步骤1:编辑主配置文件 vim /usr/local/nginx/conf/nginx.conf 步骤2:添加基于 host 的重定向规则location / { proxy_pass http://backend_server; # 转发到后端应用服务器(如 Tomcat) } # 效果:所有未匹配到其他规则的请求(如动态接口 /api/user)均转发 # 场景:PHP、Java 等动态请求处理步骤3:配置本地 hosts 并重启服务 echo "192.168.10.19 www.yjs.com www.benet.com" >> /etc/hosts systemctl restart nginx 测试效果 在浏览器中访问server { listen 80; server_name www.yjs.com; # 旧域名 charset utf-8; access_log /var/log/nginx/www.yjs.com-access.log; # 旧域名访问日志 location / { # 判断请求主机是否为旧域名 if ($host = 'www.yjs.com') { # 重定向规则:^/(.*)$ 匹配域名后所有路径($1 为路径参数),permanent 表示永久重定向(301) rewrite ^/(.*)$ http://www.benet.com/$1 permanent; } index index.html index.htm; } }自动跳转至http://www.yjs.com/test/1.htmlHTTP 响应码为 301(永久重定向),原始 URL 参数完整保留。 (二)场景二:基于客户端 IP 的访问控制(上线维护模式) 业务背景 系统新版本发布期间,仅允许公司内部 IP(192.168.10.19)正常访问,其余用户统一跳转至维护提示页面。 操作流程 步骤1:创建维护页面内容 mkdir -p /var/www/html/ echo "<h1>We are maintaining now!</h1>" > /var/www/html/weihu.html 步骤2:修改 Nginx 主配置文件 vim /usr/local/nginx/conf/nginx.conf 步骤3:插入基于 $remote_addr 的条件跳转配置http://www.benet.com/test/1.html步骤4:重启服务并验证结果 systemctl restart nginx 验证结果如下: # 1. 来自合法 IP(192.168.10.19)的请求 → 正常访问站点首页 # 2. 其他任意 IP 地址访问 → 自动跳转并显示 “We are maintaining now!” 维护提示页 总结归纳 通过上述实践配置,能够快速搭建出安全、高效且易于维护的 Nginx 服务架构,有效应对默认配置存在的安全隐患、性能瓶颈以及日常运维难题。建议在实际运行过程中持续监控关键指标(如并发连接数、响应延迟、CPU 与内存占用情况),结合业务发展动态调整优化策略,充分发挥 Nginx 的高性能优势,为系统的稳定运行提供强有力的技术支撑。server { listen 80; server_name www.yjs.com; charset utf-8; access_log /var/log/nginx/www.yjs.com-access.log; # 定义变量:标记是否需要重写(默认 true=需要) set $rewrite true; # 合法 IP 判断:若客户端 IP 为 192.168.10.19,设置 $rewrite=false(不重写) if ($remote_addr = "192.168.10.19") { set $rewrite false; } # 非法 IP 处理:重写至维护页面(不加 permanent,避免死循环) if ($rewrite = true) { rewrite (.+) /weihu.html; # (.+) 匹配所有路径,重写为 /weihu.html } # 维护页面配置:指定维护页面所在目录 location = /weihu.html { root /var/www/html; } # 合法 IP 默认配置 location / { root html; index index.html index.htm; } }


雷达卡


京公网安备 11010802022788号







