Typecho 通过 HAProxy、Nginx 多层反向代理实现 HTTPS
说明
由于 Docker 镜像 joyqi/typecho:nightly-php7.4-apache 中的端口只开放了 80 端口,最开始以为还需要在容器启动时配置 443 端口的映射,但是并没有在作者的文档中看到对应 443 和 SSL 直接有关的说明,这令我感到奇怪。
然后我注意到作者文档中指定访问链接使用的是 https
:
TYPECHO_SITE_URL=https://your-domain.com
这说明镜像默认的 80 端口是支持 HTTPS 访问,至于通过什么方式另说。于是我去翻阅 Github 上项目的 issues ,发现了有关问题作者的回复: https://github.com/typecho/Dockerfile/issues/14 。
测试根据该 issues 说法,可以通过反向代理的方法实现服务全域正常加载资源。
运行容器
在 UNRAID 中,可以通过“容器模板”创建运行容器。
项目 | 值 | 说明 |
---|---|---|
名称 | typecho-server-unraid | |
存储库 | joyqi/typecho:nightly-php7.4-apache | |
网络类型 | Bridge | |
控制台 shell 命令 | Shell | |
特权 | 开 | |
WEB UI | [PORT] | |
TYPECHO_SITE_URL | https://[DOMAIN]:[PORT] | 最终地址 |
TYPECHO_USER_NAME | 自定义 | 用户名 |
TYPECHO_USER_PASSWORD | 自定义 | 用户密码 |
TYPECHO_USER_MAIL | 自定义 | 用户邮箱 |
TIMEZONE | Asia/Shanghai | |
MEMORY_LIMIT | 200M | |
MAX_POST_BODY | 50M | |
/app | [PATH]/app |
更改容器配置
支持 HTTPS
-
由于选择的
nightly-php7.4-apache
镜像中没有预装文本编辑器,所以选择从容器内映射的/app
文件中修改config.inc.php
。root@Tower:~# cd /mnt/user/appdata/typecho/app/ root@Tower:/mnt/user/appdata/typecho/app# nano config.inc.php
-
将
define('__TYPECHO_SECURE__', true);
添加到其余define
语句后面,init
初始化之前:...... // admin directory (relative path) define('__TYPECHO_ADMIN_DIR__', '/admin/'); // ssl define('__TYPECHO_SECURE__', true); // register autoload require_once __TYPECHO_ROOT_DIR__ . '/var/Typecho/Common.php'; ...... \Typecho\Common::init(); ......
-
保存退出,重启容器。
修改 Typecho Web 设置
在登录 Typecho 进入后台后,在 设置 -> 基本设置
中,将 站点地址
修改为反向代理的 HTTPS 的地址: https://[DOMAIN]:[PORT]
。
注意:这里反向代理的地址必须是最终(或多次)反向代理的地址,否则网页样式和图片可能无法加载。
HAProxy 反向代理
本文未涉及部分,可参阅: OPNsense 防火墙系列五:HAProxy IPv6 反向代理、IPv6 代理 IPv4 - Yogile - 博客园 (cnblogs.com) 。
源服务 HTTP
在 服务 -> HAProxy -> 设置
中,选择 真实服务器
的下拉栏中 真实服务器
,添加:
项目 | 子项目 | 值 | 说明 |
---|---|---|---|
编辑服务器 | |||
启用 | 勾选 | ||
名称或前缀 | 自定义 | 填写服务器提供的服务名称 | |
类型 | 静态 |
||
静态服务器 | |||
FQDN或IP | 自定义 | 建议填写内网服务器 IPv4 | |
通用选项 | |||
端口 | 自定义 | 填写服务端口 | |
模式 | 活动 [默认] |
||
SSL | 不勾选 | 因 Typecho 非常精简,不含 SSL 服务 | |
验证SSL证书 | 不勾选 |
SSL 代理 - HTTPS 反向代理 HTTP
在 服务 -> HAProxy -> 设置
中,选择 虚拟服务
下拉栏中 公共服务
,添加:
项目 | 子项目 | 值 | 说明 |
---|---|---|---|
常规 | |||
启用 | 勾选 | ||
侦听地址 | 0.0.0.0:<端口> [::]:<端口> <OPNsense 域名>:<端口> |
示例:0.0.0.0:8080 [::]:8080 www.example.com:8080 |
|
类型 | SSL/HTTPS(TCP模式) |
||
默认后端池 | 此前添加的后端池 | ||
启用SSL卸载 | 勾选 | ||
SSL卸载 | 若勾选 启用SSL卸载 ,则出现该项目 |
||
证书 | 选择 OPNsense SSL 证书 | ||
默认证书 | 选择 OPNsense SSL 证书 | ||
启用高级设置 | 勾选 | ||
高级SSL设置 | |||
最低SSL版本 | TLSv1.2 |
||
启用HSTS | 不勾选 | ||
HSTS max-age | 15768000 |
||
规则 | |||
选择规则 | 此前添加的规则 |
Nginx 反向代理 HAProxy
由于我通过 IPv4<->Wireguard<->IPv4组网服务: LANraragi 实例 同时对 IPv4 、 IPv6 公网提供服务,所以还需要 Nginx 反向代理一次。
domain_nginx_typecho.conf
:
server {
listen [PORT] ssl http2;
server_name [DOMAIN];
ssl on;
index index.php index.html index.htm;
ssl_certificate /etc/nginx/conf.d/ssl/[DOMAIN].pem;
ssl_certificate_key /etc/nginx/conf.d/ssl/[DOMAIN].key;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://[WG_IPv4]:[WG_PORT];
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}