Как настроить nginx и php-fpm для обеспечения корректной работы websocket в Bitrix24?

Как настроить работу вебсокетов с контейнерами nginx + php-fpm + mysql + memcached + push&pull v2.0?
  • 29 июля 2024 г. 17:23
Ответы на вопрос 2
Для обеспечения корректной работы websocket в Bitrix24 с помощью nginx и php-fpm потребуется следующие настройки:

1. Установите и настройте nginx с поддержкой websocket. Для этого добавьте следующую конфигурацию в ваш файл конфигурации nginx:

```
server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass http://localhost:8080; 
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
```

2. Настройте php-fpm для поддержки websocket. Для этого отредактируйте файл php.ini и установите следующие параметры:

```
cgi.fix_pathinfo=0
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
```

3. Перезапустите nginx и php-fpm после внесения изменений.

Для настройки работы вебсокетов с контейнерами nginx + php-fpm + mysql + memcached + push&pull v2.0 потребуется создать специальную среду для работы с вебсокетами.

1. Установите и настройте контейнеры nginx, php-fpm, mysql, memcached и push&pull v2.0. Для этого можно воспользоваться docker-compose или другим инструментом управления контейнерами.

2. Пропишите соответствующие настройки в ваш файл конфигурации nginx, а также в конфигурации php-fpm.

3. Убедитесь, что все контейнеры имеют доступ друг к другу и правильно сконфигурированы для работы с вебсокетами.

4. Перезапустите все контейнеры после внесения изменений.

Следуя этим шагам, вы сможете настроить работу вебсокетов с контейнерами nginx + php-fpm + mysql + memcached + push&pull v2.0 и обеспечить корректную работу websocket в Bitrix24.
https://nginx.org/ru/docs/http/ngx_http_rewrite_mo... 

Директивы break, if, return, rewrite и set обрабатываются в следующем порядке:

последовательно выполняются директивы этого модуля, описанные на уровне server;
в цикле:
ищется location по URI запроса;
последовательно выполняются директивы этого модуля, описанные в найденном location;
цикл повторяется, если URI запроса изменялся, но не более 10 раз.


server {

    if (!-e $request_filename) {
       rewrite  ^(.*)$  /bitrix/urlrewrite.php last;
    }

    location ~* ^/bitrix/subws/ {
        proxy_pass http://push-upstream;
        ...
    }

Тут первыми выполняются if и rewrite , описанные на уровне server .
URI запроса меняется на /bitrix/urlrewrite.php и только потом начинается поиск подходящего location.
Так что в location ~* ^/bitrix/subws/ { запрос уже никогда не попадёт.

If is Evil... when used in location context
Сочетание if + try_files работает криво.
location / {
    if (-f /var/www/bitrix/index.php) {
        root /var/www/bitrix;
        break;
    }
    if (-f /var/www/bitrix/bitrixsetup.php) {
        root /var/www/bitrix;
        break;
    }
    if (-f /var/www/bitrix/restore.php) {
        root /var/www/bitrix;
        break;
    }
    try_files $uri $uri/ @bitrix;
    root  /var/www/bitrix;
}

location @bitrix {
    fastcgi_pass php-upstream;

Так как не работает try_files, то запрос не может попасть в location @bitrix . В итоге ошибка 404.

Нужно убрать:
if (-f /var/www/bitrix/index.php) {
    root /var/www/bitrix;
    break;
}
if (-f /var/www/bitrix/bitrixsetup.php) {
    root /var/www/bitrix;
    break;
}
if (-f /var/www/bitrix/restore.php) {
    root /var/www/bitrix;
    break;
}


if (!-e $request_filename) {
   rewrite  ^(.*)$  /bitrix/urlrewrite.php last;
}
Похожие вопросы