Сервер NodeJs для трансляции Laravel Echo с помощью Socket.io.
Для правильной работы необходимо следующее.
Дополнительную информацию о трансляции с помощью Laravel можно найти в официальной документации: https://laravel.com/docs/master/broadcasting.
Установите пакет npm глобально с помощью следующей команды:
$ npm install -g laravel-echo-server
Запустите команду init в каталоге вашего проекта:
$ laravel-echo-server init
Инструмент cli поможет вам настроить файл laravel-echo-server.json в корневом каталоге вашего проекта. Этот файл будет загружен сервером во время запуска. Вы можете отредактировать этот файл позже, чтобы управлять конфигурацией вашего сервера.
Laravel Echo Server предоставляет легкий http API для выполнения функций широковещания. В целях безопасности доступ к этим конечным точкам со стороны HTTP-рефереров должен быть подтвержден с помощью идентификатора и ключа приложения. Это можно создать с помощью команды cli:
$ laravel-echo-server client:add APP_ID
Если вы запустите client:add
без аргумента идентификатора приложения, он будет сгенерирован для вас. После выполнения этой команды идентификатор и ключ клиента будут отображены и сохранены в файле laravel-echo-server.json .
В этом примере запросы будут разрешены, если идентификатор приложения и ключ будут предоставлены в HTTP-запросах.
Request Headers
Authorization: Bearer skti68i...
or
http://app.dev:6001/apps/APP_ID/channels?auth_key=skti68i...
Вы можете удалить клиентов с помощью laravel-echo-server client:remove APP_ID
в корневом каталоге вашего проекта запустите
$ laravel-echo-server start
в корневом каталоге вашего проекта запустите
$ laravel-echo-server stop
Отредактируйте конфигурацию сервера по умолчанию, добавив параметры в файл laravel-echo-server.json .
Заголовок | По умолчанию | Описание |
---|---|---|
apiOriginAllow | {} | Конфигурация, обеспечивающая доступ к API через CORS. Пример |
authEndpoint | /broadcasting/auth | Маршрут, который проверяет подлинность частных каналов |
authHost | http://localhost | Хост сервера, который аутентифицирует частные каналы и каналы присутствия. |
database | redis | База данных, используемая для хранения данных, которые должны сохраняться, например участников канала присутствия. В настоящее время доступны варианты redis и sqlite |
databaseConfig | {} | Конфигурации для различных драйверов базы данных Пример |
devMode | false | Добавляет дополнительное ведение журнала для целей разработки. |
host | null | Хост сервера Socket.io, например. app.dev . null будет принимать соединения на любом IP-адресе |
port | 6001 | Порт, на котором должен работать сервер Socket.io. |
protocol | http | Должен быть http или https |
sslCertPath | '' | Путь к SSL-сертификату вашего сервера |
sslKeyPath | '' | Путь к SSL-ключу вашего сервера |
sslCertChainPath | '' | Путь к цепочке сертификатов SSL вашего сервера. |
sslPassphrase | '' | Парольная фраза, используемая для сертификата (если применимо). |
socketio | {} | Параметры для передачи экземпляру Socket.io (доступные параметры) |
subscribers | {"http": true, "redis": true} | Позволяет отключать абонентов индивидуально. Доступные подписчики: http и redis |
Если файл .env находится в том же каталоге, что и файл laravel-echo-server.json, следующие параметры можно переопределить:
authHost
: LARAVEL_ECHO_SERVER_AUTH_HOST
Примечание . Этот параметр вернется к параметру LARAVEL_ECHO_SERVER_HOST
по умолчанию, если он установлен в файле .env.host
: LARAVEL_ECHO_SERVER_HOST
port
: LARAVEL_ECHO_SERVER_PORT
devMode
: LARAVEL_ECHO_SERVER_DEBUG
databaseConfig.redis.host
: LARAVEL_ECHO_SERVER_REDIS_HOST
databaseConfig.redis.port
: LARAVEL_ECHO_SERVER_REDIS_PORT
databaseConfig.redis.password
: LARAVEL_ECHO_SERVER_REDIS_PASSWORD
protocol
: LARAVEL_ECHO_SERVER_PROTO
sslKeyPath
: LARAVEL_ECHO_SERVER_SSL_KEY
sslCertPath
: LARAVEL_ECHO_SERVER_SSL_CERT
sslPassphrase
: LARAVEL_ECHO_SERVER_SSL_PASS
sslCertChainPath
: LARAVEL_ECHO_SERVER_SSL_CHAIN
Примечание. В настоящее время эта библиотека поддерживает обслуживание только по протоколу http или https, но не по обоим каналам.
Если вы изо всех сил пытаетесь реализовать SSL с помощью этого пакета, вы можете рассмотреть возможность использования прокси-модуля в Apache или NginX. По сути, вместо того, чтобы подключать трафик веб-сокета к https://yourserver.dev:6001/socket.io?..... и пытаться его защитить, вы можете подключить трафик веб-сокета к https://yourserver.dev/socket. .io. За кулисами прокси-модуль Apache или NginX будет настроен на перехват запросов к /socket.io и внутреннее перенаправление их на ваш эхо-сервер через порт 6001 без SSL. Это обеспечивает шифрование всего трафика между браузером и веб-сайтом. сервер, так как ваш веб-сервер по-прежнему будет выполнять шифрование/дешифрование SSL. Единственное, что остается незащищенным, — это трафик между вашим веб-сервером и вашим сервером Echo, который во многих случаях может быть приемлемым.
#the following would go within the server{} block of your web server config
location /socket.io {
proxy_pass http://laravel-echo-server:6001; #could be localhost if Echo and NginX are on the same box
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:6001/$1 [P,L]
ProxyPass /socket.io http://localhost:6001/socket.io
ProxyPassReverse /socket.io http://localhost:6001/socket.io
Рабочий каталог, в котором laravel-echo-server
будет искать файл конфигурации laravel-echo-server.json
можно передать команде start
через параметр --dir
следующим образом: laravel-echo-server start --dir=/var/www/html/example.com/configuration
Сервер Laravel Echo подписывается на входящие события двумя методами: Redis и Http.
Ваше основное приложение может использовать Redis для публикации событий в каналах. Сервер Laravel Echo подпишется на эти каналы и будет транслировать эти сообщения через Socket.io.
Используя Http, вы также можете публиковать события на сервере Laravel Echo так же, как и в Redis, отправляя channel
и message
в конечную точку трансляции. Вам необходимо сгенерировать ключ API, как описано в разделе «Клиенты API», и предоставить правильный ключ API.
Запросить конечную точку
POST http://app.dev:6001/apps/your-app-id/events?auth_key=skti68i...
Тело запроса
{
"channel" : " channel-name " ,
"name" : " event-name " ,
"data" : {
"key" : " value "
},
"socket_id" : " h3nAdb134tbvqwrg "
}
канал — имя канала, на который будет транслироваться событие. Для частных каналов или каналов присутствия добавьте private-
или presence-
. каналы . Вместо одного канала вы можете транслировать множество каналов с помощью 1 запроса. name — строка, представляющая ключ события в вашем приложении. data — данные, которые вы хотите транслировать на канал. Socket_id (необязательно) — идентификатор сокета пользователя, инициировавшего событие. Если он присутствует, сервер будет только «транслировать другим».
Подписчик HTTP совместим с подписчиком Laravel Pusher. Просто настройте хост и порт для вашего сервера Socket.IO, а также установите идентификатор приложения и ключ в config/broadcasting.php. Секрет не требуется.
' pusher ' => [
' driver ' => ' pusher ' ,
' key ' => env ( ' PUSHER_KEY ' ),
' secret ' => null ,
' app_id ' => env ( ' PUSHER_APP_ID ' ),
' options ' => [
' host ' => ' localhost ' ,
' port ' => 6001 ,
' scheme ' => ' http '
],
],
Теперь вы можете отправлять события по протоколу HTTP без использования Redis. Это также позволяет вам использовать API Pusher для получения списка каналов/пользователей, как описано в библиотеке PHP Pusher.
HTTP API предоставляет конечные точки, которые позволяют вам собирать информацию о вашем работающем сервере и каналах.
Статус Получите общее количество клиентов, время безотказной работы сервера и использование памяти.
GET /apps/:APP_ID/status
Каналы Список всех каналов.
GET /apps/:APP_ID/channels
Канал Получить информацию о конкретном канале.
GET /apps/:APP_ID/channels/:CHANNEL_NAME
Пользователи канала Список пользователей канала.
GET /apps/:APP_ID/channels/:CHANNEL_NAME/users
Междоменный доступ можно указать в файле laravel-echo-server.json, изменив allowCors
в apiOriginAllow
на true
. Затем вы можете установить CORS Access-Control-Allow-Origin, Access-Control-Allow-Methods в виде строки, разделенной запятыми (GET и POST включены по умолчанию), а также заголовки Access-Control-Allow-Headers, которые API может получить.
Пример ниже:
{
"apiOriginAllow" :{
"allowCors" : true ,
"allowOrigin" : " http://127.0.0.1 " ,
"allowMethods" : " GET, POST " ,
"allowHeaders" : " Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id "
}
}
Это позволяет вам отправлять запросы к API через AJAX из приложения, которое может работать в том же домене, но на другом порту или совершенно в другом домене.
Для сохранения данных канала присутствия поддерживается использование Redis или SQLite в качестве хранилища ключей/значений. Ключ — это имя канала, а значение — список участников канала присутствия.
Каждый драйвер базы данных можно настроить в файле laravel-echo-server.json в свойстве databaseConfig
. Параметры передаются поставщику базы данных, поэтому разработчики могут настраивать их по своему усмотрению.
Например, если вы хотите передать Redis пользовательскую конфигурацию:
{
"databaseConfig" : {
"redis" : {
"port" : " 3001 " ,
"host" : " redis.app.dev " ,
"keyPrefix" : " my-redis-prefix "
}
}
}
Примечание. Для адреса хоста не следует использовать схему (http/https и т. д.).
Полный список опций Redis можно найти здесь.
Например, если вы хотите использовать redis-sentinel, вам необходимо передать пользовательскую конфигурацию:
"databaseConfig" : {
"redis" : {
"sentinels" : [
{
"host" : " redis-sentinel-0 " ,
"port" : 26379
},
{
"host" : " redis-sentinel-1 " ,
"port" : 26379
}
{
"host" : " redis-sentinel-2 " ,
"port" : 26379
}
],
"name" : " mymaster " ,
"sentinelPassword" : " redis-password "
},
},
Для получения дополнительной информации о конфигурации Redis Sentinel вы можете проверить это
При использовании SQLite вас может заинтересовать изменение пути хранения базы данных.
{
"databaseConfig" : {
"sqlite" : {
"databasePath" : " /path/to/laravel-echo-server.sqlite "
}
}
}
Примечание 1. Путь указывается относительно корня вашего приложения, а не вашей системы.
Примечание 2: для этой базы данных требуется node-sqlite3. Пожалуйста, установите перед использованием.
npm install sqlite3 -g
Когда пользователи присоединяются к каналу присутствия, их данные аутентификации канала присутствия сохраняются с помощью Redis.
Хотя каналы присутствия содержат список пользователей, могут быть случаи, когда пользователь присоединяется к каналу присутствия несколько раз. Например, это может произойти при открытии нескольких вкладок браузера. В этой ситуации события «присоединения» и «выхода» отправляются только первому и последнему экземпляру пользователя.
При желании вы можете настроить laravel-echo-server для публикации события при каждом обновлении в канале присутствия, установив для databaseConfig.publishPresence
значение true
:
{
"database" : " redis " ,
"databaseConfig" : {
"redis" : {
"port" : " 6379 " ,
"host" : " localhost "
},
"publishPresence" : true
}
}
Вы можете использовать интеграцию Redis с Laravel, чтобы запускать оттуда код приложения:
Redis :: subscribe ([ ' PresenceChannelUpdated ' ], function ( $ message ) {
var_dump ( $ message );
});
Дополнительную информацию смотрите в официальной документации Laravel. https://laravel.com/docs/master/broadcasting#introduction
Вы можете подключить клиентскую библиотеку Socket.io со своего работающего сервера. Например, если ваш сервер работает по адресу app.dev:6001
вы сможете добавить тег сценария в свой html следующим образом:
<script src="//app.dev:6001/socket.io/socket.io.js"></script>
Примечание. При использовании клиентской библиотеки Socket.io с работающего сервера не забудьте проверить, что глобальная переменная io
определена, прежде чем подписываться на события.
µWebSockets официально объявлен устаревшим. В настоящее время в Socket.IO нет поддержки µWebSockets, но может появиться новая поддержка ClusterWS. Между тем, Laravel Echo Server будет использовать движок ws
по умолчанию, пока не появится другой вариант.