Перейти к основному содержимому

Установка и настройка обратного прокси-сервера nginx

В качестве примера мы будем использовать прокси-сервер nginx. Вы можете использовать любой другой обратный прокси-сервер (reverse proxy).

дополнительно

Прокси-сервер nginx устанавливается на компьютер с ОС Linux. Существует версия nginx для ОС Windows, однако она рассматривается пока как бета-версия (подробнее). Об особенностях установки nginx на Windows см. здесь.

Установка и настройка на Linux​

примечание

В качестве примера используется ОС Ubuntu 20.04.

Установка​

Чтобы установить nginx, выполните следующие действия:

  • Запустите терминал.

  • Войдите как пользователь root:

    sudo -i
  • Чтобы установить nginx, выполните следующие команды:

    apt update
    apt install nginx

Настройка​

Чтобы настроить nginx, выполните следующие действия:

  • Проверьте, включен ли брандмауэр:

    ufw status

    Сообщение «Состояние: неактивен» говорит о том, что брандмауэр выключен. В этом случае мы настоятельно рекомендуем его включить. Для этого выполните следующие команды:

    ufw allow ssh
    ufw enable
    systemctl enable ufw
    systemctl start ufw

    После этого команда ufw status должна выдать аналогичный результат, который говорит о том, что брандмауэр работает:

    Сообщение об активном состоянии брандмауэра

  • Выведите настройки доступа для приложений, зарегистрированных в ufw:

    ufw app list

    Настройки доступа для приложений

    Как видно из этого вывода, для nginx настроено три профиля:

    • Nginx Full — этот профиль открывает порты 80 (обычный, нешифрованный веб-трафик) и 443 (трафик шифруется с помощью TLS/SSL);
    • Nginx HTTP — этот профиль открывает только порт 80 (обычный, нешифрованный веб-трафик);
    • Nginx HTTPS — этот профиль открывает только порт 443 (трафик шифруется с помощью TLS/SSL).

    Далее мы покажем, как настроить трафик для порта 80. Если же вы хотите использовать защищенное соединение, вам нужно будет разрешить профиль Nginx HTTPS и затем настроить SSL. Эти настройки выходят за рамки нашей документации, но вы можете прочитать об этом в дополнительной литературе, например тут: How To Secure Nginx with Let's Encrypt on Ubuntu 20.04.

  • Разрешите профиль Nginx HTTP:

    ufw allow 'Nginx HTTP'
  • Проверьте сделанные изменения:

    ufw status

    Статус сделанных изменений

  • Ubuntu 20.04 запускает nginx автоматически после завершения процесса установки. Чтобы проверить это, узнайте IP-адрес своего компьютера:

    ifconfig

    Получение IP-адреса компьютера

  • Запустите браузер и в адресной строке введите:

    http://10.70.3.209/

    В случае успеха вы увидите стандартную страницу nginx:

    Стандартная страница nginx

Настройка взаимодействия с сервером​

важно

Порты отладки и сервера указаны в конфигурационных файлах debug.yml и server.yml. Убедитесь, что значения портов в nginx соответствуют вашим конфигурационным файлам.

Чтобы настроить взаимодействие nginx с сервером, выполните следующие действия:

  • Удалите стандартную настройку сайта из каталогов /etc/nginx/sites-available и /etc/nginx/sites-enabled:

    rm /etc/nginx/sites-available/default
    rm /etc/nginx/sites-enabled/default
  • Создайте собственную настройку сайта. Для этого запустите редактор vi:

    vi /etc/nginx/sites-available/ess
  • Нажмите a, чтобы перейти в режим редактирования.

В примере ниже рассматривается простой случай развертывания, когда nginx установлен на том же компьютере, что и сервер.

  • Вставьте следующее содержимое (перед вставкой замените server.example.com на имя, которое будет у вашего сервера (разумеется, IP-адрес сервера должен быть прописан в DNS)):

    В этом случае:

    events {
    worker_connections 1024;
    }
    http {

    include mime.types;
    default_type application/octet-stream;
    client_max_body_size 100m;

    sendfile on;
    keepalive_timeout 65;

    # Mapping for WebSocket upgrades
    map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
    }

    # Upstream servers
    upstream httpServer {
    server 10.70.3.209:9090;
    }

    upstream debugServer {
    server 10.70.3.209:8080;
    }

    server {
    listen 80;
    server_name server.example.com;

    # Main Proxy Location
    location / {
    proxy_pass http://httpServer/;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;

    proxy_http_version 1.1;
    }

    # IDE Location
    location /ide {
    allow 10.70.3.0/24; # Adjust to your trusted IP range
    deny all;

    proxy_pass http://httpServer;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    # Timeouts for WebSocket connections
    proxy_read_timeout 86400;
    proxy_send_timeout 86400;
    proxy_connect_timeout 86400;

    # Disable buffering for WebSockets
    proxy_buffering off;
    }

    # Debug Location
    location /debug {
    allow 10.70.3.0/24; # Adjust to your trusted IP range
    deny all;

    proxy_pass http://debugServer;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_http_version 1.1;

    # WebSocket Timeouts
    proxy_read_timeout 86400;
    proxy_send_timeout 86400;
    proxy_connect_timeout 86400;
    }

    # Logging
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log warn;
    }
    }

примечание

Директива client_max_body_size ограничивает максимальный размер файла, который можно передать через nginx. Значение 0 отключает такое ограничение.

  • Нажмите Esc, чтобы вернуть редактор в командный режим.

  • Нажмите :x и затем Enter.

  • Создайте символическую ссылку между каталогами:

    ln -s /etc/nginx/sites-available/ess /etc/nginx/sites-enabled/ess
  • Перезапустите nginx:

    systemctl reload nginx
  • Проверьте работоспособность сервера через внешний IP-адрес:

    http://server.example.com/maintenance/server/v1/heartbeat

    В случае успеха вы увидите стандартный ответ сервера:

    Стандартный ответ сервера

Сервер и nginx на разных компьютерах, HTTP​

В более сложном случае сервер и nginx могут находиться на разных компьютерах. Тогда:

  • Разрешите доступность сервера по одному из его IP-адресов (см. Сетевые настройки сервера), например 192.168.0.3.

  • Этот же адрес укажите в блоке upstream файла /etc/nginx/sites-available/ess (ссылка):

    upstream httpServer {
    server 192.168.0.3:9090;
    }

а также, при использовании сервера отладки:

upstream debugServer {
server 192.168.0.3:8080;
}
  • Перезапустите nginx, если он уже запущен:

    systemctl reload nginx

Настройка Gzip-сжатия​

Для повышения производительности и снижения объема передаваемых данных рекомендуется включить Gzip-сжатие. Для этого добавьте в файл конфигурации nginx следующие параметры:

  • gzip on; – включает Gzip-сжатие.
  • gzip_comp_level 5; – устанавливает уровень сжатия (от 1 до 9).
  • gzip_proxied any; – разрешает сжатие для всех запросов, прошедших через прокси.
  • gzip_types ...; – определяет MIME-типы, для которых будет применяться сжатие.

Пример конфигурации:

gzip on;
gzip_comp_level 5;
gzip_proxied any;
gzip_types
text/html
text/plain
text/javascript
text/xml
text/css
application/javascript
application/xml
application/json
image/svg+xml;

Подключение по HTTPS​

примечание

Прежде чем настраивать подключение пользователей «1С:Шины» по HTTPS, вам нужно будет разрешить профиль Nginx HTTPS и затем настроить SSL. Эти настройки выходят за рамки нашей документации, но вы можете прочитать об этом в дополнительной литературе, например тут: How To Secure Nginx with Let's Encrypt on Ubuntu 20.04.

Для того чтобы обеспечить подключение пользователей по HTTPS, необходимо выполнить следующие условия:

  • Ключ сертификата должен быть с пустым паролем.
  • Сертификат сервера не должен быть самоподписанным.
  • Корневой сертификат (CA) необходимо добавить в Trusted Roots (допустимо использовать самоподписанный сертификат). Это нужно сделать как на хосте сервера, так и на всех клиентских хостах.

Добавьте в файл конфигурации nginx, перед основными настройками сервера, следующие настройки перенаправления:

# HTTP to HTTPS Redirect Server
server {
listen 80;
server_name server.example.com;
return 301 https://$host$request_uri;
}

а ниже, в самих настройках сервера, замените стандартные настройки сервера:

listen 80;
server_name server.example.com;

на настройки прокси-сервера с защищенным соединением:

# HTTPS Proxy Server
server {
listen 443 ssl;
server_name server.example.com;

# SSL Configuration
ssl_certificate /etc/nginx/ssl/proxy.crt;
ssl_certificate_key /etc/nginx/ssl/proxy_free.key;
ssl_protocols TLSv1.2 TLSv1.3;

# Security Headers
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}

Установка и настройка на Windows​

примечание

В качестве примера используется ОС Windows 10 Pro.

В тестовых целях вы можете установить и настроить nginx на Windows.

Чтобы установить nginx, выполните следующие действия:

  • Скачайте дистрибутив nginx по этой ссылке: https://nginx.org/ru/download.html. Мы рекомендуем использовать основную версию (Mainline version).
  • Разархивируйте дистрибутив в каталог, в котором будет находиться nginx.

Чтобы настроить взаимодействие с сервером, вам понадобится отредактировать файл конфигурации nginx conf\nginx.conf (ссылка).

совет

Если для доступа пользователей к nginx вы собираетесь использовать защищенное соединение SSL, то полный путь к каталогу, в который вы поместите nginx, не должен содержать кириллицы.

Кроме того, при подключении по HTTPS нужно поменять пути к сертификату и ключу сертификата из примера выше для Linux на соответствующие для Windows, например:

ssl_certificate c:/app/nginx/proxy.crt;
ssl_certificate_key c:/app/nginx/proxy_free.key;

Чтобы проверить работоспособность сервера через внешний IP-адрес, выполните следующие действия:

  • Запустите файл nginx.exe.

  • Запустите браузер и введите в адресной строке:

    http://server.example.com/maintenance/server/v1/heartbeat
  • В случае успеха вы увидите стандартное сообщение сервера:

    Сообщение о работе сервера

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

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

HTTPS-прокси​

Данный пример демонстрирует полную конфигурацию nginx для сценария, когда требуется шифрование трафика и принудительное перенаправление всех HTTP-запросов на HTTPS.

В конфигурации объединены два серверных блока: для принудительного перенаправления HTTP → HTTPS и для самого HTTPS-прокси. По сравнению с прокси без шифрования здесь добавлены SSL-сертификаты, ограничение версий TLS и заголовок Strict-Transport-Security.

Требования:

  • Сертификат сервера не должен быть самоподписанным;
  • Сертификат CA необходимо добавить в Trusted Roots (допустимо использовать самоподписанный сертификат). Добавить в доверенные нужно как на хосте сервера, так и на всех клиентских хостах.
  • При запуске сервера под Windows нужно добавить следующую настройку запуска JVM:
    -Djavax.net.ssl.trustStoreType=WINDOWS-ROOT
http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 10000m;

error_log logs/error.log;

sendfile on;
keepalive_timeout 65;

# Сопоставление для WebSocket-соединений
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

# Внутренние серверы
upstream httpServer {
server localhost:9090;
}

upstream debugServer {
server localhost:8080;
}

# Перенаправление HTTP → HTTPS
server {
listen 80;
server_name proxy server.example.com;
return 301 https://server.example.com$request_uri;
}

# HTTPS-прокси
server {
listen 443 ssl;
server_name server.example.com;

# Ключ сертификата должен быть с пустым паролем
ssl_certificate c:/app/nginx/proxy.crt;
ssl_certificate_key c:/app/nginx/proxy_free.key;
ssl_protocols TLSv1.2 TLSv1.3;

add_header Strict-Transport-Security 'max-age=31536000';

# Основной прокси
location / {
proxy_pass http://httpServer/;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
}

# Сервер отладки (WebSocket)
location /debug {
proxy_pass http://debugServer/;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_http_version 1.1;
}
}
}

Несколько приложений через один nginx (Элемент + Аналитика)​

В этом примере создается единый фасад для сервера «1С:Предприятие.Элемента» и сервера «1С:Аналитики». Соответственно, нужно в прокси-сервере развести «Элемент» и «1С:Аналитику» по разным базовым путям.

примечание

Пример приведен без шифрования. Для работы по HTTPS добавьте SSL-директивы и серверный блок на 443-й порт по аналогии с примером выше.

http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 10000m;

error_log logs/error.log;

sendfile on;
keepalive_timeout 65;

# Сопоставление для WebSocket-соединений
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

# Элемент
upstream httpElm {
server localhost:9090;
}

upstream debugElm {
server localhost:8080;
}

# Аналитика
upstream httpAns {
server localhost:9092;
}

upstream debugAns {
server localhost:9093;
}

# HTTP-прокси
server {
listen 80;
server_name server.example.com;

# Элемент
location /elm/ {
proxy_pass http://httpElm/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Prefix /elm;
proxy_http_version 1.1;
}

# Аналитика
location /ans/ {
proxy_pass http://httpAns/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Prefix /ans;
proxy_http_version 1.1;
}

# Отладка Элемента (WebSocket)
location /elm/debug {
proxy_pass http://debugElm/;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_http_version 1.1;
}

# Отладка Аналитики (WebSocket)
location /ans/debug {
proxy_pass http://debugAns/;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_http_version 1.1;
}
}
}

Отдельное приложение под префиксом (HTTPS)​

Данный пример демонстрирует публикацию конкретного приложения (например, «1С:Кабинет сотрудника») под выделенным префиксом ess-demo по HTTPS. Ключевая особенность — переписывание пути: внешний запрос /ess-demo/app/foo транслируется во внутренний /applications/1SKabinet-sotrudnika/foo, при этом приложению передаются заголовки X-Forwarded-Prefix и X-Forwarded-Endpoint.

http {
##
# Basic Settings
##
sendfile on;
keepalive_timeout 65;

#tcp_nopush on;
#tcp_nodelay on;
#types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
client_max_body_size 10000m;

# Сопоставление для WebSocket-соединений
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

# Внутренний сервер
upstream httpserver {
server localhost:9090;
}

# Перенаправление HTTP → HTTPS
server {
listen 80;
server_name ubuntuserver.domain.local;
return 301 https://$host$request_uri;
}

##
# SSL Settings
##
ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

# HTTPS-прокси
server {
listen 443 ssl;
server_name ubuntuserver.domain.local;

# Ключ сертификата должен быть с пустым паролем
ssl_certificate /etc/ssl/certs/ubuntuserver.domain.local.crt;
ssl_certificate_key /etc/ssl/certs/ubuntuserver.domain.local.key;
ssl_protocols TLSv1.2 TLSv1.3;

add_header Strict-Transport-Security 'max-age=31536000';

# Основное приложение: переписывание /ess-demo/app/ → /applications/<id>/
location /ess-demo/app/ {
proxy_pass http://httpserver/applications/1SKabinet-sotrudnika/;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Prefix /ess-demo;
proxy_set_header X-Forwarded-Endpoint /app;
proxy_http_version 1.1;
}

# Аутентификация
location /ess-demo/auth/ {
proxy_pass http://httpserver/auth/;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Prefix /ess-demo;
proxy_http_version 1.1;
}

# Статические ресурсы
location /ess-demo/static/ {
proxy_pass http://httpserver/static/;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Prefix /ess-demo;
proxy_http_version 1.1;
}
}

##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}

См. также​