Nginx reverse-proxy для Bitrix VM

В данной статье я расскажу про опыт настройки nginx в качестве прокси-сервера на виртуальную машину битрикс с редиректом на https. В процессе настройки возникали разного рода ошибки, основная проблема была в том, что при перенаправлении с http на https и обращении к domain.ru/bitrix без слэша в конце, в URL подставлялся 443 и протокол менялся на http. Получалась запись вида https://domain.ru/bitrix -> http://domain.ru:443/bitrix/ и в итоге ошибка 400 Bad Request, The plain HTTP request was sent to HTTPS port. Также не работал модуль Push&Pull после установки из menu.sh необходимого модуля и подключении его в настройке самого модуля из админки (bitrix vm 7.3.3+).

Итак, одна из схем, которая заработала у меня. Конфиг прокси-сервера, куда приходит первичный запрос и где располагается SSL-сертификат:

# http
server {
        server_name domain.ru;

        listen <external_ip>:80;
        return 301 https://$host$request_uri; # принудительный редирект на https
        location / {
                proxy_ignore_client_abort on;
                proxy_pass http://10.16.0.33:80;
                proxy_redirect http://10.16.0.33:80 /;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

# https
server {
        server_name domain.ru;
        ssl_certificate "cert.crtca";
        ssl_certificate_key "cert.key";
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
        ssl_prefer_server_ciphers on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    
        listen 443 ssl;

# Для работы Push&Pull, обязательно перед проксированием SSL location /
location /bitrix/subws {
                proxy_pass http://10.16.0.33:80;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";  
                proxy_read_timeout 950s;
        }

location / {
                proxy_pass http://10.16.0.33:80;
                proxy_redirect http://10.16.0.33:80 /;
                proxy_set_header Host $host:443;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header HTTPS YES;
        }
}

Слушается 80 порт и отправляет на 443 принудительно, который уже проксирует вовнутрь виртуальной машины с битриксом. Именно в такой конфигурации все заголовки корректно проксируются и не вызывают ошибок.

В самой виртуалке с битрой по умолчанию я изменил только конфиг nginx, отвечающий за http раздел:

/etc/nginx/bx/site_avaliable/bx_ext_lk.rospartner.ru.conf

Было: proxy_set_header      Host $host:80;
Стало: proxy_set_header      Host $host; 

После этого restart или reload nginx на обоих серверах и можно проверять.

Есть ещё также рекомендации по правке конфига апача в виртуалке битрикс из-за его модуля mod_dir, где нужно добавить к нужному виртуальному хосту строку вида:
ServerName  https://domain.ru

Но у меня такой вариант не сработал и проблема была исключительно на уровне конечного nginx.

Ваш комментарий будет первым

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

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