为什么passenger-install-nginx-module既没有安装Nginx,也没有在Centos7上实现Passenger支持,而输出却表明相反?

为什么passenger-install-nginx-module既没有安装Nginx,也没有在Centos7上实现Passenger支持,而输出却表明相反?

介绍

目前,大约有 100 个 Puppet 代理连接到 Puppetmaster。有时,代理需要一段时间才能接收 Puppetmaster 上实施的更改。一些信息表明,Passenger 与 Web 服务器(例如 Apache2 或 Nginx)结合使用可以加速此过程。最重要的是,根据本文档强烈建议在生产环境中使用此类功能。


目的

目的是在 CentOS7 上安装 Nginx 并实现 Phusion Passenger 支持,以passenger-install-nginx-module加速 Puppet-agents 对 Puppetmaster 上实施的更改的识别。


尝试

尝试 1

sudo /usr/local/share/gems/gems/passenger-4.0.56/bin/passenger-install-nginx-module --auto --auto-download已执行并遵循安装步骤。

第二次尝试

由于在第一次尝试时未安装 Nginx 服务,因此使用 进行安装yum -y install nginx

第三次尝试

谷歌搜索:"[emerg] unknown directive passenger_enabled" 表示 nginx 编译时没有支持 Phusion Passenger。在这种情况下,这应该是错误的,因为passenger-install-nginx-module已经运行并且尝试 1 期间安装的输出表明应该已经安装了 Nginx。

第四次尝试

/etc/nginx/nginx.conf

passenger_root  /usr/local/share/gems/gems/passenger-4.0.56;
passenger_ruby  /usr/bin/ruby;

/etc/nginx/conf.d/puppet.conf

passenger_enabled          on;

尝试 5

测试是否也使用另一个 Web 服务器发生此问题sudo /usr/local/share/gems/gems/passenger-4.0.56/bin/passenger-install-apache2-module


预期结果

执行passenger-install-nginx-module并完成安装步骤即可安装 Nginx。可以启动 Nginx 服务,并且包含 Phusion-Passenger 支持。检查端口 8140 是否处于 LISTEN 状态应为 true,因为 Nginx 应启动 Puppetmaster。


目前的结果

执行passenger-install-nginx-module并完成安装步骤并不会安装 Nginx,而输出表明相反。

Nginx with Passenger support was successfully installed.

Please edit your Nginx configuration file (probably /opt/nginx/conf/nginx.conf),
and set the passenger_root and passenger_ruby configuration options in the
'http' block, like this:

  http {
      ...
      passenger_root /usr/local/share/gems/gems/passenger-4.0.56;
      passenger_ruby /usr/bin/ruby;
      ...
  }

使用 yum 安装 Nginx 也不行,passenger-install-nginx-module再次执行还是一样。

[vagrant@vm-one ~]$ sudo systemctl status nginx.service -l                        
   nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled)
   Active: failed (Result: exit-code) since Thu 2015-01-01 01:55:56 UTC; 
  2min 19s ago
  Process: 7963 ExecStop=/bin/kill -s QUIT $MAINPID (code=exited, status=0/
  SUCCESS)
  Process: 7935 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 10814 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=1/FAILURE)
 Main PID: 7937 (code=exited, status=0/SUCCESS)

Jan 01 01:55:56 vm-one.local systemd[1]: Starting The nginx HTTP and reverse 
proxy server...
Jan 01 01:55:56 vm-one.local nginx[10814]: nginx: [emerg] unknown directive
 "passenger_enabled" in /etc/nginx/conf.d/puppet.conf:5
Jan 01 01:55:56 vm-one.local nginx[10814]: nginx: configuration file /etc/nginx
 /nginx.conf test failed
Jan 01 01:55:56 vm-one.local systemd[1]: nginx.service: control process exited,
 code=exited status=1
Jan 01 01:55:56 vm-one.local systemd[1]: Failed to start The nginx HTTP and
reverse proxy server.
Jan 01 01:55:56 vm-one.local systemd[1]: Unit nginx.service entered failed state.

尝试安装另一个支持 Passenger 的 Web 服务器会导致:

 * Checking for Apache 2...
      Found: no
 * Checking for Apache 2 development headers...
      Found: no

这表明passenger-install-apache2-module与之相反,passenger-install-nginx-module似乎要检查 Web 服务器是否已安装。

答案1

我是 Phusion Passenger 的作者。您对 Nginx 有一些根本性的误解。

首先,Nginx 不支持动态加载模块。这意味着扩展 Nginx 的唯一方法是从头开始重新编译 Nginx,并包含某些模块。

在您的思维模型中,您似乎认为 会passenger-install-nginx-module在某处安装一个模块文件,并yum install nginx在某处安装一个 Nginx 实例,然后加载 Passenger 模块。这是错误的。passenger-install-nginx-module从头开始​​编译一个全新的 Nginx,启用 Passenger 模块并将其静态链接在其中。根据您为其提供的参数(最明显的是安装前缀),您最终将得到一个完全独立的 Nginx 安装 —— 一个与您使用 yum 安装的完全独立的安装。

Passenger wiki 上对此进行了详尽的记录:为什么 Passenger 无法扩展我的 Nginx?。这不是我们(Passenger 的作者)决定的。这就是 Nginx 本身的工作原理,我们无法改变这一点。安装任何Nginx 模块就是这样的。它与 Apache 模块形成了鲜明的对比,Apache 模块确实按照您想象的方式工作。

其次,您似乎认为安装 Nginx 服务是 Passenger 会做的事情。这是错误的。服务定义完全是特定于平台的,甚至是特定于发行版的附加组件,由发行版的打包者添加。服务定义既不包含在 Nginx 源代码中,也不由 Passenger 安装。因此,如果您从源代码(而不是 RPM)安装 Passenger/Nginx,那么您必须自己安装服务定义。手册中有一节专门讨论此问题。

相关内容