如何在使用 Nginx 和 Nginx 运行的 Flask python 应用程序中进行 Ajax 异步调用古尼康

发布于 2025-01-11 14:33:23 字数 2501 浏览 0 评论 0原文

我正在运行一个 Flask python 应用程序,在其中进行一些 Ajax 调用。 使用 Flask 开发服务器运行它工作正常,调用在后台运行,我可以继续使用该应用程序。

当转移到 Gunicorn 和 Nginx 反向代理设置时,应用程序似乎等待 Ajax 调用被处理(通常以超时结束)。这是为什么?这和多线程有关系吗?我是gunicorn/nginx 的新手。感谢您的帮助

设置与此处描述的几乎相同: https://testdriven.io/blog/dockerizing-flask-with-postgres-gunicorn-and-nginx/#docker

nginx 配置:

upstream app {
    server web:5000;
}

server {

    listen 80;

    location / {
        proxy_pass http://app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /static/ {
        alias /home/app/web/project/static/;
    }

    location /media/ {
        alias /home/app/web/project/media/;
    }

}

docker-compose 文件:

version: '3.8'
services:
  web:
    container_name: app
    restart: always
    build:
      context: ./services/web
      dockerfile: Dockerfile.prod
    expose:
      - 5005
    env_file: 
      - ./.env.prod
    command: gunicorn --bind 0.0.0.0:5005 manage:app
    volumes:
      - static_volume:/home/hello_flask/web/app/static
      - media_volume:/home/hello_flask/web/app/media
    depends_on:
      - db

  db:
    container_name: app_prod_db
    restart: always
    image: postgres:13-alpine
    volumes:
      - postgres_data_prod:/var/lib/postgresql/data/
    env_file:
      - ./.env.prod.db
      
  nginx:
    container_name: nginx
    restart: always
    build: ./services/nginx
    volumes:
      - static_volume:/home/app/web/app/static
      - media_volume:/home/app/web/app/start/media
    image: "nginx:latest"
    ports:
      - "5000:80"
    depends_on: 
      - web

volumes:
  postgres_data_prod:
  static_volume:
  media_volume:

不要认为 Ajax通话是一个问题,但以防万一,这里是:

$("#load_account").on('submit', function(event) {

    $.ajax({
        data : {
            vmpro : $('#accountInput').val()
        },
        type : 'POST',
        url : '/account/load_account'
    })
    .done(function(data) {

        if (data.error) {
            $('#errorAlert_accountvmproInput').text(data.error).show();
            $('#successAlert_accountInput').hide();
        }
        else {
            $('#successAlert_accountInput').text(data.overview).show();
            $('#errorAlert_accountInput').hide();
        }

    });

I'm running a flask python app, within which I make some Ajax calls.
Running it using the Flask development server works fine, the calls run in the background and I can continue using the app.

When moving to a gunicorn and Nginx reverse proxy setup the app seems to wait for that Ajax call to be processed (often ending up in a timeout). Why is that? Does this have something to do with multithreading? I'm new to gunicorn/nginx. Thanks for the help

The setup is pretty much the same as described here: https://testdriven.io/blog/dockerizing-flask-with-postgres-gunicorn-and-nginx/#docker

The nginx config:

upstream app {
    server web:5000;
}

server {

    listen 80;

    location / {
        proxy_pass http://app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /static/ {
        alias /home/app/web/project/static/;
    }

    location /media/ {
        alias /home/app/web/project/media/;
    }

}

docker-compose file:

version: '3.8'
services:
  web:
    container_name: app
    restart: always
    build:
      context: ./services/web
      dockerfile: Dockerfile.prod
    expose:
      - 5005
    env_file: 
      - ./.env.prod
    command: gunicorn --bind 0.0.0.0:5005 manage:app
    volumes:
      - static_volume:/home/hello_flask/web/app/static
      - media_volume:/home/hello_flask/web/app/media
    depends_on:
      - db

  db:
    container_name: app_prod_db
    restart: always
    image: postgres:13-alpine
    volumes:
      - postgres_data_prod:/var/lib/postgresql/data/
    env_file:
      - ./.env.prod.db
      
  nginx:
    container_name: nginx
    restart: always
    build: ./services/nginx
    volumes:
      - static_volume:/home/app/web/app/static
      - media_volume:/home/app/web/app/start/media
    image: "nginx:latest"
    ports:
      - "5000:80"
    depends_on: 
      - web

volumes:
  postgres_data_prod:
  static_volume:
  media_volume:

Don't think that Ajax call is an issue but just in case here it is:

$("#load_account").on('submit', function(event) {

    $.ajax({
        data : {
            vmpro : $('#accountInput').val()
        },
        type : 'POST',
        url : '/account/load_account'
    })
    .done(function(data) {

        if (data.error) {
            $('#errorAlert_accountvmproInput').text(data.error).show();
            $('#successAlert_accountInput').hide();
        }
        else {
            $('#successAlert_accountInput').text(data.overview).show();
            $('#errorAlert_accountInput').hide();
        }

    });

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苦笑流年记忆 2025-01-18 14:33:23

已解决:

gunicorn 正在运行 1 个默认同步类的工作线程。
将工人数量增加到 4 人解决了这个问题。

然而我实际上最终选择使用 gevent 类工作者。
我更新的 docker-compose yml 包括:

command: gunicorn -k gevent -w 2 --bind 0.0.0.0:5005 manage:app

详细信息请参见gunicorn文档此处

Solved:

gunicorn was running 1 single worker and of the default sync class.
Increasing the number of workers to 4 solved the problem.

However I actually opted to use gevent class workers in the end.
My updated docker-compose yml includes:

command: gunicorn -k gevent -w 2 --bind 0.0.0.0:5005 manage:app

Detailed in gunicorn documentation HERE

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文