Как перенаправить трафик с Http на Https в Phoenix Elixir для SSL на балансировщик нагрузки?
Мне нужно перенаправить трафик с 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 ответа
Вам, вероятно, нужно будет включить force_ssl
подключайте только для ваших конечных точек, которые не используются для проверки работоспособности или чего-то связанного с этим.
У меня была похожая проблема с K8S Ingress на 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
и всегда проверяйте заголовки для ваших запросов и ответов при выполнении тестов.
Обычно 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")]],