同一GCE服务器部署的两个Flask应用:子域名根路由超时问题
在同一台GCP Compute Engine服务器上通过Nginx部署了两个Flask应用:
- 第一个应用部署在主域名
myapp.com,所有路由均可正常访问并渲染视图 - 第二个应用部署在子域名
example.myapp.com,除根路由/外,其他路由(如/about-example、/home)均可立即渲染,仅根路由会挂起并最终返回超时错误
应用部署在用户目录下:
home └── user1 ├── app1 └── app2
已移除 /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
应用采用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")
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
验证根路由核心逻辑:临时修改应用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模板或其依赖的资源加载上。检查日志细节:
- 查看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,确认应用是否处理了根路由请求、是否有报错或阻塞
- 查看Nginx错误日志:
直接测试应用端口:在服务器本地执行
curl http://127.0.0.1:8001/,如果超时,说明问题在应用本身而非Nginx代理;如果正常返回,再检查Nginx的proxy_params中的超时设置。确认Flask应用实例化逻辑:检查
run.py的内容,确保它正确调用了create_app()生成应用实例,而非直接使用全局app变量(全局app未注册蓝图):# run.py 正确示例 from app.src import create_app app = create_app() if __name__ == "__main__": app.run()检查模板资源引用:如果
home.html中引用了静态资源,确认url_for生成的路径是否正确,是否存在资源不存在导致的加载阻塞;可临时注释模板中的静态资源引用,测试根路由是否正常。检查服务器资源占用:访问根路由时,用
top或htop查看CPU、内存使用率,确认是否因资源耗尽导致请求阻塞。核对Nginx静态资源配置:确认
/home/user1/app2/app/src/static目录存在且Nginx有读取权限;如果模板中静态资源路径与配置不匹配,可能导致浏览器等待资源加载超时。
内容的提问来源于stack exchange,提问作者null-point-exceptional

