我手头没有现成的示例,因为我在前端没有使用代理,不过我记得之前好像实现过。无论如何,这并没有什么秘密,操作方式与其他反向代理类似。以下是使用端口(而非套接字)时应做之事的概述:
-
确保有一个 WordPress 服务正在非 80 和 443 的端口上运行(例如:8443),并且运行正常。你可以先尝试将其暴露到互联网上,以验证是否正常工作。
-
对 Discourse 进行同样的操作,映射到不同的端口。
将:
expose:
- "80:80" # http
- "443:443" # https
改为(例如):
expose:
- "8081:80" # http
- "8444:443" # https
在你的 app.yml 文件中(如果没有,我建议先在独立机器上按照官方指南运行 Discourse,看看它是如何工作的,然后查看 /var/discourse/containers/ 下生成的 app.yml 文件)。以下是 app.yml 文件的示例:discourse_docker/samples/standalone.yml at master · discourse/discourse_docker · GitHub
- 安装 Nginx,并在其配置文件中添加代理指令。它们应类似于以下示例片段:
upstream blog {
server localhost:8080;
}
server {
server_name blog.barinaklar.com;
server_tokens off;
listen 80;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://blog.barinaklar.com$request_uri;
}
}
server {
server_name blog.barinaklar.com;
server_tokens off;
listen 443 ssl;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
proxy_pass http://blog;
proxy_redirect off;
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-Host $server_name;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
upstream forum {
server localhost:8081;
}
server {
server_name forum.barinaklar.com;
server_tokens off;
listen 80;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://forum.barinaklar.com$request_uri;
}
}
server {
server_name forum.barinaklar.com;
server_tokens off;
listen 443 ssl;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
proxy_pass http://forum;
proxy_redirect off;
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-Host $server_name;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
这假设 WordPress 运行在端口 8080,Discourse 运行在端口 8081。请务必设置防火墙以阻止访问这些端口(云提供商通常默认阻止所有端口,仅开放 22 端口,因此可能不需要额外操作)。
在这种情况下,你需要负责生成 SSL/TLS 证书(你可以使用 Certbot 通过 cron 作业定期运行来生成,因此我已在 Nginx 配置中包含了路径 /.well-known/acme-challenge/)。
如前所述,这只是一个概述,可能有些细节被我遗漏了。你需要特别注意基础 URL,因为端口发生了变化(检查它是否会将用户重定向到 https://yourdomain:8081 而不是 https://yourdomain,并在必要时进行调整以确保正常工作)。
如果 WordPress 在容器内运行在端口 80 或 443,则可能不需要上述操作。Discourse 的情况也应该类似。可能出现的问题是 https 相关的问题,它可能会因为代理中使用的是 http 端口而重定向到 http,因此你需要检查是否发生这种情况,并在必要时进行修复。