Проблема при подключении WebSocket (socketo.me) к размещенному серверу

Когда я попытался запустить приложение чата с локального хоста, подключенного к базе данных MySQL, которая была закодирована с помощью PHP через WebSocket, это было успешным.

Кроме того, когда я пытался запустить с терминала PuTTY, подключенного к учетным данным SSH, он отображался как Сервер запущен с портом # 8383

somelabz@bh-ht-3 [~/public_html/chatroom-php-mysql/bin]# php server.php
Server Started.somelabz@bh-ht-3 [~/public_html/chatroom-php-mysql/bin]# php server.php
Server Started.

Сервер запускается с любым из портов №, кроме 8080. Так как я решил открыть порт с 8383, в результате он запустился успешно.

С портом 8080 журнал ошибок генерировался как

[07-Oct-2018 06:11:02 Etc/GMT] PHP Fatal error:  Uncaught RuntimeException: Failed to listen on "tcp://0.0.0.0:8080": Address already in use in /home/somelabz/public_html/chatroom-php-mysql/vendor/react/socket/src/TcpServer.php:164
Stack trace:
#0 /home/somelabz/public_html/chatroom-php-mysql/vendor/react/socket/src/Server.php(36): React\Socket\TcpServer->__construct('tcp://0.0.0.0:8...', Object(React\EventLoop\StreamSelectLoop), Array)
#1 /home/somelabz/public_html/chatroom-php-mysql/vendor/cboden/ratchet/src/Ratchet/Server/IoServer.php(59): React\Socket\Server->__construct('0.0.0.0:8080', Object(React\EventLoop\StreamSelectLoop))
#2 /home/somelabz/public_html/chatroom-php-mysql/bin/server.php(15): Ratchet\Server\IoServer::factory(Object(Ratchet\Http\HttpServer), 8080)
#3 {main}
  thrown in /home/somelabz/public_html/chatroom-php-mysql/vendor/react/socket/src/TcpServer.php on line 164

server.php

<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;

require dirname(__DIR__) . '/vendor/autoload.php';

$server = IoServer::factory(
   new HttpServer(
     new WsServer(
          new Chat()
    )
   ),
   8383
);
$server->run();

chatroom.php

// For other computers to connect, you will probably need to change this to your LAN IP or external IP,
// alternatively use: gethostbyaddr(gethostbyname($_SERVER['SERVER_NAME']))
// $Server->wsStartServer($_SERVER['SERVER_ADDR'], 9300);
var conn = new WebSocket('ws://localhost:8383');
<script type="text/javascript">
        $(document).ready(function(){
            var conn = new WebSocket('ws://localhost:8383');
            conn.onopen = function(e) {
                console.log("Connection established!");
            };

    ...
</script>

Проверяя информацию консоли в браузере, я получал следующие журналы, когда пытался переключить / изменить имя домена, а также номер порта, играя с перестановками и комбинациями из файла chatroom.php и server.php

var conn = new WebSocket ('ws: // localhost: 8383');
var conn = new WebSocket ('ws: //192.197.161.61/~somelabz: 8383');
var conn = new WebSocket ('ws: //somelabz.ml/chatroom-php-mysql: 8383');
var conn = new WebSocket ('ws: //somelabz.ml: 8383 /');
var conn = new WebSocket ('ws: //192.197.161.61: 8383 /');

Раньше я получал следующие ошибки:

chatroom.php: 73 Соединение WebSocket с 'ws: //somelabz.ml: 8383 /' не удалось: Ошибка при установлении соединения: net :: ERR_CONNECTION_TIMED_OUT

chatroom.php: 73 Соединение WebSocket с 'ws: //192.197.161.61/~somelabz: 8383' не удалось: ошибка во время рукопожатия WebSocket: неожиданный код ответа: 404

Соединение WebSocket с 'ws: //somelabz.ml/chatroom-php-mysql: 8383' не удалось: ошибка во время рукопожатия WebSocket: неожиданный код ответа: 404

Соединение WebSocket с 'ws: //somelabz.ml: 8383 /' не удалось: ошибка при установлении соединения: net :: ERR_CONNECTION_TIMED_OUT

Соединение WebSocket с 'ws: //192.197.161.61: 8383 /' не удалось: ошибка при установлении соединения: net :: ERR_CONNECTION_TIMED_OUT


Как я могу разрешить / преодолеть при подключении к WebSocket, особенно с размещенного сервера с таким доменным именем, как http://somelabz.ml/chatroom-php-mysql

var conn = new WebSocket ('ws: // localhost: 8383');

Это были файлы композитора, созданные после выполнения и добавления папки src $composer require cboden/ratchet

composer.json (на сервере)

{
    "autoload": {
        "psr-4": {
            "MyApp\\": "src"
        }
    },
    "require": {
        "cboden/ratchet": "^0.4.1"
    }
}

composer.json (на локальном хосте)

{
    "autoload": {
        "psr-4": {
            "MyApp\\": "src"
        }
    },
    "require": {
        "cboden/ratchet": "^0.4.3"
    }
}

person Nɪsʜᴀɴᴛʜ ॐ    schedule 07.10.2018    source источник


Ответы (1)


Окончательный вывод

У вас никогда не будет других вариантов запуска каких-либо услуг на сервере учетной записи перепродавца даже с Node.js

Решение заключается либо в изменении кода, либо в обновлении / покупке сервера:

  1. Длинный пул AJAX
  2. Служба выделенного хостинга
  3. Виртуальный частный сервер (VPS)

Во-первых,

Что ж, сайт Bluehost пишет:

«Мы блокируем доступ к определенным портам, чтобы избежать дыр в безопасности брандмауэра ... Покупка выделенного IP-адреса позволит нам предоставить вам доступ к портам, которые вам понадобятся для запуска ваших конкретных служб».


Поскольку сервер BlueHost блокирует входящие запросы к сокету на определенных портах, это потому, что они не разрешают WebSocket на общем хостинге.

Единственный способ получить аналогичный результат - это использовать AJAX Long Pooling или нам нужно обновить виртуальный сервер для запуска ваших собственных служб.

мы не должны запускать скрипты вроде phpwebsocket внутри веб-службы (это сам сервер). Это сбивает с толку многих людей, поскольку PHP обычно используется для написания скриптов на веб-страницах, а не для программирования демонов.

Я говорю это, потому что я упомянул запуск сценария в Xampp и назвал службу хостинга «Bluehost».
В этом случае нам нужно перейти на пакет виртуального сервера, чтобы вы могли запускать свои собственные службы .

Имеется до 65 535 портов. Веб-сервер не может использовать порты ниже 1024 в качестве прослушивающих сокетов,
потому что в большинстве систем ниже порты требуют привилегий root. Ни один здравомыслящий провайдер не станет запускать веб-сервер с правами root. Это влияет на все серверы Linux. Вот почему он работает на Xampp с портами # 443 и 80 в httpd-ssl.conf и httpd.conf соответственно. Нам нужен выделенный сервер. Хотя бы виртуальный.

Во-вторых,

Перед прослушиванием сокета я должен сначала привязать его к адресу. Привязка к адресу точно определяет, в каком интерфейсе должен быть открыт этот порт сервера. Привязка к 0.0.0.0 - это особый случай, когда вы хотите прослушивать все IP-адреса, известные интерфейсу.
Специальная привязка к 127.0.0.1 должна сделать порт сервера видимым только для кода, который может подключаться к локальному хосту (например, локальным процессам). Связывание можно использовать только для приема локальных подключений. Если у вас несколько IP-адресов, у вас также могут быть разные серверы, прослушивающие один и тот же порт, но на разных IP-адресах


Обновление:

В моем случае сервер не поддерживал запуск веб-служб. Кто-то может пойти и выбрать облачные сервисы, такие как GCP, Amazon, Heroku и т. Д. Но это определенно связано с некоторыми накладными расходами, если вы пытаетесь запустить этот проект в течение более длительного периода времени.

person Nɪsʜᴀɴᴛʜ ॐ    schedule 08.10.2018