Как настроить 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.
<a href="https://nginx.org/ru/docs/http/ngx_http_rewrite_module.html" rel="nofollow">https://nginx.org/ru/docs/http/ngx_http_rewrite_mo...</a> <br/> <br/> <blockquote>Директивы break, if, return, rewrite и set обрабатываются в следующем порядке:<br/>
<br/>
    последовательно выполняются директивы этого модуля, описанные на уровне server;<br/>
    в цикле:<br/>
        ищется location по URI запроса;<br/>
        последовательно выполняются директивы этого модуля, описанные в найденном location;<br/>
        цикл повторяется, если URI запроса изменялся, но не более 10 раз.</blockquote> <br/> <br/> <pre><code class="nginx">server {

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

    location ~* ^/bitrix/subws/ {
        proxy_pass http://push-upstream;
        ...
    }</code></pre> <br/> Тут первыми выполняются <code class="nginx">if</code> и <code class="nginx">rewrite</code> , описанные на уровне <code class="nginx">server</code> . <br/> URI запроса меняется на /bitrix/urlrewrite.php и только потом начинается поиск подходящего location. <br/> Так что в <code class="nginx">location ~* ^/bitrix/subws/ {</code> запрос уже никогда не попадёт. <br/> <br/> <a href="https://github.com/nginxinc/nginx-wiki/blob/836ecd605a1b9861fb608e848336bca9b8640b54/source/start/topics/depth/ifisevil.rst" rel="nofollow">If is Evil... when used in location context</a> <br/> Сочетание if + try_files работает криво. <br/> <pre><code class="nginx">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;</code></pre> <br/> Так как не работает try_files, то запрос не может попасть в <code class="nginx">location @bitrix</code> . В итоге ошибка 404. <br/> <br/> Нужно убрать: <br/> <pre><code class="nginx">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;
}</code></pre> <br/> <br/> <pre><code class="nginx">if (!-e $request_filename) {
   rewrite  ^(.*)$  /bitrix/urlrewrite.php last;
}</code></pre>
Похожие вопросы