无法与在 EC2 上运行的 Laravel Websockets 建立连接
Posted
技术标签:
【中文标题】无法与在 EC2 上运行的 Laravel Websockets 建立连接【英文标题】:Cannot get a connection with Laravel Websockets running on EC2 【发布时间】:2021-09-22 11:47:49 【问题描述】:我毫不怀疑comments here 不起作用。从表面上看,它应该。无论我做了什么,我都会收到502
。我的设置有点不同:
我们有一个带有 AWS 的 ec2。我们有一个私有 IP (10.0.0.1) 和一个公共 IP (52.0.0.1)。安装Laravel Websockets后,我可以用php artisan websockets:serve
作为Pusher替换启动一个websocket服务器(ws)。
这就是我困惑的地方,我应该以--host=10.0.0.1
开头的ws 吗?这是我的 nginx 设置:
# 52.0.0.1 is not needed here. I put it here to troubleshoot ws connection
# <actual-domain-name> is the domain name ie: foobar.com
server_name 52.0.0.1 <actual-domain-name>;
# The usual Laravel configs
[..]
location /v2/api
# We use the public ip address here.
# I see no mention of the private IP in this config
# Hey, everything works
proxy_pass http://52.0.0.1/api/;
# I need to implement web sockets
location /v2/api/ws
# This is where I'm lost. Should I use 127.0.0.1, 10.0.0.1 or 52.0.0.1?
proxy_pass http://127.0.0.1:6001;
# Allow the use of websockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
使用启动ws服务器php artisan websockets:serve
的命令,然后使用Postman的websocket部分,我提出请求:ws://<actual-domain-name>/v2/api/ws
我得到502 Bad Gateway。
不管我怎么开始ws:
# I start it manually for troublshooting
php artisan websockets:serve --host=10.0.0.1
php artisan websockets:serve --host=127.0.0.1
php artisan websockets:serve
# It wont let me start with
# php artisan websockets:serve --host=52.0.0.1
我无法建立联系。为了简单起见,我没有提到 ssl,所以我使用 ws://
而不是 wss://
提出请求。我被告知在 AWS 中启用了端口 6001
,我还为 ufw
启用了端口 6001
。
laravel-websockets 配置会干扰使用php artisan websockets:serve
吗?
编辑:
config/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,
'encrypted' => true,
'host' => 127.0.0.1,
'port' => 6001,
'scheme' => 'http', // I'll use https once I get this working
'curl_options' => [
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
],
],
],
【问题讨论】:
proxy_pass
应该指向暴露服务的 IPV4。如果你想使用 Nginx 作为负载均衡器,你应该将服务暴露给127.0.0.1
(使用--host
参数)和proxy_pass
暴露给它。如果您只想将其公开给foobar.com:6001
之类的域,则将其公开给公共IPV4 和proxy_pass
。坏网关表示网络问题,看起来您想要负载平衡,因此将服务公开给127.0.0.1
和proxy_pass
给127.0.0.1:6001
。
【参考方案1】:
它不会让我以
php artisan websockets:serve --host=52.0.0.1
开头
52.0.0.1
是您的公共 Inet4 地址,这不在您的地址范围内。您不能在路由器上公开该服务。
如果您想进行负载平衡:如果本地机器同时运行这两个服务,那么您需要在环回本地公开它。如果另一台机器负责在同一网络上运行该服务,那么您需要将其公开给它的私有 IPV4。
这是一个环回示例(节点同时运行两个服务):
# expose the service on the loopback address
php artisan websockets:serve --host=127.0.0.1
location /v2/api/ws
# It also may be worth noting you'll need an X-Forwarded-For for the remote address if you plan on using the remote IPV4 inside your application
proxy_pass http://127.0.0.1:6001;
# Allow the use of websockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
记得重新加载 Nginx 服务以使更改生效。
【讨论】:
谢谢。我将私有 IPv4 用作proxy_pass http://10.0.0.1:6001;
然后以 --host=10.0.01
开始 ws 对吗?我重新启动 nginx 但仍然收到 502 ?
不,如果您在同一台机器上运行服务,则需要在 127.0.0.1
上使用您的环回地址
对。一秒……
502 表示网络问题,尝试在127.0.0.1
上公开 websocket,然后将proxy_pass
公开给127.0.0.1:6001
。这个服务肯定在这个端口上运行吗?您可以使用netstat -ano|grep 6001
进行检查。
无论位置如何,它都应该可以工作,除非您在具有相同位置的其他相关文件上配置错误。不过干得好!我想为未来的观众发布您的解决方案! :) 很高兴为您提供帮助。以上是关于无法与在 EC2 上运行的 Laravel Websockets 建立连接的主要内容,如果未能解决你的问题,请参考以下文章
phpmyadmin 无法在亚马逊 ec2 实例上的 linux ami 中的 nginx Web 服务器上工作
在 Amazon Web Services EC2 上运行的 Red Hat Enterprise Linux 中禁止使用 phpmyadmin