Nginx快速入門(三)正向代理、HTTP伺服器與動靜分離
3.HTTP伺服器
Nginx本身也是一個靜態資源的伺服器,當只有靜態資源的時候,就可以使用Nginx來做伺服器,同時現在也很流行動靜分離,就可以通過Nginx來實現,首先看看Nginx做靜態資源伺服器
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
root e:\wwwroot;
index index.html;
}
}
這樣如果訪問 http://localhost 就會預設訪問到E盤wwwroot目錄下面的index.html,如果一個網站只是靜態頁面的話,那麼就可以通過這種方式來實現部署。
3.1.root
root 是指定專案的根目錄,適用與server和location。可以指定多個,如果locaiton沒有指定,會往其外層的server或http中尋找繼承。
nginx中root指令的地址,其實是替換了匹配後的url中的host
server {
listen 80 default_server;
server_name localhost;
access_log /var/log/nginx/pro/access.log;
error_log /var/log/nginx/pro/error.log;
error_page 404 /404.html;
root /vagrant/pro;
index index.html index.htm;
}
當我們訪問http://localhost/static/stc.jpg
其實訪問的是/vagrant/pro/static/stc.jpg
location ^~ /static {
root /vagrant/pro;
}
當我們訪問http://localhost/static/stc.jpg
其實訪問的是` /vagrant/pro/static/stc.jpg``
對於root指令,我們可以歸納
- 對於匹配後的url地址,將匹配的location中的root路徑替換訪問url的host即得到檔案的真實地址。(多個斜槓其實等價於一個斜槓)
- 如果不匹配location,則尋找更外層的root做替換。
- root指令最後的斜槓可加可不加。(在*nix系統中, 多個斜槓和一個斜槓是等價的)
3.2.alias
對於root,操作上很簡單,只要把root地址替換host後就是檔案在硬碟路徑(真實地址)。對於alise,它並不是替換匹配後的url地址,而是替換匹配部分的url。alias指令也可以有多個,結尾的/並不是可加可不加
location ^~ /upload {
alias /vagrant/pro/upload;
}
此時訪問http://localhost/upload/up.png
其實訪問的是/vagrant/pro/upload/up.jpg
總結
nginx的靜態檔案配置中,root和alias指令都能實現。為了避免混淆,儘量不要寫沒有根路徑的url模式,即避免 static/這樣的開頭,根路徑的斜槓需要保留,沒有根路徑其實也很奇怪。
root和alias的區別主要在於替換的部分,root模式中,會把root配置的路徑替換匹配後的url中的host。alias則把他指定的路徑,替換url中匹配的部分。指令中的斜槓對於root指令沒有影響,對於alise則按照替換規則匹配即可。
root 指令
location /dir/
root root_path -> http://host/dir/file.txt -> root_path/dir/file.txt
alias 指令
location /dir
alias alias_path -> http://host /dir /file.txt -> alias_path/file.txt
location /dir/
alias alias_path/ -> http://host /dir/ file.txt -> alias_path/file.txt
瞭解了root和alise之後,通常最佳實際是配置一個專案的根root,其他的資料夾則使用alias,畢竟alias更加靈活。
3.3.antdPro靜態專案,用nginx部署在次級域名路徑
location /yz/ {
root D:/DevProject/;
index index.html index.htm index.shtml;
try_files $uri $uri/ /yz/index.html;//按順序檢查檔案是否存在,返回第一個找到的檔案。
//結尾的斜線表示為資料夾 -$uri/。如果所有的檔案都找不到,會進行一個內部重定向到最後一個引數。
//務必確認只有最後一個引數可以引起一個內部重定向,如果是最後一個引數是檔案,那麼這個檔案必須存在。
}
對於螞蟻金服的前端腳手架antdPro
我們如何訪問呢?
我們只需要把靜態專案antdPro
打包後的內容拷貝至D:/DevProject/
就可以訪問靜態資源專案了
4.動靜分離
動靜分離是讓動態網站裡的動態網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以後,我們就可以根據靜態資源的特點將其做快取操作,這就是網站靜態化處理的核心思路
upstream test{
server localhost:8080;
server localhost:8081;
}
server {
listen 80;
expires 30d;#30天之內只要訪問過一次就從快取拿
server_name localhost;
location / {
root e:\wwwroot;
index index.html;
}
# 所有靜態請求都由nginx處理,存放目錄為html
location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
root e:\wwwroot;
}
# 所有動態請求都轉發給tomcat處理
location ~ \.(jsp|do)$ {
proxy_pass http://test;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root e:\wwwroot;
}
}
這樣我們就可以吧HTML以及圖片和css以及js放到wwwroot目錄下,而tomcat只負責處理jsp和請求,例如當我們字尾為gif的時候,Nginx預設會從wwwroot獲取到當前請求的動態圖檔案返回,當然這裡的靜態檔案跟Nginx是同一臺伺服器,我們也可以在另外一臺伺服器,然後通過反向代理和負載均衡配置過去就好了,只要搞清楚了最基本的流程,很多配置就很簡單了,另外localtion後面其實是一個正則表示式,所以非常靈活
4.1 location配置
Nginx location 配置語法(location 是在 server 塊中配置)
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
匹配模式及順序
location = /uri =開頭表示精確匹配,只有完全匹配上才能生效。
location ^~ /uri ^~ 開頭對URL路徑進行字首匹配,並且在正則之前。
location ~ pattern ~開頭表示區分大小寫的正則匹配。
location ~* pattern ~*開頭表示不區分大小寫的正則匹配。
location /uri 不帶任何修飾符,也表示字首匹配,但是在正則匹配之後。
location / 通用匹配,任何未匹配到其它location的請求都會匹配到,相當於switch中的default。
@,nginx內部跳轉
location /img/ {
error_page 404 @img_err;
}
location @img_err {
# 規則
}
#以 /img/ 開頭的請求,如果連結的狀態為 404。則會匹配到 @img_err 這條規則上。
注意點
- 匹配的順序是先匹配普通字串,然後再匹配正則表示式。另外普通字串匹配順序是根據配置中字元長度從長到短,也就是說使用普通字串配置的location順序是無關緊要的,反正最後nginx會根據配置的長短來進行匹配,但是需要注意的是正則表示式按照配置檔案裡的順序測試。找到第一個比配的正則表示式將停止搜尋。
- 一般情況下,匹配成功了普通字串location後還會進行正則表示式location匹配。有兩種方法改變這種行為,其一就是使用“=”字首,這時執行的是嚴格匹配,並且匹配成功後立即停止其他匹配,同時處理這個請求;另外一種就是使用“^~”字首,如果把這個字首用於一個常規字串那麼告訴nginx 如果路徑匹配那麼不測試正則表示式。
實驗案例
- 測試"^“和”",nginx配置如下。瀏覽器輸入http://localhost/helloworld/test,返回601。如將#1註釋,#2開啟,瀏覽器輸入http://localhost/helloworld/test,返回603。注:#1和#2不能同時開啟,如同時開啟,啟動nginx會報nginx: [emerg] duplicate location “/helloworld”…,因為這兩個都是普通字串
location ^~ /helloworld { #1
return 601;
}
#location /helloworld { #2
# return 602;
#}
location ~ /helloworld {
return 603;
}
- 測試普通字串的長短(普通字串的匹配與順序無關,與長短有關)。瀏覽器輸入http://localhost/helloworld/test/a.html,返回601。瀏覽器輸入http://localhost/helloworld/a.html,返回602。
location /helloworld/test/ { #1
return 601;
}
location /helloworld/ { #2
return 602;
}
- 測試正則表示式的順序(正則匹配與順序相關)。瀏覽器輸入http://localhost/helloworld/test/a.html,返回602;將#2和#3調換順序,瀏覽器輸入http://localhost/helloworld/test/a.html,返回603
location /helloworld/test/ { #1
return 601;
}
location ~ /helloworld { #2
return 602;
}
location ~ /helloworld/test { #3
return 603;
}
5.正向代理
正向代理,意思是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端才能使用正向代理。當你需要把你的伺服器作為代理伺服器的時候,可以用Nginx來實現正向代理
如今的網路環境下,我們如果由於技術需要要去訪問國外的某些網站,此時你會發現位於國外的某網站我們通過瀏覽器是沒有辦法訪問的,此時大家可能都會用一個操作FQ(VPN)進行訪問,FQ的方式主要是找到一個可以訪問國外網站的代理伺服器,我們將請求傳送給代理伺服器,代理伺服器去訪問國外的網站,然後將訪問到的資料傳遞給我
正向代理最大的特點: 客戶端非常明確要訪問的伺服器地址;伺服器只清楚請求來自哪個代理伺服器,而不清楚
來自哪個具體的客戶端;正向代理模式遮蔽或者隱藏了真實客戶端資訊。
正向代理和反向代理一起使用就會像下圖這樣
resolver 114.114.114.114 8.8.8.8;
server {
resolver_timeout 5s;
listen 81;
access_log e:\wwwroot\proxy.access.log;
error_log e:\wwwroot\proxy.error.log;
location / {
proxy_pass http://$host$request_uri;
}
}
resolver是配置正向代理的DNS伺服器,listen 是正向代理的埠,配置好了就可以在ie上面或者其他代理外掛上面
使用伺服器ip+埠號進行代理了