coderisimo
@coderisimo

Как настроить web-sockets на docker с PHP и nginx?

Пытался решить задачку в течение нескольких дней. Результата, увы, нет.
Суть - хочу настроить работу с web-sockets на docker , php и nginx. Попробую детально описать , как все настроено.
Использую workerman.При запуске получаю :
------------------------------------------- WORKERMAN --------------------------------------------
Workerman version:4.0.5          PHP version:7.2.24
-------------------------------------------- WORKERS ---------------------------------------------
proto   user            worker          listen                      processes    status           
tcp     root            omg             websocket://0.0.0.0:8282    4             [OK]            
--------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.

т.е он работает.
Докер PS
b9beab6b1e51        nginx:latest        "nginx -g 'daemon of…"   36 seconds ago      Up 35 seconds       0.0.0.0:8000->80/tcp     pwa_nginx_1
b4583dd4af96        pwa_php             "docker-php-entrypoi…"   37 seconds ago      Up 36 seconds       8282/tcp, 9000/tcp       pwa_php_1
978dc6e1e1cb        mariadb             "docker-entrypoint.s…"   4 days ago          Up 37 seconds       0.0.0.0:3306->3306/tcp   pwa_mysql_1

docker-compose :

version: '2'
services:
    nginx:
      # используем последний стабильный образ nginx
        image: nginx:latest
        # маршрутизируем порты
        ports:
            - "8000:80"      
        # монтируем директории, слева директории на основной машине, справа - куда они монтируются в контейнере
        volumes:
            - ./hosts:/etc/nginx/conf.d
            - ./www:/var/www
            - ./logs:/var/log/nginx
        # nginx должен общаться с php контейнером
        links:
            - php
    php:
        # у нас свой образ для PHP, указываем путь к нему и говорим что его надо собрать
        build: ./images/php
        expose: 
            - "8282"

        # этот образ будет общаться с mysql
        links:
            - mysql
        # монтируем директорию с проектами
        volumes:
            - ./www:/var/www
    mysql:
        image: mariadb
        ports:
            - "3306:3306"
        volumes:
            - ./mysql:/var/lib/mysql
        # задаем пароль для root пользователя
        environment:
            MYSQL_ROOT_PASSWORD: secret


NGINX

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
    }

server {
    charset utf-8;
    client_max_body_size 256M;

    listen 80; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6
    root        /var/www/distancer/web;
    index       index.php;

    server_name distancer;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    location /ws {
        proxy_pass http://php:8282/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        #added from https://github.com/walkor/Workerman/issues/248
        proxy_set_header X-Real-IP $remote_addr;
        proxy_read_timeout 950s;   
        proxy_set_header Host $http_host;
    }

    location / {
        # Redirect everything that isn't a real file to index.php
        try_files $uri $uri/ /index.php$is_args$args;
    }

  
    location ~ ^/assets/.*\.php$ {
        deny all;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass php:9000;
        fastcgi_read_timeout 500;
        try_files $uri =404;
    }
    location ~* /\. {
        deny all;
    }

}



js код

var conn = new WebSocket('ws://127.0.0.1');
            conn.onopen = function (e) {
                console.log("Connection established!");
            };



Сам сайт работает нормально. Все открывается без проблем. Сокеты не работают.
Пробовал разные конфиги для докера и nginx в миллионе комбинаций и вариаций (потанцевал с бубном на славу!).
Ошбика сохраняется, глаз дергается.
Запрос ws://127.0.0.1 - дает net::ERR_CONNECTION_REFUSED или Error during WebSocket handshake: Unexpected response code: 200.
Вроде, тема стандартная, а четких рецептов решения найти не могу. Куча разных варинатов , одинаково бесполезных.
Пробовал пробрасывать php наружу и обращаться к нему напрямую.
expose - "8282:8282" , получал IP php контейнера ( например 127.0.21.1) через inspect и обращался ws://127.0.21.1:8282. Результат такой же.

в общем, буду рад идеям, комментариям И так далее.
Спасибо
  • Вопрос задан
  • 1946 просмотров
Решения вопроса 1
coderisimo
@coderisimo Автор вопроса
Подсказано Andrey Shatokhin
Просто обращаться нужно на ws://127.0.0.1:8000/ws я же пробовал вот так ws://127.0.0.1:8000/ - без /ws в конце

Соответственно location /ws в конфиге nginx - не работал.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@pureweb-creator
Столкнулся с такой же проблемой, спасибо, помогло. Но у меня вопрос небольшой, как ты запускал скрипт с вебсокетом? В докерфайле? Просто у меня не получается никак.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы