一、背景
隨著業務量和使用者數量的激增,單一的tomcat部署應用已經無法滿足效能需求,而且對於每次釋出專案期間服務不可用的問題也凸顯,既然出現了這個問題,那麼我們本文就藉助nginx來完美的解決這個問題。
二、基本概念
1.說明:關於Nginx的概念和介紹以及Centos7下安裝步驟,請移步:Centos7安裝Nginx實戰
2.正向代理和反向代理
假設我們給定客戶端A、代理伺服器B、以及最終伺服器C
正向代理:代理伺服器B來代替客戶端A來訪問最終伺服器C並將最終結果轉發給客戶端A,站在客戶端A的角度上,代理伺服器代理的是客戶端A,這個過程是正向的,所以叫正向代理。(正向代理需要客戶端A設定代理伺服器的ip和提供代理服務的埠)
反向代理:客戶端A直接訪問代理伺服器B,由代理伺服器B來決定將請求轉發到哪個最終伺服器進行真正處理,並將最終伺服器的處理結果轉發給客戶端A,也就是代理伺服器代理的是最終伺服器C,站在客戶端A的角度上,這個過程是反向的,所以叫反向代理。(反向代理不需要客戶端A進行任何設定)
關於正向代理和反向代理,這裡有一篇不錯的文章:圖解正向代理、反向代理、透明代理
3.負載均衡(Load Balance)
所謂負載均衡就是將一批可以提供相同服務的伺服器組成一個伺服器集合,每臺伺服器都可以單獨向外部提供相同的服務,通過某種負載分擔技術,按照使用者指定的負載均衡策略將外部請求分配到伺服器集合中的具體的某一臺來進行處理的技術。以此來提高併發、增加吞吐量、提高處理能力、增加服務可用性。
三、實現步驟
1.首先將專案部署在不同的伺服器上,並記錄下服務的IP地址和埠
如:tomcat A : 192.168.85.131:8080
tomcat B : 192.168.85.131:8081
2.在nginx的config檔案nginx.conf中進行如下設定
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream tomcats{
# server 192.168.85.131:8080 weight=5;
server 192.168.85.131:8080;
server 192.168.85.131:8081;
}
server {
listen 80;
server_name tomcat.hafiz.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://tomcats;
index index.html index.htm;
}
}
}
3.說明:其中標紅的地方是最關鍵的地方,upstream指定了叢集服務的各個服務的地址,可以使用weight來增加某個伺服器的權重,也就意味著請求會被多轉發到這個伺服器上。server_name用來指定暴露給使用者的地址,使用者訪問這個地址,這個地址再將請求按照策略進行轉發。
4.有了叢集提供負載均衡,如果是web專案就涉及到sesstion在叢集中共享的問題,要解決這個問題,請移步:Shiro+Redis實現tomcat叢集共享session
四、總結
通過本文,我們就清楚了什麼叫正向代理和反向代理以及負載均衡,還有如何使用nginx來完成負載均衡。以前感覺部署叢集提供負載均衡很牛,現在看來其實也沒啥,挺簡單的。