使用 Nginx 反向代理 HTTP 站点并开启 HTTPS 来加密你的站点,保护交换数据的隐私与完整性

使

写在前面

本文以 Bitwarden 为例,教大家如何使用 Nginx 反向代理一个现有的 HTTP 站点并开启 HTTPS

为什么要开启 HTTPS

HTTP 采用明文传输信息,存在信息的窃听、篡改和劫持的风险。

HTTPS 利用 SSL/TLS 建立全信道,加密数据包,主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

建设性意见

  1. 推荐部署 docker 版本的 Nginx

    省去繁琐的环境搭建流程以及系统运行环境不一致造成的种种问题,对新手更友好。

  2. Nginx 容器运行在 Host 网络模式

    Docker 默认的 userland-proxy 转发方式会剥离数据包的原始地址,因此,运行在 Bridge 网络模式的容器看到的所有客户端访问记录都来自固定网关 IP,而站点的安全防护、信息统计等功能都需要真实 IP。 Nginx 运行在 Host 网络模式便可以获取到真实 IP,再通过反向代理将正确的 IP 回传给运行在 Bridge 网络模式的容器。

准备工作

  1. 安装 Docker
  2. 安装 Docker 可视化容器管理工具 – Portainer
  3. 安装 Bitwarden (反向代理其它站点略过)

Nginx 部署与反向代理

  1. 创建用于持久化存储 Nginx 数据的目录(命名规则参考)

    mkdir -p '自定义数据目录'/conf.d
    mkdir -p '自定义数据目录'/letsencrypt
  2. 下载并解压 letsencrypt,将解压出来的文件放入你刚才创建的 '自定义数据目录'/letsencrypt 目录下
    压缩文件提供 Nginx 的 SSL 标准配置和老猪我生成的适用于本地访问的个人签名证书,用于降低新手用户的入门难度。
    请注意,个人签名证书仅限内网使用且不受浏览器信任,但不影响实际的安全性。
    高级用户可以自行注册域名,然后购买或申请 Let's Encrypt 等机构签发的免费证书,并将压缩包中的证书文件替换掉。

  3. 复制并修改以下文本中我注明的部分,然后命名为 vaultwarden.conf 并保存在 '自定义数据目录/conf.d' 目录下

    upstream vaultwarden-default {
       zone vaultwarden-default 64k;
       server localhost:15007; # 15007 是部署 Bitwarden 时设置的 HTTP 访问端口,如果你更改了该端口请自行更换
       keepalive 2;
    }
    
    upstream vaultwarden-ws {
       zone vaultwarden-ws 64k;
       server localhost:3012;
       keepalive 2;
    }
    
    server {
       listen 5007 ssl http2;  # HTTPS ipv4 的访问端口,部署在数据中心的用户可以改回 443,家用宽带运营商会封 443,所以需要其它端口
       listen [::]:5007 ssl http2; # HTTPS ipv6 的访问端口,部署在数据中心的用户可以改回 443,家用宽带运营商会封 443,所以需要其它端口
       server_name localhost; # 拥有自有域名的可将 localhost 修改为域名,例如 xxxx.xxxx.com
    
       http2_idle_timeout 5m; # up from 3m default
    
       client_max_body_size 256m;
    
       if ($scheme != "https") {
           return 301 https://$host$request_uri;
       }
    
       location / {
           proxy_http_version 1.1;
           proxy_set_header "Connection" "";
    
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
    
           proxy_pass http://vaultwarden-default;
       }
    
       location /notifications/hub/negotiate {
           proxy_http_version 1.1;
           proxy_set_header "Connection" "";
    
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
    
           proxy_pass http://vaultwarden-default;
       }
    
       location /notifications/hub {
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
    
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header Forwarded $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
    
           proxy_pass http://vaultwarden-ws;
       }
    
       ssl_certificate /etc/letsencrypt/default/fullchain.pem; # 拥有自有域名的请配置为自己的证书路径
       ssl_certificate_key /etc/letsencrypt/default/privkey.pem; # 拥有自有域名的请配置为自己的证书路径
       include /etc/letsencrypt/options-ssl-nginx.conf;
       ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    
       # Add HSTS header with preload. This is the line that does it.
       add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
    }

    如果你反向代理的是其它站点,详见:使用 Nginx 反向代理 HTTP 站点并开启 HTTPS 的基础配置参考

  4. 点击 portainer 控制面板左侧 Stacks ,在该页面中点击 Add stack

    img

  5. Stack 命名,根据需要修改下文中提供的模板并粘贴到页面上,然后点击页面底部 Deploy the stack 完成创建

    version: '3'
    services:
     nginx:
       container_name: nginx
       image: nginx:latest                               # latest 安装最新的版本
       restart: always                                   # 设置重启策略
       volumes:
         - "'自定义数据目录'/conf.d:/etc/nginx/conf.d"
         - "'自定义数据目录'/letsencrypt:/etc/letsencrypt"
       network_mode: host                                # 以 Host 网络模式运行
       environment:
         TZ: Asia/Shanghai                               # 容器内部时区

登录

现在反向代理已配置完成,您可以通过打开 Web 浏览器并转到以下位置登录到您反向代理的站点:

https://localhost:5007
  • 如果您不是在本机安装,请不要忘记将 localhost 替换为安装设备的实际 IP 地址
  • 如果您修改了默认的 HTTP 访问端口,请不要忘记将 5007 替换为您自定义的端口
0 0 投票数
文章评分
订阅评论
提醒
0 评论
内联反馈
查看所有评论
By 马丁龙猪

标签

归档

其他操作