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

030*_*030 2 installation nginx phusion-passenger systemctl centos7

介绍

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


目的

目的是在 CentOS7 上安装 Nginx 并实现 Phusion 乘客支持,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 已执行并遵循安装步骤。

尝试 2

由于在尝试 1 期间未安装 Nginx 服务,因此使用yum -y install nginx.

尝试 3

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

尝试 4

/etc/nginx/nginx.conf

passenger_root  /usr/local/share/gems/gems/passenger-4.0.56;
passenger_ruby  /usr/bin/ruby;
Run Code Online (Sandbox Code Playgroud)

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

passenger_enabled          on;
Run Code Online (Sandbox Code Playgroud)

尝试 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;
      ...
  }
Run Code Online (Sandbox Code Playgroud)

使用 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.
Run Code Online (Sandbox Code Playgroud)

尝试安装另一个带有乘客支持的 Web 服务器会导致:

 * Checking for Apache 2...
      Found: no
 * Checking for Apache 2 development headers...
      Found: no
Run Code Online (Sandbox Code Playgroud)

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

Hon*_*Lai 7

我是 Phusion 乘客的作者。你从根本上误解了 Nginx。

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

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

这在Passenger wiki 中有详细记录:为什么Passenger 不能扩展我的Nginx?. 这不是我们——Passenger 的作者——决定的。这就是 Nginx 本身的基本工作方式,我们无法改变这一点。安装任何Nginx 模块都是这样。它与 Apache 模块形成鲜明对比,Apache 模块按照您认为的方式工作。

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