一、環(huán)境準(zhǔn)備
Tomcat1:192.168.31.103
Tomcat2:192.168.31.117
Nginx:192.168.31.154
在103和117上分別部署相同的Tomcat程序气笙,修改index.jsp頁面蜡娶,把內(nèi)容改為各自的IP地址
Nginx的安裝請(qǐng)參考:http://www.reibang.com/p/2a31c0b8bec9
二借浊、修改配置文件nginx.conf
在http節(jié)點(diǎn)中增加:
## user-api upstream user-api { server 192.168.31.103:8080 weight=3; server 192.168.31.117:8080 weight=3; } server { listen 80; server_name 192.168.31.154; location / { proxy_pass http://user-api/; } }
upstream為Nginx的負(fù)載均衡模塊础米,里面定義了負(fù)載應(yīng)用的列表虚循。
server{}為虛擬主機(jī)配置辐烂,server_name為虛擬主機(jī)的IP或者域名淆衷,多個(gè)域名之間用空格隔開亏掀,listen為監(jiān)聽的端口忱反,location / 表示監(jiān)聽80端口下面的所有請(qǐng)求,proxy_pass配置為:http + upstream名稱
以上配置完成后幌氮,執(zhí)行./nginx -t命令檢測(cè)配置是否有錯(cuò)缭受,再執(zhí)行./ngin -s reload命令進(jìn)行更新。
說明:
upstream按照輪詢(默認(rèn))方式進(jìn)行負(fù)載该互,每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器米者,如果后端服務(wù)器down掉,能自動(dòng)剔除宇智。雖然這種方式簡(jiǎn)便蔓搞、成本低廉。
但缺點(diǎn)是:可靠性低和負(fù)載分配不均衡随橘。適用于圖片服務(wù)器集群和純靜態(tài)頁面服務(wù)器集群喂分。
除此之外,upstream還有其它的分配策略机蔗,分別如下:
1蒲祈、weight(權(quán)重)
指定輪詢幾率,weight和訪問比率成正比萝嘁,用于后端服務(wù)器性能不均的情況梆掸。如下所示,10.0.0.88的訪問比率要比10.0.0.77的訪問比率高一倍牙言。
upstream linuxidc{ server 10.0.0.77 weight=5; server 10.0.0.88 weight=10; }
2酸钦、ip_hash(訪問ip)
每個(gè)請(qǐng)求按訪問ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器咱枉,可以解決session的問題卑硫。
upstream favresin{ ip_hash; server 10.0.0.10:8080; server 10.0.0.11:8080; }
3、fair(第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來分配請(qǐng)求蚕断,響應(yīng)時(shí)間短的優(yōu)先分配欢伏。與weight分配策略類似。
upstream favresin{ server 10.0.0.10:8080; server 10.0.0.11:8080; fair; }
4亿乳、url_hash(第三方)
按訪問url的hash結(jié)果來分配請(qǐng)求颜懊,使每個(gè)url定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效。
注意:在upstream中加入hash語句河爹,server語句中不能寫入weight等其他的參數(shù)匠璧,hash_method是使用的hash算法。
upstream resinserver{ server 10.0.0.10:7777; server 10.0.0.11:8888; hash $request_uri; hash_method crc32; }
upstream還可以為每個(gè)設(shè)備設(shè)置狀態(tài)值咸这,這些狀態(tài)值的含義分別如下:
down 表示單前的server暫時(shí)不參與負(fù)載.
weight 默認(rèn)為1.weight越大夷恍,負(fù)載的權(quán)重就越大。
max_fails :允許請(qǐng)求失敗的次數(shù)默認(rèn)為1.當(dāng)超過最大次數(shù)時(shí)媳维,返回proxy_next_upstream 模塊定義的錯(cuò)誤.
fail_timeout : max_fails次失敗后酿雪,暫停的時(shí)間。
backup: 其它所有的非backup機(jī)器down或者忙的時(shí)候侄刽,請(qǐng)求backup機(jī)器指黎。所以這臺(tái)機(jī)器壓力會(huì)最輕。
upstream bakend{ #定義負(fù)載均衡設(shè)備的Ip及設(shè)備狀態(tài) ip_hash; server 10.0.0.11:9090 down; server 10.0.0.11:8080 weight=2; server 10.0.0.11:6060; server 10.0.0.11:7070 backup; }
三州丹、測(cè)試
訪問http://192.168.31.154/dreyer-user-api/index.jsp
不斷的刷新頁面醋安,我們會(huì)發(fā)現(xiàn)應(yīng)用會(huì)在117和103之間隨機(jī)切換,這表明通過Nginx來實(shí)現(xiàn)Tomcat應(yīng)用的負(fù)載均衡目的達(dá)到墓毒。
四吓揪、附錄實(shí)例
nginx.conf
<pre><code>
user www www;
user root;
worker_processes 4;
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 40960;
}
load modules compiled as Dynamic Shared Object (DSO)
dso {
load ngx_http_fastcgi_module.so;
load ngx_http_rewrite_module.so;
}
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;
tcp_nodelay on;
types_hash_max_size 2048;
server_names_hash_max_size 512;
server_names_hash_bucket_size 128;
#keepalive_timeout 0;
keepalive_timeout 280;
gzip on;
gzip_comp_level 3;
gzip_types text/plain text/css text/javascript application/x-javascript application/javascript application/xml application/json;
client_header_buffer_size 128k;
large_client_header_buffers 4 256k;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
## 配置包含的文件信息
include /opt/nginx/conf/tools/*.conf;
include /opt/nginx/sites-enabled/*.conf;
}
</code></pre>
在包含的文件信息中摘取幾段
## dev-pay-api(單節(jié)點(diǎn)) server { listen 80; server_name xxxx.cn; location / { proxy_pass http://172.16.xx.xx:8089/; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'POST, GET, OPTIONS,PUT,DELETE'; add_header 'Access-Control-Allow-Headers' '*,token'; proxy_set_header Host $http_host; proxy_set_header Cookie $http_cookie; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 100m; } }
## qa-web-pay-api(雙機(jī)負(fù)載均衡) upstream qa_web_pay_api { server 172.16.xx.xx:8089 weight=3; server 172.16.xx.xx:8089 weight=3; } server { listen 80; server_name xxxx.com; location / { proxy_pass http://qa_web_pay_api/; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'POST, GET, OPTIONS,PUT,DELETE'; add_header 'Access-Control-Allow-Headers' '*,token'; proxy_set_header Host $http_host; proxy_set_header Cookie $http_cookie; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 100m; } }
## test-web-b(前端代碼,前后端分離的模式) server { listen 80; server_name xxxx.com; rewrite ^(.*)$ https://$host$1 permanent; location / { root /usr/local/www/test-web-b; try_files $uri $uri/ /index.html =404; } }