【问题标题】:How to configure uvicorn in nginx for justpy如何在nginx中为justpy配置uvicorn
【发布时间】: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 的代码(直接来自他们的文档 herehere),这也可以为我们提供我们想要的而没有任何错误 如果我运行它具有开放端口的公共 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


    【解决方案1】:

    我的猜测是您收到该弹出窗口是因为 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

    【讨论】:

      猜你喜欢
      • 2022-11-04
      • 2013-01-20
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2018-02-23
      • 2019-10-23
      • 1970-01-01
      相关资源
      最近更新 更多