Nginx能做什麼?
- 反向代理
- 負載均衡
- HTTP伺服器(包含動靜分離)
- 正向代理
以上就是我瞭解到的Nginx在不依賴第三方模組能處理的事情,下面詳細說明每種功能怎麼做
1. 反向代理反向代理應該是Nginx做的最多的一件事了,什麼是反向代理呢,以下是百度百科的說法:反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器。簡單來說就是真實的伺服器不能直接被外部網路訪問,所以需要一臺代理伺服器,而代理伺服器能被外部網路訪問的同時又跟真實伺服器在同一個網路環境,當然也可能是同一臺伺服器,埠不同而已。
下面貼上一段簡單的實現反向代理的程式碼 -
server { listen 80; server_name localhost; client_max_body_size 1024M; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host:$server_port; } }
儲存配置檔案後啟動Nginx,這樣當我們訪問localhost的時候,就相當於訪問 localhost:8080 了。
2. 負載均衡
負載均衡也是Nginx常用的一個功能,負載均衡其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,從而共同完成工作任務。簡單而言就是當有2臺或以上伺服器時,根據規則隨機的將請求分發到指定的伺服器上處理,負載均衡配置一般都需要同時配置反向代理,透過反向代理跳轉到負載均衡。而Nginx目前支援自帶3種負載均衡策略,還有2種常用的第三方策略。
1、RR(預設)
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down
掉,能自動剔除。
upstream test { server localhost:8080; server localhost:8081; } server { listen 81; server_name localhost; client_max_body_size 1024M; location / { proxy_pass http://test; proxy_set_header Host $host:$server_port; } }
負載均衡的核心程式碼為 -
upstream test { server localhost:8080; server localhost:8081; }
這裡配置了2臺伺服器,當然實際上是一臺,只是埠不一樣而已,而8081的伺服器是不存在的,也就是說訪問不到,但是我們訪問 http://localhost 的時候,也不會有問題,會預設跳轉到 http://localhost:8080 具體是因為Nginx會自動判斷伺服器的狀態,如果伺服器處於不能訪問(伺服器掛了),就不會跳轉到這臺伺服器,所以也避免了一臺伺服器掛了影響使用的情況,由於Nginx預設是RR策略,所以我們不需要其他更多的設定。
2、權重
指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。 例如
upstream test { server localhost:8080 weight=9; server localhost:8081 weight=1; }
10
次一般只會有1
次會訪問到8081
,而有9
次會訪問到8080
-3、ip_hash
上面的2
種方式都有一個問題,那就是下一個請求來的時候請求可能分發到另外一個伺服器,當我們的程式不是無狀態的時候(採用了session儲存資料),這時候就有一個很大的很問題了,比如把登入資訊儲存到了session中,那麼跳轉到另外一臺伺服器的時候就需要重新登入了,所以很多時候我們需要一個客戶只訪問一個伺服器,那麼就需要用iphash了,iphash的每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
upstream test { ip_hash; server localhost:8080; server localhost:8081; }
4、fair(第三方)
按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
upstream backend { fair; server localhost:8080; server localhost:8081; }
5、url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。 在upstream中加入hash語句,server語句中不能寫入weight等其他的引數,hash_method是使用的hash演算法
upstream backend { hash $request_uri; hash_method crc32; server localhost:8080; server localhost:8081; }
3. HTTP伺服器
server { listen 80; server_name localhost; client_max_body_size 1024M; location / { root E:/wwwroot; #根目錄,在原有的訪問路徑前加上root路徑 index index.html; #如果沒有具體的訪問檔案,就訪問索引選項。 } }
E
盤wwwroot
目錄下面的index.html
,如果一個網站只是靜態頁面的話,那麼就可以透過這種方式來實現部署。4. 動靜分離
upstream test{ server localhost:8080; server localhost:8081; } server { listen 80; 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後面其實是一個正規表示式,所以非常靈活
5. 正向代理
resolver 114.114.114.114 8.8.8.8; server { resolver_timeout 5s; listen 81; access_log e:/wwwrootproxy.access.log; error_log e:/wwwrootproxy.error.log; location / { proxy_pass http://$host$request_uri; } }
resolver是配置正向代理的DNS伺服器,listen 是正向代理的埠,配置好了就可以在ie上面或者其他代理外掛上面使用伺服器ip+埠號進行代理了。
Nginx是支援熱啟動的,也就是說當我們修改配置檔案後,不用關閉Nginx,就可以實現讓配置生效,當然我並不知道多少人知道這個,反正我一開始並不知道,導致經常殺死了Nginx執行緒再來啟動。。。Nginx從新讀取配置的命令是
nginx -s reload
windows下面就是
nginx.exe -s reload
參考https://www.yiibai.com/nginx/nginx-main-use-scenes.html