我对 Docker 和 AWS 非常陌生,对于我的国际象棋项目,我有一个使用 socket.io 和 Docker 的 React/Node 应用程序,我想将所有内容部署到 AWS Elastic Beanstalk 上。我已经完成了 docker 容器化,一切都可以在本地运行,但是当我尝试访问 beanstalk 上的应用程序时,程序运行时,套接字连接却无法运行。我在开发控制台中收到此轮询错误: 在此输入图片描述 我认为它一直在轮询。有人可以看一下吗? 这是我的 server.js:
const express = require('express');
const { Server } = require("socket.io");
const { v4: uuidV4 } = require('uuid');
const http = require('http');
const path = require('path');
const app = express(); // initialize express
const server = http.createServer(app); // HTTP server created
const port = process.env.PORT || 8080 // set port to value received from environment variable or 8080 if null
const io = new Server(server, {
cors: {
origin: "*", // Update this to your frontend's origin
methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH", "HEAD"],
credentials: true
}
});
const cors = require('cors');
const corsOptions = {
origin: '*',
credentials: true, //access-control-allow-credentials:true
optionSuccessStatus: 200
}
app.use(cors(corsOptions));
// Parses JSON bodies
app.use(express.json());
// Serve static files from the react app
app.use(express.static(path.join(__dirname, '../client/public')));
// all other requests point to the index.html file
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, '../client/public', 'index.html'));
});
Socket.js:
import { io } from "socket.io-client"; // import connection function
const socket = io(); // initialize websocket connection on port 8080
export default socket;
Dockerrun.aws.json:
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "767397913162.dkr.ecr.us-east-1.amazonaws.com/1v1chess:latest",
"Update": "true"
},
"Ports": [
{
"ContainerPort": 8080,
"HostPort": 8080
}
]
}
还有一些事情:
我禁用了这个 chrome 标志:chrome://flags/#block-insecure-private-network-requests,一切正常了一晚上。第二天,即使关闭了标志,它也无法再次工作。
对于您的使用案例,它更适合 Amazon Elastic Container Service (ECS),而不是 Elastic Beanstalk。
Elastic Beanstalk 是部署 Web 应用程序的绝佳选择,但它主要是为传统 Web 应用程序设计的,而不是容器化应用程序。 Elastic Beanstalk 确实支持 Docker,但它可能不是最适合涉及 socket.io 和 Docker 的特定用例。
Amazon Elastic Container Service (ECS) 是一种容器编排服务,更适合管理和部署容器化应用程序。 ECS 允许您跨 Amazon EC2 实例集群轻松运行、扩展和管理 Docker 容器,或者对于 Fargate,无需管理任何底层基础设施。
以下是针对基于 Docker 的应用程序使用 Amazon ECS 而非 Elastic Beanstalk 的一些优势:
以容器为中心的方法:ECS 专为运行和管理容器化应用程序而设计,与将容器视为辅助部署选项的 Elastic Beanstalk 相比,提供了更加原生和优化的体验。
可扩展性和可用性:ECS 允许您通过添加或删除任务和服务来轻松扩展应用程序,确保容器化应用程序的高可用性和容错能力。
网络和负载均衡:ECS 与 Elastic Load Balancing 和 AWS App Mesh 等其他 AWS 服务无缝集成,让您能够更有效地管理容器化应用程序的网络、负载均衡和服务发现。
通过使用 Amazon ECS,您可以利用专为管理和运行容器化应用程序而设计的特定特性和功能,这可能有助于解决您在使用 Elastic Beanstalk 时遇到的 socket.io 连接问题。