我用Laravel /Websockets在本地主机+自签名证书上开发了一个实时聊天应用程序,在本地开发中使用SSL。到目前为止一切都很顺利。我将所有内容上传到测试服务器+ supervisord以同时运行队列和websockets:serve (自签名证书除外)。由于我们使用AWS证书管理器来设置SSL,所以在任何地方都没有私钥和证书的副本。因此,我无法在测试服务器上运行websockets。
下面是我的设置(非常基本)
/etc/httpd/con.d/project.conf
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/var/www/html/project/core/public"
<Directory "/var/www/html/project/core">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
ErrorLog "logs/project/errors.log"
CustomLog "logs/project/access.log" common
</VirtualHost>/etc/监督员f
[program:laravel-queue]
command=php /var/www/html/project/core/artisan queue:work --sleep=3 --tries=3
process_name=%(program_name)s
numprocs=1
autostart=true
autorestart=true
startsecs=10
startretries=3
user=ec2-user
redirect_stderr=true
stdout_logfile=/var/www/html/project/core/laravel-queue.log
[program:laravel-websockets]
command=php /var/www/html/project/core/artisan websockets:serve --host=127.0.0.1
process_name=%(program_name)s
numprocs=1
autostart=true
autorestart=true
startsecs=10
startretries=3
user=ec2-user
redirect_stderr=true
stdout_logfile=/var/www/html/project/core/laravel-websockets.logbroadcasting.php
'connections' => [
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'),
'useTLS' => true,
'encrypted' => true,
'host' => '127.0.0.1',
'port' => env('LARAVEL_WEBSOCKETS_PORT'),
'scheme' => 'https',
'curl_options' => [
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
],
],
],websockets.php
'ssl' => [
'local_cert' => env('LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT', null),
'local_pk' => env('LARAVEL_WEBSOCKETS_SSL_LOCAL_PK', null),
'passphrase' => env('LARAVEL_WEBSOCKETS_SSL_PASSPHRASE', null),.env
PUSHER_APP_ID=12345
PUSHER_APP_KEY=ABCDEFG
PUSHER_APP_SECRET=HIJKLMNOP
PUSHER_APP_CLUSTER=mt1
LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT=
LARAVEL_WEBSOCKETS_SSL_LOCAL_PK=
LARAVEL_WEBSOCKETS_SSL_PASSPHRASE=""
LARAVEL_WEBSOCKETS_PORT=6001
MIX_LARAVEL_WEBSOCKETS_PORT="${LARAVEL_WEBSOCKETS_PORT}"回波初始化
const Echo = new initEcho({
broadcaster: "pusher",
key: process.env.MIX_PUSHER_APP_KEY,
cluster: process.env.MIX_PUSHER_APP_CLUSTER,
wsHost: window.location.hostname,
wsPort: process.env.MIX_LARAVEL_WEBSOCKETS_PORT,
wssPort: process.env.MIX_LARAVEL_WEBSOCKETS_PORT,
forceTLS: true,
encrypted: true,
enabledTransports: ["ws", "wss"],
auth: {
headers: {
Authorization:
"Bearer " + access_token,
Accept: "application/json",
},
},
});
Echo.connector.pusher.connection.strategy.transports.ws.transport.manager.livesLeft =
Infinity;
Echo.connector.pusher.connection.strategy.transports.wss.transport.manager.livesLeft =
Infinity;
Echo.connector.pusher.connection.bind("state_change", function (states) {
// state change
});
const channel = Echo.join("chat-message")
.here(() => {
console.log("chat channel");
})
.joining((event) => {
// console.log({ event }, "joining");
})
.leaving((event) => {
// console.log({ event }, "leaving");
})
.listenForWhisper("typing", (event) => {
// console.log({ event }, "listenForWhisper");
})
.listen(".chat-message", (event) => {
// console.log({ event }, "listen");
});编辑
许多这样的Q&A提到了一些关于设置应用程序负载平衡器、SSL终端等的内容(不太了解这一点),因此我们尝试基于这个aws文档进行以下操作,并将443更改为6001 (ws端口号),并将协议更改为http或https。还是同样的问题。
更新我们也尝试做此aws添加HTTPS侦听器。还是一样,听不到端口。
我对aws及其服务的了解非常有限(我不是设置AWS ec2和ACM的人),所以如果解决方案在AWS中,请尽可能简单地教我。
发布于 2022-11-17 05:15:48
在将近两周后,我就能完成代码了。使用此设置,您不再需要在.env文件中添加私钥和证书。
broadcasting.php
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'),
'useTLS' => true,
#### ADD HERE
'encrypted' => false,
'host' => '127.0.0.1',
'port' => env('LARAVEL_WEBSOCKETS_PORT'),
'scheme' => 'http',
### ADD HERE
],
],bootstrap.js
const Echo = new Echo({
broadcaster: "pusher",
key: process.env.MIX_PUSHER_APP_KEY,
cluster: process.env.MIX_PUSHER_APP_CLUSTER,
wsHost: window.location.hostname,
// This is important
wsPort: 80,
wssPort: 443,
forceTLS: true,
encrypted: true,
enabledTransports: ["ws", "wss"],
// This is important
// optional if you are using jwt
auth: {
headers: {
Authorization:
"Bearer " + access_token,
Accept: "application/json",
},
},
// optional if you are using jwt
});
// Socket will try to reconnect indefinetly with this. If not added, echo will only try to reconnect twice as default
Echo.connector.pusher.connection.strategy.transports.ws.transport.manager.livesLeft =
Infinity;
Echo.connector.pusher.connection.strategy.transports.wss.transport.manager.livesLeft =
Infinity;
// Socket will try to reconnect indefinetly with this. If not added, echo will only try to reconnect twice as default如果使用的是Custom WebSocket Handlers,则使用此Apache代理通行证。
ProxyRequests off
ProxyVia on
RewriteEngine On
RewriteEngine On
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule /(.*) ws://127.0.0.1:6001/$1 [P,L]
ProxyPass /ws/chat http://127.0.0.1:6001/ws/chat
ProxyPassReverse /ws/chat http://127.0.0.1:6001/ws/chathttps://stackoverflow.com/questions/74345042
复制相似问题