我有一个相当旧的 Rails 应用程序,我需要让它在 Docker 化环境中运行。我以前从未使用过 ruby 或 Rails,所以我显然不知道事情是如何工作的。
rails 应用程序在乘客中运行,并以 nginx 为前端。我可以让应用程序在根 url 上正常工作,例如http://localhost/,但需要在http://localhost/my-app/view下运行。
我已根据 docs 将乘客配置添加到 nginx。大多数事情都可以正常工作,除了一种表单之外,该表单有一个控制器,无需 sub-dir 乘客配置即可正常工作,但是当我添加新配置并提交表单时,我发现我的
passenger_base_uri
在网络请求中出现了两次例如
http://localhost/my-app/view/my-app/view/explore/new?search=&area=458579%2C305178
所以我可以看到 URL 中的重复项,如果我将该 URL 复制为curl 命令并删除重复的路径,那么它再次按预期工作。
查看此站点的 nginx 配置
location ~ ^/my-app/view(/.*|$) {
alias /var/www/html/code/public$1;
passenger_base_uri /my-app/view;
passenger_app_root /var/www/html/code;
passenger_document_root /var/www/html/code/public;
passenger_enabled on;
}
这正是我上面链接的乘客文档中的内容。
表单模板为:
.col-md-6.col-sm-12
=form_tag( {controller: :explore, action: :new}, {method: :get, enforce_utf8: false} ) do
%fieldset
.form-group
%label{ for: "search_search" }
Sampling point name or ID
%input#search.form-control{ name: "search", id: "search", value: @exploration.user_search[:search], class: "c-constraint" }
.form-group
%label{ for: "area" }
Area
%select.form-control{ name: "area", id: "area-selections", class: "c-constraint" }
%option{ value: nil, label: "areas"}
- Areas.new.each do |area|
%option{ value: area.id, selected: @exploration.user_search.area_selected?( area.id ) }
= area.label
=submit_tag( "Find sampling points", name: nil, class: "btn btn-lg action-button c-action-submit u-margin-1-vertical" )
任何想法、想法将不胜感激。
我尝试过到处调整配置,但没有与乘客打交道的经验,我不确定要尝试什么。我还尝试将
namespaces
引入 Rails 应用程序,但同样,由于我缺乏经验,我可能做错了,我在日志中遇到了无法破译的错误。
我已设法解决此问题,但忘记回复。
这是一个奇怪的现象,我无法完全理解为什么会发生这种情况。
我被锁定到 Rails v5.2.0。
事实证明,这是乘客应用程序容器的 nginx 配置,并撤消了 production.rb 文件中错误的
config.assets.compile = true
行。
一旦我将
config.assets.compile = false
重置为应有的样子,我就在 nginx 配置中注释掉了 alias
行。关闭此功能,使表单按预期提交,但没有资产,如果我重新打开 alias
,我得到了资产,但表单再次提交错误。
我将 nginx 配置改回原来的配置:
location /my-app/view/ {
passenger_base_uri /my-app/view;
passenger_app_root /var/www/html/code;
passenger_document_root /var/www/html/code/public;
alias /var/www/html/code/public/;
passenger_enabled on;
}
它又神奇地开始工作了。
我同时进行了一些编辑,然后就开始工作了。我没有时间回去分析每个不同的设置,在这之后还有 25 个其他问题需要解决,所以就继续前进。