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

  1. 由于选择的 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
    
  2. 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();
    ......
    
  3. 保存退出,重启容器。

修改 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";
    }
}
posted @ 2022-09-03 21:29  Yogile  阅读(1098)  评论(0编辑  收藏  举报