You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一GCE服务器部署的两个Flask应用:子域名根路由超时问题

问题描述

在同一台GCP Compute Engine服务器上通过Nginx部署了两个Flask应用:

  • 第一个应用部署在主域名 myapp.com,所有路由均可正常访问并渲染视图
  • 第二个应用部署在子域名 example.myapp.com,除根路由 / 外,其他路由(如 /about-example、/home)均可立即渲染,仅根路由会挂起并最终返回超时错误
项目结构

应用部署在用户目录下:

home
    └── user1
        ├── app1
        └── app2
Nginx配置

已移除 /etc/nginx/sites-enabled 下的默认配置,为每个应用添加了独立配置文件:

应用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;
    }
}

应用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配置文件存储在 /etc/supervisor/conf.d/(应用名)-supervisor.conf,已确认Supervisord正确加载了这些配置。

应用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

应用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路由

应用采用Blueprint进行模块化组织,应用2的路由如下:

应用2路由(路径: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应用配置(路径: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

排查方案
  1. 验证根路由核心逻辑:临时修改应用2根路由,返回简单字符串而非模板,测试是否仍超时:

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

    重启应用后访问 example.myapp.com,如果正常返回,说明问题出在home.html模板或其依赖的资源加载上。

  2. 检查日志细节:

    • 查看Nginx错误日志:tail -f /var/log/nginx/app2.error.log,观察根路由请求时的错误信息
    • 查看Gunicorn日志:tail -f /var/log/supervisor/app2.out.log 和 tail -f /var/log/supervisor/app2.err.log,确认应用是否处理了根路由请求、是否有报错或阻塞
  3. 直接测试应用端口:在服务器本地执行 curl http://127.0.0.1:8001/,如果超时,说明问题在应用本身而非Nginx代理;如果正常返回,再检查Nginx的proxy_params中的超时设置。

  4. 确认Flask应用实例化逻辑:检查run.py的内容,确保它正确调用了create_app()生成应用实例,而非直接使用全局app变量(全局app未注册蓝图):

    # run.py 正确示例
    from app.src import create_app
    
    app = create_app()
    
    if __name__ == "__main__":
        app.run()
    
  5. 检查模板资源引用:如果home.html中引用了静态资源,确认url_for生成的路径是否正确,是否存在资源不存在导致的加载阻塞;可临时注释模板中的静态资源引用,测试根路由是否正常。

  6. 检查服务器资源占用:访问根路由时,用top或htop查看CPU、内存使用率,确认是否因资源耗尽导致请求阻塞。

  7. 核对Nginx静态资源配置:确认/home/user1/app2/app/src/static目录存在且Nginx有读取权限;如果模板中静态资源路径与配置不匹配,可能导致浏览器等待资源加载超时。


内容的提问来源于stack exchange,提问作者null-point-exceptional

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:37:12