3

我需要将流量从 Http 转发到 Https,SSL 在负载均衡器上,所以我需要做的就是使用我添加的plug_sslso转发标头:prod.exs

config :web, Web.Endpoint,
  force_ssl: [rewrite_on: [:x_forwarded_proto]]

在我的prod.exs并删除其他所有内容config :web, Web.Endpoint

它不起作用。

我究竟做错了什么?

我需要把force_ssl我的router

先感谢您。

4

2 回答 2

3

您可能force_ssl只需要为您的端点启用插件,这些端点不用于健康检查或与之相关的东西。

我在 GKE 上的 k8s Ingress 遇到了类似的问题,解决方案是只为我的应用程序路由放置force_ssl on 路由器/healthz,并使用 HTTP 让(配置为我的健康检查路由)。

一个例子config/prod.exs

# Tells if we need to enforce SSL for our endpoints.
# Only production/staging should enforce
config :my_app, force_ssl: true

config :my_app, MyAppWeb.Endpoint,
  load_from_system_env: true,
  url: [host: "${APP_HOST}", port: 80],
  server: true,
  http: [port:  "${PORT}"],
  url: [scheme: "https", host: "${APP_HOST}", port: 443],
  secret_key_base: "${SECRET_KEY_BASE}"

这是一个例子lib/my_app_web/router.ex

defmodule MyAppWeb.Router do
  use MyAppWeb, :router

  # This route will NOT enforce SSL
  get("/healthz", MyAppWeb.HealthCheckController, :show)

  pipeline :api do
    plug(:accepts, ["json"])

    if Application.get_env(:my_app, :force_ssl) do
      plug(Plug.SSL, rewrite_on: [:x_forwarded_proto], host: nil)
    end
  end

  scope "/", MyAppWeb do
    pipe_through(:api)

    # My routes will go here, and will be enforced if the
    # application flag `force_ssl` is enabled.
  end
end

这有点难以调试。如果您正在使用kubernetes,请尝试使用kubectl describe ingress YOUR-INGRESS-HERE,并在进行测试时始终检查您的请求和响应的标题。

于 2018-06-10T22:23:04.873 回答
0

通常 healthchecker 直接使用本地网络调用您的服务器,而不是您的应用所在的域。这样您就可以将您的本地地址放入exclude选项中。

这就是我所做的:

config :my_app, MyApp.Endpoint,
  force_ssl: [rewrite_on: [:x_forwarded_proto], exclude: ["localhost", "${IP_ADDRESS}"]],

IP_ADDRESS使用distillery. 但是,当您不使用时,distillery您可以通过这种方式获取环境变量:

config :my_app, MyApp.Endpoint,
  force_ssl: [rewrite_on: [:x_forwarded_proto], exclude: ["localhost", System.get_env("IP_ADDRESS")]],
于 2018-07-27T09:42:17.273 回答