如何在Phoenix Elixir中将流量从Http重定向到Https for Load Balancer?

时间:2018-06-08 01:16:54

标签: elixir phoenix-framework plug

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

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

在我的prod.exs中删除config :web, Web.Endpoint

上的所有内容

它不起作用。

我做错了什么?

我是否需要将force_ssl放入router

提前谢谢。

2 个答案:

答案 0 :(得分:0)

您可能需要仅为未用于运行状况检查的端点或与其相关的端点启用force_ssl插件。

我在GKE上的k8s Ingress遇到了类似的问题,解决方法是仅将force_ssl 放在路由器上仅用于我的应用程序路由,然后让/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,并在执行测试时始终检查请求和响应的标头。

答案 1 :(得分:0)

通常,运行状况检查程序直接使用本地网络而不是应用程序所在的域来调用服务器。这样,您可以将本地地址放入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")]],