Socket.io를 사용하여 방송하는 Laravel Echo용 NodeJs 서버입니다.
제대로 작동하려면 다음이 필요합니다.
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 서버는 브로드캐스팅 기능을 수행하기 위해 가벼운 http API를 노출합니다. 보안을 위해 http 리퍼러에서 이러한 엔드포인트에 액세스하려면 APP ID와 키를 사용하여 인증해야 합니다. 이는 cli 명령을 사용하여 생성할 수 있습니다.
$ laravel-echo-server client:add APP_ID
app id 인수 없이 client:add
실행하면 하나가 생성됩니다. 이 명령을 실행하면 클라이언트 ID와 키가 표시되고 laravel-echo-server.json 파일에 저장됩니다.
이 예에서는 앱 ID와 키가 모두 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 | {} | CORS를 통해 API에 액세스할 수 있도록 구성합니다. 예 |
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
참고 : .env 파일에 LARAVEL_ECHO_SERVER_HOST
옵션이 설정된 경우 이 옵션은 기본값으로 대체됩니다.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
구성 파일을 찾을 작업 디렉터리는 다음과 같이 --dir
매개변수를 통해 start
명령에 전달될 수 있습니다: laravel-echo-server start --dir=/var/www/html/example.com/configuration
Laravel Echo 서버는 Redis와 Http라는 두 가지 방법으로 들어오는 이벤트를 구독합니다.
핵심 애플리케이션은 Redis를 사용하여 이벤트를 채널에 게시할 수 있습니다. Laravel Echo 서버는 해당 채널을 구독하고 소켓.io를 통해 해당 메시지를 브로드캐스팅합니다.
Http를 사용하면 channel
과 message
브로드캐스트 엔드포인트에 제출하여 Redis에서와 동일한 방식으로 Laravel Echo 서버에 이벤트를 게시할 수도 있습니다. 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-
추가합니다. 채널 - 단일 채널 대신 한 번의 요청으로 여러 채널에 방송할 수 있습니다. name - 앱 내 이벤트 키를 나타내는 문자열입니다. 데이터 - 채널에 브로드캐스트하려는 데이터입니다. 소켓_ID(선택 사항) - 이벤트를 시작한 사용자의 소켓 ID입니다. 존재하는 경우 서버는 "다른 사람에게만 브로드캐스트"합니다.
HTTP 구독자는 Laravel Pusher 구독자와 호환됩니다. Socket.IO 서버의 호스트와 포트를 구성하고 config/broadcasting.php에서 앱 ID와 키를 설정하기만 하면 됩니다. 비밀은 필요하지 않습니다.
' pusher ' => [
' driver ' => ' pusher ' ,
' key ' => env ( ' PUSHER_KEY ' ),
' secret ' => null ,
' app_id ' => env ( ' PUSHER_APP_ID ' ),
' options ' => [
' host ' => ' localhost ' ,
' port ' => 6001 ,
' scheme ' => ' http '
],
],
이제 Redis를 사용하지 않고 HTTP를 사용하여 이벤트를 보낼 수 있습니다. 또한 Pusher API를 사용하여 Pusher PHP 라이브러리에 설명된 대로 채널/사용자를 나열할 수 있습니다.
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
apiOriginAllow
의 allowCors
true
로 변경하여 laravel-echo-server.json 파일에서 교차 도메인 액세스를 지정할 수 있습니다. 그런 다음 CORS Access-Control-Allow-Origin, Access-Control-Allow-Methods를 쉼표로 구분된 문자열(GET 및 POST는 기본적으로 활성화됨)로 설정하고 API가 수신할 수 있는 Access-Control-Allow-Headers를 설정할 수 있습니다.
아래 예:
{
"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 "
}
}
이를 통해 동일한 도메인이지만 다른 포트 또는 완전히 다른 도메인에서 실행될 수 있는 앱에서 AJAX를 통해 API에 요청을 보낼 수 있습니다.
현재 상태 채널 데이터를 유지하기 위해 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를 사용하여 저장됩니다.
프레즌스 채널에는 사용자 목록이 포함되어 있지만 사용자가 프레즌스 채널에 여러 번 참여하는 경우가 있습니다. 예를 들어, 여러 브라우저 탭을 열 때 이런 일이 발생합니다. 이 상황에서는 "가입" 및 "탈퇴" 이벤트가 사용자의 첫 번째 및 마지막 인스턴스에만 발생합니다.
선택적으로, databaseConfig.publishPresence
true
로 설정하여 업데이트할 때마다 이벤트를 프레즌스 채널에 게시하도록 laravel-echo-server를 구성할 수 있습니다.
{
"database" : " redis " ,
"databaseConfig" : {
"redis" : {
"port" : " 6379 " ,
"host" : " localhost "
},
"publishPresence" : true
}
}
Laravel의 Redis 통합을 사용하여 거기에서 애플리케이션 코드를 트리거할 수 있습니다.
Redis :: subscribe ([ ' PresenceChannelUpdated ' ], function ( $ message ) {
var_dump ( $ message );
});
자세한 내용은 공식 Laravel 문서를 참조하세요. https://laravel.com/docs/master/broadcasting#introduction
실행 중인 서버에서 소켓.io 클라이언트 라이브러리를 포함할 수 있습니다. 예를 들어, 서버가 app.dev:6001
에서 실행 중인 경우 다음과 같이 HTML에 스크립트 태그를 추가할 수 있습니다.
<script src="//app.dev:6001/socket.io/socket.io.js"></script>
참고: 실행 중인 서버에서 소켓.io 클라이언트 라이브러리를 사용하는 경우 이벤트를 구독하기 전에 io
전역 변수가 정의되어 있는지 확인해야 합니다.
µWebSockets는 공식적으로 더 이상 사용되지 않습니다. 현재 Socket.IO에는 µWebSocket이 지원되지 않지만 새로운 ClusterWS 지원이 들어올 수 있습니다. 한편 Laravel Echo 서버는 다른 옵션이 있을 때까지 기본적으로 ws
엔진을 사용합니다.