Проксирование запросов в 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 пот и принимает запрос

0

Автор публикации

не в сети 1 год

Чип и Дел Чип и Дел

0
Комментарии: 0Публикации: 10Регистрация: 02-11-2019

One thought on “Проксирование запросов в nginx с помощью proxy_pass

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Авторизация
*
*
Регистрация
*
*
*
Генерация пароля