我有一个非常简单的烧瓶应用程序,它能很好地工作在带有域的https上,与gunicorn和nginx一起工作。这表明所有其他配置都在工作(IP、端口、https等),但是当我尝试将它与使用uvicorn的justpy库一起使用时,就没有交互了。奇怪的是,当我使用开放端口在GCP的公共ip上运行它时,它工作得很好,所以我假设它是我的nginx配置中的一个问题。
配置和示例如下,以及我可以在此找到的文档。这是在安装了Ubuntu21.04的GCP实例(e2微)上运行的。公共IP已经成为静态的,我正在使用letsencrypt作为HTTPS的域。
这可能只是因为just is库非常新,但我希望确保它不是因为不正确地配置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!”使用命令
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;
}
}此外,如果我们使用公正的代码(它直接来自于它们的文档这里和这里),如果我使用开放端口在公共IP上运行它,并对上面的gunicorn命令进行了轻微的修改,那么它也会给出我们想要的没有任何错误的:
gunicorn -k uvicorn.workers.UvicornWorker fl1:app -b 0.0.0.0:5000import 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和域时,也就是当它开始失败时,应用程序不断地说“页面需要重新加载,单击OK来重新加载”,每次单击OK,它都会继续重新加载。我想这与uvicorn的nginx配置有关,但我还没有弄清楚。
uvicorn 文档帮不了多少忙,而且在第65行的websockets的main.html文件中有一些东西,但是我不知道这会对nginx产生什么影响。任何帮助都将不胜感激。
发布于 2021-09-04 23:24:44
我猜是因为websocket连接没有被正确地转发给uvicorn,所以才会弹出。我自己也有类似的问题,但与您的设置略有不同,也使用ssl运行Uvicorn后端服务器。
但据我所见,我在配置中获得的唯一相关的额外位数是:
http {
...
# possibly websockets?
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
...
server {
...
location / {
...
# definitely for websockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
...
}
}
}请看一下这个站点,那里有大量的信息,包括一些关于websockets:https://www.linkedin.com/pulse/how-use-nginx-reverse-proxy-https-wss-self-signed-ramos-da-silva?articleId=6678584723419226112的信息。
https://stackoverflow.com/questions/68866920
复制相似问题