如何使用Unix套接字加载2个Flask应用为nginx/uwsgi服务2个子域?

1 投票
1 回答
1822 浏览
提问于 2025-04-18 09:47

我正在按照这个uwsgi指南来设置nginx/uwsgi,希望让一个Flask应用在“www”子域名上运行,另一个Flask应用在“api”子域名上运行。我的nginx.conf配置文件如下:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    access_log  /path/to/access_nginx.log combined;
    error_log   /path/to/error_nginx.log  crit;

    include mime.types;
    sendfile on;

    server {
    server_name   api.example.com;
        listen 14265;

        location / {
        include uwsgi_params;
        uwsgi_param UWSGI_SCRIPT wsgi_api;
        uwsgi_pass unix:///path/to/api.sock;
        }
    }

    server {
    server_name   www.example.com;
        listen 14265;

        location / {
            include uwsgi_params;
            uwsgi_param UWSGI_SCRIPT wsgi;
            uwsgi_pass unix:///path/to/wsgi.sock;
        }
    }
}

启动uwsgi的时候,我这样做:

#!/bin/bash
APPNAME=nginx
# Start uwsgi
${HOME}/webapps/${APPNAME}/bin/uwsgi \
  --uwsgi-socket "${HOME}/webapps/${APPNAME}/wsgi.sock" \
  --master \
  --workers 1 \
  --max-requests 10000 \
  --harakiri 60 \
  --daemonize ${HOME}/webapps/${APPNAME}/uwsgi.log \
  --pidfile ${HOME}/webapps/${APPNAME}/uwsgi.pid \
  --vacuum \
  --python-path ${HOME}/webapps/${APPNAME}

# Start nginx
${HOME}/webapps/${APPNAME}/bin/nginx

当我访问www.example.com时,一切正常。但是,当我访问api.example.com时,却出现了502错误。为了修复这个502错误,我可以把api.sock改成wsgi.sock,但这样一来,当我访问api.example.com时,显示的页面就会是www.example.com的内容(尽管wsgi.pywsgi_api.py是不同的文件)。

补充说明:我找到的关于在nginx/uwsgi上设置多个子域名的例子(包括我链接的那个)都只展示了如何为静态网站设置子域名。我找不到一个例子是关于如何使用unix套接字来实现的。

1 个回答

1

我也注意到只有 wsgi.sock 被创建了。

这就是你问题的答案。如果你没有看到 api.sock,那么 nginx 就无法把请求传递给它。所以你会遇到 502 错误。你应该为每个应用启动 uwsgi

#!/bin/bash

# Start uwsgi 
for APPNAME in "app_1" "app_2"
do
    uwsgi \
      --uwsgi-socket "${HOME}/webapps/${APPNAME}/wsgi.sock" \
      --master \
      --workers 1 \
      --max-requests 10000 \
      --harakiri 60 \
      --daemonize ${HOME}/webapps/${APPNAME}/uwsgi.log \
      --pidfile ${HOME}/webapps/${APPNAME}/uwsgi.pid \
      --vacuum \
      --python-path ${HOME}/webapps/${APPNAME}
done

撰写回答