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 标记)。

复制代码
相关推荐
linweidong2 小时前
云服务器磁盘空间管理:binlog导致磁盘快速增长的应对策略与自动化实践
运维·服务器·自动化·binlog·容器化·磁盘管理·运维面经
代码79722 小时前
【无标题】使用 Playwright 实现跨 Chromium、Firefox、WebKit 浏览器自动化操作
运维·前端·深度学习·华为·自动化
COWORKSHOP2 小时前
华为芯片泄密案警示:用Curtain e-locker阻断内部数据泄露
运维·服务器·前端·数据库·安全·华为
namekong82 小时前
在 Ubuntu 上可以用几个常用命令查看系统运行情况(内存、CPU、硬盘占用等
linux·运维·服务器
wheeldown3 小时前
【Linux】Linux下的静态链接的底层逻辑
linux·运维·服务器
gsfl3 小时前
环境搭建,Ubuntu 安装、客户端使用与性能认知
linux·运维·ubuntu
liu****3 小时前
负载均衡式的在线OJ项目编写(五)
运维·c++·负载均衡·个人开发
saber_andlibert4 小时前
【Linux】深入理解Linux的进程(一)
linux·运维·服务器·开发语言·c++
虚伪的空想家5 小时前
K8S部署的ELK分片问题解决,报错:unexpected error while indexing monitoring document
运维·elk·云原生·容器·kubernetes·报错·eck