问题
我有两个flask应用程序部署到同一个GCP计算引擎和一个nginx服务器。
主域上的第一个应用:myapp.com.
第二个是在子域上:example.myapp.com.
主域上第一个应用程序的所有路由都可以访问并正确呈现它们的视图,但是第二个应用程序的'/'路由只是挂起,并最终返回超时错误。奇怪的是,如果我在第二个应用程序上显式访问其他路由,例如:example.myapp.com/about-example
或example.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
感谢任何建议和反馈。我知道这里有很多移动的部分,这有点混乱,但我在这里束手无策。让我知道,如果我错过了任何部分,以帮助使问题更容易理解。谢谢!
1条答案
按热度按时间bxjv4tth1#
您正在init.py中创建两个Flask应用示例,模块级Flask应用示例未在
create_app()
中使用,这可能会导致路由问题。试试这个代码
并确保在使用
Gunicorn
启动应用程序时正确使用create_app()
函数在
run.py
中,它必须是这样的:如果您仍然对
Nginx
和Supervisor
的日志进行错误检查,请尝试在本地重现错误。