Force_https 与 GCP Ingress 配合使用时无效

我在 GCP 上有一个 Kubernetes 实例。一切看起来正常,但不知为何 force_https 没有强制重定向,站点仍然可以通过 http:// 访问。

我目前的解决方案是在 app.yml 中添加以下配置块:

    - replace:
        filename: /etc/nginx/conf.d/discourse.conf
        from: '    add_header ETag "";'
        to: |
                  add_header ETag "";
                  if ($thescheme = "http") {
                    return 301 https://$host$request_uri;
                  }

(我也很想知道如何让 pups 正确缩进我插入的这些行,但先不跑题了。)

进行该更改后不久,Ingress 控制器似乎停止提供站点服务,尽管它之前似乎正常工作了一段时间,并且正确地执行了重定向。

显然这属于 unsupported-install(不受支持的安装),但如果有人知道接下来该从哪里排查,我将不胜感激。

您使用的是 HTTP 负载均衡器还是 TCP 负载均衡器?如果是 HTTP,入口流量中看到的协议可能被封装在一个 Discourse 未识别的非标准头部中。

完全托管的设置看起来如下:

$ gcloud compute addresses create discourse-ip-address --global
#                                 ^~~~~~~~~~~~~~~~~~~~ 自定义名称
# 警告:保留 IP 地址但未使用会产生 0.010 美元/小时的罚款
---
apiVersion: networking.gke.io/v1beta1
kind: ManagedCertificate
metadata:
  name: discourse-cert
spec:
  domains:
    - discourse.example.com  # 自定义
---
apiVersion: extensions/v1beta1
# 如果是 v1.14 或更高版本:
# apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: discourse-web-ingress
  annotations:
    networking.gke.io/managed-certificates: discourse-cert
    kubernetes.io/ingress.global-static-ip-name: discourse-ip-address
spec:
  backend:
    serviceName: discourse-web  # 请确认此项是否正确
    servicePort: 80

来源:

非常感谢,@riking!是的,问题似乎出在负载均衡器上。我认为 Ingress 本身没问题(我现在也意识到它们之间是有区别的)。我切换到了你展示的配置方案,但得到的结果和我之前使用稍复杂的配置时一样。我想下一步可能是研究一下 tcpdump,看看那些请求头里到底有什么。 . .

编辑:看起来它应该能正常工作。以下是我看到的请求头信息:

GET /thisisatest HTTP/1.1
User-Agent: Wget/1.19.4 (linux-gnu)
Accept: */*
Accept-Encoding: identity
Host: community.example.com
X-Cloud-Trace-Context: 72c9f7219e6b541cad01153c52fb92c5/13509441707361831434
Via: 1.1 google
X-Forwarded-For: MY-IP-ADDRESS, INGRESS-IP
X-Forwarded-Proto: http
Connection: Keep-Alive

我配置了 set_real_ip_from 指向 Ingress 的 IP 地址(并且 IP 地址已被正确记录)。

@pfaffman 我可以帮忙解决这个问题——我在使用 GCP 时曾遇到过并解决了同样的问题。不过我接下来几个小时比较忙,但如果你能在这里或私下发给我你的负载均衡器配置(包括健康检查设置),我可以尝试帮你找出问题所在。

附:TCP 和 HTTP 都能正常工作。

非常感谢,@p16

好的,这是健康检查情况。我将路径更改为 /srv/status,但我仍然看到 “GoogleHC/1.0” 在访问 /

谢谢,后端在负载均衡器中是否显示为健康状态?另外,请在主机(在“更多”下)添加 www.yoursite.com

此外,以下是我添加到 app.yml 的内容:

  after_web_config:
    - replace:
       filename: "/etc/nginx/conf.d/discourse.conf"
       from: /server.+{/
       to: |
         server {
           if ($http_x_forwarded_proto = 'http'){
            return 301 https://$host$request_uri;
           }

这种情况不会持续太久,因为 Google 将在本季度添加一个从 HTTP 到 HTTPS 的重定向器。

好的。看起来现在可以工作了!我有点困惑关于那个神奇的端口 30182,不过我想这大概是某种 Kubernetes 的魔法,我改天再弄明白吧。
我会试试你的 after_web_config: 配置段。它看起来比我之前的做法更简洁。

非常感谢。