Nginx 配置 SSL/TLS 详解与实战

Nginx 配置 SSL/TLS 详解与实战

在现代Web开发中,使用SSL/TLS加密协议来保护用户数据已成为一项基本要求。Nginx,作为一款高性能的HTTP和反向代理服务器,支持SSL/TLS加密,使得配置HTTPS服务变得简单而高效。本文将详细介绍如何通过Nginx配置文件来实现HTTPS服务,包括SSL证书的配置、HTTP到HTTPS的重定向以及针对API和静态资源的路由处理。

1. Nginx SSL/TLS 配置基础

要配置Nginx以支持SSL/TLS,你首先需要准备SSL证书和密钥文件。这些文件通常由证书颁发机构(CA)签发,但也可以使用自签名证书进行测试。在Nginx配置文件中,SSL证书和密钥通过ssl_certificatessl_certificate_key指令指定。

2. HTTP到HTTPS的重定向

为了确保所有访问都通过HTTPS进行,你需要在Nginx中配置一个监听HTTP端口(如80或8072)的server块,用于将所有HTTP请求重定向到HTTPS。以下是一个简单的重定向配置示例:

nginx 复制代码
server {
    # 监听端口 8072
    listen       8072;
    # 服务器名称匹配任何主机名
    server_name  _;
    # 重定向所有 HTTP 请求到 HTTPS 协议
    return 301 https://$host$request_uri;
}

这段配置监听8072端口,对所有请求执行301永久重定向到HTTPS版本。

3. HTTPS server 块配置

接下来,我们配置一个用于处理HTTPS请求的server块。在这个块中,我们将指定SSL证书、密钥、SSL会话参数、支持的SSL/TLS版本和加密套件等。

nginx 复制代码
server {
    # 监听端口 443 并启用 SSL/TLS
    listen       443 ssl;
    # 服务器名称匹配任何主机名
    server_name  _;
    # 设置服务器根目录
    root  /usr/share/nginx/html;
    # SSL 证书文件路径
    ssl_certificate /etc/nginx/ssl/server1.crt;
    # SSL 证书密钥文件路径
    ssl_certificate_key /etc/nginx/ssl/server1.key;
    # 设置 SSL 会话超时时间
    ssl_session_timeout 5m;
    # 允许的 SSL/TLS 版本
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # 允许的加密套件
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    # 优先使用服务器提供的加密套件
    ssl_prefer_server_ciphers on;

    # 其他配置...
}

在这个配置中,我们监听443端口并启用了SSL。通过ssl_certificatessl_certificate_key指定了证书和密钥文件的路径。我们还设置了SSL会话超时时间、支持的协议版本和加密套件。

4. API 代理与静态资源服务

在HTTPS server 块中,你可以根据需要定义多个location块来处理不同类型的请求。例如,你可能想要将所有/api路径的请求代理到后端服务,而将其他请求作为静态资源服务。

nginx 复制代码
# 定义 API 路径的代理规则
location /api {
    # 将请求代理到本地的 8196 端口
    proxy_pass http://127.0.0.1:8196/;
    # 使用 HTTP/1.1 版本
    proxy_http_version 1.1;
    # 设置代理请求头 Host 字段
    proxy_set_header Host $host;
    # 设置代理请求头 X-Real-IP 字段
    proxy_set_header X-Real-IP $remote_addr;
    # 设置代理请求头 X-Forwarded-For 字段
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # 其他代理配置...
}
# 定义其他静态资源的路由规则
location / {
    # 设置静态资源根目录
    root /var/www/bigdata/frontend/zb-admin-new;
    # 尝试找到请求的文件或目录,如果没有则返回 index.html
    try_files $uri $uri/ /index.html;
    # 设置默认索引文件
    index index.html index.htm;
}

/apilocation块中,我们配置了反向代理,将所有请求转发到本地8196端口。在/location块中,我们设置了静态资源的根目录,并配置了try_files指令来尝试按请求的路径提供服务,如果找不到文件则回退到index.html

5. 错误页面处理

最后,Nginx允许你自定义错误页面,以提升用户体验。你可以通过error_page指令和相应的location块来实现这一点。

nginx 复制代码
# 自定义 404 错误页面
error_page 404 /404.html;
# 处理 404 错误页面的具体规则
location = /404.html {
    # 错误页面配置...
}
# 自定义 500, 502, 503, 504 错误页面
error_page 500 502 503 504 /50x.html;
# 处理 500, 502, 503, 504 错误页面的具体规则
location = /50x.html {
    # 错误页面配置...
}
相关推荐
疯狂动物城在逃flash4 分钟前
数据库入门:SQL学习路线图与实战技巧
前端
亦舒.7 分钟前
宝塔面板Nginx手动配置负载均衡实战指南
运维·nginx·负载均衡
前端小巷子10 分钟前
跨域问题解决方案:开发代理
前端·javascript·面试
前端_逍遥生10 分钟前
Chrome 插件开发到发布完整指南:从零开始打造 TTS 朗读助手
前端·chrome
Mintopia10 分钟前
Three.js 材质与灯光:一场像素级的光影华尔兹
前端·javascript·three.js
天涯学馆12 分钟前
JavaScript 跨域、事件循环、性能优化面试题解析教程
前端·javascript·面试
掘金一周20 分钟前
别再用 100vh 了!移动端视口高度的终极解决方案| 掘金一周7.3
前端·后端
晴殇i22 分钟前
CSS 迎来重大升级:Chrome 137 支持 if () 条件函数,样式逻辑从此更灵活
前端·css·面试
咚咚咚ddd24 分钟前
cursor mcp实践:网站落地页性能检测报告(browser-tools)
前端
MiyueFE25 分钟前
让我害怕的 TypeScript 类型 — — 直到我学会了这 3 条规则
前端·typescript