我可以在端口 80 上运行两个服务器应用程序吗?

我可以在端口 80 上运行两个服务器应用程序吗?

我当前在端口 80 上运行 nginx,并将服务器名称配置为example.comwww.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 应用程序提供服务

相关内容