问题总结:手工编译nginx/动态乘客模块之后,我无法判断乘客是否正在启动,或者是什么问题在为我的应用程序服务,但无论我尝试哪一页,我都会得到403禁止或404找不到。
details:我在passenger+nginx包下有一个可工作的rails应用程序,但是由于nginx1.18的安全警报和公司的安全策略,我不得不清除nginx的设置,重新开始,手动编译所有根据此链接。经过半天的挣扎之后,当我尝试通过浏览器访问我的站点时,nginx将启动,我在错误日志中得到了这样的信息:
2022/02/24 00:03:06 [error] 156967#156967: *3 directory index of "/home/<app name>/staging/current/public/" is forbidden, client: <client ip addr>, server: <server ip addr>, request: "GET / HTTP/1.1", host: "<server ip addr>"我认为正在发生的是乘客正在开始,但当它试图运行rails应用程序时出现了一些错误。但我不确定因为
passenger-status,因为根据这个问题,乘客找不到它的实例注册表文件夹时出错。设置适当的env。变量PASSENGER_INSTANCE_REGISTRY_DIR to /tmp没有为我修复这个问题,尽管我确实看到在那里创建了乘客文件。我的nginx.conf中有以下设置:
load_module modules/ngx_http_passenger_module.so
http {
:
passenger_root /home/<app name>/.rvm/gems/ruby-2.6.5/gems/passenger-6.0.12
passenger_ruby /home/<app name>/.rvm/gems/ruby-2.6.5/wrappers/ruby
:我在“启用/默认”站点中有以下设置:
root /home/<app name>/staging/current/public;
passenger_enabled on;
passenger_app_env staging;我可以通过访问rails应用程序目录并运行RAILS_ENV=staging passenger start来独立运行乘客。启动应用程序没有明显的问题。rails server也不例外。
我怎么才能诊断出到底发生了什么?我如何知道乘客是否甚至是错误日志条目的来源?经过两天的尝试,我完全被困住了。
提前感谢您的帮助。
在我最初的问题之后编辑了,我注意到sudo service nginx status在抱怨乘客没有正确安装/编译。然而,我清除了所有的东西(nginx,客运),并从头开始设置它,我回到上面的问题,但没有错误的乘客时,我现在检查的状态。
我还确信乘客根本不会被呼叫,因为如果我在我的应用程序的公共目录中添加"hello,world“,它就会得到Nginx的服务。当我检查passenger=memory-stats时,我也没有看到乘客的过程。所以我认为乘客没有启动。
发布于 2022-02-25 01:37:13
我回答了我自己的问题。
在上一次编辑之后不久,我修复了一个小问题(我在我的passenger_root文件中临时注释掉了passenger_ruby和nginx.conf指令),然后一切都正常了。
因此,现在我将概述我用来升级Nginx和Phusion乘客到Ubuntu20.04上的最新稳定版本的整个过程,希望它能在未来帮助他人。在我的例子中,这是因为Nginx 1.20+被强制执行,但是Ubuntu的apt只提供了1.18,这是一个大约6个月前已知的漏洞。
当Phusion提供的乘客Nginx包使用过时的供应商供应的Nginx时(就像几个月以来的情况一样),这个过程是必要的。
步骤1.清除现有的ubuntu供应的nginx和乘客:
sudo apt-get remove nginx*
sudo apt-get remove passenger步骤2.从nginx.org的apt存储库下载最新的稳定nginx (在我的例子中是1.20.2),而不是从Ubuntu下载。在Ubuntu标题下,我遵循了此链接的说明。
步骤3 :我已经有了rvm管理的ruby,但是您应该安装该应用程序环境或您需要的任何应用程序环境。我前进的方向是红宝石/铁轨。
步骤4.通过ruby命令安装乘客:
gem install passenger第5步。转到乘客目录,然后搜索它:
cd ~/.rvm/gems/ruby-2.6.5/gems/passenger-6.0.12
rvmsudo rake nginx:as_dynamic_module CACHING=false注意到在这里使用rvmsudo。因为乘客安装在rvm目录中,所以对于乘客可执行文件,应该使用rvmsudo而不是sudo。
步骤6.下载nginx源代码以匹配在步骤2中安装的稳定版本:根据此页,您可以从这个URI获得它:
https://nginx.org/download/nginx-${NGINX_VERSION_HERE}.tar.gz然后用tar -xf nginx-${NGINX_VERSION_HERE}.tar.gz解压
步骤7.按照上面的链接,为即将进行的编译获取兼容的指令。运行sudo nginx -V,返回:
nginx version: nginx/1.20.2
built by gcc 9.3.0 (Ubuntu 9.3.0-10ubuntu2)
built with OpenSSL 1.1.1f 31 Mar 2020
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --wi...编辑复制从“-前缀”开始的所有内容。
步骤8.配置编译。转到nginx源目录并执行:
./configure {paste from clipboard} --add-dynamic-module=$(passenger-config --nginx-addon-dir)
make
sudo make install步骤9.配置nginx:
cd /etc/nginx
sudo mkdir modules-enabled #if directory not already there
cd modules-enabled
sudo ln -s /usr/lib/nginx/modules/ngx_http_passenger_module.so ngx_http_passenger_module.so最后一行放置一个符号链接到为乘客创建的动态库,该链接是在步骤7的--modules-path参数定义的位置创建的。
然后,确保nginx看到模块,并知道在哪里可以找到自己和乘客需要的ruby解释器。在nginx.conf中,确保有这些行:
load_module modules/ngx_http_passenger_module.so
http {
:
passenger_root /home/<app name>/.rvm/gems/ruby-2.6.5/gems/passenger-6.0.12
passenger_ruby /home/<app name>/.rvm/gems/ruby-2.6.5/wrappers/ruby
:当然,确切的位置取决于您的rvm版本和乘客版本。
步骤10.配置站点。这超出了这一范围,但要具备的关键行是:
:
root /home/<app name>/staging/current/public;
passenger_enabled on;
passenger_app_env staging; #rails environment (not needed for production, only development or staging)
:
}https://stackoverflow.com/questions/71249148
复制相似问题