Nginx 配置指南:HTTPS 自签名、Location、Rewrite 与状态统计
目录
一、HTTPS 自签名证书配置
1.1 SSL/TLS 基础认知
1.2 HTTPS 工作流程(必背)
1.3 自签名证书生成(OpenSSL 工具)
步骤 1:安装 OpenSSL(默认已装,若未装则执行)
步骤 2:创建证书存储目录
步骤 3:生成私钥文件(含公钥)
步骤 4:生成证书请求文件(CSR)
步骤 5:生成自签名证书(CRT)
1.4 Nginx 配置 HTTPS
配置验证与重启
1.5 HTTPS 测试
二、Location 配置:请求路径匹配
2.1 Location 语法
2.2 匹配规则与优先级
2.3 关键注意点
2.4 配置案例
2.5 return 指令:直接返回响应
三、Rewrite 配置:URL 重写
3.1 Rewrite 语法
3.2 配置案例(多轮重写)
3.3 if 指令:条件判断
常用条件(condition)
if 指令案例
3.4 autoindex:目录列表展示
四、Nginx 常用变量
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 工作流程(必背)
- 客户端(浏览器)发起 HTTPS 请求(如
https://www.jx.com
); - 服务器返回自身的 CA 证书(包含公钥);
- 浏览器验证证书合法性(自签名证书需手动信任);
- 验证通过后,浏览器生成随机数,用证书中的公钥加密;
- 客户端将加密后的随机数发送给服务器;
- 服务器用自身私钥解密,获取随机数;
- 双方基于该随机数,使用对称加密算法(效率高)传输后续数据;
- 浏览器用随机数解密服务器数据,完成通信。
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 端口,启用 SSLserver_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)。
- URL(统一资源定位符):如
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/test 、www.jx.com/test123 等 |
2.3 关键注意点
-
路径末尾的
/
影响:location /test
:优先匹配/test
目录,若目录不存在则匹配/test
文件;location /test/
:仅匹配/test/
目录(路径必须以/
结尾)。
-
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.htmllocation = /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.htmlindex 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,常用于新老域名更替、路径简化、业务拆分等场景,可写在 server
、location
、if
块中。
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.jpglocation /images {rewrite /images/(.*) /pics/$1 last; # last:发起新请求,重新匹配}# 2. 第二次重写:/pics/xxx.jpg → /photos/xxx.jpglocation /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 指令案例
- 根据浏览器类型跳转:
location / {# Chrome 浏览器 → /Chrome/xxxif ($http_user_agent ~ Chrome) {rewrite /(.*) /Chrome/$1 break;}# Firefox 浏览器 → /Firefox/xxxif ($http_user_agent ~ Firefox) {rewrite /(.*) /Firefox/$1 break;}
}
- 资源不存在时返回 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. |