Подписка на блог

Расширьте границы знаний о Linux и станьте настоящим гиком

Прокси-сервер Nginx для Битрикс24

У меня возникла необходимость разместить сервер Nginx с публичным IP-адресом за виртуальной машиной Bitrix. Однако выяснилось, что процесс не такой простой. Для корректной работы Bitrix требуется более глубокая настройка конфигурации Nginx. После проведения исследования на различных форумах я обнаружил подходящее решение данной проблемы.

Шаг 1. Производим обновление Nginx до версии, не ниже используемой на виртуальной машине Bitrix24. В моем случае это была версия 1.20.2, которая включала в себя пакеты nginx-extras, необходимые для правильной передачи специальных заголовков websocket.

Шаг 2. Производим настройку nginx на виртуальной машине Bitrix24.

Открываем конфигурационный файл nginx для битрикса. По умолчанию это /etc/nginx/bx/site_avaliable/s1.conf:

# Default website
    server {
            listen 80 default_server;
            server_name _;
            server_name_in_redirect off;

	    access_log /var/log/nginx/access.log main;
	    error_log /var/log/nginx/error.log warn;

            proxy_set_header        X-Real-IP        $remote_addr;
            proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header        Host $host:443;

	    set_real_ip_from 192.168.88.20;
	    real_ip_header X-Forwarded-For;

            set $proxyserver        "http://127.0.0.1:8888";
            set $docroot            "/home/bitrix/www";

            index index.php;
            root /home/bitrix/www;

            # Redirect to ssl if need
            if (-f /home/bitrix/www/.htsecure) { rewrite ^(.*)$ https://$host$1 permanent; }

            # Include parameters common to all websites
            include bx/conf/bitrix.conf;

            # Include server monitoring locations
            include bx/server_monitor.conf;
    }

Здесь мы изменили только proxy_set_header Host $host:80; на proxy_set_header Host $host:443; чтобы nginx подставлял в заголовки 443 порт и добавили два новых параметра для того, чтобы получать реальные ip-адреса посетителей:
set_real_ip_from 192.168.88.20; и real_ip_header X-Forwarded-For;, где в set_real_ip_from указывается ip-адрес проксирующего nginx-сервера, с которого разрешается получать настоящие адреса.

Перезапускаем nginx командой:

service nginx reload

Шаг 3. Производим настройку реверс-прокси в Nginx.

В файле nginx.conf в разделе «http» добавляем параметры, соответствующие настройкам из файла nginx.conf виртуальной машины Bitrix24. Эти параметры у меня сгруппированы в файле bx/bx_general_proxy_settings.conf. Также необходимо добавить директивы «map» из файла bx/settings/rtc-im_settings.conf:

include bx/rtc-im_settings.conf;
include bx/bx_general_proxy_settings.conf;

Конфиг bx/bx_general_proxy_settings.conf:

proxy_connect_timeout           300;
        proxy_send_timeout              300;
        proxy_read_timeout              300;
        proxy_buffer_size               64k;
        proxy_buffers                   8 256k;
        proxy_busy_buffers_size         256k;
        proxy_temp_file_write_size      10m;

        gzip                            on;
        gzip_proxied                    any;
        gzip_static                     on;
        gzip_http_version               1.0;
        gzip_types                      application/x-javascript application/javascript text/css;

        default_type application/force-download;

        tcp_nopush                      on;
        tcp_nodelay                     on;

        client_max_body_size            1024m;
        client_body_buffer_size         4m;

Так же имейте ввиду, что данные конфигурации могут дублироваться с конфигурациями nginx.conf, из-за чего будет возникать ошибка о дубликате. Поэтому данный файл я у себя не добавлял, а всего лишь изменил конфигурации nginx.conf под себя.

Конфиг bx/rtc-im_settings.conf:

log_format simple '$time_local $status $request';

# if connection ti not set
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' 'close';
}

map $http_upgrade  $replace_upgrade {
  default $http_upgrade;
  ''      "websocket";
}

Конфиг файл conf.d/domain.conf

server {
    listen       80;
    if ($host = {DNS name}) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
}
server {
        listen       443 ssl;
        server_name {DNS name} www.{DNS name};
        access_log /var/www/httpd-logs/{DNS name}.access.log;
        error_log /var/www/httpd-logs/{DNS name}.error.log notice;
        ssl_certificate /etc/letsencrypt/live/{DNS name}/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/{DNS name}/privkey.pem; # managed by Certbot
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
        ssl_prefer_server_ciphers on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        location / {

                proxy_ignore_client_abort on;
                proxy_pass https://{IP VM B24}:443;
                proxy_redirect https://{IP VM B24}:443 /;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header HTTPS YES;

            # for Push&Pull
            location /bitrix/subws/ {
                access_log off;
                proxy_max_temp_file_size 0;
                proxy_read_timeout  43800;
                proxy_http_version 1.1;
                proxy_pass https://{IP VM B24}:443;
                proxy_set_header Upgrade $replace_upgrade;
                proxy_set_header Connection $connection_upgrade;
                proxy_redirect https://{IP VM B24}:443 /;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header HTTPS YES;
            }
            location /bitrix/sub/ {
                access_log off;
                rewrite ^/bitrix/sub/(.*)$ /bitrix/subws/$1 break;
                proxy_pass https://{IP VM B24}:443;
                proxy_max_temp_file_size 0;
                proxy_read_timeout  43800;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header HTTPS YES;
            }

            location /bitrix/rest/ {
                access_log off;
                proxy_pass https://{IP VM B24}:443;
                proxy_max_temp_file_size 0;
                proxy_read_timeout  43800;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header HTTPS YES;
            }
         }
}

Для проведения тестов вводим команду

nginx -t

На этом все, настройка завершена. Перечитываем конфиги:

nginx -s reload

Перезапускаем nginx командой

service nginx reload
Подписаться на блог
Отправить
Поделиться