pfaffman
(Jay Pfaffman)
1
我在 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(不受支持的安装),但如果有人知道接下来该从哪里排查,我将不胜感激。
riking
(Kane York)
2
您使用的是 HTTP 负载均衡器还是 TCP 负载均衡器?如果是 HTTP,入口流量中看到的协议可能被封装在一个 Discourse 未识别的非标准头部中。
riking
(Kane York)
3
完全托管的设置看起来如下:
$ 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
来源:
pfaffman
(Jay Pfaffman)
4
非常感谢,@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 地址已被正确记录)。
P16
5
@pfaffman 我可以帮忙解决这个问题——我在使用 GCP 时曾遇到过并解决了同样的问题。不过我接下来几个小时比较忙,但如果你能在这里或私下发给我你的负载均衡器配置(包括健康检查设置),我可以尝试帮你找出问题所在。
附:TCP 和 HTTP 都能正常工作。
pfaffman
(Jay Pfaffman)
6
非常感谢,@p16!
好的,这是健康检查情况。我将路径更改为 /srv/status,但我仍然看到 “GoogleHC/1.0” 在访问 /。
P16
7
谢谢,后端在负载均衡器中是否显示为健康状态?另外,请在主机(在“更多”下)添加 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 的重定向器。
pfaffman
(Jay Pfaffman)
8
好的。看起来现在可以工作了!我有点困惑关于那个神奇的端口 30182,不过我想这大概是某种 Kubernetes 的魔法,我改天再弄明白吧。
我会试试你的 after_web_config: 配置段。它看起来比我之前的做法更简洁。
非常感谢。