使用Docker在Elastic Beanstalk上实现WebSockets

10
尝试在目前运行在单个实例上的AWS Elastic Beanstalk中部署Docker镜像,除了我通过Socket.IO使用的WebSockets之外,一切正常。另一篇帖子建议删除nginx,但是对于使用Docker进行部署的情况,这可能已经不再可行或不是一个选项。我有一个Python脚本,可以更改nginx配置以允许WebSocket连接。当我ssh到实例并运行该脚本时,它可以工作。然而,在运行ebextensions时,nginx配置的那一部分尚不存在,因此我无法自动运行此脚本。
如果您想自己尝试,请部署databench_examples。当您使用eb initeb start部署时,它可以正常工作,然后ssh进入实例并转到/var/app/current,运行sudo python nginx_socketio_conf.py更改nginx配置文件。如果无法正常工作,则在运行simplepi分析时,在浏览器控制台中会看到Socket.IO握手的500错误。
1个回答

7
您是正确的,当运行ebextensions时,nginx配置文件不存在。原因是:该配置文件在应用程序部署后动态生成,因为Docker容器的端口映射在容器停止后才会知道。因此,您通过ebextensions执行的Python脚本没有要操作的配置文件。
另一种常规方法行不通,即将nginx配置文件写入/etc/nginx/conf.d,因为指令必须存在于块中的配置中。所以这是不可行的。
我创建了一个PR来说明一个可行的方法:https://github.com/svenkreiss/databench_examples/pull/3 这是一种未经记录的技术,它将Python/nginx变异脚本放入Elastic Beanstalk的钩子目录中的正确位置。然后,Elastic Beanstalk立即在生成nginx配置后执行该脚本(Elastic Beanstalk将按字母顺序运行钩子子目录中的可执行脚本,因此有01_前缀)。
谢谢,
Evan

嗨Evan,我在mongoDB 27017端口上遇到了类似的问题。这是我的完整问题(https://dev59.com/Il8d5IYBdhLWcg3wv0Yg),你建议我该怎么做才能解决它?谢谢。 - Agustin Haller
供参考,此 PR 将一个脚本放置在 /opt/elasticbeanstalk/hooks/appdeploy/enact/ 中,该脚本会重写Amazon放置的配置。 - rektide
1
为了重新启动nginx,我不得不使用“sudo initctl restart nginx”而不是“service restart nginx”,以使其正常工作。 - Ruben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接