Nginx反向代理和負載均衡

Nginx反向代理和負載均衡

來自專欄沐碼人6 人贊了文章

上次分享了怎麼用docker創建nginx服務 說到nginx 我們往往都會用到nginx的兩個重要功能,反向代理和負載均衡,今天我來和大家分享一下Nginx的反向代理和負載均衡

什麼是反向代理?

說到反向代理,大家一般都會提一下:正向代理,正向代理就是代理,比如我們寫爬蟲的時候IP被封、Google的時候404,這個時候我們都會用到代理,你可以把代理理解成一個跳板,我們的電腦不能訪問Google,那我們就去訪問能訪問Google的伺服器,一般我都是在這兩種情況下使用代理,可能有更高深的用法,具體我也沒用過。 說完代理,就來說一下我們今天的主角--反向代理

定義

反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連接請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連接的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器

功能

對客戶端隱藏伺服器的IP地址 通過緩存靜態資源,加速Web請求 更安全,因為任何來自Internet的請求都必須先經過代理伺服器,可以在這裡做防護(例如ip過濾)

實現方法:

location / { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_pass http://abc.com;}

第一次看到上面這些內容時,大多人可能還是不明白 簡單點說就是你有A、B兩台伺服器,這兩台伺服器上都放著你的代碼,當用戶訪問你的內容時,會訪問A伺服器,A伺服器再去請求B內容返回給用戶,用戶不知道請求的是B,這樣就是實現了反向代理

下面我們通過以下簡單的幾步演示一下反向代理

通過上一篇的Docker創建Nginx服務,我們可以快速創建3個nginx服務,來模擬3台伺服器

  • 首先創建一個nginx的配置文件

#創建 nginx配置文件touch nginx.conf # 創建a、b、c三個文件夾存放項目mkdir a b c

  • 編寫Nginx配置文件

# Nginx的配置文件,這裡主要作用是為了指定埠和項目路徑events { #每個工作進程的並發連接數 worker_connections 1024;}http { server { #監聽埠 listen 80; #綁定域名 server_name localhost; #項目路徑 root /nginx/share/nginx/html; }}

  • 啟動Nignx服務

#創建a容器docker run -p 80:80 -v $PWD/nginx/nginx.conf:/etc/nginx/nginx.conf -v $PWD/html/a:/usr/share/nginx/html --name a-server -d nginx#創建b容器docker run -p 80:8081 -v $PWD/html/b:/usr/share/nginx/html --name b-server -d nginx#創建c容器docker run -p 80:8082 -v $PWD/html/c:/usr/share/nginx/html --name c-server -d nginx #參數解釋 -p 8080:80 將容器的80埠映射到宿主機的8080埠 -v $PWD/a.conf:/etc/nginx/nginx.conf 將宿主機中當前目錄下的a.conf掛載到容器的/etc/nginx/nginx.conf -v $PWD:/a 將主機中當前目錄a掛載到容器的/usr/share/nginx/html --name 容器的名稱 -d 後台運行容器,並返回容器ID

  • 判斷Nginx是否啟動成功

docker ps -a 查看容器是否成功啟動或者curl 127.0.0.1 curl 127.0.0.1:8081 curl 127.0.0.1:8082

  • 修改配置文件

events { #每個工作進程的並發連接數 worker_connections 1024;}http { server { #監聽埠 listen 80; #綁定域名 server_name localhost; #項目路徑 root /nginx/share/nginx/html; # 反向代理 location /b { rewrite ^/b(.*) /$1 break; proxy_pass http://127.0.0.1:8081 } # 反向代理 location /c { rewrite ^/c(.*) /$1 break; proxy_pass http://127.0.0.1:8082 } }}

這個時候就我們就已經實現了方向代理,可以在瀏覽器中訪問

http://127.0.0.1 輸出this is ahttp://127.0.0.1/b 輸出 this is b http://127.0.0.1/c 輸出 this is c

今天的另外一個主角是負載均衡

什麼是負載均衡 很多新手在聽說負載均衡的時候,都會感覺是很高深莫測,其實實現起來也不難, 下面我們修改配置實現一個簡單的負載均衡

首先來了解一下負載均衡

定義

用來在多個計算機、網路連接、CPU、磁碟驅動器或其他資源中分配負載,以達到最優化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。 使用帶有負載平衡的多個伺服器組件,取代單一的組件,可以通過冗餘提高可靠性

功能

將流量分配給多個應用程序伺服器,提高Web應用程序的可伸縮性和可靠性

實現方法

http { upstream myServer { server 127.0.0.1:8081; server 127.0.0.1:8082; } server { listen 80; location / { proxy_pass http://myServer; } }}

對於上面的很官方定義,我再用大白話解釋一下, 將用戶的請求分配到壓力小的伺服器上,從而減輕伺服器壓力

下面我們通過簡單的Demo演示一下負載均衡

修改剛才的配置文件nginx.conf

events { #每個工作進程的並發連接數 worker_connections 1024;}http { #定義負載均衡設備的 Ip及設備狀態 upstream myServer { server 127.0.0.1:8081; server 127.0.0.1:8082; } server { #監聽埠 listen 80; #綁定域名 server_name localhost; #項目路徑 root /nginx/share/nginx/html; location / { proxy_pass http://myServer; } }}打開瀏覽器輸入http://127.0.0.1 我們刷新瀏覽器,就輸出this is b或者this is a

到這裡反向代理和負載均衡的基本配置就分享完了。

但是機智的你可能會發提出一些疑問,通過負載均衡,用戶訪問到B伺服器時,下次刷新又去訪問C伺服器,能不能還繼續訪問A伺服器。當然Nginx提供了方法 具體配置內容如下

upstream myServer { #weight 指定輪詢幾率,如果現在有5個請求, #有4個會請求到B伺服器上,1個請求到C伺服器上, #一般我們會把伺服器配置比較高的權重加大 server b.com weight=4; server c.com; #通過客戶端的IP地址,確定下一個請求應該選擇哪個伺服器 ip_hash; }

本次主要分享了Nginx的反向代理和負載均衡,當然,分享的內容還是比較基礎,Nginx雖然體積不大,但是功能很全面,更多模塊和配置文件可以去查看官方文檔

注意事項

  • 如果 nginx沒有開啟熱更新,修改配置文件一定要重啟

#docker 容器的重啟命令docker restart id(容器ID)#不是使用docker安裝的nginxservice nginx restart

  • 反向代理中nginx的配置 proxy_pass

location /c { #如果是綁定目錄,這裡的rewrite一定要寫 rewrite ^/c(.*) /$1 break; # docker容器中這裡一定要填寫本機的ip地址,不能填寫127.0.0.1 proxy_pass http://117.189.124.134:8082; }

總結:Nginx的反向代理、負載均衡配置還是比較簡單的,主要用到proxy_pass和upstream,避免上述幾個坑,應該沒有什麼問題,本人對Nginx只是屬於入門階段,如有錯誤,歡迎指正

推薦閱讀:

linux系統centOS6.5使用goaccess工具分析nginx網站日誌
Apache Web伺服器的安裝(4個步驟)
Linux-CentOs7-Nginx 安裝
PHP vs Node.js vs Nginx

TAG:負載均衡 | Nginx | 反向代理 |