Добавление чата через веб-сокет в существующее веб-приложение PHP

У меня есть существующее веб-приложение на стандартной платформе PHP/Apache. Теперь я хочу добавить функциональность чата, и я хочу, чтобы он работал в режиме реального времени через веб-сокет, и в этом отношении я немного изучил socket.io на nodejs. Таким образом, в дополнение к Apache, работающему с большим приложением PHP, я бы использовал nodejs с socket.io, работающим в чате.

Но чего я действительно не понимаю, так это того, как я узнаю своих пользователей в коде для чата nodejs? Во-первых, Apache и nodejs не смогут работать на одном и том же порту, то есть я буду запускать чат, например, на порту 8080, и в этом случае я потеряю файлы cookie пользователя, что означает, что теперь я должен попросить их войти еще раз на этом порту на основе nodejs, если они хотят использовать чат? Звучит смешно, но я не знаю, как это сделать.

Конечно, я не могу перенести весь свой код на nodejs. Поэтому в идеале я бы хотел, чтобы Apache и nodejs сосуществовали. Или я просто совершенно не понимаю, как чат должен работать в веб-приложениях.

Любые советы приветствуются.


person Digital Ninja    schedule 24.12.2016    source источник
comment
Вы можете запустить сервер WebSocket на PHP, при условии, что вы можете правильно настроить свой сервер.   -  person Dai    schedule 24.12.2016
comment
Если вы переключитесь на Nginx, вы можете сделать это на том же порту с тем же URL-адресом, например, «exampe.com/chat» указывает на систему nodejs, а все остальное указывает на систему PHP.   -  person SudoKid    schedule 25.12.2016
comment
Сделал мой ответ ниже помочь тебе? Любые комментарии?   -  person rsp    schedule 27.12.2016
comment
@rsp Я думаю, что это, вероятно, решение, которое я в конечном итоге выберу, если все пойдет хорошо с его настройкой. Я просто не успел поиграть с ним за это время. Я приму ваш ответ, как только попробую, если у меня не будет дополнительных проблем.   -  person Digital Ninja    schedule 28.12.2016


Ответы (1)


Вы можете запустить свой Apache с PHP, например. порт 3001 и ваше приложение Node на порту 3002, и настройте nginx в качестве обратного прокси-сервера, чтобы сделать их доступными на порту 80, например, ваше приложение PHP в корневом каталоге / и ваше приложение Node в каталоге /chat, с конфигурацией nginx, например это:

server {
    listen 80;
    server_name example.com;
    location /chat {
        proxy_pass http://localhost:3002;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
    location / {
        proxy_pass http://localhost:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}

С SSL было бы немного сложнее, но не настолько:

server {
    listen 443;
    server_name example.com;
    add_header Strict-Transport-Security "max-age=3600";
    ssl on;
    ssl_certificate /.../chained2.pem;
    ssl_certificate_key /.../domain.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
    ssl_session_cache shared:SSL:50m;
    ssl_prefer_server_ciphers on;

    location /chat {
        proxy_pass http://localhost:3002;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }

    location / {
        proxy_pass http://localhost:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }

}

Ваши приложения PHP и Node могут даже работать на разных серверах — просто используйте их адреса в конфигурации nginx.

Смотрите этот ответ и его комментарии для более подробной информации:

person rsp    schedule 24.12.2016
comment
как я могу настроить два процесса, работающих на двух машинах с помощью пушки? нам нужно включить nginx для этих служб с частным IP-адресом и вызовом внутри основного nginx? - person Karesh A; 06.04.2017