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

相关推荐
程序员小崔日记9 小时前
20块钱注册一年 .COM 域名!Spaceship 最新优惠教程,支付宝即可付款(附优惠码)
服务器·腾讯云·域名
实心儿儿10 小时前
Linux —— 进程间关系和守护进程
linux·运维·服务器
林浅不想努力11 小时前
LVS知识点总结
服务器·云原生·lvs
石小石Orz11 小时前
我发现了开发者AI产品营收的新方向
前端·虚拟现实
老马识途2.011 小时前
关于跨域问题的总结
java·前端
Dawn-bit12 小时前
Linux磁盘管理详解
linux·运维·服务器·计算机网络·云计算
别惊醒渔人13 小时前
Vue3 Diff 优化:最长递增子序列 LIS
前端·javascript·vue.js
颜酱13 小时前
07 | 把字段与指标同步到 Qdrant(生成阶段)
前端·人工智能·后端
用户0595401744614 小时前
把AI长期记忆测试从手动验证换成pytest,2天揪出11个隐藏Bug
前端·css
lichenyang45315 小时前
从 Vite 空项目到 AIGC 图片工作台:我如何打通生图、任务轮询、生成库与 Canvas 动态特效
前端·人工智能