Прокси сервер

Прокси – единая точка входа в приложение, может использоваться в двух режимах, как основной веб сервер (прямой прокси) с помощью, которого можно настроить защищённое https соединение или как обратный прокси, который будет работать за внешним, сконфигурированным на стороне клиента веб сервером.

Настройка прямого прокси осуществляется с помощью переменных среды, имеющих префикс PROXY

Прямой прокси

Прямой прокси имеет два режима работы:

  • с поддержкой защищённого https соединения;
  • нешифрованное соединение;

PROXY_SSL_ENABLED - Значение в формате true/false, определяющее использование защищённого https соединения с помощью SSL сертификатов. Значение по умолчанию: true.

# Включить использование https
PROXY_SSL_ENABLED=true

PROXY_CERT_PATH - Строка содержащая абсолютный или относительный путь к файлу сертификата выданным удостоверяющим центром заказчика, файл сертификата должен быть в .pem формате, содержать сертификат объекта, закрытый ключ и образовывать полную цепочку доверия.

# Путь к сертификату
PROXY_CERT_PATH=/etc/ssl/planr.pem

Обратный прокси

Настройка обратного прокси осуществляется если необходимо использовать внешний веб сервер, например nginx или haproxy. Для настройки необходимо:

  • Изменить значения переменных
    • PROXY_PORT=8080 (любой порт отличный от 80 по умолчанию, так как внешний веб сервер будет прослушивать этот порт)
    • PROXY_ADMIN_PORT=8081 (любой порт отличный от 81 по умолчанию, так как внешний веб сервер будет прослушивать этот порт)
    • PROXY_SSL_PORT=8443 (любой порт отличный от 443 по умолчанию, так как внешний веб сервер будет прослушивать этот порт)
  • Убедится, что внешний веб сервер имеет поддержку websocket.
  • Используя внешний веб сервер, сделать редирект на http://localhost:8080 (Порт задаётся переменной PROXY_PORT) и на http://localhost:8081 (Порт задаётся переменной PROXY_ADMIN_PORT).

Примеры

Примеры конфигурация для наиболее распространённых веб серверов.

Конфигурация Nginx

http {
    server {
        listen 80;
        server_name planr.com;

        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;

            proxy_pass http://planr;

            # enable WebSockets
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }

    server {
        listen 81;
        server_name planr-admin.com;

        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;

            proxy_pass http://planr_admin;

            # enable WebSockets
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }

    upstream planr {
        server localhost:8080;
    }

    upstream planr_admin {
        server localhost:8081;
    }
}

Конфигурация HAProxy

listen http
    bind \*:80
    default_backend planr_servers

listen http
    bind \*:81
    redirect location /admin if { path / }
    default_backend planr_servers

backend planr_servers
    option httpchk HEAD /health
    http-check expect status 200
    cookie io prefix indirect nocache # using the `io` cookie set upon handshake
    server planr localhost:8080 check cookie planr

backend planr_admin_servers
    option httpchk HEAD /health
    http-check expect status 200
    cookie io prefix indirect nocache # using the `io` cookie set upon handshake
    server planr localhost:8081 check cookie planr