Nginx是一款輕量級(jí)的網(wǎng)頁服務(wù)器、反向代理服務(wù)器。相較于Apache涨冀、lighttpd具有占有內(nèi)存少,穩(wěn)定性高等優(yōu)勢麦萤。它最常的用途是提供反向代理服務(wù)鹿鳖。
安裝
在Centos下,yum源不提供nginx的安裝壮莹,可以通過切換yum源的方法獲取安裝翅帜。目前很多像centos7系統(tǒng)已經(jīng)自帶這幾個(gè)庫,所以安裝前可以先查看一下本地是否已經(jīng)存在命满。存在可直接跳至第四步驟涝滴。需要使用安裝包編譯安裝的,如下胶台。以下命令均需root權(quán)限執(zhí)行:
首先安裝必要的庫(nginx 中g(shù)zip模塊需要 zlib 庫歼疮,rewrite模塊需要 pcre 庫,ssl 功能需要openssl庫)诈唬。選定/usr/local為安裝目錄韩脏,以下具體版本號(hào)根據(jù)實(shí)際改變。
1.安裝PCRE庫
$ cd /usr/local/
$ sudo wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz
$ sudo tar -zxvf pcre-8.36.tar.gz
$ cd pcre-8.36
$ sudo ./configure
$ sudo make
$ sudo make install
2.安裝zlib庫
$ cd /usr/local/
$ sudo wget http://zlib.net/zlib-1.2.8.tar.gz
$ sudo tar -zxvf zlib-1.2.8.tar.gz
$ cd zlib-1.2.8
$ sudo ./configure
$ sudo make
$ sudo make install
3.安裝ssl
$ cd /usr/local/
$ sudo wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz
$ sudo tar -zxvf openssl-1.0.1j.tar.gz
$ sudo ./config
$ sudo make
$ sudo make install
4.安裝nginx
$ cd /usr/local/
$ sudo wget http://nginx.org/download/nginx-1.8.0.tar.gz
$ sudo tar -zxvf nginx-1.8.0.tar.gz
$ cd nginx-1.8.0
$ sudo ./configure --prefix=/usr/local/nginx #這一步需要按需要添加編譯參數(shù)铸磅,如下
$ sudo make
$ sudo make install
如果是使用安裝包編譯的上面幾個(gè)依賴骤素,需要在在--prefix后面接以下命令:
--with-pcre=/usr/local/pcre-8.36 指的是pcre-8.36 的源碼路徑匙睹。
--with-zlib=/usr/local/zlib-1.2.8 指的是zlib-1.2.8 的源碼路徑。
5.啟動(dòng)
先測試一下配置文件是否正確:
$ /usr/local/nginx/sbin/nginx -t
無問題可以啟動(dòng):
$ /usr/local/nginx/sbin/nginx
檢查是否啟動(dòng)成功:
打開瀏覽器訪問此機(jī)器的 IP济竹,如果瀏覽器出現(xiàn) Welcome to nginx! 則表示 Nginx 已經(jīng)安裝并運(yùn)行成功痕檬。
部分命令如下:
重啟:
$ /usr/local/nginx/sbin/nginx –s reload
停止:
$ /usr/local/nginx/sbin/nginx –s stop
測試配置文件是否正常:
$ /usr/local/nginx/sbin/nginx –t
強(qiáng)制關(guān)閉:
$ pkill nginx
配置
以上安裝方法nginx的配置文件位于
/usr/local/nginx/conf/nginx.conf
Nginx配置文件常見結(jié)構(gòu)的從外到內(nèi)依次是「http」「server」「location」等等,缺省的繼承關(guān)系是從外到內(nèi)送浊,也就是說內(nèi)層塊會(huì)自動(dòng)獲取外層塊的值作為缺省值梦谜。
Server
接收請(qǐng)求的服務(wù)器需要將不同的請(qǐng)求按規(guī)則轉(zhuǎn)發(fā)到不同的后端服務(wù)器上,在 nginx 中我們可以通過構(gòu)建虛擬主機(jī)(server)的概念來將這些不同的服務(wù)配置隔離袭景。
server {
listen 80;
server_name localhost;
root html;
index index.html index.htm;
}
例如我們筆戈玩下的兩個(gè)子項(xiàng)目 passport 和 wan 就可以通過在 nginx 的配置文件中配置兩個(gè) server唁桩,servername 分別為 passport.bigertech.com 和 wan.bigertech.com。這樣的話不同的 url 請(qǐng)求就會(huì)對(duì)應(yīng)到 nginx 相應(yīng)的設(shè)置耸棒,轉(zhuǎn)發(fā)到不同的后端服務(wù)器上荒澡。
這里的 listen 指監(jiān)聽端口,server_name 用來指定IP或域名与殃,多個(gè)域名對(duì)應(yīng)統(tǒng)一規(guī)則可以空格分開单山,index 用于設(shè)定訪問的默認(rèn)首頁地址,root 指令用于指定虛擬主機(jī)的網(wǎng)頁跟目錄幅疼,這個(gè)地方可以是相對(duì)地址也可以是絕對(duì)地址米奸。
通常情況下我們可以在 nginx.conf 中配置多個(gè)server,對(duì)不同的請(qǐng)求進(jìn)行設(shè)置爽篷。就像這樣:
server {
listen 80;
server_name host1;
root html;
index index.html index.htm;
}
server {
listen 80;
server_name host2;
root /data/www/html;
index index.html index.htm;
}
但是當(dāng) server 超過2個(gè)時(shí)悴晰,建議將不同對(duì)虛擬主機(jī)的配置放在另一個(gè)文件中,然后通過在主配置文件 nginx.conf 加上 include 指令包含進(jìn)來逐工。更便于管理铡溪。
include vhosts/*.conf;
就可以把vhosts的文件都包含進(jìn)去啦。
Localtion
每個(gè) url 請(qǐng)求都會(huì)對(duì)應(yīng)的一個(gè)服務(wù)泪喊,nginx 進(jìn)行處理轉(zhuǎn)發(fā)或者是本地的一個(gè)文件路徑佃却,或者是其他服務(wù)器的一個(gè)服務(wù)路徑。而這個(gè)路徑的匹配是通過 location 來進(jìn)行的窘俺。我們可以將 server 當(dāng)做對(duì)應(yīng)一個(gè)域名進(jìn)行的配置饲帅,而 location 是在一個(gè)域名下對(duì)更精細(xì)的路徑進(jìn)行配置。
以上面的例子瘤泪,可以將root和index指令放到一個(gè)location中灶泵,那么只有在匹配到這個(gè)location時(shí)才會(huì)訪問root后的內(nèi)容:
location / {
root /data/www/host2;
index index.html index.htm;
}
location 匹配規(guī)則
~ 波浪線表示執(zhí)行一個(gè)正則匹配,區(qū)分大小寫
~* 表示執(zhí)行一個(gè)正則匹配对途,不區(qū)分大小寫
^~ ^~表示普通字符匹配赦邻,如果該選項(xiàng)匹配,只匹配該選項(xiàng)实檀,不匹配別的選項(xiàng)惶洲,一般用來匹配目錄
= 進(jìn)行普通字符精確匹配
匹配例子:
location = / {
# 只匹配"/".
[ configuration A ]
}
location / {
# 匹配任何請(qǐng)求按声,因?yàn)樗姓?qǐng)求都是以"/"開始
# 但是更長字符匹配或者正則表達(dá)式匹配會(huì)優(yōu)先匹配
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 開始的請(qǐng)求,并停止匹配 其它location
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配以 gif, jpg, or jpeg結(jié)尾的請(qǐng)求.
# 但是所有 /images/ 目錄的請(qǐng)求將由 [Configuration C]處理.
[ configuration D ]
}
請(qǐng)求:
/ -> 符合configuration A
/documents/document.html -> 符合configuration B
/images/1.gif -> 符合configuration C
/documents/1.jpg ->符合 configuration D
靜態(tài)文件映射
訪問文件的配置主要有 root 和 aliasp's 兩個(gè)指令恬吕。這兩個(gè)指令的區(qū)別容易弄混:
alias
alias后跟的指定目錄是準(zhǔn)確的签则,并且末尾必須加 /。
location /c/ {
alias /a/;
}
如果訪問站點(diǎn)http://location/c訪問的就是/a/目錄下的站點(diǎn)信息铐料。
root
root后跟的指定目錄是上級(jí)目錄渐裂,并且該上級(jí)目錄下要含有和location后指定名稱的同名目錄才行。
location /c/ {
root /a/;
}
這時(shí)訪問站點(diǎn)http://location/c訪問的就是/a/c目錄下的站點(diǎn)信息钠惩。
如果你需要將這個(gè)目錄展開柒凉,在這個(gè)location的末尾加上「autoindex on; 」就可以了
轉(zhuǎn)發(fā)
配置起來很簡單比如我要將所有的請(qǐng)求到轉(zhuǎn)移到真正提供服務(wù)的一臺(tái)機(jī)器的 8001 端口,只要這樣:
location / {
proxy_pass 172.16.1.1:8001;
}
這樣訪問host時(shí)篓跛,就都被轉(zhuǎn)發(fā)到 172.16.1.1的8001端口去了膝捞。
負(fù)載均衡
upstream myserver; {
ip_hash;
server 172.16.1.1:8001;
server 172.16.1.2:8002;
server 172.16.1.3;
server 172.16.1.4;
}
location / {
proxy_pass http://myserver;
}
我們在 upstream 中指定了一組機(jī)器,并將這個(gè)組命名為 myserver愧沟,這樣在 proxypass 中只要將請(qǐng)求轉(zhuǎn)移到 myserver 這個(gè) upstream 中我們就實(shí)現(xiàn)了在四臺(tái)機(jī)器的反向代理加負(fù)載均衡蔬咬。其中的 ip_hash 指明了我們均衡的方式是按照用戶的 ip 地址進(jìn)行分配。另外還有輪詢央渣、指定權(quán)重輪詢计盒、fair渴频、url_hash幾種調(diào)度算法芽丹。
總結(jié)
以上是最簡單的通過 nginx 實(shí)現(xiàn)靜態(tài)文件轉(zhuǎn)發(fā)、反向代理和負(fù)載均衡的配置卜朗。在 nginx 中所有的功能都是通過模塊來實(shí)現(xiàn)的拔第,比如當(dāng)我們配置 upstream 時(shí)是用 upstream 模塊,而 server 和 location 是在 http core 模塊场钉,其他的還有流控的 limt 模塊蚊俺,郵件的 mail 模塊,https 的 ssl 模塊逛万。他們的配置都是類似的可以再 nginx 的模塊文檔中找到詳細(xì)的配置說明泳猬。