【发布时间】:2021-01-05 21:26:36
【问题描述】:
注意**我可以通过使用 route-53 和弹性 beanstalk 环境将 cloudfront 从 server.com 域的图片中移除来使事情正常运行。仍然很高兴知道为什么云端会阻止这一点,但不是直接关注开发**
我正在使用 cloudfront 和路由 53 为来自 s3 存储桶的 node.js 静态 socket.io 客户端提供服务。我正在尝试让该客户端使用弹性 beanstalk 与 node.js Web 服务器通信。网络服务器使用路由 53 域和云端与亚马逊证书管理器生成的 ssl 连接。
使用 http 客户端并直接连接到 beanstalk 环境,我看到了所需的功能。但是,当我尝试使用收到的客户端和服务器迁移到 SSL/https 时:
(log from /var/log/nginx/error.log on elastic beanstalk instance)
"GET /socket.io/ HTTP/1.1" 400 51 "-" "Amazon CloudFront"
这是从静态 s3 https 域运行的客户端代码:
import ioClient from "socket.io-client";
const ENDPOINT = "https://server.com";
export const socket = ioClient(ENDPOINT);
这里是服务器端。 process.env.port 设置为 8080,我可以通过弹性 beanstalk 日志验证应用正在侦听 8080。
const express = require("express");
const http = require("http");
const socket_io = require("socket.io");
const index = require("./routes/index");
const app = express();
app.use(index);
const server = http.createServer(app);
const io = socket_io(server);
const port = process.env.port || 4001;
server.listen(port, () => console.log(`http server listing on port ${port}`));
在 ALB 内部,我在端口 443 上设置了一个 https 侦听器,并通过 Amazon Certificate Manager (ACM) ssl 认证。侦听器有一个将 443 https 映射到 http 上的 8080 的进程,我认为 ngnix 应该从那里充当我在 8080 上的 socket.io 侦听器的反向代理
监听器和处理器
在我的节点项目文件夹的根目录中,我有一个 .ebextensions 目录,其中有一个名为 01_files.config 的文件,其中包含以下内容:
files:
"/etc/nginx/conf.d/websocketupgrade.conf" :
mode: "000755"
owner: root
group: root
content: |
proxy_pass http://localhost:8080;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header Host $host;
来自这篇帖子中的 cmets:socket.io handshake return error "Transport unknown" 我发现了以下 socket.io 错误代码
engine.io message type:
open =0
close =1
ping =2
pong =3
message =4
upgrade =5
noop =6
socket.io message type:
connect = 0
disconnect = 1
event = 2
ack = 3
error = 4
binary_event = 5
binary_ack = 6
所以,400 51 可能意味着“错误请求,升级断开连接。”
这是响应正文:
{"code":0,"message":"Transport unknown"}
这是浏览器中客户端应用程序的错误:
polling-xhr.js:268 GET https://server.com/socket.io/?EIO=3&transport=polling&t=NIgQkyr 400
这看起来像是 xhr 传输层上的失败轮询请求
【问题讨论】:
标签: node.js https socket.io amazon-elastic-beanstalk amazon-route53