楼主: W160729221818zN
15 0

Nginx 核心配置实战 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2018-11-21
最后登录
2018-11-21

楼主
W160729221818zN 发表于 2025-11-29 07:00:02 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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

观察返回头中是否存在 ExpiresCache-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. =:精确匹配
  2. ^~:前缀匹配(忽略正则)
  3. ~~*:正则表达式匹配(区分大小写 / 不区分)

(三)匹配优先级顺序(由高至低)

  1. 精确匹配(=)
  2. 前缀匹配(^~),最长匹配胜出
  3. 正则匹配(按配置顺序执行,首个匹配即生效)
  4. 普通前缀匹配(无修饰符)

(四)经典配置实例解析

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:准备测试资源并重启服务

  1. 将一张图片复制到 Nginx 默认根目录下:
    cp /root/game.jpg /usr/local/nginx/html/
  2. 创建一个简单的 index.html 页面,引用该图片:
    vim /usr/local/nginx/html/index.html
    内容如下:
    <html><body><img src="game.jpg"/></body></html>
  3. 重启 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,则说明防盗链机制已生效。

Referer

echo "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$
→ 排除所有以
.jpg
结尾的请求路径 (三)匹配顺序优先级(由高到低) 1. 精准匹配(=) 若存在完全一致的 URI,则立即执行并结束匹配流程。 2. 前缀匹配(^~) 成功匹配后不再继续检查任何正则规则。 3. 正则匹配(~ 和 ~*) 按照配置文件中出现的先后顺序依次尝试,首个命中即生效。 4. 普通前缀匹配(无特殊符号) 在未触发正则的情况下,选择最长前缀路径进行响应。 5. 通用匹配(/) 所有规则均未匹配时的默认兜底规则。 (四)典型配置案例详解 1. 根路径精准匹配(优化首页加载)
location = / {
    root html;
    index index.html index.htm;
}
# 效果:仅匹配访问根路径 http://www.example.com/,不匹配 /data、/images 等路径
# 场景:网站首页高频访问,精准匹配提升效率
2. 静态资源目录使用前缀匹配(提升处理效率)
location ^~ /static/ {
    root /webroot/static/;
}
# 效果:匹配所有以 /static/ 开头的请求(如 /static/css/style.css),优先于正则匹配
# 场景:静态资源目录,避免被其他正则规则覆盖,提升访问速度
3. 利用正则匹配筛选图片资源(按文件类型控制)
location ~* \.(gif|jpg|jpeg|png)$ {
    root /webroot/images/;
    expires 7d;  # 缓存7天
}
# 效果:不区分大小写匹配图片文件,统一处理缓存
# 场景:所有图片资源的集中管理
4. 动态请求统一转发至后端服务(作为最后一条规则)
location / {
    proxy_pass http://backend_server;  # 转发到后端应用服务器(如 Tomcat)
}
# 效果:所有未匹配到其他规则的请求(如动态接口 /api/user)均转发
# 场景:PHP、Java 等动态请求处理
(五)配置建议与注意事项 - 正则表达式规则遵循“书写顺序”决定优先级,应将高频或高优先级规则置于前面。 - 对重要目录推荐使用 `^~` 前缀匹配,防止被后续正则意外覆盖。 - 尽量减少正则使用的频率,优先选用前缀匹配以提高性能和可读性。 十、Nginx 重定向实战应用场景 (一)场景一:域名迁移跳转(旧域名平滑过渡) 需求背景 原网站域名 www.yjs.com 需迁移到新域名 www.benet.com,但旧域名仍需保留访问入口,并确保原有路径及参数完整传递(如 `/test/1.html` 跳转后保持不变)。 实施步骤(含详细注释) 步骤1:编辑主配置文件 vim /usr/local/nginx/conf/nginx.conf 步骤2:添加基于 host 的重定向规则
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;
    }
}
步骤3:配置本地 hosts 并重启服务 echo "192.168.10.19 www.yjs.com www.benet.com" >> /etc/hosts systemctl restart nginx 测试效果 在浏览器中访问
http://www.yjs.com/test/1.html
自动跳转至
http://www.benet.com/test/1.html
HTTP 响应码为 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 的条件跳转配置
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;
    }
}
步骤4:重启服务并验证结果 systemctl restart nginx 验证结果如下: # 1. 来自合法 IP(192.168.10.19)的请求 → 正常访问站点首页 # 2. 其他任意 IP 地址访问 → 自动跳转并显示 “We are maintaining now!” 维护提示页 总结归纳 通过上述实践配置,能够快速搭建出安全、高效且易于维护的 Nginx 服务架构,有效应对默认配置存在的安全隐患、性能瓶颈以及日常运维难题。建议在实际运行过程中持续监控关键指标(如并发连接数、响应延迟、CPU 与内存占用情况),结合业务发展动态调整优化策略,充分发挥 Nginx 的高性能优势,为系统的稳定运行提供强有力的技术支撑。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Application Maintaining Maintenance Javascript Processes

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-6 02:45