介紹
簡(jiǎn)而言之,Nginx(發(fā)音為“engine x”)是一個(gè)小型、功能強(qiáng)大并且可擴(kuò)展的 web/proxy 服務(wù)器。根據(jù)Netcraft最近的一次調(diào)查,Nginx已經(jīng)支持了全球超過(guò)15%的網(wǎng)站,共111,680,078家 [1],其中不乏Netflix和WordPress.com這樣的龐然大物。
Nginx基于Simplified BSD許可(一個(gè)開(kāi)源許可)發(fā)行,可以從在線(xiàn)倉(cāng)庫(kù)或者源代碼進(jìn)行安裝。在本文中,我們將會(huì)涵蓋如何在Debian,Ubuntu以及CentOS下安裝Nginx。需要特別注意的一點(diǎn)是,在線(xiàn)倉(cāng)庫(kù)中的版本通常都會(huì)滯后一點(diǎn)。如果我們想體驗(yàn)最新的功能和bug修正,那么我推薦根據(jù)源代碼來(lái)構(gòu)建,或者直接從nginx.org下載安裝包。
使用在線(xiàn)倉(cāng)庫(kù)在Debian Wheezy 7.2 上安裝Nginx
通過(guò)使用Debian GNU/Linux包管理器的高級(jí)界面工具——aptitude
,我們可以查看Nginx相關(guān)的包列表(如圖1所示)。但是,我建議你先運(yùn)行命令aptitude update
,以便可以看到可用包的最新列表。
圖1
(順便提一下,第一列中的”p“表示當(dāng)前操作系統(tǒng)上沒(méi)有安裝此包)
如果我們不知道要安裝哪個(gè)包,可以在命令aptitude search
后跟上一個(gè)包名,例如aptitude search nginx
,這樣可以幫助我們進(jìn)行選擇。根據(jù)列出的各個(gè)包的說(shuō)明,我們將選擇安裝nginx-full
(如圖2所示)。需要重點(diǎn)注意的是,每個(gè)包的描述中都列出了在使用倉(cāng)庫(kù)進(jìn)行安裝時(shí),默認(rèn)會(huì)安裝的其他模塊,我們將在本文稍后部分再對(duì)其進(jìn)行介紹。
圖2 使用在線(xiàn)倉(cāng)庫(kù)在Debian Wheezy 7.2上安裝nginx-full
現(xiàn)在,我們已經(jīng)安裝了Nginx,但還沒(méi)有啟動(dòng)它。隨后我們運(yùn)行service nginx start
啟動(dòng)Nginx,即可在瀏覽器中打開(kāi)其啟動(dòng)頁(yè)面(如圖3所示)。
圖3 Nginx啟動(dòng)頁(yè)面
接下來(lái)這條命令會(huì)顯示我們剛安裝的Nginx的版本(如圖4所示)
圖4 從倉(cāng)庫(kù)中安裝的Nginx v1.2.1版本
但是,如今Nginx的最新版本已經(jīng)是1.5.6(譯者注:現(xiàn)在已經(jīng)是1.9.11),而版本1.2.1已經(jīng)與2012年6月5日過(guò)期了[2]。顯然,如果我們希望使用最新的Nginx版本,就需要從源代碼進(jìn)行安裝。
使用源代碼在Debian Wheezy 7.2上安裝Nginx
請(qǐng)注意,以下指令代表了在Linux下從頭開(kāi)始構(gòu)建一個(gè)包的默認(rèn)步驟,而我們都知道,使用./configure
,make
和make install
的常規(guī)安裝步驟,會(huì)使得卸載包變得困難,因?yàn)橄到y(tǒng)沒(méi)有辦法去跟蹤哪些文件在安裝過(guò)程中被添加或修改。
總而言之,你應(yīng)該有一個(gè)有說(shuō)服力的原因(一個(gè)真正強(qiáng)有說(shuō)服力的原因!),才可以選擇上面提到的這種方式來(lái)編譯一個(gè)包。雖然你也許有一些這類(lèi)的原因,但是最常見(jiàn)的一個(gè)原因是要在系統(tǒng)中安裝某個(gè)包的更新版本,或者為了添加某個(gè)特定的功能。
如果你構(gòu)建并安裝了一個(gè).deb
或者一個(gè).rpm
文件,那么相應(yīng)的包管理器(aptitude
/apt-get
或者yum
)就能夠感知到包的存在,并且它可以確保你沒(méi)有覆蓋之前安裝的包的文件。另一方面,make install
命令會(huì)覆蓋安裝過(guò)程中遇到的所有文件。我們稍后會(huì)討論,當(dāng)我們必須要從源代碼編譯并安裝一個(gè)包時(shí),可選的其他方式。
既然我們已經(jīng)決定使用Nginx的最新版本,那么久需要按照如下步驟,從http://nginx.org/download/下載已經(jīng)壓縮好的tar文件,并且在構(gòu)建之前進(jìn)行解壓縮。
- 下載tar包:
wget
http://nginx.org/download/nginx-1.5.6.tar.gz - 解壓縮:
tar xvzf nginx-1.5.6.tar.gz
- 進(jìn)入上一步自動(dòng)創(chuàng)建的目錄:
cd nginx-1.5.6
然后
-
cd nginx-1.5.6
(如果你希望列出所有的配置選項(xiàng),可以使用--help
選項(xiàng))。./configure
命令的輸出會(huì)顯示出Nginx的安裝目錄(如圖5所示的/usr/local/nginx
)
圖5 Nginx安裝路徑
make
make install
雖然安裝完成了,但是Nginx所在目錄還沒(méi)有被添加到PATH環(huán)境變量中(如圖6所示)
圖6 PATH變量(之前)
現(xiàn)在我們將/usr/local/nginx/sbin
目錄添加到PATH變量中,并檢查我們剛剛從源代碼安裝的Nginx版本(如圖7所示)。
圖7 PATH變量(之后),并且從源代碼安裝了Nginx v1.5.6版本
注意:在安裝過(guò)程中,可能系統(tǒng)會(huì)提示缺少庫(kù)文件(如圖8所示)。這時(shí)我們可以選擇安裝提供該庫(kù)文件(例如我們遇到的libpcre3-dev
和zlib1g-dev
文件)的包,或者在配置是忽略這些提示。
圖8 缺少庫(kù)文件
在Ubuntu 12.04 LTS上安裝Nginx
雖然Ubuntu的最新版本是13.10(代號(hào) Saucy Salamander,于2013年十月17日發(fā)布),我們還是決定在Ubuntu 12.04 LTS(代號(hào) Precise Pangolin)上進(jìn)行安裝,因?yàn)镃anonical提供了直到2017年4月份的延長(zhǎng)支持。
我們會(huì)繼續(xù)通過(guò)sudo aptitude
和update
來(lái)更新源代碼,然后從分發(fā)版的在線(xiàn)倉(cāng)庫(kù)中安裝nginx-full。因?yàn)閁buntu默認(rèn)禁止root賬戶(hù),所以必須加上關(guān)鍵字"sudo"
(如圖9所示)。除此之外,其他的所有安裝步驟都跟我們之前在Debian上的操作幾乎一樣。從源代碼進(jìn)行安裝也是一樣的。
圖9 在Ubuntu上從倉(cāng)庫(kù)安裝nginx-full包
但是,我們可以看到,可用的版本比之前更低(如圖10所示)。
圖10 在Ubuntu上從倉(cāng)庫(kù)安裝的Nginx版本
同之前一樣,我們會(huì)在從源代碼進(jìn)行安裝之前,刪除(卸載)掉nginx相關(guān)的所有包(如圖11所示)。
圖11
同之前一樣,在從源代碼安裝Nginx之后,我們的包都是最新的版本了(如圖12所示)。
圖12
但是,當(dāng)我們?cè)趪L試啟動(dòng)Nginx時(shí)——就像我們?cè)贒ebian中做的那樣——我們很可能會(huì)得到一個(gè)nginx: unrecognized service的錯(cuò)誤消息(如圖13所示)。
圖13
這是因?yàn)槲覀兪菑脑创a安裝的該包,因此啟動(dòng)腳本沒(méi)有被放置在合適的地方。對(duì)于這種情況,我們或者可以使用全路徑(/usr/local/nginx/sbin/nginx)來(lái)運(yùn)行主程序以啟動(dòng)nginx守護(hù)進(jìn)程,或者可以編寫(xiě)一個(gè)腳本來(lái)幫我們做這件事,當(dāng)然,最后一種也是最好的方式,是能夠像其他程序一樣,使用常見(jiàn)的參數(shù)(start, stop, restart, reload
等等)。同時(shí),我們也可以使用隨本教程提供的啟動(dòng)腳本(讀者可以自行修改來(lái)滿(mǎn)足需求)。
一旦我們將啟動(dòng)腳本添加到/etc/init.d
目錄(并將其命名為nginx),我們就需要將DAEMON變量指向到目錄/usr/local/nginx/sbin/nginx
,并將安裝目錄(/usr/local/nginx/sbin
)添加到PATH變量中(請(qǐng)參考圖14a和14b)。
圖14a Nginx啟動(dòng)腳本(之前)
圖14b Nginx啟動(dòng)腳本(之后)
然后我們就可以按如下方式來(lái)運(yùn)行腳本(如圖15a所示)
圖15a Nginx在端口80監(jiān)聽(tīng),PID為1931
同時(shí),我們還需要確保nginx.conf文件”知道“從哪找到Nginx的PID。因此我們注釋掉nginx.conf
中的如下幾行(如圖15c所示,該文件一般在/usr/local/nginx/conf
目錄下)并將目錄改為啟動(dòng)腳本中的目錄(如圖15b所示)。
圖15b 文件
/var/run/$NAME.pid
(此處$NAME=nginx) 包含了Nginx的當(dāng)前PID
圖15c
使用checkinstall
包來(lái)跟蹤所有通過(guò)安裝腳本創(chuàng)建或修改的文件
checkinstall
包(如圖16所示)可以跟蹤所有在安裝過(guò)程中創(chuàng)建或修改的文件。它還可以創(chuàng)建并安裝一個(gè)與包管理器兼容的包(.deb
或者.rpm
)(如圖16和17所示),這樣你就可以在不需要這個(gè)包的時(shí)候完整的卸載掉。關(guān)于它的用法請(qǐng)檢查附帶的man手冊(cè)。
圖16a 安裝checkinstall包
圖16b 使用checkinstall創(chuàng)建一個(gè).deb文件并進(jìn)行安裝(I)
圖16c 使用checkinstall創(chuàng)建一個(gè).deb文件并進(jìn)行安裝(II)
當(dāng)我們運(yùn)行 aptitude search nginx
后,會(huì)連同注釋?zhuān)ㄖ霸诎惭b時(shí)作為描述)一起顯示出我們已經(jīng)安裝了的包(如圖17所示)。
圖17
在CentOS 6.4上安裝Nginx
從倉(cāng)庫(kù)安裝
-
從http://nginx.org/packages/centos/6 處下載并運(yùn)行nginx yum配置文件。確保你選擇了合適的架構(gòu);”noarch“是一個(gè)穩(wěn)妥的選擇:
- 下載:
wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
- 安裝:
wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
- 下載:
安裝Nginx:
yum install nginx
啟動(dòng)Nginx:
service nginx start
從源代碼安裝
按照同Debian和Ubuntu一樣的流程
啟用模塊
根據(jù)Nginx的wiki[3],由于當(dāng)前不支持運(yùn)行時(shí)啟用模塊,所以必須在編譯時(shí)選擇啟用的模塊。通過(guò)運(yùn)行./configure --help
,可以找到配置腳本中提供的所有編譯時(shí)選項(xiàng),包括可選模塊。不幸的是,如果我們已經(jīng)安裝了Nginx但又想添加某一個(gè)模塊,我們必須先卸載它,再重新用所需模塊進(jìn)行編譯。
對(duì)于標(biāo)準(zhǔn)的HTTP模塊列表,請(qǐng)參考表1[4]:
名稱(chēng) | 描述 | 版本 | 禁用參數(shù) |
---|---|---|---|
HTTP Core | 控制端口、位置、錯(cuò)誤頁(yè)面、別名及其他必要項(xiàng) | -without-http | |
Access | 根據(jù)IP地址允許/禁止訪(fǎng)問(wèn) | –without-http_access_module | |
Auth Basic | 基礎(chǔ)HTTP認(rèn)證 | –without-http_auth_basic_module | |
Auto Index | 生成自動(dòng)目錄列表 | –without-http_autoindex_module | |
Browser | 解析“User-Agent” | 0.4.3 | –without-http_browser_module |
Charset | 重新對(duì)頁(yè)面編碼 | –without-http_charset_module | |
Empty GIF | 從內(nèi)存中提供一個(gè)1x1的圖片 | 0.3.10 | –without-http_empty_gif_module |
FastCGI | FastCGI 支持 | –without-http_fastcgi_module | |
Geo | 使用IP地址的鍵/值對(duì)來(lái)設(shè)置變量 | 0.1.17 | –without-http_geo_module |
Gzip | 對(duì)響應(yīng)進(jìn)行Gzip壓縮 | –without-http_gzip_module | |
Headers | 設(shè)置任意的HTTP響應(yīng)頭 | ||
Index | 控制哪些文件可以用作索引 | ||
Limit Requests | 限制客戶(hù)端連接的頻率 | 0.7.20 | –without-http_limit_req_module |
Limit Conn | 基于一個(gè)變量來(lái)限制并發(fā)連接 | –without-http_limit_conn_module | |
Log | 自定義訪(fǎng)問(wèn)日志 | ||
Map | 使用任意的鍵/值對(duì)來(lái)配置變量 | 0.3.16 | –without-http_map_module |
Memcached | Memcached支持 | –without-http_memcached_module | |
Proxy | 代理到上游服務(wù)器 | –without-http_proxy_module | |
Referer | 根據(jù)Referer頭信息來(lái)過(guò)濾請(qǐng)求 | –without-http_referer_module | |
Rewrite | 使用正則表達(dá)式來(lái)改寫(xiě)請(qǐng)求 | –without-http_rewrite_module | |
SCGI | 支持SCGI協(xié)議 | 0.8.42 | –without-http_scgi_module |
Split Clients | 根據(jù)一些條件類(lèi)分隔客戶(hù)端 | 0.8.37 | –without-http_split_clients_module |
SSI | 支持Server-side Includes 命令 | –without-http_ssi_module | |
Upstream | 用于負(fù)載均衡 | –without-http_upstream_ip_hash_module (只禁用ip_hash 指令) | |
User ID | 發(fā)起身份確認(rèn)cookie | –without-http_userid_module | |
uWSGI | uWSGI 協(xié)議支持 | 0.8.40 | –without-http_uwsgi_module |
X-Accel | X-Sendfile-like 模塊 |
表1 標(biāo)準(zhǔn)的HTTP模塊
對(duì)于可選的HTTP模塊列表,請(qǐng)參考表2[5]
名稱(chēng) | 描述 | 版本 | 啟用參數(shù) |
---|---|---|---|
Addition | 在頁(yè)面后追加文字 | –with-http_addition_module | |
Auth Request | 基于子請(qǐng)求的結(jié)果來(lái)實(shí)現(xiàn)客戶(hù)端認(rèn)證 | 1.5.4 | –with-http_auth_request_module |
Degradation | 在低內(nèi)存情況下,允許對(duì)某些地址返回204或者444 | 0.8.25 | –with-http_degradation_module |
Embedded Perl | 在Nginx配置文件中使用Perl | 0.3.21 | –with-http_perl_module |
FLV | Flash流視頻 | 0.4.7 | –with-http_flv_module |
GeoIP | 使用來(lái)自MaxMind GeoIP二進(jìn)制文件的信息來(lái)創(chuàng)建變量 | 0.8.6, 0.7.63 | –with-http_geoip_module |
Google Perftools | Google性能工具支持 | 0.6.29 | –with-google_perftools_module |
Gzip Precompression | 對(duì)靜態(tài)文件啟用預(yù)壓縮版本 | 0.6.23 | –with-http_gzip_static_module |
Gunzip | 即時(shí)對(duì)經(jīng)過(guò)gzip壓縮的響應(yīng)進(jìn)行解壓縮 | 1.3.6 | –with-http_gunzip_module |
Image Filter | 使用Libgd來(lái)轉(zhuǎn)換圖片 | 0.7.54 | 0.7.54 |
MP4 | 啟用mp4流媒體及其seeking功能 | 1.1.3, 1.0.7 | –with-http_mp4_module |
Random Index | 將目錄索引隨機(jī)化 | 0.7.15 | –with-http_random_index_module |
Real IP | 使用nginx作為后端服務(wù)器時(shí)啟用 | 0.3.8 | –with-http_realip_module |
Secure Link | 使用秘鑰來(lái)保護(hù)頁(yè)面 | 0.7.18 | –with-http_secure_link_module |
SSL | 支持HTTPS/SSL | –with-http_ssl_module | |
Stub Status | 查看服務(wù)器統(tǒng)計(jì)信息 | 0.1.18 | –with-http_stub_status_module |
Substitution | 替換頁(yè)面中的文字 | –with-http_sub_module | |
WebDAV | 支持WebDAV 穿越 | 0.3.38 | –with-http_dav_module |
XSLT | 使用XSLT對(duì)頁(yè)面進(jìn)行再處理 | 0.7.8 | –with-http_xslt_module |
表2 可選的HTTP模塊
對(duì)于郵件模塊列表,請(qǐng)參考表3[6]。
名稱(chēng) | 描述 | 配置參數(shù) |
---|---|---|
Mail Core | 配置郵件模塊的核心參數(shù) | –with-mail |
POP3 | POP3設(shè)置 | –without-mail_pop3_module |
IMAP | IMAP設(shè)置 | –without-mail_imap_module |
SMTP | SMTP設(shè)置 | –without-mail_smtp_module |
Auth HTTP | 使用Nginx來(lái)認(rèn)證郵件服務(wù) | |
Proxy | Nginx可以代理 IMAP、POP3及SMTP協(xié)議 | |
SSL | 該模塊可以確保為POP3/IMAP/SMTP提供SSL/TLS支持 | –with-mail_ssl_module |
表3 郵件模塊
舉例說(shuō)明,我們可以重新編譯Nginx,以便添加其他模塊(如圖18所示)。
圖18 使用其他模塊重新編譯Nginx
將Nginx添加為一個(gè)系統(tǒng)服務(wù)
-
Debian/Ubuntu :
update-rc.d –f nginx defaults
(在Ubuntu上使用sudo
)
注意:如果已經(jīng)存在/etc/rcrunlevel.d/[SK]??name 這樣的文件,那么update-rc.d將不會(huì)起作用。這樣做的目的,是為了避免修改可能經(jīng)過(guò)系統(tǒng)管理員調(diào)整過(guò)的已有配置。只有不存在任何該類(lèi)文件的情況下,例如該服務(wù)從未被安裝過(guò),該程序才會(huì)安裝相應(yīng)的鏈接。
- CentOS: chkconfig nginx on
-
Sept. 2013 Web Server Survey, http://news.netcraft.com/archives/2013/09/05/september-2013-web-server-survey.html ?
-
download page, http://nginx.org/download/ ?
-
Nginx wiki, http://wiki.nginx.org/Modules ?
-
Nginx modules, http://wiki.nginx.org/Modules ?
-
Nginx modules, http://wiki.nginx.org/Modules ?
-
Nginx modules, http://wiki.nginx.org/Modules ?