文章目录
写在前面
本文以 Bitwarden 为例,教大家如何使用 Nginx
反向代理一个现有的 HTTP
站点并开启 HTTPS
为什么要开启 HTTPS
HTTP
采用明文传输信息,存在信息的窃听、篡改和劫持的风险。
HTTPS
利用 SSL/TLS
建立全信道,加密数据包,主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。
建设性意见
-
推荐部署
docker
版本的Nginx
省去繁琐的环境搭建流程以及系统运行环境不一致造成的种种问题,对新手更友好。
-
Nginx
容器运行在Host
网络模式Docker 默认的
userland-proxy
转发方式会剥离数据包的原始地址,因此,运行在Bridge
网络模式的容器看到的所有客户端访问记录都来自固定网关 IP,而站点的安全防护、信息统计等功能都需要真实 IP。 Nginx 运行在 Host 网络模式便可以获取到真实 IP,再通过反向代理将正确的 IP 回传给运行在Bridge
网络模式的容器。
准备工作
- 安装 Docker
- 安装 Docker 可视化容器管理工具 – Portainer
- 安装 Bitwarden (反向代理其它站点略过)
Nginx 部署与反向代理
-
创建用于持久化存储 Nginx 数据的目录(命名规则参考)
mkdir -p '自定义数据目录'/conf.d mkdir -p '自定义数据目录'/letsencrypt
-
下载并解压 letsencrypt,将解压出来的文件放入你刚才创建的
'自定义数据目录'/letsencrypt
目录下
压缩文件提供 Nginx 的 SSL 标准配置和老猪我生成的适用于本地访问的个人签名证书,用于降低新手用户的入门难度。
请注意,个人签名证书仅限内网使用且不受浏览器信任,但不影响实际的安全性。
高级用户可以自行注册域名,然后购买或申请Let's Encrypt
等机构签发的免费证书,并将压缩包中的证书文件替换掉。 -
复制并修改以下文本中我注明的部分,然后命名为
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 的基础配置参考
-
点击 portainer 控制面板左侧
Stacks
,在该页面中点击Add stack
-
为
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
替换为您自定义的端口