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 验证效果
- 检查配置文件语法:nginx -t
- 重载 Nginx 配置:nginx -s reload
- 浏览器访问 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。
-
生成 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)
-
生成 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 证书
-
将 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
-
将签名后的证书和 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 访问
-
客户端浏览器访问 https://www.mycompany.com(自签证书需手动信任)。
-
命令行验证(跳过证书校验):
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 配置步骤
-
创建浏览器专属页面目录:
cd /usr/local/nginx/html
mkdir chrome firefox # Chrome 和 Firefox 页面目录
echo "
Chrome 专属页面
" > chrome/index.htmlecho "
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 验证效果
- 重载 Nginx 配置:nginx -s reload
- 使用 Chrome 浏览器访问 http://[Nginx 服务器 IP],显示 "Chrome 专属页面";
- 使用 Firefox 浏览器访问,显示 "Firefox 专属页面";
- 使用 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.com 和 www.chenyu.com 引用服务器的 JPG/PNG/GIF 图片,其他域名引用时返回 403。
7.3.1 步骤 1:准备测试环境
-
在 Nginx 网站根目录上传测试图片:
cd /usr/local/nginx/html
wget https://example.com/linux.jpg # 假设下载一张名为 linux.jpg 的图片
-
在 "盗链测试网站"(如 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:验证防盗链效果
- 合法访问验证:
-
- 在 www.cy.com 页面中引用 linux.jpg(Referer: http://www.cy.com),图片正常显示;
-
- 直接在浏览器输入 http://www.cy.com/linux.jpg(无 Referer),图片正常显示。
- 盗链验证:
-
- 访问 www.other.com 的盗链页面,图片无法加载,浏览器控制台显示 "403 Forbidden";
-
-
使用 curl 模拟盗链请求(指定非法 Referer):
curl --referer http://www.other.com -I http://www.cy.com/linux.jpg
返回结果包含"HTTP/1.1 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;
}
}
八、配置验证与重载命令汇总
所有配置修改后,需执行以下命令确保配置正确并生效:
- 检查 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 标记)。