如何在 nginx 托管的单个域下托管多个 Flask 应用程序?
How to host multiple flask apps under a single domain hosted on nginx?
我想要达到的目标:
我有一个托管 mydomain.com 的 nginx 网络服务器。当有人将我的 domain.com 输入他们的客户端时,我希望我的服务器从 /var/www/mydomain/
提供 index.html 当他们输入 mydomain.com/flaskapp1 时,他们应该会看到 flaskapp1。当他们输入 mydomain.com/flaskapp2 时,他们应该会看到 flaskapp2.
我已经设法使用这里的教程 http://www.markjberger.com/flask-with-virtualenv-uwsgi-nginx/ 为一个或其他 Flask 应用程序提供服务,但是在尝试实现为两个单独的 Flask 应用程序提供服务时,我 运行 遇到了困难。当我尝试在浏览器中使用 mydomain.co.uk/flaskapp 或 mydomain.co.uk/flaskapp2 访问任一 Flask 应用程序时,我没有看到 Flask 应用程序,而是收到一条 404 消息。
这是我目前拥有的:
cat /etc/nginx/sites-available/mydomain.co.uk
server {
listen 80;
server_name www.mydomain.co.uk mydomain.co.uk;
location / {
root /var/www/html/;
index index.html index.htm;
}
location /flaskapp {
include uwsgi_params;
uwsgi_pass unix:/tmp/flaskapp.sock;
}
location /flaskapp2 {
include uwsgi_params;
uwsgi_pass unix:/tmp/flaskapp2.sock;
}
}
上面的conf文件已经sim链接到/etc/nginx/sites-enabled
.
cat /etc/uwsgi/apps-available/flaskapp.ini
[uwsgi]
vhost = true
socket = /tmp/flaskapp.sock
venv = /var/www/flaskapp/venv
chdir = /var/www/flaskapp
module = flaskapp
callable = app
cat /etc/uwsgi/apps-available/flaskapp2.ini
[uwsgi]
vhost = true
socket = /tmp/flaskapp2.sock
venv = /var/www/flaskapp2/venv
chdir = /var/www/flaskapp2
module = flaskapp2
callable = app
两个 .ini 文件都已符号链接到 /etc/uwsgi/apps-enabled
。 UWSGI 重新启动正常,没有任何问题,并且正在 运行ning。 flaskapp.sock 和 flaskapp2.sock 都属于 www-data
cat /var/www/flaskapp/flaskapp.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World from flaskapp1!'
if __name__ == '__main__':
app.run(host='0.0.0.0')
cat /var/www/flaskapp2/flaskapp2.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World from flaskapp2!'
if __name__ == '__main__':
app.run(host='0.0.0.0')
cat /var/www/mydomain.co.uk/index.html
<!DOCTYPE html>
<html>
<body>
<h1>mydomain.co.uk</h1>
<p>This is the index page of my domain.co.uk</p>
</body>
</html>
两个虚拟环境都安装了 Flask,并将 运行 Flask 应用程序使用开发服务器。
我希望这是我错过的简单内容。
问题出在这里:两个 flask 应用程序都不知道它们是从您域中的子目录提供的。 Nginx 将完整的 URL 传递给它们,而不是相对于该目录的 URL,因此每个 URL 都是相对于根目录调度的。让我们看看示例:
假设您的 flaskapp 中有 3 个视图,在 url /one/
、/two/
和 /three/
上提供。因此,当您尝试访问 URL /one/
上的视图时,您正在键入地址:http://yourdomain.com/flaskapp/one/
。 Flask 将从 nginx URL /flaskapp/one/
接收,但该应用程序中没有这样的视图,因此它将发送 404 作为响应。
您可以做的是通知每个 flaskapp 它们不是在域根目录中提供的,而是在特定的子目录中提供的。您可以通过发送 SCRIPT_NAME
uwsgi_param
和值中的子目录位置来实现此目的,因此您的 nginx 配置将具有:
location /flaskapp {
include uwsgi_params;
uwsgi_pass unix:/tmp/flaskapp.sock;
uwsgi_param SCRIPT_NAME /flaskapp;
}
location /flaskapp2 {
include uwsgi_params;
uwsgi_pass unix:/tmp/flaskapp2.sock;
uwsgi_param SCRIPT_NAME /flaskapp2;
}
正在查看 NGINX here 的 uwsgi 文档。
具体来说:
Unfortunately nginx is not able to rewrite PATH_INFO accordingly to
SCRIPT_NAME. For such reason you need to instruct uWSGI to map
specific apps in the so called “mountpoint” and rewrite SCRIPT_NAME
and PATH_INFO automatically:
更改我的 flaskapp.ini
和 flaskapp2.ini
文件以包含应用程序的安装点并打开 manage-script-name 变量已经奏效。
cat /etc/uwsgi/apps-available/flaskapp.ini
[uwsgi]
vhost = true
socket = /tmp/flaskapp.sock
venv = /var/www/flaskapp/venv
chdir = /var/www/flaskapp
module = flaskapp
callable = app
mount = /flaskapp=flaskapp.py
manage-script-name = true
cat /etc/uwsgi/apps-available/flaskapp2.ini
[uwsgi]
vhost = true
socket = /tmp/flaskapp2.sock
venv = /var/www/flaskapp2/venv
chdir = /var/www/flaskapp2
module = flaskapp2
callable = app
mount = /flaskapp2=flaskapp2.py
manage-script-name = true
现在这两个 flask 应用程序都是 运行 根据需要通过 uwsgi 通过 nginx。
添加安装点对我有用。
/etc/uwsgi/apps-available/flaskapp.ini
callable = app
mount = /flaskapp=/var/www/flaskapp
/etc/uwsgi/apps-available/flaskapp2.ini
callable = app
mount = /flaskapp2=/var/www/flaskapp2
来源https://neginfinity.bitbucket.io/2017/09/hosting-multiple-flask-applications-in-nginx.html
我想要达到的目标:
我有一个托管 mydomain.com 的 nginx 网络服务器。当有人将我的 domain.com 输入他们的客户端时,我希望我的服务器从 /var/www/mydomain/
提供 index.html 当他们输入 mydomain.com/flaskapp1 时,他们应该会看到 flaskapp1。当他们输入 mydomain.com/flaskapp2 时,他们应该会看到 flaskapp2.
我已经设法使用这里的教程 http://www.markjberger.com/flask-with-virtualenv-uwsgi-nginx/ 为一个或其他 Flask 应用程序提供服务,但是在尝试实现为两个单独的 Flask 应用程序提供服务时,我 运行 遇到了困难。当我尝试在浏览器中使用 mydomain.co.uk/flaskapp 或 mydomain.co.uk/flaskapp2 访问任一 Flask 应用程序时,我没有看到 Flask 应用程序,而是收到一条 404 消息。
这是我目前拥有的:
cat /etc/nginx/sites-available/mydomain.co.uk
server {
listen 80;
server_name www.mydomain.co.uk mydomain.co.uk;
location / {
root /var/www/html/;
index index.html index.htm;
}
location /flaskapp {
include uwsgi_params;
uwsgi_pass unix:/tmp/flaskapp.sock;
}
location /flaskapp2 {
include uwsgi_params;
uwsgi_pass unix:/tmp/flaskapp2.sock;
}
}
上面的conf文件已经sim链接到/etc/nginx/sites-enabled
.
cat /etc/uwsgi/apps-available/flaskapp.ini
[uwsgi]
vhost = true
socket = /tmp/flaskapp.sock
venv = /var/www/flaskapp/venv
chdir = /var/www/flaskapp
module = flaskapp
callable = app
cat /etc/uwsgi/apps-available/flaskapp2.ini
[uwsgi]
vhost = true
socket = /tmp/flaskapp2.sock
venv = /var/www/flaskapp2/venv
chdir = /var/www/flaskapp2
module = flaskapp2
callable = app
两个 .ini 文件都已符号链接到 /etc/uwsgi/apps-enabled
。 UWSGI 重新启动正常,没有任何问题,并且正在 运行ning。 flaskapp.sock 和 flaskapp2.sock 都属于 www-data
cat /var/www/flaskapp/flaskapp.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World from flaskapp1!'
if __name__ == '__main__':
app.run(host='0.0.0.0')
cat /var/www/flaskapp2/flaskapp2.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World from flaskapp2!'
if __name__ == '__main__':
app.run(host='0.0.0.0')
cat /var/www/mydomain.co.uk/index.html
<!DOCTYPE html>
<html>
<body>
<h1>mydomain.co.uk</h1>
<p>This is the index page of my domain.co.uk</p>
</body>
</html>
两个虚拟环境都安装了 Flask,并将 运行 Flask 应用程序使用开发服务器。
我希望这是我错过的简单内容。
问题出在这里:两个 flask 应用程序都不知道它们是从您域中的子目录提供的。 Nginx 将完整的 URL 传递给它们,而不是相对于该目录的 URL,因此每个 URL 都是相对于根目录调度的。让我们看看示例:
假设您的 flaskapp 中有 3 个视图,在 url /one/
、/two/
和 /three/
上提供。因此,当您尝试访问 URL /one/
上的视图时,您正在键入地址:http://yourdomain.com/flaskapp/one/
。 Flask 将从 nginx URL /flaskapp/one/
接收,但该应用程序中没有这样的视图,因此它将发送 404 作为响应。
您可以做的是通知每个 flaskapp 它们不是在域根目录中提供的,而是在特定的子目录中提供的。您可以通过发送 SCRIPT_NAME
uwsgi_param
和值中的子目录位置来实现此目的,因此您的 nginx 配置将具有:
location /flaskapp {
include uwsgi_params;
uwsgi_pass unix:/tmp/flaskapp.sock;
uwsgi_param SCRIPT_NAME /flaskapp;
}
location /flaskapp2 {
include uwsgi_params;
uwsgi_pass unix:/tmp/flaskapp2.sock;
uwsgi_param SCRIPT_NAME /flaskapp2;
}
正在查看 NGINX here 的 uwsgi 文档。
具体来说:
Unfortunately nginx is not able to rewrite PATH_INFO accordingly to SCRIPT_NAME. For such reason you need to instruct uWSGI to map specific apps in the so called “mountpoint” and rewrite SCRIPT_NAME and PATH_INFO automatically:
更改我的 flaskapp.ini
和 flaskapp2.ini
文件以包含应用程序的安装点并打开 manage-script-name 变量已经奏效。
cat /etc/uwsgi/apps-available/flaskapp.ini
[uwsgi]
vhost = true
socket = /tmp/flaskapp.sock
venv = /var/www/flaskapp/venv
chdir = /var/www/flaskapp
module = flaskapp
callable = app
mount = /flaskapp=flaskapp.py
manage-script-name = true
cat /etc/uwsgi/apps-available/flaskapp2.ini
[uwsgi]
vhost = true
socket = /tmp/flaskapp2.sock
venv = /var/www/flaskapp2/venv
chdir = /var/www/flaskapp2
module = flaskapp2
callable = app
mount = /flaskapp2=flaskapp2.py
manage-script-name = true
现在这两个 flask 应用程序都是 运行 根据需要通过 uwsgi 通过 nginx。
添加安装点对我有用。
/etc/uwsgi/apps-available/flaskapp.ini
callable = app
mount = /flaskapp=/var/www/flaskapp
/etc/uwsgi/apps-available/flaskapp2.ini
callable = app
mount = /flaskapp2=/var/www/flaskapp2
来源https://neginfinity.bitbucket.io/2017/09/hosting-multiple-flask-applications-in-nginx.html