安裝
安裝依賴
在Linux中是編譯安裝,所以要準(zhǔn)備一系列工具
yum install pcre-devel make gcc gcc-c++ ncurses-devel perl zlib zlib-devel openssl openssl-devel
| 工具目的 | 程序 |
|---|---|
| 編譯器 | make gcc gcc-c++ |
| 安全協(xié)議 | openssl openssl-devel |
| 語言 | perl腳本語言 |
| 正則表達(dá)式庫 | pcre-devel(用于perl語言) |
| 壓縮庫 | zlib zlib-devel |
| 字符處理庫 | ncurses-devel |
cd /usr/local/
wget http://nginx.org/download/nginx-1.10.1.tar.gz
tar -zxvf nginx-1.10.1.tar.gz
cd nginx-1.10.1
執(zhí)行Configuration配置檢查文件,指定目錄到剛剛新建的nginx目錄里
./configure --prefix=/usr/local/nginx
執(zhí)行make操作和make install進(jìn)行安裝
make
make install
安裝完成后,將nginx命令移動(dòng)到$PATH的目錄下,這樣就不用每次都cd到 /usr/local/sbin 里去運(yùn)行了
mv /usr/local/nginx/sbin/nginx /usr/local/bin/
然后使用nginx -c 命令指定配置文件,接著使用 nginx -t 命令檢查配置文件是否正確,得到反饋syntax is ok
nginx -c /usr/local/nginx/conf/nginx.conf
nginx -t
啟動(dòng):
nginx
重啟:
nginx -s reload
立即停止:
nginx –s stop
溫和停止:
nginx -s quit
強(qiáng)制關(guān)閉:
pkill nginx
打開瀏覽器訪問此機(jī)器的 IP,如果瀏覽器出現(xiàn) Welcome to nginx! 則表示 Nginx 已經(jīng)安裝并運(yùn)行成功。
配置
Nginx配置文件常見結(jié)構(gòu)的從外到內(nèi)依次是「http」「server」「location」等等,缺省的繼承關(guān)系是從外到內(nèi),也就是說內(nèi)層塊會(huì)自動(dòng)獲取外層塊的值作為缺省值。
- HTTP
HTTP代表在該計(jì)算機(jī)上啟動(dòng)HTTP路由,可以開啟不同的server服務(wù),所以HTTP內(nèi)可以包括多個(gè)server。
http {
server {
# 在80端口監(jiān)聽http服務(wù)
# 正常情況下會(huì)和個(gè)人電腦的瀏覽器沖突,但是服務(wù)器上一般沒瀏覽器
# 因?yàn)闉g覽器之所以能上網(wǎng),就是在80端口不停的監(jiān)聽http服務(wù)
listen 80;
server_name localhost;
......
}
server {
# 在8080端口監(jiān)聽http服務(wù)
listen 8080;
server_name localhost;
......
}
......
}
- Server
接收請(qǐng)求的服務(wù)器需要將不同的請(qǐng)求按規(guī)則轉(zhuǎn)發(fā)到不同的后端服務(wù)器上,在 nginx 中我們可以通過構(gòu)建虛擬主機(jī)(server)的概念來將這些不同的服務(wù)配置隔離。
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;
}
這里的 listen 指監(jiān)聽端口,server_name 用來指定IP或域名,多個(gè)域名對(duì)應(yīng)統(tǒng)一規(guī)則可以空格分開,index 用于設(shè)定訪問的默認(rèn)首頁地址,root 指令用于指定虛擬主機(jī)的網(wǎng)頁跟目錄,這個(gè)地方可以是相對(duì)地址也可以是絕對(duì)地址。
但是當(dāng) server 超過2個(gè)時(shí),建議將不同對(duì)虛擬主機(jī)的配置放在另一個(gè)文件中,然后通過在主配置文件 nginx.conf 加上 include 指令包含進(jìn)來。更便于管理。
include vhosts/*.conf;
由于DNS的存在,我們可以使用一個(gè)IP對(duì)應(yīng)多個(gè)域名,比如 www.a.com 和 www.b.com 這個(gè)稱之為host,后邊的才是路徑path,Nginx會(huì)對(duì)HTTP的Request報(bào)文做如下處理。
POST /psas/bug/image/confirm HTTP/1.1 <== 第一行才是path
Accept: application/json
Content-Type: text/plain; charset=utf-8
Cookie: JSESSIONID=h72ql6a
Host: www.a.com:8080 <== 這一行是host
Connection: close
User-Agent: Paw/3.0.12 (Macintosh; OS X/10.12.0) GCDHTTPRequest
Content-Length: 366
接收到請(qǐng)求后去HTTP報(bào)文頭拿host字段。
去和server name字段進(jìn)行匹配,哪個(gè)匹配上用哪個(gè)處理。
如果沒有匹配上,就用listen了當(dāng)前端口的默認(rèn)server處理。
默認(rèn)server可以自己設(shè)置,如果沒有設(shè)置,默認(rèn)配置文件中最靠前是默認(rèn)。
- Location
每個(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)行配置。如果有多個(gè)匹配的location塊,則nginx選擇最長前綴的那個(gè)。/的location塊的前綴只有一個(gè)字符,是最短的,因此只有當(dāng)其它location都匹配失敗時(shí),這個(gè)location才會(huì)被選擇。
匹配例子:
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
具體可參考:Location配置詳細(xì)
服務(wù)靜態(tài)內(nèi)容:
web服務(wù)器的一個(gè)重要任務(wù)是對(duì)外輸出文件,比如圖片和靜態(tài)網(wǎng)頁。你會(huì)實(shí)現(xiàn)一個(gè)這樣的例子:根據(jù)不同的請(qǐng)求,文件會(huì)從不同的本地目錄,如: /data/www (html) 和 /data/images 被輸出。這需要修改配置文件并且在http塊指令中建立帶有兩個(gè)location塊的server塊。
首先,創(chuàng)建/data/www的目錄并且放置一個(gè)index.html的文件,然后創(chuàng)建/data/images目錄并放置一些圖片
下面的例子中它會(huì)匹配以/images/開始的請(qǐng)求(location / 也會(huì)匹配這個(gè)請(qǐng)求,但它的前綴更短) 。如,server塊指令看起來就像這樣
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
這個(gè)配置已經(jīng)可以工作了,它監(jiān)聽在標(biāo)準(zhǔn)的80端口上,并且可以在本機(jī)上通過http://localhost/ 訪問。為了響應(yīng)以/images/開頭的URI,服務(wù)器會(huì)從/data/images目錄中發(fā)送文件。比如:為了響應(yīng)http://localhost/images/example.png ,nginx會(huì)發(fā)送/data/images/example.png這個(gè)文件,如果不存在這樣的文件,nginx就會(huì)發(fā)送404錯(cuò)誤。而不以/images/開頭的請(qǐng)求則被映射到/data/www目錄,比如:http://localhost/some/example.html 被映射到/data/www/some/example.html文件。
建立簡單的代理服務(wù)器:
nginx一個(gè)最常見的用途就是用作代理服務(wù)器,也就是把收到的請(qǐng)求傳遞給被代理的服務(wù)器,并從被代理服務(wù)器中取回響應(yīng),再將其發(fā)送給客戶端。
我們會(huì)配置一個(gè)基本的代理服務(wù)器,對(duì)于圖片文件的請(qǐng)求,從本地目錄中發(fā)送文件,而對(duì)于其它的請(qǐng)求,則把請(qǐng)求轉(zhuǎn)發(fā)給另一個(gè)被代理服務(wù)器。在這個(gè)例子里,兩個(gè)服務(wù)器都會(huì)在一個(gè)單一的nginx實(shí)例中被定義。
首先,通過添加一個(gè)塊指令定義一個(gè)被代理服務(wù)器:
server {
listen 8080;
root /data/up1;
location / {
}
}
這是一個(gè)監(jiān)聽在8080端口的簡單服務(wù)器(之前我們定義的server塊不聲明listen指令是因?yàn)槭褂昧藰?biāo)準(zhǔn)的80端口)并且會(huì)把所有請(qǐng)求映射到本地的 /data/upl 文件夾。創(chuàng)建這個(gè)文件夾并且放入一個(gè)index.html文件。注意,這里的root指令被放在了server上下文中。當(dāng)有一個(gè)location被選擇了而它的內(nèi)部卻沒有root指令時(shí),它就會(huì)使用server中的這個(gè)root指令。
接下來,修改在前一節(jié)中的server配置使它變?yōu)橐粋€(gè)代理服務(wù)器的配置。在第一個(gè)location塊中,添加proxy_pass指令,它的參數(shù)是被代理服務(wù)器的協(xié)議,名稱和端口。(本例中,參數(shù)是 http://localhost:8080):
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我們現(xiàn)在修改第二個(gè)location塊,使它由原先的匹配/images/前綴變?yōu)槠ヅ涞湫偷膱D片文件擴(kuò)展名。修改后的location如下:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
這個(gè)參數(shù)是一個(gè)匹配所有以.gif,.jpg或.png結(jié)尾的URI的正則表達(dá)式。~ 應(yīng)該被寫在正則表達(dá)式前面。
當(dāng)nginx選擇一個(gè)location時(shí),它先檢查前綴,并且記錄匹配的location(最長前綴),然后nginx再檢查正則表達(dá)式,如果有一個(gè)正則表達(dá)式匹配,它就選擇這個(gè)location,否則,選擇之前記錄的location。
最終的代理服務(wù)器配置:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
現(xiàn)在,這個(gè)服務(wù)器可以將以.gif,.jpg或.png結(jié)尾的請(qǐng)求映射到本機(jī)目錄,將其它所有請(qǐng)求發(fā)送到被代理服務(wù)器。為了使配置生效,要發(fā)送reload信號(hào)。