安裝
安裝依賴
在Linux中是編譯安裝,所以要準備一系列工具
yum install pcre-devel make gcc gcc-c++ ncurses-devel perl zlib zlib-devel openssl openssl-devel
工具目的 | 程序 |
---|---|
編譯器 | make gcc gcc-c++ |
安全協議 | openssl openssl-devel |
語言 | perl腳本語言 |
正則表達式庫 | 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
執行Configuration配置檢查文件,指定目錄到剛剛新建的nginx目錄里
./configure --prefix=/usr/local/nginx
執行make操作和make install進行安裝
make
make install
安裝完成后,將nginx命令移動到$PATH的目錄下,這樣就不用每次都cd到 /usr/local/sbin 里去運行了
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
啟動:
nginx
重啟:
nginx -s reload
立即停止:
nginx –s stop
溫和停止:
nginx -s quit
強制關閉:
pkill nginx
打開瀏覽器訪問此機器的 IP,如果瀏覽器出現 Welcome to nginx! 則表示 Nginx 已經安裝并運行成功。
配置
Nginx配置文件常見結構的從外到內依次是「http」「server」「location」等等,缺省的繼承關系是從外到內,也就是說內層塊會自動獲取外層塊的值作為缺省值。
- HTTP
HTTP代表在該計算機上啟動HTTP路由,可以開啟不同的server服務,所以HTTP內可以包括多個server。
http {
server {
# 在80端口監聽http服務
# 正常情況下會和個人電腦的瀏覽器沖突,但是服務器上一般沒瀏覽器
# 因為瀏覽器之所以能上網,就是在80端口不停的監聽http服務
listen 80;
server_name localhost;
......
}
server {
# 在8080端口監聽http服務
listen 8080;
server_name localhost;
......
}
......
}
- Server
接收請求的服務器需要將不同的請求按規則轉發到不同的后端服務器上,在 nginx 中我們可以通過構建虛擬主機(server)的概念來將這些不同的服務配置隔離。
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 指監聽端口,server_name 用來指定IP或域名,多個域名對應統一規則可以空格分開,index 用于設定訪問的默認首頁地址,root 指令用于指定虛擬主機的網頁跟目錄,這個地方可以是相對地址也可以是絕對地址。
但是當 server 超過2個時,建議將不同對虛擬主機的配置放在另一個文件中,然后通過在主配置文件 nginx.conf 加上 include 指令包含進來。更便于管理。
include vhosts/*.conf;
由于DNS的存在,我們可以使用一個IP對應多個域名,比如 www.a.com 和 www.b.com 這個稱之為host,后邊的才是路徑path,Nginx會對HTTP的Request報文做如下處理。
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
接收到請求后去HTTP報文頭拿host字段。
去和server name字段進行匹配,哪個匹配上用哪個處理。
如果沒有匹配上,就用listen了當前端口的默認server處理。
默認server可以自己設置,如果沒有設置,默認配置文件中最靠前是默認。
- Location
每個 url 請求都會對應的一個服務,nginx 進行處理轉發或者是本地的一個文件路徑,或者是其他服務器的一個服務路徑。而這個路徑的匹配是通過 location 來進行的。我們可以將 server 當做對應一個域名進行的配置,而 location 是在一個域名下對更精細的路徑進行配置。如果有多個匹配的location塊,則nginx選擇最長前綴的那個。/的location塊的前綴只有一個字符,是最短的,因此只有當其它location都匹配失敗時,這個location才會被選擇。
匹配例子:
location = / {
# 只匹配"/".
[ configuration A ]
}
location / {
# 匹配任何請求,因為所有請求都是以"/"開始
# 但是更長字符匹配或者正則表達式匹配會優先匹配
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 開始的請求,并停止匹配 其它location
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配以 gif, jpg, or jpeg結尾的請求.
# 但是所有 /images/ 目錄的請求將由 [Configuration C]處理.
[ configuration D ]
}
請求:
/ -> 符合configuration A
/documents/document.html -> 符合configuration B
/images/1.gif -> 符合configuration C
/documents/1.jpg ->符合 configuration D
具體可參考:Location配置詳細
服務靜態內容:
web服務器的一個重要任務是對外輸出文件,比如圖片和靜態網頁。你會實現一個這樣的例子:根據不同的請求,文件會從不同的本地目錄,如: /data/www (html) 和 /data/images 被輸出。這需要修改配置文件并且在http塊指令中建立帶有兩個location塊的server塊。
首先,創建/data/www的目錄并且放置一個index.html的文件,然后創建/data/images目錄并放置一些圖片
下面的例子中它會匹配以/images/開始的請求(location / 也會匹配這個請求,但它的前綴更短) 。如,server塊指令看起來就像這樣
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
這個配置已經可以工作了,它監聽在標準的80端口上,并且可以在本機上通過http://localhost/ 訪問。為了響應以/images/開頭的URI,服務器會從/data/images目錄中發送文件。比如:為了響應http://localhost/images/example.png ,nginx會發送/data/images/example.png這個文件,如果不存在這樣的文件,nginx就會發送404錯誤。而不以/images/開頭的請求則被映射到/data/www目錄,比如:http://localhost/some/example.html 被映射到/data/www/some/example.html文件。
建立簡單的代理服務器:
nginx一個最常見的用途就是用作代理服務器,也就是把收到的請求傳遞給被代理的服務器,并從被代理服務器中取回響應,再將其發送給客戶端。
我們會配置一個基本的代理服務器,對于圖片文件的請求,從本地目錄中發送文件,而對于其它的請求,則把請求轉發給另一個被代理服務器。在這個例子里,兩個服務器都會在一個單一的nginx實例中被定義。
首先,通過添加一個塊指令定義一個被代理服務器:
server {
listen 8080;
root /data/up1;
location / {
}
}
這是一個監聽在8080端口的簡單服務器(之前我們定義的server塊不聲明listen指令是因為使用了標準的80端口)并且會把所有請求映射到本地的 /data/upl 文件夾。創建這個文件夾并且放入一個index.html文件。注意,這里的root指令被放在了server上下文中。當有一個location被選擇了而它的內部卻沒有root指令時,它就會使用server中的這個root指令。
接下來,修改在前一節中的server配置使它變為一個代理服務器的配置。在第一個location塊中,添加proxy_pass指令,它的參數是被代理服務器的協議,名稱和端口。(本例中,參數是 http://localhost:8080):
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我們現在修改第二個location塊,使它由原先的匹配/images/前綴變為匹配典型的圖片文件擴展名。修改后的location如下:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
這個參數是一個匹配所有以.gif,.jpg或.png結尾的URI的正則表達式。~ 應該被寫在正則表達式前面。
當nginx選擇一個location時,它先檢查前綴,并且記錄匹配的location(最長前綴),然后nginx再檢查正則表達式,如果有一個正則表達式匹配,它就選擇這個location,否則,選擇之前記錄的location。
最終的代理服務器配置:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
現在,這個服務器可以將以.gif,.jpg或.png結尾的請求映射到本機目錄,將其它所有請求發送到被代理服務器。為了使配置生效,要發送reload信號。