【发布时间】:2021-10-22 06:55:00
【问题描述】:
我有一个非常简单的烧瓶应用程序,可以通过 https 与域完美配合 gunicorn 和 nginx。这表明所有其他配置都在工作(IP、端口、https 等),但是当我尝试将它与使用 uvicorn 的 justpy 库一起使用时,没有交互。奇怪的是,当我通过开放端口的 GCP 的公共 ip 运行它时,它工作得很好,所以我假设这是我的 nginx 配置的问题。
配置和示例如下,以及我可以找到的文档。这是在安装了 Ubuntu 21.04 的 GCP VM 实例(e2 micro)上运行的。公共 IP 已设为静态,我在域中使用letsencrypt 进行HTTPS。
这可能只是因为 justpy 库太新,但我想确保不是因为 nginx 配置不正确。
所以,使用简单的烧瓶应用程序:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World from flaskapp 1!'
当我们转到https://test1.domain.com(test1.domain.com 只是一个例子)时,我们得到了我们想要的,即“来自 flaskapp 1 的 Hello World!”使用命令
gunicorn fl1:app -b 0.0.0.0:5000
并使用以下 nginx 配置:
server {
listen 80;
listen 443 ssl http2;
server_name test1.domain.com;
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
ssl_protocols TLSv1.3;
location / {
include proxy_params;
proxy_pass http://0.0.0.0:5000;
}
}
同样,如果我们使用 justpy 的代码(直接来自他们的文档 here 和 here),这也可以为我们提供我们想要的而没有任何错误 如果我运行它具有开放端口的公共 IP 并对上面的 gunicorn 命令稍作修改:
gunicorn -k uvicorn.workers.UvicornWorker fl1:app -b 0.0.0.0:5000
import justpy as jp
app = jp.app
def my_click(self, msg):
self.text = 'I was clicked'
self.set_class('bg-blue-500')
def my_mouseenter(self, msg):
self.text = 'Mouse entered'
self.set_class('bg-red-500')
def my_mouseleave(self, msg):
self.text = 'Mouse left'
self.set_class('bg-teal-500')
def event_demo():
wp = jp.WebPage()
d = jp.Div(text='Not clicked yet', a=wp, classes='w-64 text-2xl m-2 p-2 bg-blue-500 text-white',
click=my_click, mouseenter=my_mouseenter, mouseleave=my_mouseleave)
return wp
jp.justpy(
event_demo,
start_server=False
)
这将给我们一个框,当鼠标在框内时,“鼠标进入”变成红色,当鼠标不在框内时,“鼠标左”变成绿色,当我们点击时,“我被点击”变成蓝色点击框。
一切正常,但是,当我开始使用 nginx(使用上面的配置)来使用 https 和域时,它开始失败并且应用程序不断说“页面需要重新加载,单击“确定”重新加载”,每次单击“确定”时它都会继续重新加载。我想这与 uvicorn 的 nginx 配置有关,但我还没有弄清楚。
uvicorn documentation 并没有多大帮助,justpy 在其main.html 文件中包含第 65 行的 websockets 文件,但我不知道这会如何影响 nginx。任何帮助将不胜感激。
【问题讨论】:
标签: nginx uvicorn starlette justpy