目录
[一、Nginx 基础优化配置](#一、Nginx 基础优化配置)
[1. 隐藏版本号](#1. 隐藏版本号)
[2. 修改用户与组](#2. 修改用户与组)
[3. 配置缓存时间](#3. 配置缓存时间)
[4. 日志切割](#4. 日志切割)
[5. 连接超时配置](#5. 连接超时配置)
[6. 更改进程数](#6. 更改进程数)
[基础 HTTP 服务器配置](#基础 HTTP 服务器配置)
[启用 Gzip 压缩](#启用 Gzip 压缩)
[SSL/TLS 配置](#SSL/TLS 配置)
[7. 配置网页压缩](#7. 配置网页压缩)
[1. 核心原理](#1. 核心原理)
[2. 配置方法](#2. 配置方法)
[三、扩展 Nginx location 配置规则](#三、扩展 Nginx location 配置规则)
[1. location 的三类匹配方式](#1. location 的三类匹配方式)
[2. 匹配优先级](#2. 匹配优先级)
[3. 规则顺序](#3. 规则顺序)
[4. location 配置实例解析](#4. location 配置实例解析)
[4.1 精确匹配:location = /](#4.1 精确匹配:location = /)
[4.2 普通前缀匹配:location /](#4.2 普通前缀匹配:location /)
[4.3 正则匹配:location ~ \.jpg](#4.3 正则匹配:location ~ \.jpg)
[4.4 前缀匹配与正则匹配结合:location ^~ /static/](#4.4 前缀匹配与正则匹配结合:location ^~ /static/)
[4.5 正则匹配和优先级](#4.5 正则匹配和优先级)
[4.6 默认匹配:location /](#4.6 默认匹配:location /)
[5. 典型的 Nginx 配置](#5. 典型的 Nginx 配置)
[6. 总结](#6. 总结)
[四、扩展 Nginx 重定向配置](#四、扩展 Nginx 重定向配置)
[1. 基于域名的跳转](#1. 基于域名的跳转)
[2. 基于客户端 IP 访问跳转](#2. 基于客户端 IP 访问跳转)
前言
Nginx 作为高性能的 HTTP 和反向代理服务器,在实际生产环境中,其默认配置往往无法满足高并发、高安全性的需求。因此,对 Nginx 进行合理优化并配置防盗链,是提升服务稳定性、安全性和性能的关键环节。本文将从基础优化、防盗链配置以及进阶的 location 规则和重定向配置三个维度,详细讲解 Nginx 的核心配置技巧。
一、Nginx 基础优化配置
基础优化主要围绕版本隐藏、权限控制、性能调优、日志管理等核心维度展开,旨在解决默认配置中的安全隐患和性能瓶颈。
1. 隐藏版本号
Nginx 默认响应头会携带版本信息(如 Server: nginx/1.24.0),攻击者可能利用特定版本的漏洞发起攻击。隐藏版本号可降低被针对性攻击的风险。
配置方法 :在 Nginx 主配置文件(通常为 nginx.conf)的 http 块中添加以下
nginx
http {
# 禁用 Nginx 版本号显示
server_tokens off;
# 使用 headers-more 模块自定义 Server 头(需安装 ngx_headers_more 模块)
more_set_headers "Server: CustomServer/1.0";
# 可选:移除其他敏感头信息
more_clear_headers "X-Powered-By";
more_clear_headers "X-AspNet-Version";
}

验证方式 :使用 curl -I 域名 命令查看响应头,若 Server 字段仅显示 nginx 或自定义内容,无版本号则配置生效。
2. 修改用户与组
Nginx 默认以 nobody 用户或 nginx 用户运行,若服务被入侵,攻击者可能通过该用户获取系统权限。为降低风险,建议创建专用的低权限用户与组运行 Nginx。
操作步骤:
-
创建用户与组:
useradd -M -s /sbin/nologin nginx_user(-M不创建家目录,-s指定登录shell为不可登录,增强安全性)。 -
在主配置文件的
main块(全局配置)中指定用户与组:
stata
user nginx_user nginx_user;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

注意事项:需确保 Nginx 运行目录、日志目录、网站根目录对该用户有相应的读写权限,避免出现权限不足的错误。
3. 配置缓存时间
对静态资源(如图片、CSS、JS、字体文件等)配置缓存,可减少重复请求,降低服务器压力,同时提升客户端加载速度。缓存配置通过 expires 指令实现。
配置方法 :在 server 块或 location 块中添加针对静态资源的缓存规则:
nginx
server {
listen 80;
server_name example.com;
root /usr/share/nginx/html;
# 对图片文件配置 7 天缓存
location ~* \.(jpg|jpeg|png|gif|ico)$ {
expires 7d;
add_header Cache-Control "public, max-age=604800";
access_log off;
}
# 对 CSS、JS 文件配置 1 天缓存
location ~* \.(css|js)$ {
expires 1d;
add_header Cache-Control "public, max-age=86400";
}
}

说明 :public 表示缓存可被客户端和代理服务器缓存;max-age 单位为秒,与 expires 计算的时间需一致。对于经常更新的资源,应设置较短的缓存时间。
4. 日志切割
Nginx 默认将所有访问日志和错误日志写入单个文件,长期运行会导致日志文件过大,难以查看和管理。日志切割可将日志按时间(如每日)分割,便于归档和分析。
实现方式:通过 Shell 脚本结合定时任务(crontab)实现自动切割,步骤如下:
- 创建日志切割脚本
/usr/local/nginx/sbin/nginx_log_cut.sh:
bash
#!/bin/bash
# 日志存储目录
LOG_DIR="/var/log/nginx"
# 当前日期(格式:年-月-日)
DATE=$(date +%Y-%m-%d)
# Nginx 进程号文件
PID_FILE="/var/run/nginx.pid"
# 重命名访问日志和错误日志
mv $LOG_DIR/access.log $LOG_DIR/access_$DATE.log
mv $LOG_DIR/error.log $LOG_DIR/error_$DATE.log
# 向 Nginx 发送 USR1 信号,触发日志重新生成(不中断服务)
kill -USR1 $(cat $PID_FILE)
# 可选:删除 30 天前的旧日志,释放磁盘空间
find $LOG_DIR -name "access_*.log" -mtime +30 -delete
find $LOG_DIR -name "error_*.log" -mtime +30 -delete
关键功能说明
日志轮转部分通过重命名现有日志文件并发送 USR1 信号给 Nginx 进程实现,确保服务不中断。find 命令自动清理 30 天前的旧日志文件,防止磁盘空间耗尽。
使用建议
将该脚本保存为 /etc/cron.daily/nginx-logrotate 并赋予可执行权限,可实现每日自动运行:
bash
chmod +x /etc/cron.daily/nginx-logrotate
注意检查脚本中的路径(LOG_DIR 和 PID_FILE)是否与实际系统配置匹配。
-
给脚本添加执行权限:
chmod +x /usr/local/nginx/sbin/nginx_log_cut.sh。 -
添加定时任务,设置每日凌晨 0 点执行切割: 执行
crontab -e,添加以下内容:0 0 * * * /usr/local/nginx/sbin/nginx_log_cut.sh
5. 连接超时配置
合理配置连接超时时间,可避免无效连接占用服务器资源,提升服务器并发处理能力。核心超时参数包括连接超时、读取超时、发送超时等,配置在 http 块或 server 块中。
nginx
http {
......
keepalive_timeout 65 180; # 客户端连接保持时间为65秒,后续请求超时时间为180秒
client_header_timeout 80; # 客户端发送请求头超时时间为80秒,超时返回408错误
client_body_timeout 80; # 客户端发送请求体超时时间为80秒
......
}
bash
systemctl restart nginx # 重启Nginx服务使配置生效
参数说明
keepalive_timeout 65 180
第一个参数 65 表示服务器将保持客户端连接打开的最长时间(秒)。第二个参数 180 是可选的,表示在响应头中发送给客户端的 Keep-Alive: timeout=180 值,指导客户端后续请求的超时时间。
client_header_timeout 80
定义等待客户端发送完整 HTTP 请求头的超时时间。如果客户端在此时间内未发送完整的请求头,Nginx 将返回 408(Request Time-out)错误。
client_body_timeout 80
设置等待客户端发送请求体的超时时间。适用于 POST 等需要传输请求体的方法,超时处理方式与请求头超时相同。
注意事项
修改 Nginx 配置文件后,建议先测试配置语法是否正确:
bash
nginx -t
确认语法无误后再执行重启命令。生产环境中建议在低峰期进行配置变更。
说明 :keepalive_timeout 过长可能导致连接堆积,过短则会频繁建立连接增加开销,需根据业务场景调整(如静态资源服务可适当延长,API服务可缩短)。
6. 更改进程数
Nginx 的工作进程(worker_processes)负责处理客户端请求,合理设置进程数可充分利用服务器 CPU 资源,提升并发处理能力。
配置原则:
注意事项
两个命令可以分开执行,分别获取CPU核数和Nginx进程数。如果需要一次性执行,可以用分号连接:
-
对于单核 CPU:设置为 1 或 2(避免进程切换开销)。
-
对于多核 CPU:建议设置为 CPU 核心数或核心数 + 1,充分利用多核资源。
-
Nginx 1.9+ 版本支持
auto参数,可自动识别 CPU 核心数并配置。
查看CPU核数和Nginx子进程数的代码
以下代码组合了查看CPU物理核数和Nginx子进程数量的功能:
bash
# 查看CPU物理核数
cat /proc/cpuinfo | grep -c "physical id"
# 查看Nginx子进程数量(包括主进程)
ps aux | grep nginx | grep -v grep | wc -l
代码说明
cat /proc/cpuinfo | grep -c "physical id"命令通过读取/proc/cpuinfo文件并统计"physical id"出现的次数来获取CPU物理核数。
ps aux | grep nginx | grep -v grep | wc -l命令通过以下步骤工作:
ps aux列出所有进程grep nginx筛选出nginx相关进程grep -v grep排除掉grep自身进程wc -l统计最终行数
bash
cat /proc/cpuinfo | grep -c "physical id"; ps aux | grep nginx | grep -v grep | wc -l
执行结果会先显示CPU物理核数,然后显示Nginx进程总数。
以下是在 vim /usr/local/nginx/conf/nginx.conf 中编辑 Nginx 配置文件的常见功能示例代码,根据需求可调整具体参数:
基础 HTTP 服务器配置
nginx
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
启用 Gzip 压缩
nginx
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1024;
gzip_comp_level 6;
反向代理配置
nginx
location /api/ {
proxy_pass http://backend_server:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
SSL/TLS 配置
nginx
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
}
静态文件缓存控制
nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
注意事项:
- 修改配置后需执行
nginx -t测试语法 - 重载配置使用
nginx -s reload - 路径需根据实际环境调整
7. 配置网页压缩
对 HTML、CSS、JS 等文本类资源进行压缩,可减少资源传输大小,提升客户端加载速度,同时降低服务器带宽占用。Nginx 通过 gzip 模块实现压缩功能,默认已内置。
推荐配置 :在 http 块中添加以下配置:
配置Nginx开启Gzip压缩并测试图片加载
Nginx配置部分
编辑nginx.conf文件,在http{}块内添加或修改以下Gzip配置参数:
nginx
gzip on;
gzip_min_length 1k;
gzip_buffers 4 64k;
gzip_http_version 1.1;
gzip_comp_level 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;
HTML文件部分
在/usr/local/nginx/html/index.html中添加图片引用标签:
html
<img src="game.jpg"/>
操作步骤
- 使用vim编辑
nginx.conf后保存退出 - 将图片文件
game.jpg上传至/usr/local/nginx/html/目录 - 重启Nginx服务使配置生效:
bash
nginx -s reload
验证方法
- 浏览器访问
http://服务器IP/应正常显示图片 - 通过开发者工具查看响应头,确认存在
Content-Encoding: gzip字段 - 使用curl测试压缩效果:
bash
curl -I -H "Accept-Encoding: gzip" http://localhost/game.jpg
二、配置防盗链
防盗链用于防止其他网站非法引用本网站的资源(如图片、视频),避免服务器带宽被恶意消耗。Nginx 通过 valid_referers 指令判断请求的来源(Referer 头),实现防盗链控制。
1. 核心原理
当客户端请求资源时,HTTP 请求头会携带 Referer 字段,表明请求来自哪个页面。Nginx 通过校验 Referer 字段,允许可信域名的引用,拒绝非法域名的引用。
2. 配置方法
在需要防盗链的 location 块(如图片、视频资源目录)中添加配置:
以下是实现防盗链功能的 Nginx 配置代码片段,基于用户提供的模板进行完善:
配置代码
nginx
http {
...
server {
...
location ~* \.(jpg|gif|swf|png|jpeg)$ {
valid_referers none blocked *.benet.com benet.com;
if ($invalid_referer) {
rewrite ^/ http://www.benet.com/error.png;
# return 403;
}
}
...
}
}
功能说明
该配置实现了对图片和 Flash 文件的防盗链保护:
- 匹配
.jpg,.gif,.swf,.png,.jpeg等静态资源文件 - 允许来自
benet.com及其子域名的合法引用 - 允许直接访问(none)和通过代理访问(blocked)
- 非法引用时重定向到错误图片
- 注释掉的
return 403可作为备选方案直接返回 403 状态码
注意事项
- 需要确保
error.png文件存在于网站根目录 - 建议根据实际需求调整允许的域名列表
- 重定向会影响 SEO,生产环境建议使用 403 状态码
参数说明:
~* \.(jpg|gif|swf) :这段正则表达式表示匹配不区分大小写,以 .jpg 或 .gif 或 .swf 结尾的文
件;
valid_referers :设置信任的网站,可以正常使用图片;
none :允许没有 http_refer 的请求访问资源(根据 Referer 的定义,它的作用是指示一个请求是从哪里链接
过来的,如果直接在浏览器的地址栏中输入一个资源的 URL 地址,那么这种请求是不会包含 Referer 字段
的),如 http://www.benet.com/game.jpg www.benet.com/
我们使用 http://www.benet.com 访问显示的图片,可以理解成 http://www.benet.com/game.jpg
这个请求是从 http://www.benet.com 这个链接过来的。
blocked :允许不是 http:// 开头的,不带协议的请求访问资源;
\*.benet.com :只允许来自指定域名的请求访问资源,如 http://www.benet.com
if 语句:如果链接的来源域名不在 valid_referers 所列出的列表中, invalid_referer 为 true ,则执行
后面的操作,即进行重写或返回 403 页面。
以下是实现网页准备的代码和配置步骤:
文件传输与目录准备
bash
cd /usr/local/nginx/html
# 假设通过scp传输文件(需替换实际源路径)
scp user@source_server:/path/to/game.jpg .
scp user@source_server:/path/to/error.png .
创建index.html文件
bash
cat > index.html <<EOF
<html>
<body>
<img src="game.jpg"/>
</body>
</html>
EOF
配置hosts解析
bash
echo "192.168.10.101 www.benet.com" >> /etc/hosts
echo "192.168.10.17 www.zjl.com" >> /etc/hosts
权限与所有权设置(可选)
bash
chown -R nginx:nginx /usr/local/nginx/html
chmod 644 /usr/local/nginx/html/*
重启Nginx服务
bash
systemctl restart nginx
注意事项:
- 确保Nginx安装目录为
/usr/local/nginx - 若使用yum安装的Nginx,默认目录应为
/usr/share/nginx/html - 需要提前关闭SELinux或配置适当策略
- 防火墙需放行80端口
参数说明:
-
none:允许空 Referer(直接在浏览器输入资源 URL 访问)。 -
blocked:允许 Referer 被防火墙或代理服务器过滤后的请求。 -
example.com *.example.com:允许本域名及子域名的引用。
注意事项:Referer 头可被伪造,防盗链仅能阻止常规的非法引用,若需更严格的控制,可结合令牌验证等方式。
三、扩展 Nginx location 配置规则
location 是 Nginx 中用于匹配请求 URI 的核心指令,通过不同的匹配方式和优先级,可实现对不同资源的精准路由和控制。掌握 location 配置是 Nginx 进阶使用的关键。
1. location 的三类匹配方式
Nginx 的 location 匹配方式主要分为三类,不同方式的语法和匹配逻辑不同:
| 匹配类型 | 语法格式 | 匹配规则 |
|---|---|---|
| 精确匹配 | location = /uri | 仅匹配 URI 完全等于指定值的请求,不匹配子路径 |
| 前缀匹配 | location [^~] /uri | 匹配以指定 URI 为前缀的请求,包括子路径;^~ 表示优先匹配,不执行后续正则匹配 |
| 正则匹配 | location ~ /uri(区分大小写)location ~* /uri(不区分大小写) | 按正则表达式规则匹配 URI,仅匹配路径部分,不包含查询参数 |
2. 匹配优先级
当多个 location 规则同时存在时,Nginx 按以下优先级顺序匹配,一旦匹配成功则停止后续匹配:
-
精确匹配(=):优先级最高,完全匹配时直接生效。
-
前缀匹配(^~):次高优先级,匹配前缀后不执行正则匹配。
-
正则匹配(~ / ~*):优先级低于前缀匹配(^~),按配置顺序匹配,先匹配到的生效。
-
普通前缀匹配(无 ^~):优先级最低,匹配前缀后若存在正则匹配则继续执行正则匹配,若正则匹配成功则覆盖前缀匹配。
3. 规则顺序
规则顺序对不同匹配类型的影响不同:
-
精确匹配(=)和前缀匹配(^~):顺序不影响,优先级固定。
-
正则匹配(~ / ~*):顺序影响匹配结果,配置在前面的正则规则优先匹配,一旦匹配成功则不再检查后续正则规则。
-
普通前缀匹配(无 ^~):顺序不影响,Nginx 会自动选择最长的前缀进行匹配,若存在正则匹配则会被正则覆盖。
4. location 配置实例解析
通过具体实例理解不同匹配方式的使用场景和优先级关系:
4.1 精确匹配:location = /
仅匹配根路径 http://example.com/,不匹配 http://example.com/index.html 或 http://example.com/admin/。
代码实现
以下是实现根路径请求处理的 Nginx 配置代码片段,功能为返回指定目录下的 index.html 作为首页:
nginx
location = / {
# 根路径请求的处理,如返回首页
root /usr/share/nginx/html;
index index.html;
}
功能说明
-
location = /精确匹配根路径请求(
/),优先级高于普通前缀匹配。 -
root指令指定静态文件根目录为
/usr/share/nginx/html,所有文件路径将基于此目录解析。 -
index指令当请求路径为目录时,默认返回
index.html文件。若文件不存在,需额外配置错误处理。
注意事项
-
确保
/usr/share/nginx/html/index.html文件存在,否则会触发 404 错误。 -
若需处理其他首页文件(如
index.htm),可扩展index指令:nginxindex index.html index.htm; -
高安全性场景建议禁用目录列表:
nginxautoindex off;
4.2 普通前缀匹配:location /
匹配所有以 / 为前缀的请求(即所有请求),是默认的匹配规则,优先级最低。通常用于处理未被其他规则匹配的请求。
nginx
location / {
root /usr/share/nginx/html;
index index.html;
}
匹配 :匹配以 / 开头的所有路径,类似于默认规则。访问 /data 、 /images 等路径时都会匹配
此配置。
使用场景 :常用于处理静态文件和其他通用的请求。
4.3 正则匹配:location ~ \.jpg$
区分大小写匹配所有以 .jpg 结尾的请求,用于单独处理图片资源。若需不区分大小写,可改为 ~*。
nginx
location ~ \.jpg$ {
expires 30d;
add_header Cache-Control "public, no-transform";
try_files $uri /fallback.jpg;
}
匹配 :匹配所有以 .jpg 结尾的请求。需要注意,正则匹配是区分大小写的。
使用场景 :用于处理特定文件类型的请求,比如图片文件( .jpg )。
4.4 前缀匹配与正则匹配结合:location ^~ /static/
^~ 表示优先匹配以 /static/ 为前缀的请求,不执行后续正则匹配。适用于静态资源目录,避免被其他正则规则干扰。
nginx
location ^~ /static/ {
root /webroot/static/;
}
匹配 :匹配所有以 /static/ 开头的请求,优先于正则匹配。
使用场景 :用于加速静态文件的处理,避免进入正则匹配检查。
4.5 正则匹配和优先级
正则匹配按配置顺序生效,前面的规则优先匹配。如下例中,.php$ 规则配置在前面,会优先匹配 /admin/login.php,而不会被后面的 /admin/ 正则匹配。
nginx
location ^~ /images/ {
root /data/images;
}
location ~* \.(gif|jpg|jpeg)$ {
root /media/images;
}
匹配 :当请求路径以 /images/ 开头时会使用 ^~ /images/ 规则,而不会继续使用 ~* 正则规
则。
使用场景 :优先匹配目录路径的规则,避免正则规则不必要的执行。
4.6 默认匹配:location /
作为最后一条规则,处理所有未被其他规则匹配的请求,通常用于反向代理或返回 404 错误。
nginx
location / {
root /var/www/html;
index index.html index.htm;
try_files $uri $uri/ =404;
}
匹配 :这是一个通用的规则,用于处理没有匹配到其它 location 的请求。通常用于动态请求转
发到后端应用服务器。
使用场景 :常用于 PHP 、 Python 等动态请求的转发。
5. 典型的 Nginx 配置
结合上述规则,给出一个典型的网站 Nginx 配置,涵盖静态资源处理、PHP 解析、反向代理、防盗链等场景:
以下是实现静态文件、动态请求、根路径及特定路径处理的Nginx配置代码示例:
处理静态文件请求
nginx
location ^~ /static/ {
root /webroot/static/;
expires 30d;
access_log off;
}
处理动态请求(如PHP)
nginx
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
处理根路径
nginx
location = / {
root /webroot/html;
index index.html index.htm;
try_files $uri $uri/ =404;
}
处理特定路径请求(如/images/)
nginx
location ^~ /images/ {
root /webroot/images;
expires max;
add_header Cache-Control public;
access_log off;
}
补充:通用代理配置
nginx
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
补充:静态资源缓存配置
nginx
location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
expires 1y;
add_header Cache-Control "public, immutable";
}
该配置实现了:
- 静态文件通过
/static/路径直接访问文件系统 - PHP动态请求通过FastCGI处理
- 根路径优先返回静态HTML文件
- 图片资源通过
/images/路径单独处理 - 其他请求默认转发到后端服务
- 静态资源设置长期缓存策略
6. 总结
优先级 : = (精确匹配) > ^~ (前缀匹配) > ~ / ~* (正则匹配) > / (默认匹配)
用途 :
精确匹配 适用于需要精确控制的路径(如首页)。
前缀匹配 用于处理路径较长的请求,特别是静态资源。
正则匹配 用于更复杂的模式匹配,如文件类型(图片、 CSS 文件等)。
规则顺序 :在配置时,确保合理排列 location 规则,确保静态资源和动态请求的正确处理。
四、扩展 Nginx 重定向配置
重定向(Redirect)用于将客户端请求重新导向到其他 URL,常见场景包括域名跳转(如 HTTP 转 HTTPS)、IP 限制访问、路径重写等。Nginx 通过 return 或 rewrite 指令实现重定向。
1. 基于域名的跳转
基于域名的跳转常用于旧域名迁移到新域名、HTTP 域名跳转到 HTTPS 域名、主域名跳转到 www 子域名等场景。
配置Nginx实现域名永久重定向
以下代码实现将www.yjs.com的请求永久重定向(301)到www.benet.com,并保留原始URL路径参数:
nginx
vim /usr/local/nginx/conf/nginx.conf
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') {
rewrite ^/(.*)$ http://www.benet.com/$1 permanent;
}
root html;
index index.html index.htm;
}
}
配置本地DNS解析
添加本地hosts解析记录,用于测试:
bash
echo "192.168.10.101 www.yjs.com www.benet.com" >> /etc/hosts
重启Nginx服务
bash
systemctl restart nginx
测试验证
访问http://www.yjs.com/test/1.html(即使文件不存在)将被重定向到http://www.benet.com/test/1.html,浏览器开发者工具会显示301状态码,证明实现了永久重定向且路径参数正常传递。
关键点说明
rewrite ^/(.*)$匹配所有路径,$1捕获路径参数permanent参数实现301永久重定向$host变量自动获取请求的原始域名- 301重定向有利于SEO权重传递
2. 基于客户端 IP 访问跳转
基于客户端 IP 实现访问控制,如禁止特定 IP 访问网站,或跳转到指定提示页面;也可允许特定 IP 访问后台,其他 IP 禁止。
配置Nginx实现IP访问控制
以下代码实现仅允许IP 192.168.10.19 访问网站,其他IP显示维护页面:
nginx
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.yjs.com;
charset utf-8;
access_log /var/log/nginx/www.yjs.com-access.log;
set $rewrite true;
if ($remote_addr = "192.168.10.19"){
set $rewrite false;
}
if ($rewrite = true){
rewrite (.+) /weihu.html;
}
location = /weihu.html {
root /var/www/html;
}
location / {
root html;
index index.html index.htm;
}
}
创建维护页面
bash
mkdir -p /var/www/html/
echo "<h1>We are maintaining now!</h1>" > /var/www/html/weihu.html
systemctl restart nginx
注意事项
使用rewrite (.+) /weihu.html permanent;会导致非白名单IP访问时进入重定向循环。建议使用非永久重定向(去掉permanent参数)以避免此问题。
验证配置
配置生效后:
- IP
192.168.10.19可以正常访问网站 - 其他IP地址访问将显示维护页面
/var/www/html/weihu.html的内容
五、总结
Nginx 优化与配置是一个系统性工程,基础优化聚焦于安全(隐藏版本、权限控制)和性能(进程数、缓存、压缩、超时),防盗链解决带宽盗用问题,而 location 规则和重定向则实现精准的路由和访问控制。在实际应用中,需结合业务场景(如静态资源服务、反向代理、PHP 解析)灵活调整配置,同时定期监控服务器状态,根据实际运行数据优化参数,确保 Nginx 服务稳定、高效、安全运行。