我当前在端口 80 上运行 nginx,并将服务器名称配置为example.com
和www.example.com
。
我也有烧瓶我希望通过端口 80 访问该应用程序,但使用主机名app.example.com
。
由于 nginx 已经在使用端口 80,我该如何将app.example.com
请求路由到 Flask 应用程序?
请注意,该服务器只有一个 IPv4 地址。
答案1
应该相当容易。
确保 Flask 本身在 80 以外的端口上运行。
然后使用 NginX 作为反向代理(和 Web 服务器)来处理 app.example.com 的子域,其次将其作为 localhost:8080(或您的 flask 应用程序绑定的任何位置)的代理来处理。
upstream flask {
server 127.0.0.1:8080; #Flask
}
server {
listen YOUR_PUBLIC_IP:80;
server_name app.example.com;
location / {
proxy_pass http://flask;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
您可以拥有多个 server{} 块,全部位于端口 80 上,只要 server_name 变化,就可以像 Apache VirtualHosts 一样使用它们。
答案2
直接在端口 80 上为应用程序提供服务并不是一个好主意。最好有一个标准 HTTP 服务器监听端口 80 并将请求转发到 Python(Flask)应用程序的 WSGI 服务器。
你应该配置 nginx,将所有对 app.example.com 的请求发送到你的 WSGI(Python 应用服务器)。这样,http://example.com:80将直接由 nginx 提供服务,并且对虚拟主机 app.example.com:80 的所有请求都将转发到您的 Python 应用程序服务器。根据您的偏好,您可以使用 uWSGI 或 gunicorn 运行您的 Python/Flask 应用程序。
要将 app.example.com 配置为虚拟主机,您需要创建一个文件(例如,/etc/nginx/sites-available/app.example.com
如果您使用基于 Debian 的发行版),其中包含如下内容:
server {
server_name app.example.com;
access_log /var/log/nginx/app-access.log;
error_log /var/log/nginx/app-error.log;
location /static {
root /var/www/app.example.com/static; # adjust to fit your path here
}
location / {
uwsgi_pass unix:/tmp/uwsgi_app.sock;
include /etc/nginx/conf.d/uwsgi_params;
}
}
该部分的内容location /
需要根据您选择使用的特定 WSGI 服务器进行调整 - 请参见下文。
然后您需要将新的虚拟主机配置符号链接到 sites-enabled 并重新启动 nginx:
ln -sf /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/
/etc/init.d/nginx restart
有关更多信息,请参阅此文档配置 nginx 为多个站点提供服务(虚拟主机)在同一个 IP 地址和 TCP 端口上。
这里有两篇博客文章描述了如何使用 uWSGI 配置 nginx:使用 Nginx 和 uWSGI 部署 Flask 使用 nginx 和 uWSGI 设置 Flask如果你更喜欢 gunicorn(Ruby 的 unicorn 应用服务器的 Python WSGI 端口),你可以查看这个 SO 问题:使用 nginx 和 gunicorn 运行 Flask 应用和使用 Nginx 和 gunicorn 为 Flask 应用程序提供服务