使用带有elasticbeanstalk,java的rest服务器和websocket,无法连接

Posted

技术标签:

【中文标题】使用带有elasticbeanstalk,java的rest服务器和websocket,无法连接【英文标题】:Using rest server and websocket with elasticbeanstalk, java, cannot connect 【发布时间】:2017-08-28 16:02:16 【问题描述】:

我正在尝试将 nginx 路由配置为能够同时使用休息服务器(使用 Java Spark)和 Websockets(使用 Netty-socketIO)。

它在本地运行良好,但无法在 aws elasticbeanstalk 上运行。

我在端口 5000 上侦听 Java Spark,这是 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-se-platform.html 的默认端口

默认情况下,Elastic Beanstalk 将 nginx 代理配置为将请求转发到端口 5000 上的应用程序

这行得通。

我在端口 9000 上监听 Websocket。我确实将 ELB 协议更改为 TCP。

仍然来自 aws 文档:

要扩展 Elastic Beanstalk 的默认 nginx 配置,请将 .conf 配置文件添加到应用程序源包中名为 .ebextensions/nginx/conf.d/ 的文件夹中。 Elastic Beanstalk 的 nginx 配置自动在此文件夹中包含 .conf 文件。

我试过但没有成功:

server 
    location / 
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    

SocketIO-客户端连接字符串http://beanstalk-address-here.us-east-1.elasticbeanstalk.com:9000

在“网络”选项卡中,请求在失败前处于(待处理)一段时间。

【问题讨论】:

您是否启用了目标群体的粘性?没有它,我猜网络套接字无法工作 【参考方案1】:

一个可能的问题是您没有正确配置您的 ELB,除了端口 9000 上的连接。您必须在 ELB 上正确配置安全组以允许非标准端口上的连接:

https://aws.amazon.com/premiumsupport/knowledge-center/elb-connectivity-troubleshooting/

【讨论】:

【参考方案2】:

如果你仍然通过非标准端口访问你的应用程序,你为什么要使用 nginx

Nginx 路由通常在一个端口(通常是 80/443)中接受所有连接,并且根据配置路径,它会重定向到任何特定的 ip/端口

你的 nginx 配置文件应该有这些

Nginx 监听端口

   server 
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  localhost;

   

重定向列表

server
....

location / 
        proxy_pass http://<your-app-ip>:<your-app-port>;
        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

您的应用网址是 http://beanstalk-address-here.us-east-1.elasticbeanstalk.com:9000

你的重定向url是http://beanstalk-address-here.us-east-1.elasticbeanstalk.com(nginx会监听80端口并重定向到你的应用端口)

【讨论】:

以上是关于使用带有elasticbeanstalk,java的rest服务器和websocket,无法连接的主要内容,如果未能解决你的问题,请参考以下文章

使用 API 使用 RDS 配置 ElasticBeanstalk

带有 ALB 和 Socket.IO 的 AWS ElasticBeanstalk 上的 HTTP 400 错误

如何在 Elasticbeanstalk 环境中运行的 docker 容器中承担 AWS 角色?

Amazon ElasticBeanstalk:使用换行符配置环境变量

AWS Elasticbeanstalk 单实例强制 SSL 重定向循环

带有 Amazon CloudWatch 的 Elastic Beanstalk Docker