当前位置: 首页 > 面试题库 >

如何在Nginx托管的单个域下托管多个Flask应用程序?

龙飞
2023-03-14
问题内容

我想要达到的目标:

我有一个托管mydomain.com的Nginx Web服务器。当有人将我的domain.com键入其客户端时,我希望我的服务器从中提供index.html。/var/www/mydomain/当他们键入mydomain.com/flaskapp1时,他们应该看到flaskapp1。当他们键入mydomain.com/flaskapp2时,他们应该看到flaskapp2。

我已经成功地使用此处的教程http://www.markjberger.com/flask-with-virtualenv-uwsgi-nginx/来获取一个或其他烧瓶应用程序,但是当尝试实现为两个单独的烧瓶应用程序提供服务时,我遇到了困难。当我尝试在浏览器中使用mydomain.co.uk/flaskapp或mydomain.co.uk/flaskapp2访问任何一个烧瓶应用程序时,都没有看到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可以正常重启,没有任何问题,并且可以正常运行。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应用程序。

我希望这是我错过的简单事情。


问题答案:

查看NGINX的uwsgi文档。

特别:

不幸的是,nginx无法根据SCRIPT_NAME重写PATH_INFO。因此,您需要指示uWSGI在所谓的“挂载点”中映射特定的应用程序,并自动重写SCRIPT_NAME和PATH_INFO:

更改my flaskapp.iniflaskapp2.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应用程序都根据需要通过nginx通过uwsgi运行。



 类似资料:
  • 这与两个职位有关- 使用WildFly托管多个域(下拖), 野生飞行- 创建/编辑jboss-web.xml的变通方法似乎不起作用。 在我的场景中,两个虚拟主机使用完全相同的WAR文件服务,没有上下文根配置,我尝试了这种变通方法。 在wildfly/standalone/configuration/standalone中。xml: 在JBossWeb中。xml: 在部署/重新部署期间,Wildfl

  • 我们计划在我们的单个Azure kubernetes集群上部署多个应用程序,每个应用程序都将拥有自己的一组Azure资源-例如:Key vault、Storage。 我计划为每个应用程序提供个人托管身份,并提供对相关资源的访问。 我知道AZURE AAD POD identify是配置POD以使用托管标识访问AZURE资源的方法。 但是,如何将多个托管标识添加到Azure kubernetes集群

  • 托管 本页告诉你如何在自己的服务器上托管 .crx文件。如果你仅仅通过Chrome Web Store发布扩展,应用,或者主题那么你不需要本页。取而代之的是查阅Chrome Web Store帮助和开发者文档。 注意:如果你已经把扩展发布到扩展库,扩展就会合并到Chrome Web Store里。 按照惯例, 无论是Chrome Web Store还是特定服务器所提供的扩展, 可安装的web ap

  • 我正在开发一个应用程序,将工作在两个不同的Android环境(消费者和企业市场)。假设它是一个短信应用程序,需要管理一打配置参数。 第一个环境是一个标准的Android设备,它没有启用Android Enterprise(AfW)功能。因此没有EMM(MDM)来提供Android代理/客户端应用程序作为实现托管配置提供程序的设备/配置文件所有者。 第二个环境是公司内部。EMM(MDM)用于管理所有

  • 我有两个静态web应用程序(create-react-apps)目前在两个独立的S3桶中。这两个bucket都配置为公共读取+静态web托管,访问它们的S3托管URL可以正确显示站点。 我为此设置了一个CloudFront--默认的Cloudfront源正确地加载,这样www.mywebsite.com在默认情况下加载index.html。 对于,我已经设置了一个缓存行为,以便路径模式指向Seco