Nginx

為什麼passenger-install-nginx-module既沒有安裝Nginx,也沒有在Centos7上實現Passenger支持,而輸出顯示相反?

  • January 1, 2015

介紹

目前大約有 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執行並遵循安裝步驟。

嘗試 2

由於在嘗試 1 期間未安裝 Nginx 服務,因此使用yum -y install nginx.

嘗試 3

Google搜尋:"[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;

/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.

嘗試安裝另一個帶有乘客支持的 Web 伺服器會導致:

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

這表明passenger-install-apache2-modulepassenger-install-nginx-module似乎檢查是否已安裝 Web 伺服器相反。

我是 Phusion 乘客的作者。你從根本上誤解了關於 Nginx 的一些東西。

首先,Nginx 不支持動態載入模組。這意味著擴展 Nginx 的唯一方法是從頭開始重新編譯 Nginx,並包含某些模組。

在您的心智模型中,您似乎認為在passenger-install-nginx-module某處安裝一個模組文件,yum install nginx然後在某處安裝一個 Nginx 實例,然後載入乘客模組。這是錯誤的。passenger-install-nginx-module從頭開始編譯一個全新的 Nginx,啟用 Passenger 模組並在其中靜態連結。根據你給它的參數(最明顯的是安裝前綴),你最終會得到一個完全獨立的 Nginx 安裝——一個完全獨立於你用 yum 安裝的那個。

這在乘客 wiki 上有大量記錄:為什麼乘客不能擴展我的 Nginx?. 這不是我們——Passenger 的作者——決定的。這就是 Nginx 本身的基本工作方式,我們無法改變這一點。安裝任何Nginx 模組都是這樣的。它與 Apache 模組形成鮮明對比,Apache 模組確實按照您認為的方式工作。

其次,您似乎假設安裝 Nginx 服務是由Passenger 負責的。這是錯誤的。服務定義完全是特定於平台的,甚至是特定於發行版的附加組件,由發行版的打包程序添加。服務定義既不包含在 Nginx 原始碼中,也不由Passenger 安裝。因此,如果您從原始碼(而不是 RPM)安裝Passenger/Nginx,那麼您必須自己安裝服務定義。手冊中有一節介紹了這一點。

引用自:https://serverfault.com/questions/655700