警告:计算机的 443 端口似乎无法通过主机名访问

我手头没有现成的示例,因为我在前端没有使用代理,不过我记得之前好像实现过。无论如何,这并没有什么秘密,操作方式与其他反向代理类似。以下是使用端口(而非套接字)时应做之事的概述:

  1. 确保有一个 WordPress 服务正在非 80 和 443 的端口上运行(例如:8443),并且运行正常。你可以先尝试将其暴露到互联网上,以验证是否正常工作。

  2. 对 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

  1. 安装 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,因此你需要检查是否发生这种情况,并在必要时进行修复。

3 个赞