是否可以在不需要 Nginx 的情况下在 EC2 上部署 Daphne SSL?

Is it possible to deploy Daphne SSL on EC2 without the need for Nginx?

我正在尝试通过 Daphne 使用 Django 通道制作原型。结构如图所示。当我在没有 SSL (wss) 的情况下部署它时,一切正常(连接、发送消息等)。我继续使用 wss 在本地使用自签名证书来完成它,它也可以工作。但是当通过在 EC2(云)中部署它来测试它时,它等待了很长时间,最后它说连接失败,在后端日志中,它甚至没有显示连接请求尝试到达。

这就是我在 Daphne - EC2 上使用自签名证书进行部署的方式(因为这是一个测试)。注:8000端口在安全组开放。

daphne -e ssl:8000:privateKey=key.pem:certKey=cert.pem prototype.asgi:application

并使用本地前端 (Angular) 我正在使用:

angular.json

[...]

"serve": {
[...]

    "options": {
        "sslKey": "src/assets/key.pem",
        "sslCert": "src/assets/cert.pem"
    }

[...]

}

[...]

Websocket 调用

private initChannel(arg: string, arg2: string) { 
    this.webSocketSubject = webSocket('wss://' + this.EC2_IP + ':8000/prototype/?arg=' + arg + '&arg2=' + arg2);
}

部署命令:

ng serve --ssl

你是不是突然想到了可能发生的事情?

我看到大多数通过 nginx 部署它,但原型纯粹是通过 websocket(通道),所以目前不需要平衡器或代理。此部署必须使用 Nginx 吗?

我的问题是 SSL/TLS 证书。为了能够通过 HTTPS 建立连接,它需要一个适用于 called/consumed 域的 SSL/TLS 证书。这就是为什么当我生成测试证书时它在本地起作用的原因,因为我是本地主机的所有者。但是在云中,每个实例都管理自己的域,该域属于管理实例的云公司,因此无法通过 HTTPS 接收请求。

因此,如果它可以在不需要反向代理 (nginx) 的情况下部署,为此您必须生成一个 DNS 域,指向您在云中实例的 IP(例如在 GoDaddy 中,AWS 有53 号公路,还有很多)。由于域是您的并且指向您有权管理的实例,因此您可以从 Let's Encrypt(或任何需要付费的证书颁发机构)生成免费证书。在 Let's Encrypt 的情况下,我使用了 Lego library。有了这个库在我获得的域中为我生成的证书和密钥,并且指向我的实例的 IP,我 运行 下面的命令并且它工作正常。

daphne -e ssl:8000:privateKey=my.domain.key:certKey=my.domain.crt prototype.asgi:application

请记住,如果您想 运行 ASGI 服务器 Daphne 的特定 IP(链接到 DNS 域的 IP),您可以 运行 以下命令。

daphne -e ssl:port=8002:interface=192.168.1.70:privateKey=my.domain.key:certKey=my.domain.crt chat.asgi:application