首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在nginx中为公正配置uvicorn

如何在nginx中为公正配置uvicorn
EN

Stack Overflow用户
提问于 2021-08-20 18:54:57
回答 1查看 487关注 0票数 1

我有一个非常简单的烧瓶应用程序,它能很好地工作在带有域的https上,与gunicorn和nginx一起工作。这表明所有其他配置都在工作(IP、端口、https等),但是当我尝试将它与使用uvicorn的justpy库一起使用时,就没有交互了。奇怪的是,当我使用开放端口在GCP的公共ip上运行它时,它工作得很好,所以我假设它是我的nginx配置中的一个问题。

配置和示例如下,以及我可以在此找到的文档。这是在安装了Ubuntu21.04的GCP实例(e2微)上运行的。公共IP已经成为静态的,我正在使用letsencrypt作为HTTPS的域。

这可能只是因为just is库非常新,但我希望确保它不是因为不正确地配置nginx。

所以,使用简单的烧瓶应用程序:

代码语言:javascript
复制
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配置:

代码语言:javascript
复制
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命令进行了轻微的修改,那么它也会给出我们想要的没有任何错误的

代码语言:javascript
复制
gunicorn -k uvicorn.workers.UvicornWorker fl1:app -b 0.0.0.0:5000
代码语言:javascript
复制
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和域时,也就是当它开始失败时,应用程序不断地说“页面需要重新加载,单击OK来重新加载”,每次单击OK,它都会继续重新加载。我想这与uvicorn的nginx配置有关,但我还没有弄清楚。

uvicorn 文档帮不了多少忙,而且在第65行的websockets的main.html文件中有一些东西,但是我不知道这会对nginx产生什么影响。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2021-09-04 23:24:44

我猜是因为websocket连接没有被正确地转发给uvicorn,所以才会弹出。我自己也有类似的问题,但与您的设置略有不同,也使用ssl运行Uvicorn后端服务器。

但据我所见,我在配置中获得的唯一相关的额外位数是:

代码语言:javascript
复制
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的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68866920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档