nginx - 乘客 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/mydash
或http://testapp.myexample.com/efergy
我看到的是同一个应用程序正在显示。在顶部,在子部分之前,我可以将“仪表板”替换为“peniso”,它会更改运行 1 个应用程序。我已经翻转了文件夹的顺序,也将根目录从一个更改为另一个。似乎仍然只有一个应用程序可用。
您如何配置Passenger 以使用多个不同的应用程序?
最终,一旦我了解如何让 /var/www 下的目录正常工作,我需要托管一些 Python 和一些 Node.js 应用程序。
解决方案
我有一个特定于 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 会阅读他们的公告??——那么这确实有效。
推荐阅读
- ruby-on-rails - 如果使用 Haml 选择了单选按钮,如何隐藏元素
- python - 在python中乘以大数的最快方法?
- spring-mvc - 使用 Intellij + tomcat 设置 Spring MVC 应用程序
- azure-pipelines - 在下一步中获取任务状态
- java - 加载类“com.spotify.docker.Resource”时出错
- javascript - 如何在使用 appendChild 时在变量中读取和存储多个用户输入
- html - 将两个东西放在彼此旁边标题
- python - Python: Dataframes FutureWarning: for list-likes to .loc or []
- scala - Spark 执行器中何时可能发生 OutOfMemory 错误?
- django - 'AnonymousUser' 对象在 Django 登录功能中没有属性 '_meta' 错误