乘客子 uri

Passenger sub uri's

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

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

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

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

这是我在 /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;
        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;
        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 我看到显示的是同一个应用程序。在顶部,在子部分之前,我可以将 "dashboard" 替换为 "peniso",它会更改 1 个应用程序 运行。我翻转了文件夹的顺序,还将根目录从一个更改为另一个。似乎仍然只有一个应用程序可用。

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

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

我有一个特定于 Python Ploty 仪表板的解决方案,该仪表板使用名为 Dash 的抽象层编写。我希望可以为所有 Plotly 应用程序找到类似的修复程序,但没有实现它。可以修改 Dash Plotly 应用程序以了解调用的 suburi。如果网络 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 文档中,我发现子 uri 问题对于所有类型的应用程序都很严重,除了 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. 

在 Passenger GitHub 问题列表中,我在 "use of url rewriting" 上创建了一个文档详细信息请求,因为在大多数情况下这似乎是唯一真正可行的答案 (https://github.com/phusion/passenger/issues/2254)。为每个我们想要 运行.

的不同 node.js 应用找出特定于案例的修复是不可行的

为了让大家了解情况,Passenger 框架结构确实可以将服务器引导到正确的文件夹,但是当真正执行应用程序时,nginx 和 Passenger,出于我不明白的原因,恢复到 运行 他们在配置文件中找到的第一个应用程序。一旦你解决了这个问题,每个应用程序都知道如何被调用——也许 nginx 会阅读他们的公告??——然后它就可以工作了。