Проксирование запросов в nginx с помощью proxy_pass
Рассмотрим такой пример. Допустим, у нас есть 1 сервер виртуализации , где установлен Debian+Proxmox с локальным IP 192.168.88.200 . В виртуальной среде Proxmox развернуто 2 контейнера на каждом из которых находится по 1 сайту. К примеру: example1.com расположенный на контейнере 101 c локальным ip адресом 192.168.88.10 и example2.com расположенный на контейнере 102 c локальным ip адресом 192.168.88.20 и один внешний белый ip адрес, в примере мы будем использовать 88.251.4.18. Итого:
Proxmox 192.168.88.200
Контейнер 101 с сайтом example1.com 192.168.88.10
Контейнер 102 с сайтом example2.com 192.168.88.20
Внешний белый ip адрес 88.251.4.18
Задача: Заставить работать 2 сайта на 1 внешнем ip адресе.
Решение: Создаем на Proxmox новый контейнер в нашем случаи с порядковым номером 103. В качестве операционной системы возьмем debian 10 и после установления ОС дополнительно устанавливаем туда nginx. Он и будет обрабатывать все запросы и проксировать их на контейнеры.
Переходим к настройке. На сервере 103 переходим к настройке ngnix:
/etc/nginx/sites-available
создаем конфигурацию (config)
reverse
server {
listen 80;
server_name example1.com;
server_name_in_redirect on;
access_log /var/log/nginx/example1.com;
error_log /var/log/nginx/example1.com;
location / {
proxy_pass http://192.168.88.10:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name example2.com;
server_name_in_redirect on;
access_log /var/log/nginx/example2.com.log;
error_log /var/log/nginx/example2.com.log;
location / {
proxy_pass http://192.168.88.20:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
где listen 80; это порт приема трафика
название вашего домена server_name example1.com;
сохранение логов (log file) из access_log /var/log/nginx/example1.com;
К слову Большой синоним узнай здесь.указываем куда будет транслироваться трафик на виртуальный сервер proxy_pass http://192.168.88.10:80;
Для изменения или создания заголовков прокси соединения воспользуйтесь директивой proxy_set_header
. Например, чтобы отредактировать заголовок host
и добавить в него несколько часто встречающихся заголовков при проксировании, мы можем поступить следующим образом:
заголовок host
соответствующего запроса будет изменен на значение переменной $host
. Которое должно содержать изначально запрошенный host. Заголовок X-Forwarded-Proto
дает вышестоящему серверу знать о том, какая схема была использована при изначальном запросе (http/https);
X-Real-IP
имеет значение IP адреса клиента. Заголовок X-Forwarded-For
содержит список прокси серверов, по которым прошел запрос до настоящего момента. В данном примере мы присваиваем ему значение переменной $proxy_add_x_forwarded_for
. Она содержит в себе полученный заголовок X-Forwarder-For
плюс добавляет свой сервер в этот список.
Конечно, есть смысл перенести директиву proxy_set_header
в раздел серверного или http контекста, чтобы можно было ссылаться на неё из разных мест настройки.
memcached
Для ускорения ответа запроса можно использовать систему кеширование memcached лучше всего запустить ее на отдельной виртуальной машине как пример у меня она доступна по адресу 192.168.88.252
рекомендация чтобы на в наружу не светилась так как есть атаки на эти сервисы
location /page {
set $memcached_key "$uri?$args";
memcached_pass 192.168.88.252:11211;
error_page 404 502 504 = @fallback;
error_page 404 = @dynamic_request;
}
Вставить его в вашу конфигурацию в директории /etc/nginx/sites-available proxy между location
HTTPS
Для доступа сайта по HTTPS на сервере nginx proxy_pass лучше использовать сервис для создание сертификатов бесплатный certbot.
Для выпуска сертификата устанавливаем certbot командой
sudo apt-get install certbot python-certbot-nginx
Для выпуска сертификата нужно выполнить команду
sudo certbot --nginx
Выбрать сайт который вы хотите перевести на https подтверждаете и переводите на https

вы вбираете 2 Redirect теперь сайт доступен по https
Приводите конфигурации в порядок в директории /etc/nginx/sites-available
Пример конфигурации с https
server {
listen 80;
server_name example1.com www.example1.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name example1.com www.example1.com;
server_name_in_redirect off;
access_log /var/log/nginx/example1.com.log;
error_log /var/log/nginx/example1.com.log;
#ssl on;
ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
add_header Strict-Transport-Security max-age=31536000;
location ~ ^/\.user\.ini {
deny all;
}
location /page {
set $memcached_key "$uri?$args";
memcached_pass 192.168.89.252:11211;
error_page 404 502 504 = @fallback;
error_page 404 = @dynamic_request;
}
location / {
# app1 reverse proxy follow
proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 64;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.88.10:80/;
proxy_buffering on;
proxy_cache all;
proxy_cache_valid any 30m;
proxy_cache_valid 200 10m;
proxy_cache_valid 301 302 304 20m;
proxy_cache_valid 404 1m;
fastcgi_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
fastcgi_hide_header "Set-Cookie";
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
fastcgi_ignore_headers "Cache-Control" "Expires";
}
error_page 404 /404.php;
location = /40x.php {
}
error_page 500 502 503 504 /50x.php;
location = /50x.php {
}
}
Для удобства лучше отдельно размещать файлы конфигурации nginx в директории /etc/nginx/sites-available для каждого сервер
В такой конфигурацией запросы на ваш сайт проходя следующий путь.
nginx proxy_pass слушает порты 80 и 443 при обращение на 80 порт он передает запрос на 443 порт в этом помогает функция в конфигурации nginx proxy_pass постоянного редиректа return 301 https://$server_name$request_uri; дальше он передает запрос в бок обработки где функция proxy_pass http://192.168.88.10:80/; отдает запрос на указанный адрес в тоже момент ваш сервер с сайтам 192.168.88.10 слушает 80 пот и принимает запрос
Уведомление: Установка версии Document server Onlyoffice для Linux на Debian, Ubuntu под управлением Nextcloud | | Чип и Дел