Как перенаправить трафик с Http на Https в Phoenix Elixir для SSL на балансировщик нагрузки? - PullRequest
0 голосов
/ 08 июня 2018

Мне нужно перенаправить трафик с Http на Https, SSL находится на балансировщике нагрузки, поэтому все, что мне нужно сделать, это переслать заголовок с помощью plug_ssl, поэтому в моем prod.exs я добавил:

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

в моем prod.exs и удалите все остальное на config :web, Web.Endpoint

Не работает.

Что я делаю не так?

Нужно ли вставлять force_ssl в мой router?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 июля 2018

Обычно Healthchecker вызывает ваш сервер напрямую, используя локальную сеть, а не домен, в котором находится ваше приложение.Таким образом, вы можете поместить свой локальный адрес в параметр exclude.

Вот что я сделал:

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

Где IP_ADDRESS Я получил из переменной environement (это зависит от вашего развертываниявведите, как вы его получите), используя distillery.Однако, если вы не используете distillery, вы можете просто получить переменные окружения следующим образом:

config :my_app, MyApp.Endpoint,
  force_ssl: [rewrite_on: [:x_forwarded_proto], exclude: ["localhost", System.get_env("IP_ADDRESS")]],
0 голосов
/ 11 июня 2018

Возможно, вам понадобится включить плагин force_ssl только для ваших конечных точек, которые не используются для проверки работоспособности или чего-то связанного с этим.

У меня была похожая проблема с входом k8s на GKE иРешением было поставить 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 и всегда проверяйте заголовки для ваших запросов и ответов при выполнении тестов.

...