首页 > 解决方案 > 乘客 sub uri's

问题描述

Phusion 乘客说明在大多数方面都很棒。他们在设置 NGINX、乘客应用程序、测试 python 等方面的安装指南远优于平均水平。在单个服务器上设置多个单独的应用程序的说明是有缺陷的。我采用Passenger的主要原因是能够托管多个应用程序。

我按照 Phusion Passenger 的说明使用子 URI( https://www.phusionpassenger.com/library/deploy/nginx/deploy/python/ )设置 NGINX 服务器。我认为这将允许我运行具有不同子文件夹的单独应用程序。我有几个 python 应用程序/var/www,如下所示:

/var/www/dashboard
/var/www/peniso

我有一个 Python 虚拟环境,在单独的子文件夹 venv 中。每个人都单独工作。但是如何一次性让所有东西都可用呢?我看到的问题是,无论使用哪个子 URI,都会运行同一个应用程序。

这是我在 /etc/nginx/sites-enable/dashboard.conf 文件中尝试的内容:

server {
    listen 80;
    server_name testapp.myexample.com;

    # Tell Nginx and Passenger where your app's 'public' directory is
    root /var/www/dashboard/public;

    passenger_app_type wsgi;
    passenger_startup_file passenger_wsgi.py;

    # Turn on Passenger
    passenger_enabled on;
    passenger_python /var/www/dashboard/venv/bin/python3.7;

    location ~ ^/mydash(/.*|$) {
        alias /var/www/dashboard/public$1;
        passenger_base_uri /mydash;
        passenger_app_root /var/www/dashboard;
        passenger_document_root /var/www/dashboard/public;
        passenger_enabled on;
        passenger_python /var/www/dashboard/venv/bin/python3.7;
   }


   location ~ ^/efergy(/.*|$) {
        alias /var/www/peniso/public$1;
        passenger_base_uri /efergy;
        passenger_app_root /var/www/peniso;
        passenger_document_root /var/www/peniso/public;
        passenger_enabled on;
        passenger_app_env development;
        passenger_python /var/www/peniso/venv/bin/python3.7;
   }
}

我浏览http://testapp.myexample.com/mydashhttp://testapp.myexample.com/efergy我看到的是同一个应用程序正在显示。在顶部,在子部分之前,我可以将“仪表板”替换为“peniso”,它会更改运行 1 个应用程序。我已经翻转了文件夹的顺序,也将根目录从一个更改为另一个。似乎仍然只有一个应用程序可用。

您如何配置Passenger 以使用多个不同的应用程序?

最终,一旦我了解如何让 /var/www 下的目录正常工作,我需要托管一些 Python 和一些 Node.js 应用程序。

标签: nginxpassenger

解决方案


我有一个特定于 Python Ploty 仪表板的解决方案,它使用名为 Dash 的抽象层编写。我希望可以为所有 Plotly 应用程序找到类似的修复程序,但没有实现它。可以修改 Dash Plotly 应用程序以了解调用的 suburi。如果 Web URL 是http://example.com/energy,则需要在 Plotly 应用程序中进行简单更改。

从标准标准部分开始:

app = dash.Dash(__name__,
    meta_tags=[
        {
            "name": "viewport",
            "content": "width=device-width"
        }
    ]
)

包括网址的最后一部分

app = dash.Dash(__name__,
    meta_tags=[
        {
            "name": "viewport",
            "content": "width=device-width"
        }
    ],
    requests_pathname_prefix='/energy/'
)
app.config.suppress_callback_exceptions = True

最后一行是我同时在 Plotly 列表中捡到的东西,不知道是不是很重要。

在Passenger 文档中,我发现sub-uri 问题对于除Rails 之外的所有类型的应用程序都很严重,Rails 有一个纯乘客解决方案。整个事情没有很好的记录。但是他们在 node.js 文档中确实有一个警告(https://www.phusionpassenger.com/library/deploy/nginx/deploy/nodejs/):

Sub-URI deployments in Node.js require framework-specific 
adjustments in the application. For example, in Express 4.0+, 
you should use a router. An alternative is to use url 
rewriting to avoid the need for sub-URIs altogether. 

在乘客 GitHub 问题列表中,我创建了关于“使用 url 重写”的文档详细信息的请求,因为在大多数情况下,这似乎是唯一真正可行的答案 ( https://github.com/phusion/passenger/issues/2254 ) . 我无法为我们要运行的每个不同的 node.js 应用程序找出特定于案例的修复程序。

就这样每个人都理解这种情况,Passenger 框架结构确实可以将服务器引导到正确的文件夹,但是当实际执行应用程序时,nginx 和Passenger,由于我不明白的原因,恢复运行第一个他们在配置文件中找到的应用程序。一旦你解决了这个问题,每个应用程序都知道如何被调用——也许 nginx 会阅读他们的公告??——那么这确实有效。


推荐阅读