Nginx 核心功能配置:访问控制、用户认证、HTTPS 与 URL 重写等

Nginx 核心功能配置:访问控制、用户认证、HTTPS 与 URL 重写等

一、访问控制配置

访问控制通过 allow(允许)和 deny(拒绝)指令实现,用于限制特定 IP 或 IP 段对 Nginx 资源的访问,通常配置在 location 段中。

1.1 拒绝单个 IP 访问指定资源

场景 :禁止 IP 为 192.168.100.111 的主机访问 /status 状态页面。

配置示例

复制代码
server {

listen 80;

server_name localhost;

# 拒绝 192.168.100.111 访问 /status

location /status {

echo "Nginx Status Page"; # 自定义返回内容(或结合 stub_status)

deny 192.168.100.111; # 拒绝指定 IP

allow all; # 允许其他所有 IP(默认隐含,可显式声明)

}

}

1.2 仅允许单个 IP 访问指定资源

场景 :仅允许 192.168.100.111 访问 /status 状态页面,拒绝其他所有 IP。

配置示例(结合 stub_status 模块):

复制代码
server {

listen 80;

server_name localhost;

# 仅允许 192.168.100.111 访问 /status(Nginx 状态页)

location /status {

stub_status on; # 开启 Nginx 状态监控(需模块支持)

allow 192.168.100.111; # 允许指定 IP

deny all; # 拒绝其他所有 IP(必须放在最后)

}

}

1.3 stub_status 模块说明

stub_status 是 Nginx 内置模块,用于查看服务器的实时连接状态,需在 location 中开启。

1.3.1 状态页输出内容解析

访问 http://[Nginx 服务器 IP]/status,返回内容如下:

复制代码
Active connections: 1

server accepts handled requests

14 14 14

Reading: 0 Writing: 1 Waiting: 0

各字段含义:

  • Active connections:当前 Nginx 正在处理的活动连接数。
  • accepts:累计处理的总连接数。
  • handled:累计成功建立的 TCP 握手次数(通常与 accepts 一致,除非资源耗尽)。
  • requests:累计处理的 HTTP 请求数。
  • Reading:Nginx 正在读取客户端请求头的连接数。
  • Writing:Nginx 正在向客户端写入响应头的连接数。
  • Waiting:开启 Keep-Alive 后,等待客户端下一次请求的空闲连接数(计算公式:Active - Reading - Writing)。

二、用户认证配置

用户认证通过 auth_basic 指令实现,访问指定资源时需输入用户名和密码,依赖加密的用户密码文件(推荐用 htpasswd 生成)。

2.1 步骤 1:安装 htpasswd 工具

htpasswd 是 Apache 工具集的一部分,用于生成加密的用户密码文件,需先安装:

复制代码
# CentOS/RHEL 系统

yum -y install httpd-tools

# Ubuntu/Debian 系统

apt-get install apache2-utils

2.2 步骤 2:生成用户密码文件

复制代码
# 语法:htpasswd -c(创建新文件)-m(MD5 加密)[文件路径] [用户名]

htpasswd -c -m /usr/local/nginx/conf/.user_auth sl

# 执行后输入密码(如 123456),文件内容示例:

# sl:$apr1$xxxx$xxxxxxxxxxxxxxxxxxxxxxxxx(MD5 加密后的密码)
  • 若需添加多个用户,去掉 -c 选项(避免覆盖现有文件):htpasswd -m /usr/local/nginx/conf/.user_auth user2。

2.3 步骤 3:配置 Nginx 用户认证

场景:访问 /status 状态页时要求输入用户名和密码。

配置示例

复制代码
server {

listen 80;

server_name localhost;

location /status {

stub_status on;

auth_basic "Welcome to Nginx Status Page"; # 认证弹窗提示信息

auth_basic_user_file "/usr/local/nginx/conf/.user_auth"; # 密码文件路径

}

}

2.4 验证效果

  1. 检查配置文件语法:nginx -t
  2. 重载 Nginx 配置:nginx -s reload
  3. 浏览器访问 http://[Nginx 服务器 IP]/status,会弹出用户名 / 密码输入框,输入正确后才可访问。

三、HTTPS 配置(SSL 证书)

HTTPS 需通过 SSL 证书实现加密传输,配置步骤分为「CA 根证书生成」「服务器证书签名」「Nginx 启用 HTTPS」三部分。

3.1 步骤 1:在 CA 服务器生成根证书(自签)

假设 CA 服务器 IP 为 192.168.100.20,Nginx 服务器 IP 为 192.168.100.10

  1. 生成 CA 私钥(权限 077,避免泄露):

    cd /etc/pki/CA

    (umask 077; openssl genrsa -out private/cakey.pem 2048)

2.生成 CA 根证书(有效期 1024 天):

复制代码
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 1024

执行后需输入信息(国家、地区、公司等,后续服务器证书需与这些信息一致):

复制代码
Country Name (2 letter code) [XX]:CN

State or Province Name (full name) []:HB

Locality Name (eg, city) [Default City]:WH

Organization Name (eg, company) [Default Company Ltd]:LQ

Organizational Unit Name (eg, section) []:linux

Common Name (eg, your name or your server's hostname) []:ca.mycompany.com

Email Address []:admin@mycompany.com

3.初始化 CA 证书数据库:

复制代码
echo 01 > serial # 证书序列号起始值

touch index.txt # 证书索引文件

3.2 步骤 2:在 Nginx 服务器生成证书请求(CSR)

  1. 生成 Nginx 服务器私钥:

    cd /usr/local/nginx/conf

    (umask 077; openssl genrsa -out httpd.key 2048)

2.生成证书请求文件(CSR):

复制代码
openssl req -new -key httpd.key -days 1024 -out httpd.csr

输入信息需与 CA 根证书一致(Common Name 填 Nginx 服务器域名 / IP,如 www.mycompany.com)。

3.3 步骤 3:CA 服务器签名 Nginx 证书

  1. 将 Nginx 服务器的 CSR 文件上传到 CA 服务器:

    在 Nginx 服务器执行

    scp httpd.csr root@192.168.100.20:/root/

2.CA 服务器签名证书(生成 CRT 文件):

复制代码
# 在 CA 服务器执行

openssl ca -in /root/httpd.csr -out /root/httpd.crt -days 1024

执行过程中输入 y 确认签名。

3.4 步骤 4:Nginx 启用 HTTPS

  1. 将签名后的证书和 CA 根证书传回 Nginx 服务器:

    在 CA 服务器执行

    scp /root/httpd.crt root@192.168.100.10:/usr/local/nginx/conf/

    scp /etc/pki/CA/cacert.pem root@192.168.100.10:/usr/local/nginx/conf/

2.修改 Nginx 配置文件(启用 443 端口):

复制代码
server {

listen 443 ssl; # 监听 HTTPS 默认端口 443

server_name www.mycompany.com; # Nginx 服务器域名/IP

# SSL 证书配置

ssl_certificate httpd.crt; # 服务器签名证书

ssl_certificate_key httpd.key; # 服务器私钥

ssl_session_cache shared:SSL:1m; # SSL 会话缓存(1MB,约 4000 会话)

ssl_session_timeout 5m; # SSL 会话超时时间

ssl_ciphers HIGH:!aNULL:!MD5; # 加密套件(优先高安全性)

ssl_prefer_server_ciphers on; # 优先使用服务器端加密套件

# 网站根目录与默认页

location / {

root html;

index index.html index.htm;

}

}

# 可选:HTTP 自动跳转 HTTPS(80 端口重定向到 443)

server {

listen 80;

server_name www.mycompany.com;

return 301 https://$host$request_uri; # 永久重定向到 HTTPS

}

3.验证配置并重载 Nginx:

复制代码
nginx -t # 检查语法

nginx -s reload # 重载配置

3.5 验证 HTTPS 访问

  1. 客户端浏览器访问 https://www.mycompany.com(自签证书需手动信任)。

  2. 命令行验证(跳过证书校验):

    curl -k https://192.168.100.10 # -k 忽略证书有效性检查

四、Rewrite 重写(URL 跳转)

Rewrite 用于实现 URL 重定向或路径伪装,依赖正则表达式和 Flag 标记,支持在 server、location、if 段中配置。

4.1 核心语法

复制代码
rewrite <正则表达式> <目标路径/URL> [Flag];
  • 正则表达式:匹配客户端请求的 URI(如 ^/imgs/(.*\.jpg)$ 匹配 /imgs/ 下的所有 JPG 图片)。
  • 目标路径 / URL:匹配成功后跳转的地址(可使用 1、2 等变量引用正则捕获的内容)。
  • Flag 标记:控制跳转行为,常用标记如下:

|-----------|----------------------------------------------|
| Flag | 作用说明 |
| last | 执行当前规则后,继续匹配后续 location 规则(常用于 server/if 段)。 |
| break | 执行当前规则后终止,不匹配后续规则(常用于 location 段)。 |
| redirect | 返回 302 临时重定向(浏览器地址栏显示新 URL,适用于临时跳转)。 |
| permanent | 返回 301 永久重定向(浏览器缓存跳转规则,适用于域名更换等场景)。 |

4.2 常见应用场景

4.2.1 路径伪装(隐藏真实路径)

场景:客户端访问 /imgs/linux.jpg,实际读取服务器 /images/linux.jpg(路径不变,内容指向真实文件)。

配置示例

复制代码
server {

listen 80;

server_name localhost;

root /usr/local/nginx/html; # 网站根目录

location /imgs {

# 正则捕获 /imgs/ 后的内容(如 linux.jpg),指向 /images/$1

rewrite ^/imgs/(.*\.jpg)$ /images/$1 break;

}

# 真实图片路径(客户端不可见)

location /images {

# 无需额外配置,直接读取 root 下的 /images 目录

}

}
4.2.2 域名跳转(旧域名指向新域名)

场景 :访问旧域名 www.cy.com 时,自动跳转至新域名 www.chenyu.com,并保留路径参数(如 www.cy.com/test 跳转至 www.chenyu.com/test)。

配置示例

复制代码
server {

listen 80;

server_name www.cy.com; # 旧域名

location / {

# $host 为当前请求域名,$1 捕获 / 后的所有路径

rewrite ^/(.*)$ https://www.chenyu.com/$1 permanent;

}

}

server {

listen 80;

server_name www.chenyu.com; # 新域名

root /var/www/chenyu;

index index.html;

}
4.2.3 多规则链式跳转

场景:访问 /imgs/linux.jpg 时,先跳转至 /images/linux.jpg,再跳转至百度图片。

配置示例(使用 last 标记):

复制代码
server {

listen 80;

server_name localhost;

root /usr/local/nginx/html;

location /imgs {

rewrite ^/imgs/(.*\.jpg)$ /images/$1 last; # last 继续匹配后续规则

}

location /images {

rewrite ^/images/(.*\.jpg)$ http://image.baidu.com break; # break 终止

}

}

五、If 判断配置

If 用于根据条件执行不同逻辑,支持变量比较、正则匹配、文件 / 目录判断等,仅支持单条件(无 else),可在 server 或 location 段中配置。

5.1 常见条件表达式

|-------|--------------------------------------|--------------------------|
| 条件类型 | 语法示例 | 说明 |
| 变量比较 | if (remote_addr = "192.168.100.20") | 客户端 IP 等于指定值 | | 正则匹配 | if (http_user_agent ~ Chrome) | 客户端浏览器包含 Chrome(区分大小写) |
| 非正则匹配 | if (http_user_agent \~\* Firefox) | 客户端浏览器包含 Firefox(不区分大小写) | | 文件判断 | if (-f request_filename) | 请求路径是否为文件 |
| 目录判断 | if (-d request_filename) | 请求路径是否为目录 | | 文件存在 | if (!-e request_filename) | 请求路径是否不存在(! 表示否定) |

5.2 应用场景:基于 IP 的维护页跳转

场景 :网站维护时,仅允许公司 IP(192.168.100.20)访问正常页面,其他 IP 跳转至维护页 /weihu.html。

配置示例

复制代码
server {

listen 80;

server_name www.cy.com;

root /var/www/html;

# 定义变量 $rewrite,默认 true(需要跳转)

set $rewrite true;

# 公司 IP 不跳转(设置 $rewrite 为 false)

if ($remote_addr = "192.168.100.20") {

set $rewrite false;

}

# 非公司 IP 跳转至维护页

if ($rewrite = true) {

rewrite ^(.*)$ /weihu.html break;

}

# 维护页路径

location = /weihu.html {

root /var/www/html; # 维护页所在目录

index weihu.html;

}

# 正常页面路径

location / {

index index.html;

}

}

准备维护页

复制代码
echo "weihu" > /var/www/html/weihu.html

六、基于浏览器的页面分离

通过 $http_user_agent 变量识别客户端浏览器类型(如 Chrome、Firefox),跳转至对应页面目录,实现浏览器差异化展示。

6.1 配置步骤

  1. 创建浏览器专属页面目录

    cd /usr/local/nginx/html

    mkdir chrome firefox # Chrome 和 Firefox 页面目录

    echo "

    Chrome 专属页面

    " > chrome/index.html

    echo "

    Firefox 专属页面

    " > firefox/index.html

2.Nginx 配置浏览器判断

复制代码
server {

listen 80;

server_name localhost;

root /usr/local/nginx/html;

location / {

# 匹配 Firefox 浏览器(不区分大小写)

if ($http_user_agent ~* Firefox) {

rewrite ^(.*)$ /firefox/$1 break; # 跳转到 Firefox 专属目录

}

# 匹配 Chrome 浏览器(不区分大小写)

if ($http_user_agent ~* Chrome) {

rewrite ^(.*)$ /chrome/$1 break; # 跳转到 Chrome 专属目录

}

# 其他浏览器显示默认页面

index index.html index.htm;

}

# 配置 Firefox 专属页面的访问路径

location /firefox {

root /usr/local/nginx/html;

index index.html;

}

# 配置 Chrome 专属页面的访问路径

location /chrome {

root /usr/local/nginx/html;

index index.html;

}

}

6.2 验证效果

  1. 重载 Nginx 配置:nginx -s reload
  2. 使用 Chrome 浏览器访问 http://[Nginx 服务器 IP],显示 "Chrome 专属页面";
  3. 使用 Firefox 浏览器访问,显示 "Firefox 专属页面";
  4. 使用 Edge、Safari 等其他浏览器访问,显示默认 index.html 内容。

七、防盗链配置

防盗链基于 HTTP 请求头中的 Referer 字段实现,仅允许指定域名(如自身域名)引用资源,阻止其他网站 "盗用" 图片、视频等静态资源。

7.1 核心原理

  • Referer 字段 :客户端向服务器请求资源时,会在请求头中携带 Referer,告知服务器 "当前资源是从哪个页面链接过来的"(如从 www.cy.com 页面引用图片,则 Referer: http://www.cy.com)。
  • 防盗链逻辑:通过 valid_referers 定义 "合法 Referer 列表",若请求的 Referer 不在列表中,判定为 "盗链",返回 403 禁止访问。

7.2 核心语法

复制代码
location ~* \.(资源后缀1|资源后缀2)$ {

valid_referers none blocked server_names 合法域名/正则;

if ($invalid_referer) {

return 403; # 盗链时返回 403

# 或返回自定义"盗链提示图片":rewrite ^/ /error.png break;

}

}
  • valid_referers 参数说明:
    • none:允许无 Referer 的请求(如直接在浏览器输入资源 URL);
    • blocked:允许 Referer 被防火墙 / 代理隐藏的请求(无协议头的 Referer);
    • server_names:允许当前 server_name 对应的域名(即自身域名);
    • 合法域名/正则:自定义允许的域名(如 www.cy.com)或正则(如 ~\.chenyu\.com 匹配所有 chenyu.com 子域名)。
  • $invalid_referer:Nginx 内置变量,valid_referers 匹配失败时为 true,匹配成功时为 false。

7.3 应用场景:图片资源防盗链

场景 :仅允许 www.cy.comwww.chenyu.com 引用服务器的 JPG/PNG/GIF 图片,其他域名引用时返回 403。

7.3.1 步骤 1:准备测试环境
  1. 在 Nginx 网站根目录上传测试图片:

    cd /usr/local/nginx/html

    wget https://example.com/linux.jpg # 假设下载一张名为 linux.jpg 的图片

  2. 在 "盗链测试网站"(如 www.other.com)的页面中引用该图片:

    盗链测试

7.3.2 步骤 2:配置 Nginx 防盗链
复制代码
server {

listen 80;

server_name www.cy.com;

root /usr/local/nginx/html;

# 对 JPG/PNG/GIF 图片配置防盗链

location ~* \.(jpg|png|gif)$ {

# 合法 Referer 列表:无 Referer、自身域名、www.chenyu.com

valid_referers none blocked server_names www.chenyu.com;

# 盗链处理:返回 403

if ($invalid_referer) {

return 403;

}

}

location / {

index index.html;

}

}
7.3.3 步骤 3:验证防盗链效果
  1. 合法访问验证
  1. 盗链验证
    • 访问 www.other.com 的盗链页面,图片无法加载,浏览器控制台显示 "403 Forbidden";

7.4 进阶:盗链返回自定义图片

若需对盗链请求返回 "盗链提示图片"(而非直接 403),可修改配置如下:

复制代码
location ~* \.(jpg|png|gif)$ {

valid_referers none blocked www.cy.com;

if ($invalid_referer) {

# 盗链时返回 /error.png(需提前准备该图片)

rewrite ^/ /error.png break;

}

}

八、配置验证与重载命令汇总

所有配置修改后,需执行以下命令确保配置正确并生效:

  1. 检查 Nginx 配置语法:nginx -t

(输出 nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful 表示语法正确)

2.重载 Nginx 配置:nginx -s reload

(平滑重载,不中断现有连接)

3.查看 Nginx 状态:systemctl status nginx 或 ps -ef | grep nginx

九、总结

本文覆盖 Nginx 7 大核心功能,配置逻辑与应用场景总结如下:

|------------|---------------------------------|------------------------|
| 功能模块 | 核心指令 / 模块 | 典型应用场景 |
| 访问控制 | allow/deny | 限制特定 IP 访问状态页、管理后台 |
| 用户认证 | auth_basic/htpasswd | 保护敏感资源(如状态页、API 接口) |
| HTTPS | ssl_certificate/listen 443 | 网站加密传输,满足安全合规(如电商) |
| Rewrite 重写 | rewrite/Flag(last/break) | 域名跳转、路径伪装、动态 URL 静态化 |
| If 判断 | if (condition) | 基于 IP / 浏览器的差异化逻辑(维护页) |
| 浏览器分离 | http_user_agent | 为不同浏览器提供专属页面(适配需求) | | 防盗链 | valid_referers/invalid_referer | 保护静态资源(图片、视频)不被盗用 |

实际生产环境中,可根据业务需求组合使用上述功能(如 "HTTPS + 用户认证 + 访问控制" 保护后台系统),同时需注意配置语法正确性与性能优化(如避免过多 if 判断、合理使用 break/last 标记)。

复制代码
相关推荐
大柏怎么被偷了2 分钟前
【Linux】文件系统
linux·运维·数据库
laoliu19961 小时前
Odoo 18企业版源码 包含 部署教程
运维·服务器
守城小轩2 小时前
基于Chrome140的Quora账号自动化(关键词浏览)——运行脚本(三)
运维·自动化·chrome devtools·指纹浏览器·浏览器开发
未来之窗软件服务2 小时前
幽冥大陆(五十五)ASR SetThreadInformation C语言识别到自动化软件
运维·自动化·asr·东方仙盟·操作系统级别错误
开开心心就好2 小时前
免费卸载工具,可清理残留批量管理启动项
linux·运维·服务器·windows·随机森林·pdf·1024程序员节
Lbwnb丶2 小时前
检测服务器是否是虚拟化,如KVM,VM等
linux·运维·服务器
老猿讲编程2 小时前
【车载信息安全系列4】基于Linux中UIO的HSE应用实现
linux·运维·服务器
鸡吃丸子2 小时前
初识Docker
运维·前端·docker·容器
wanhengidc3 小时前
巨椰 云手机 云游戏稳定运行
运维·服务器·arm开发·游戏·云计算