Nginx 配置指南:HTTPS 自签名、Location、Rewrite 与状态统计

目录

[一、HTTPS 自签名证书配置](#一、HTTPS 自签名证书配置)

[1.1 SSL/TLS 基础认知](#1.1 SSL/TLS 基础认知)

[1.2 HTTPS 工作流程(必背)](#1.2 HTTPS 工作流程(必背))

[1.3 自签名证书生成(OpenSSL 工具)](#1.3 自签名证书生成(OpenSSL 工具))

[步骤 1:安装 OpenSSL(默认已装,若未装则执行)](#步骤 1:安装 OpenSSL(默认已装,若未装则执行))

[步骤 2:创建证书存储目录](#步骤 2:创建证书存储目录)

[步骤 3:生成私钥文件(含公钥)](#步骤 3:生成私钥文件(含公钥))

[步骤 4:生成证书请求文件(CSR)](#步骤 4:生成证书请求文件(CSR))

[步骤 5:生成自签名证书(CRT)](#步骤 5:生成自签名证书(CRT))

[1.4 Nginx 配置 HTTPS](#1.4 Nginx 配置 HTTPS)

配置验证与重启

[1.5 HTTPS 测试](#1.5 HTTPS 测试)

[二、Location 配置:请求路径匹配](#二、Location 配置:请求路径匹配)

[2.1 Location 语法](#2.1 Location 语法)

[2.2 匹配规则与优先级](#2.2 匹配规则与优先级)

[2.3 关键注意点](#2.3 关键注意点)

[2.4 配置案例](#2.4 配置案例)

[2.5 return 指令:直接返回响应](#2.5 return 指令:直接返回响应)

[三、Rewrite 配置:URL 重写](#三、Rewrite 配置:URL 重写)

[3.1 Rewrite 语法](#3.1 Rewrite 语法)

[3.2 配置案例(多轮重写)](#3.2 配置案例(多轮重写))

[3.3 if 指令:条件判断](#3.3 if 指令:条件判断)

常用条件(condition)

[if 指令案例](#if 指令案例)

[3.4 autoindex:目录列表展示](#3.4 autoindex:目录列表展示)

[四、Nginx 常用变量](#四、Nginx 常用变量)

[4.1 核心变量表](#4.1 核心变量表)


一、HTTPS 自签名证书配置

HTTPS 基于 SSL/TLS 协议实现数据加密传输,自签名证书适合内网测试或非公网场景(公网需使用 CA 机构颁发的证书)。

1.1 SSL/TLS 基础认知

  • SSL(Secure Sockets Layer) :网景公司 1990 年开发,用于保障 WWW 通讯安全,核心提供 私密性(数据加密)、完整性(防篡改)、身份认证,后续迭代至 SSLv3。
  • TLS(Transport Layer Security):IETF 1999 年颁布,基于 SSLv3 优化扩展,是当前主流标准(如 TLSv1.2、TLSv1.3)。
  • 协议位置:位于 TCP/IP 协议与应用层协议(如 HTTP)之间,不依赖平台和应用,通用性强。

1.2 HTTPS 工作流程(必背)

  1. 客户端(浏览器)发起 HTTPS 请求(如 https://www.jx.com);
  2. 服务器返回自身的 CA 证书(包含公钥);
  3. 浏览器验证证书合法性(自签名证书需手动信任);
  4. 验证通过后,浏览器生成随机数,用证书中的公钥加密;
  5. 客户端将加密后的随机数发送给服务器;
  6. 服务器用自身私钥解密,获取随机数;
  7. 双方基于该随机数,使用对称加密算法(效率高)传输后续数据;
  8. 浏览器用随机数解密服务器数据,完成通信。

1.3 自签名证书生成(OpenSSL 工具)

OpenSSL 是开源加密工具包,可生成私钥、证书请求文件(CSR)及自签名证书,步骤如下:

步骤 1:安装 OpenSSL(默认已装,若未装则执行)
复制代码
# CentOS/RHEL 系统
yum install -y openssl
# Ubuntu/Debian 系统
apt install -y openssl
步骤 2:创建证书存储目录
复制代码
# 统一存储路径,便于 Nginx 引用
mkdir -p /usr/share/nginx/pki/private
步骤 3:生成私钥文件(含公钥)
复制代码
cd /usr/share/nginx/pki/private
# 生成 2048 位 RSA 私钥(1024 位已不安全,建议 2048/4096 位)
openssl genrsa -out nginx.key 2048

# 查看私钥详情(可选)
openssl rsa -in nginx.key -text
步骤 4:生成证书请求文件(CSR)

CSR 包含服务器身份信息,用于向 CA 机构申请证书(自签名时仅作中间文件):

复制代码
cd /usr/share/nginx/pki
openssl req -new -key ./private/nginx.key -out nginx.csr

执行后需填写身份信息(按实际情况填写,Common Name 需与域名一致):

复制代码
Country Name (2 letter code) [XX]:CN  # 国家代码,中国填 CN
State or Province Name (full name) []:BJ  # 省份
Locality Name (eg, city) [Default City]:BJ  # 城市
Organization Name (eg, company) [Default Company Ltd]:jx  # 机构/公司名
Organizational Unit Name (eg, section) []:2310  # 部门
Common Name (eg, your name or your server's hostname) []:www.jx.com  # 核心!域名/服务器 hostname
Email Address []:2310@jx.com  # 邮箱
A challenge password []:  # 密码(可选,直接回车跳过)
An optional company name []:jx  # 可选公司名
步骤 5:生成自签名证书(CRT)

用私钥签名 CSR,生成有效期内的证书:

复制代码
# 有效期 3650 天(约 10 年,可按需调整)
openssl x509 -req -days 3650 -in nginx.csr -signkey ./private/nginx.key -out nginx.crt

# 查看证书详情(可选)
openssl x509 -in nginx.crt -text

1.4 Nginx 配置 HTTPS

修改 Nginx 配置文件(通常位于 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf),添加 443 端口(HTTPS 默认端口)的 server 块:

复制代码
server {
    listen       443 ssl;  # 监听 443 端口,启用 SSL
    server_name  www.jx.com;  # 与证书的 Common Name 一致

    # 引用证书和私钥(路径需与实际生成路径匹配)
    ssl_certificate      /usr/share/nginx/pki/nginx.crt;
    ssl_certificate_key  /usr/share/nginx/pki/private/nginx.key;

    # SSL 会话缓存(提升性能)
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;  # 会话超时时间

    # 加密套件(优先选择高安全性套件,排除弱加密)
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;  # 优先使用服务器端的加密套件

    # 业务逻辑(按需调整)
    location / {
        root   html;  # 网站根目录
        index  index.html index.htm;  # 默认首页
    }
}
配置验证与重启
复制代码
# 验证配置文件语法是否正确
nginx -t
# 重启 Nginx 使配置生效
systemctl restart nginx

1.5 HTTPS 测试

由于是自签名证书,浏览器会提示 "不安全"(手动信任即可),也可通过 curl 跳过证书验证测试:

复制代码
# -k 选项:跳过证书合法性校验
curl -k https://192.168.115.111  # 替换为你的服务器 IP/域名

二、Location 配置:请求路径匹配

Location 用于定义 Nginx 如何处理不同路径的请求,核心是匹配规则优先级 ,写在 server 块内部。

2.1 Location 语法

复制代码
location [ = | ~ | ~* | ^~ ] uri {
    # 匹配后的处理逻辑(如 root、index、rewrite 等)
}
  • URL 与 URI 区别
    • URL(统一资源定位符):如 http://www.jx.com/s?id=1(含协议、域名、参数);
    • URI(统一资源标识符):如 /s(仅路径,Location 匹配的是 URI)。

2.2 匹配规则与优先级

优先级从高到低排序:

符号 规则说明 示例
= 精确匹配(URI 必须完全一致) location = /info.html 仅匹配 www.jx.com/info.html
^~ 前缀匹配(匹配到后停止后续搜索) location ^~ /bbs/ 匹配 www.jx.com/bbs/ 及子路径
~ 正则匹配(区分大小写) `location ~ .(jpg png)$` 仅匹配小写后缀的图片
~* 正则匹配(不区分大小写) `location ~* .(jpg PNG)$` 匹配任意大小写后缀的图片
无符号 普通前缀匹配(按最长匹配原则,最后生效) location /test 匹配 www.jx.com/testwww.jx.com/test123

2.3 关键注意点

  1. 路径末尾的 / 影响

    • location /test:优先匹配 /test 目录,若目录不存在则匹配 /test 文件;
    • location /test/:仅匹配 /test/ 目录(路径必须以 / 结尾)。
  2. root 与 alias 区别(路径映射):

    • root /usr/share/nginx/html:请求 /test/1.jpg 会映射到 /usr/share/nginx/html/test/1.jpg
    • alias /usr/share/nginx/images:请求 /test/1.jpg 会直接映射到 /usr/share/nginx/images/1.jpg(忽略 test 路径)。

2.4 配置案例

复制代码
server {
    listen  80;
    server_name  www.jx.com;

    # 1. 精确匹配:仅处理 /info.html
    location = /info.html {
        root  /usr/share/nginx/html;  # 文件路径:/usr/share/nginx/html/info.html
    }

    # 2. 正则匹配(区分大小写):处理图片请求
    location ~ \.(jpeg|jpg|png|svg)$ {
        root /usr/share/nginx/html/images;  # 请求 /1.jpg → /usr/share/nginx/html/images/1.jpg
    }

    # 3. 前缀匹配(匹配后停止):处理 /bbs/ 路径
    location ^~ /bbs/ {
        root  /usr/share/nginx/html;  # 请求 /bbs/index.html → /usr/share/nginx/html/bbs/index.html
        index index.html index.htm;  # 默认首页
    }

    # 4. 普通匹配:处理其他所有路径
    location / {
        root   html;
        index  index.html index.htm;
    }
}

2.5 return 指令:直接返回响应

return 用于停止请求处理,直接返回状态码或重定向,后续指令不再执行,语法:

复制代码
return code [text];          # 返回状态码 + 文本(如 404 "Page Not Found")
return code URL;             # 返回状态码 + 重定向(如 302 https://www.baidu.com)
return URL;                  # 默认 302 重定向(如 return https://www.baidu.com)

示例:

复制代码
# 1. 直接返回 404
location /old {
    return 404 "This page is deprecated";
}

# 2. 临时重定向(302)
location /temp {
    return 302 https://www.jx.com/new;
}

# 3. 永久重定向(301,搜索引擎会更新索引)
location /old-site {
    return 301 https://www.jx.com/new-site;
}

三、Rewrite 配置:URL 重写

Rewrite 基于正则表达式修改请求的 URI,常用于新老域名更替、路径简化、业务拆分 等场景,可写在 serverlocationif 块中。

3.1 Rewrite 语法

复制代码
rewrite 正则表达式 目标URI [flag];
  • 正则表达式 :匹配当前请求的 URI(如 /images/(.*\.jpg)$ 匹配 /images/xxx.jpg);
  • 目标 URI :重写后的路径(如 /pic/$1$1 是正则中括号 (.*\.jpg) 的捕获值,即 xxx.jpg);
  • flag:重写后的行为(可选,常用值如下):
flag 作用说明
last 重写后发起新请求,重新匹配所有 location(常用于多轮重写)
break 重写后停止,不匹配后续 location(常用于单次重写)
redirect 返回 302 临时重定向(地址栏会变化)
permanent 返回 301 永久重定向(地址栏会变化,搜索引擎更新索引)

3.2 配置案例(多轮重写)

需求:访问 /images/1.jpg → 重写为 /pics/1.jpg → 再重写为 /photos/1.jpg,最终从 /photos 目录获取文件。

复制代码
server {
    listen 80;
    server_name www.jx.com;
    root /usr/share/nginx/html;  # 根目录

    # 1. 第一次重写:/images/xxx.jpg → /pics/xxx.jpg
    location /images {
        rewrite /images/(.*) /pics/$1 last;  # last:发起新请求,重新匹配
    }

    # 2. 第二次重写:/pics/xxx.jpg → /photos/xxx.jpg
    location /pics {
        rewrite /pics/(.*) /photos/$1 last;
    }

    # 3. 最终处理:从 /photos 目录获取文件
    location /photos {
        # 无额外逻辑,直接使用 root 路径:/usr/share/nginx/html/photos/xxx.jpg
    }

    # 4. 重定向案例:访问 /search 跳转到百度
    location /search {
        rewrite ^/(.*) https://www.baidu.com redirect;  # 302 临时重定向
    }
}

注意:生产环境避免使用 .*(匹配任意字符),可能导致过度匹配,建议精确正则(如 ^/images/)。

3.3 if 指令:条件判断

if 用于根据条件执行 Rewrite 或其他逻辑,语法:

复制代码
if (condition) {
    # 条件满足时的操作(如 rewrite、return)
}
常用条件(condition)
条件格式 说明 示例
$variable 变量为空或以 0 开头 → false,否则 true if ($arg_pid) { ... }(若 URL 有 pid 参数则执行)
$var = value / $var != value 变量等于 / 不等于指定值 if ($uri = "/images/") { ... }
~ / !~ 正则匹配 / 不匹配(区分大小写) if ($http_user_agent ~ Chrome) { ... }(Chrome 浏览器)
~* / !~* 正则匹配 / 不匹配(不区分大小写) if ($http_user_agent ~* firefox) { ... }(Firefox 浏览器)
-f / !-f 文件存在 / 不存在 if (!-f $request_filename) { ... }(文件不存在时)
-d / !-d 目录存在 / 不存在 if (-d $request_filename) { ... }(目录存在时)
-e / !-e 文件 / 目录 / 符号链接存在 / 不存在 if (!-e $request_filename) { ... }(资源不存在时)
if 指令案例
  1. 根据浏览器类型跳转

    location / {
    # Chrome 浏览器 → /Chrome/xxx
    if (http_user_agent ~ Chrome) { rewrite /(.*) /Chrome/1 break;
    }
    # Firefox 浏览器 → /Firefox/xxx
    if (http_user_agent ~ Firefox) { rewrite /(.*) /Firefox/1 break;
    }
    }

  2. 资源不存在时返回 404

    location / {
    if (!-e $request_filename) {
    return 404 "Resource not found";
    }
    }

3.4 autoindex:目录列表展示

autoindex 用于当请求以 / 结尾且无默认首页时,展示目录下的文件列表,适合静态资源下载站(生产环境混合业务站点禁用,避免暴露目录结构)。

配置示例:

复制代码
server {
    listen 80;
    server_name www.jx.com;

    location /download/ {
        root /usr/share/nginx/html;  # 目录路径:/usr/share/nginx/html/download/
        autoindex on;  # 开启目录列表(off 关闭)
        autoindex_exact_size off;  # 显示 KB/MB/GB(on 显示字节数)
        autoindex_format html;  # 以 HTML 格式展示(可选 json/xml)
        autoindex_localtime on;  # 显示服务器本地时间(off 显示 GMT 时间)
    }
}

访问 http://www.jx.com/download/ 即可看到目录下的所有文件。

四、Nginx 常用变量

Nginx 内置变量可用于获取请求信息(如客户端 IP、请求方法、协议等),常用于 if 判断、return 响应或日志配置。

4.1 核心变量表

变量名 含义 示例值
$remote_addr 客户端 IP 地址 192.168.
相关推荐
游戏开发爱好者82 小时前
App HTTPS 抓包实战,原理、常见问题与可行工具路线(开发 测试 安全 角度)
网络协议·安全·ios·小程序·https·uni-app·iphone
1024小神2 小时前
vue前端项目使用摄像头扫码时需要访问https服务接口,访问自建证书出现接口报错,可能在你的电脑上安装证书
网络协议·http·https
2501_915106322 小时前
App HTTPS 抓包实战指南,原理、常见阻碍、逐步排查与工具组合
网络协议·http·ios·小程序·https·uni-app·iphone
StevenLdh2 小时前
Docker容器化部署简要指南
运维·docker·容器
東雪蓮☆2 小时前
ELK 企业级日志分析系统实战教程
linux·运维·elk
RoboWizard3 小时前
传输无界 金士顿双接口U盘上新抽电脑
运维·人工智能·缓存·电脑·金士顿
Teamhelper_AR3 小时前
AR技术:轨道交通运维与安全保障的革新力量
运维·安全·ar
小卓笔记3 小时前
第1章 Web服务-nginx
前端·网络·nginx
jnpher3 小时前
通过你的自有服务器代理网址
运维·服务器