Nginx 优化与防盗链及扩展配置指南

目录

前言

[一、Nginx 基础优化配置](#一、Nginx 基础优化配置)

[1. 隐藏版本号](#1. 隐藏版本号)

[2. 修改用户与组](#2. 修改用户与组)

[3. 配置缓存时间](#3. 配置缓存时间)

[4. 日志切割](#4. 日志切割)

[5. 连接超时配置](#5. 连接超时配置)

[6. 更改进程数](#6. 更改进程数)

查看CPU核数和Nginx子进程数的代码

[基础 HTTP 服务器配置](#基础 HTTP 服务器配置)

[启用 Gzip 压缩](#启用 Gzip 压缩)

反向代理配置

[SSL/TLS 配置](#SSL/TLS 配置)

静态文件缓存控制

[7. 配置网页压缩](#7. 配置网页压缩)

配置Nginx开启Gzip压缩并测试图片加载

二、配置防盗链

[1. 核心原理](#1. 核心原理)

[2. 配置方法](#2. 配置方法)

配置代码

功能说明

注意事项

文件传输与目录准备

创建index.html文件

配置hosts解析

权限与所有权设置(可选)

重启Nginx服务

[三、扩展 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 配置)

处理静态文件请求

处理动态请求(如PHP)

处理根路径

处理特定路径请求(如/images/)

补充:通用代理配置

补充:静态资源缓存配置

[6. 总结](#6. 总结)

[四、扩展 Nginx 重定向配置](#四、扩展 Nginx 重定向配置)

[1. 基于域名的跳转](#1. 基于域名的跳转)

配置Nginx实现域名永久重定向

配置本地DNS解析

重启Nginx服务

测试验证

关键点说明

[2. 基于客户端 IP 访问跳转](#2. 基于客户端 IP 访问跳转)

配置Nginx实现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。

操作步骤

  1. 创建用户与组:useradd -M -s /sbin/nologin nginx_user-M 不创建家目录,-s 指定登录shell为不可登录,增强安全性)。

  2. 在主配置文件的 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)实现自动切割,步骤如下:

  1. 创建日志切割脚本 /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_DIRPID_FILE)是否与实际系统配置匹配。

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

  2. 添加定时任务,设置每日凌晨 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"/>

操作步骤

  1. 使用vim编辑nginx.conf后保存退出
  2. 将图片文件game.jpg上传至/usr/local/nginx/html/目录
  3. 重启Nginx服务使配置生效:
bash 复制代码
nginx -s reload

验证方法

  1. 浏览器访问http://服务器IP/应正常显示图片
  2. 通过开发者工具查看响应头,确认存在Content-Encoding: gzip字段
  3. 使用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 按以下优先级顺序匹配,一旦匹配成功则停止后续匹配:

  1. 精确匹配(=):优先级最高,完全匹配时直接生效。

  2. 前缀匹配(^~):次高优先级,匹配前缀后不执行正则匹配。

  3. 正则匹配(~ / ~*):优先级低于前缀匹配(^~),按配置顺序匹配,先匹配到的生效。

  4. 普通前缀匹配(无 ^~):优先级最低,匹配前缀后若存在正则匹配则继续执行正则匹配,若正则匹配成功则覆盖前缀匹配。

3. 规则顺序

规则顺序对不同匹配类型的影响不同:

  • 精确匹配(=)和前缀匹配(^~):顺序不影响,优先级固定。

  • 正则匹配(~ / ~*):顺序影响匹配结果,配置在前面的正则规则优先匹配,一旦匹配成功则不再检查后续正则规则。

  • 普通前缀匹配(无 ^~):顺序不影响,Nginx 会自动选择最长的前缀进行匹配,若存在正则匹配则会被正则覆盖。

4. location 配置实例解析

通过具体实例理解不同匹配方式的使用场景和优先级关系:

4.1 精确匹配:location = /

仅匹配根路径 http://example.com/,不匹配 http://example.com/index.htmlhttp://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 文件。若文件不存在,需额外配置错误处理。

注意事项

  1. 确保 /usr/share/nginx/html/index.html 文件存在,否则会触发 404 错误。

  2. 若需处理其他首页文件(如 index.htm),可扩展 index 指令:

    nginx 复制代码
    index index.html index.htm;
  3. 高安全性场景建议禁用目录列表:

    nginx 复制代码
    autoindex 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 通过 returnrewrite 指令实现重定向。

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 服务稳定、高效、安全运行。

相关推荐
w***37511 小时前
Nginx 的 proxy_pass 使用简介
运维·nginx
tsumikistep1 小时前
【前后端】Vue 脚手架与前端工程结构入门指南
前端·javascript·vue.js
在繁华处1 小时前
JAVA实战:文件管理系统1.0
java·开发语言·前端
GISer_Jing1 小时前
SSE Conf大会分享支付宝xUI引擎:AI时代的多模态交互革命
前端·人工智能·交互
Aerelin1 小时前
爬虫playwright中的资源监听
前端·爬虫·js·playwright
WordPress学习笔记1 小时前
专业建外贸网站公司推荐
大数据·前端·人工智能
XiaoCCCcCCccCcccC2 小时前
多路复用 select -- select 的介绍,select 的优缺点,select 版本的 TCP 回显服务器
服务器·c++
XiaoCCCcCCccCcccC2 小时前
多路复用 poll -- poll 的介绍,poll 的优缺点,poll 版本的 TCP 回显服务器
服务器·网络·c++
fruge2 小时前
前端简历优化:如何突出项目亮点与技术深度(附示例)
前端