nginx 部署在同一服务器上的两个flask应用之一,具有无响应的“/”路由

qyswt5oh  于 2023-04-20  发布在  Nginx
关注(0)|答案(1)|浏览(143)

问题

我有两个flask应用程序部署到同一个GCP计算引擎和一个nginx服务器。
主域上的第一个应用:myapp.com.
第二个是在子域上:example.myapp.com.
主域上第一个应用程序的所有路由都可以访问并正确呈现它们的视图,但是第二个应用程序的'/'路由只是挂起,并最终返回超时错误。奇怪的是,如果我在第二个应用程序上显式访问其他路由,例如:example.myapp.com/about-exampleexample.myapp.com/home,则页面立即呈现。
我在第二个应用程序上测试了所有的路线,它们都能工作。默认的回家路线/是唯一一个在我导航到example.myapp.com时导致问题的路线

项目结构

应用程序部署在用户目录中

home
    └── user1
        ├── app1
        └── app2

NGINX

我删除了/etc/nginx/sites-enabled的默认配置,并为每个应用程序添加了这些额外的配置

App 1配置

server {
    server_name myapp.com;
    access_log /var/log/nginx/app1.access.log;
    error_log /var/log/nginx/app1.error.log;

    location / {
        proxy_pass http://127.0.0.1:8000;
        include /etc/nginx/proxy_params;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /static {
        alias /home/user1/app1/app/static;
    }
}

App 2配置

server {
    server_name example.myapp.com;
    access_log /var/log/nginx/app2.access.log;
    error_log /var/log/nginx/app2.error.log;

    location / {
        proxy_pass http://127.0.0.1:8001;
        include /etc/nginx/proxy_params;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /static {
        alias /home/user1/app2/app/src/static;
    }
}

部署

我使用gunicorn沿着supervisor来运行应用程序。每个应用程序都有一个supervisor conf。存储在/etc/supervisor/conf.d/(name-of-app)-supervisor. conf。验证supervisor是否正确阅读了附加conf。

App 1 Supervisor配置

[program:app1]
command=/home/user1/app1/venv/bin/gunicorn personal_website:app -w 2
directory=/home/user1/app1
user=user1
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
stdout_logfile=/var/log/app1/app1.out.log
stderr_logfile=/var/log/app1/app1.err.log

App 2 Supervisor配置

[program:app2]
command=/home/user1/app2/venv/bin/gunicorn -b 0.0.0.0:8001 run:app
directory=/home/user1/app2
user=user1
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/app2.out.log
stderr_logfile=/var/log/supervisor/app2.err.log

Flask路由

应用程序使用蓝图组织为一个包

app2

位置:app/src/main/routes.py

"""Main blueprint module"""
from flask import Blueprint, render_template

main = Blueprint("main", __name__)

@main.route("/")
@main.route("/home")
def home():
    return render_template("home.html", active_page="home")

Flask应用配置

这个__init__文件中还有更多内容,但为了简洁起见,将其删除
位置:app/src/__init__.py

from flask import Flask

from app.config import Config

app = Flask(__name__)
app.config.from_object(Config)

def create_app(config_class=Config):
    app = Flask(__name__)

    from app.src.users.routes import users
    from app.src.entries.routes import entries
    from app.src.main.routes import main

    app.register_blueprint(users)
    app.register_blueprint(entries)
    app.register_blueprint(main)
    return app

感谢任何建议和反馈。我知道这里有很多移动的部分,这有点混乱,但我在这里束手无策。让我知道,如果我错过了任何部分,以帮助使问题更容易理解。谢谢!

bxjv4tth

bxjv4tth1#

您正在init.py中创建两个Flask应用示例,模块级Flask应用示例未在create_app()中使用,这可能会导致路由问题。
试试这个代码

from flask import Flask

from app.config import Config

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)

    from app.src.users.routes import users
    from app.src.entries.routes import entries
    from app.src.main.routes import main

    app.register_blueprint(users)
    app.register_blueprint(entries)
    app.register_blueprint(main)
    return app

并确保在使用Gunicorn启动应用程序时正确使用create_app()函数
run.py中,它必须是这样的:

from app.src import create_app

app = create_app()

如果您仍然对NginxSupervisor的日志进行错误检查,请尝试在本地重现错误。

相关问题