我正在使用 Ubuntu 14.04 和 apache 运行 EC2 服务器,并且我有一个使用 CakePHP 的 Ratchet websocket 插件的应用程序。我在本地主机上运行良好,我想在服务器上测试该应用程序。当我通过 SSH 进入我的服务器并启动 shell 脚本时,它运行良好。但是,当我实际转到使用 websocket 连接的页面时,在 chrome 上的网络选项卡中它显示 websocket(待处理),然后它失败并出现以下错误
WebSocket 连接‘ws://my.ip.address:8080/websocket’失败:建立连接时出错:net::ERR_CONNECTION_TIMED_OUT
我使用telnet my.server.ip.address 80
并成功连接。我也能连接到端口 22,但由于“协议不匹配”,它立即被踢出。我尝试了同样的事情,但在端口 8080 上,出现了连接超时。
我可以通过 ssh 连接到我的服务器并使用telnet 127.0.0.1 8080
。我无法从外部计算机执行此操作,只能从 SSH 连接的本地地址执行此操作。我使用了sudo tcpdump -i any port 8080
一个通过 SSH 连接的单独终端,并显示了我的 telnet 连接的流量。因此,我相信端口 8080 是开放的,我可以从内部连接,但无论 UFW 显示什么,到端口 8080 的所有外部流量似乎都被阻止了。
在本地主机上开发时,如果我忘记启用 websocket 服务器,我就会收到相同的连接超时错误。
当我使用nmap -p 8080 my.server.ip.address
它时,它显示状态为已过滤。当我对端口 80 执行相同操作时,它显示状态为打开。
在我的服务器上,我启动了 websocket,然后在终端中我使用netstat -ntlp | grep LISTEN
它确实显示端口 8080 正在监听。
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 3532/php
当我停止 websocket 并再次运行 netstat 命令时,它就消失了
在我的本地机器(websocket 在其上运行)上,我打开了另一个终端,并用它sudo tcpdump -i any port 8080
来监控实时流量。我打开了网络浏览器,果然,通过 websocket 的所有流量都被捕获了。我在我的服务器上做了同样的事情,没有显示任何活动。
经过一番寻找,我找到了一个人在 Ratchet 插件 github 问题页面上似乎也有类似的问题。插件的创建者回复了Hey, regarding your first comment is that if you pass it through a webserver you have to set it up to proxy the websocket connections to Ratchet.
,但我不太清楚那是什么意思。那是指端口监听,还是其他意思?
这是我的 UFW 状态
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
2222/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
8080/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
2222/tcp (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
8080/tcp (v6) ALLOW Anywhere (v6)
答案1
答案2
您的端口未在 EC2 安全组中打开。请检查您的 EC2 控制台以打开与服务器绑定的安全组的端口。