介绍
目前,大约有 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,那么您必须自己安装服务定义。手册中有一节专门讨论此问题。