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

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

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

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

Примечание:

Установка. Чтобы установить 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 18.04.
  • Разрешите профиль Nginx HTTP:
    ufw allow 'Nginx HTTP'
  • Проверьте сделанные изменения:
    ufw status
  • После завершения процесса установки Ubuntu 20.04 запускает nginx автоматически. Чтобы проверить это узнайте IP-адрес своего компьютера:
    ifconfig
  • Запустите браузер и в адресной строке введите:
    http://10.70.3.209/
    В случае успеха вы увидите стандартную страницу 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, чтобы перейти в режим редактирования;
  • Самый простой случай развертывания может выглядеть следующим образом:
    • сервер доступен только через локальный сетевой интерфейс (localhost) (см. Сетевые настройки сервера);
    • nginx установлен на том же компьютере, что и сервер;
    • пользователи обращаются по протоколу HTTP.
    В этом случае вставьте следующее содержимое. Перед вставкой замените server.example.com на имя, которое будет у вашего сервера (разумеется, IP-адрес сервера должен быть прописан в DNS):
    #client_max_body_size 10000m;
    client_max_body_size 0;
      
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
     
    upstream httpServer {
        server 127.0.0.1:9090;
    }
         
    # HTTP Proxy Server
    server {
        listen       80;
        server_name server.example.com default_server;
     
        # HTTP       
        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;
        } 
    }
    Примечание: Директива 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;
    }
  • Перезапустите nginx, если он уже запущен:
    systemctl reload nginx

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

Примечание: Прежде чем настраивать подключение пользователей по HTTPS, вам нужно будет разрешить профиль Nginx HTTPS и затем настроить SSL. Эти настройки выходят за рамки нашей документации, но вы можете прочитать об этом в дополнительной литературе, например тут: How To Secure Nginx with Let's Encrypt on Ubuntu 18.04.
Для того чтобы обеспечить подключение пользователей по HTTPS, необходимо выполнить следующие условия:
  • Сертификат сервера не должен быть самоподписанным;
  • Корневой сертификат (CA) необходимо добавить в Trusted Roots (допустимо использовать самоподписанный сертификат). Это нужно сделать как на хосте сервера, так и на всех клиентских хостах.

В этом случае файл /etc/nginx/sites-available/ess должен выглядеть следующим образом:

#client_max_body_size 10000m;
client_max_body_size 0;
 
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}
 
upstream httpServer {
    server 127.0.0.1:9090;
}
 
# Redirect HTTP to HTTPS
server {
    listen          80;
    server_name     server.example.com;       
    return 301      https://$host$request_uri;
}
     
# HTTPS Proxy Server
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 TLSv1.1 TLSv1.2;
 
    # Сообщить браузеру, что сервер доступен только по HTTPS
    # Это предотвращает возможность перехода обратно на HTTP с атакой по назащищенному каналу
    add_header Strict-Transport-Security 'max-age=604800';
 
    # HTTP       
    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;
    }     
}

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

Примечание:

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

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

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

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

Сервер и nginx на одном компьютере, HTTP

Самый простой случай развертывания может выглядеть следующим образом:
  • сервер доступен только через локальный сетевой интерфейс (localhost) (см. Сетевые настройки сервера);
  • nginx установлен на том же компьютере, что и сервер;
  • пользователи обращаются по протоколу HTTP.
В этом случае блоки http и server должны выглядеть следующим образом (замените server.example.com на имя, которое будет у вашего сервера (разумеется, IP-адрес сервера должен быть прописан в DNS):):
http {
    include       mime.types;
    default_type  application/octet-stream;
    #client_max_body_size 10000m;
    client_max_body_size 0;
 
    sendfile        on;   
    keepalive_timeout  65;
 
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
 
    upstream httpServer {
        server 127.0.0.1:9090;
    }
     
    # HTTP Proxy Server
    server {
        listen       80;
        server_name server.example.com default_server;
 
        # HTTP       
        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;
        } 
    }
}
Примечание: Директива client_max_body_size ограничивает максимальный размер файла, который можно передать через nginx. Значение 0 отключает такое ограничение.

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

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

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

В более сложном случае сервер и nginx могут находиться на разных компьютерах. Тогда:
  • разрешите доступность сервера по одному из его IP-адресов (см. Сетевые настройки сервера), например 192.168.0.3;
  • этот же адрес укажите в блоке upstream:
        upstream httpServer {
            server 192.168.0.3:9090;
        }

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

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

В этом случае блоки http и server должны выглядеть следующим образом:

http {
    include       mime.types;
    default_type  application/octet-stream;
    #client_max_body_size 10000m;
    client_max_body_size 0;
 
    sendfile        on;   
    keepalive_timeout  65;
 
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
 
    upstream httpServer {
        server 127.0.0.1:9090;
    }
 
    # Redirect HTTP to HTTPS
    server {
        listen          80;
        server_name     server.example.com;       
        return 301      https://$host$request_uri;
    }
     
    # HTTPS Proxy Server
    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 TLSv1.1 TLSv1.2;
 
        # Сообщить браузеру, что сервер доступен только по HTTPS
        # Это предотвращает возможность перехода обратно на HTTP с атакой по незащищенному каналу
        add_header Strict-Transport-Security 'max-age=604800';
 
        # HTTP       
        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;
        }     
    }
}