【问题标题】:Ubuntu 20.04 + Nginix 1.20.2 + Passenger 6.0.12 dynamic module + RailsUbuntu 20.04 + Nginx 1.20.2 + Passenger 6.0.12 动态模块 + Rails
【发布时间】:2022-11-10 03:02:35
【问题描述】:

问题摘要:手动编译 nginx/动态乘客模块后,我无法判断乘客是否正在启动或服务于我的应用程序的问题,但无论我尝试哪个页面,我都会得到 403 禁止或 404 未找到。

细节:我在passenger+nginx捆绑包下有一个工作的rails应用程序,但由于nginx 1.18的安全警报和我公司的安全政策,我不得不清除我的nginx设置并重新开始,根据this link手动编译所有内容。经过半天的努力,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 应用程序时出现了一些错误。但我不能确定,因为

  1. 错误消息完全没有信息,我想如果乘客没有启动,nginx 会失败并显示类似的消息。
  2. 我无法运行passenger-status,根据this question,我收到一个错误,即乘客找不到其实例注册表文件夹。设置适当的环境。变量 PASSENGER_INSTANCE_REGISTRY_DIR 到 /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

    我如何诊断发生了什么?我怎么知道乘客是否是错误日志条目的来源?在尝试了我能在 SO 中找到的所有东西两天后,我完全陷入了困境。

    提前感谢您的帮助。

    编辑在我最初的问题之后,我注意到sudo service nginx status 抱怨乘客没有正确安装/编译。但是,我清除了所有内容(nginx,passenger)并从头开始重新设置,我又回到了上述问题,但是当我现在检查状态时没有关于乘客的错误。

    我还确信,Passenger 根本没有被调用,因为如果我在我的应用程序的公共目录中的 index.html 中放入“hello, world”,它就会由 Nginx 提供服务。当我检查passenger=memory-stats 时,我也看不到乘客进程。所以我认为Passenger没有启动。

【问题讨论】:

    标签: ruby-on-rails ubuntu-20.04 passenger-nginx


    【解决方案1】:

    我回答了我自己的问题。

    上次编辑后不久,我修复了一个小问题(我在 nginx.conf 文件中暂时注释掉了 passenger_rootpassenger_ruby 指令),然后一切正常。

    所以现在我将概述我用来在 Ubuntu 20.04 上将 Nginx 和 Phusion 乘客升级到最新稳定版本的整个过程,希望它对将来的人有所帮助。在我的情况下,这是因为 Nginx 1.20+ 是强制性的,但 Ubuntu 的 apt 只提供了 1.18,它在大约 6 个月前就有一个已知漏洞。

    当 Phusion 提供的passenger-nginx 包使用过时的、供应商提供的 Nginx 时(几个月以来一直如此),需要此过程。

    步骤 1. 清除现有 ubuntu 提供的 nginx 和乘客:

    sudo apt-get remove nginx*
    sudo apt-get remove passenger
    

    步骤 2. 从 nginx.org 的 apt 存储库而不是 Ubuntu 下载最新的稳定 nginx(在我的例子中是 1.20.2)。我按照 Ubuntu 标题下 this link 的说明进行操作。

    第 3 步。我已经拥有由 rvm 管理的 ruby​​,但你应该安装那个或任何你需要的应用程序环境。我的指示是针对 ruby​​/rails 的。

    步骤 4. 通过 ruby​​ gem 命令安装乘客:

    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 中安装的稳定版本:根据this page,您可以从以下 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...
    

    编辑从“--prefix”开始复制所有内容。

    步骤 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 可以看到该模块,并且知道在哪里可以找到自己以及Passenger 所需的 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)
       :
       }
    
    
    
    
    
    
    
    

    【讨论】:

      猜你喜欢
      • 2014-05-27
      • 1970-01-01
      • 2015-01-16
      • 2021-06-01
      • 2012-10-04
      • 2021-02-09
      • 1970-01-01
      • 2013-12-23
      • 2014-07-07
      相关资源
      最近更新 更多