這篇文章主要講解了“Debian下搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡的方法”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Debian下搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡的方法”吧!
創(chuàng)新互聯(lián)2013年開(kāi)創(chuàng)至今,先為昌都等服務(wù)建站,昌都等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為昌都企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
負(fù)載均衡的基本概念
負(fù)載平衡(load balancing)是一種計(jì)算機(jī)網(wǎng)絡(luò)技術(shù),用來(lái)在多個(gè)計(jì)算機(jī)(計(jì)算機(jī)集群)、網(wǎng)絡(luò)連接、cpu、磁盤驅(qū)動(dòng)器或其他資源中分配負(fù)載,以達(dá)到最佳化資源使用、最大化吞吐率、最小化響應(yīng)時(shí)間、同時(shí)避免過(guò)載的目的。
使用帶有負(fù)載平衡的多個(gè)服務(wù)器組件,取代單一的組件,可以通過(guò)冗余提高可靠性。負(fù)載平衡服務(wù)通常是由專用軟體和硬件來(lái)完成。
負(fù)載平衡最重要的一個(gè)應(yīng)用是利用多臺(tái)服務(wù)器提供單一服務(wù),這種方案有時(shí)也稱之為服務(wù)器農(nóng)場(chǎng)。通常,負(fù)載平衡主要應(yīng)用于web網(wǎng)站,大型的internet relay chat網(wǎng)絡(luò),高流量的文件下載網(wǎng)站,nntp(network news transfer protocol)服務(wù)和DNS服務(wù)。現(xiàn)在負(fù)載平衡器也開(kāi)始支持?jǐn)?shù)據(jù)庫(kù)服務(wù),稱之為數(shù)據(jù)庫(kù)負(fù)載平衡器。
對(duì)于互聯(lián)網(wǎng)服務(wù),負(fù)載平衡器通常是一個(gè)軟體程序,這個(gè)程序偵聽(tīng)一個(gè)外部端口,互聯(lián)網(wǎng)用戶可以通過(guò)這個(gè)端口來(lái)訪問(wèn)服務(wù),而作為負(fù)載平衡器的軟體會(huì)將用戶的請(qǐng)求轉(zhuǎn)發(fā)給后臺(tái)內(nèi)網(wǎng)服務(wù)器,內(nèi)網(wǎng)服務(wù)器將請(qǐng)求的響應(yīng)返回給負(fù)載平衡器,負(fù)載平衡器再將響應(yīng)發(fā)送到用戶,這樣就向互聯(lián)網(wǎng)用戶隱藏了內(nèi)網(wǎng)結(jié)構(gòu),阻止了用戶直接訪問(wèn)后臺(tái)(內(nèi)網(wǎng))服務(wù)器,使得服務(wù)器更加安全,可以阻止對(duì)核心網(wǎng)絡(luò)棧和運(yùn)行在其它端口服務(wù)的攻擊。
當(dāng)所有后臺(tái)服務(wù)器出現(xiàn)故障時(shí),有些負(fù)載平衡器會(huì)提供一些特殊的功能來(lái)處理這種情況。例如轉(zhuǎn)發(fā)請(qǐng)求到一個(gè)備用的負(fù)載平衡器、顯示一條關(guān)于服務(wù)中斷的消息等。負(fù)載平衡器使得it團(tuán)隊(duì)可以顯著提高容錯(cuò)能力。它可以自動(dòng)提供大量的容量以處理任何應(yīng)用程序流量的增加或減少。
下面我們就來(lái)看一下如何搭建具備負(fù)載均衡能力的nginx+tomcat服務(wù)器組合:
0.前期準(zhǔn)備
使用debian環(huán)境。安裝nginx(默認(rèn)安裝),一個(gè)web項(xiàng)目,安裝tomcat(默認(rèn)安裝)等。
1.一份nginx.conf配置文件
# 定義nginx運(yùn)行的用戶 和 用戶組 如果對(duì)應(yīng)服務(wù)器暴露在外面的話建議使用權(quán)限較小的用戶 防止被入侵
# user www www;
#nginx進(jìn)程數(shù), 建議設(shè)置為等于cpu總核心數(shù)
worker_processes 8;
#開(kāi)啟全局錯(cuò)誤日志類型
error_log /var/log/nginx/error.log info;
#進(jìn)程文件
pid /var/run/nginx.pid;
#一個(gè)nginx進(jìn)程打開(kāi)的最多文件描述數(shù)目 建議與ulimit -n一致
#如果面對(duì)高并發(fā)時(shí) 注意修改該值 ulimit -n 還有部分系統(tǒng)參數(shù) 而并非這個(gè)單獨(dú)確定
worker_rlimit_nofile 65535;
events{
#使用epoll模型提高性能
use epoll;
#單個(gè)進(jìn)程最大連接數(shù)
worker_connections 65535;
}
http{
#擴(kuò)展名與文件類型映射表
include mime.types;
#默認(rèn)類型
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
#日志
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
#gzip 壓縮傳輸
gzip on;
gzip_min_length 1k; #最小1k
gzip_buffers 16 64k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain application/x-javascript text/css application/xml application/javascript;
gzip_vary on;
#負(fù)載均衡組
#靜態(tài)服務(wù)器組
upstream static.zh-jieli.com {
server 127.0.0.1:808 weight=1;
}
#動(dòng)態(tài)服務(wù)器組
upstream zh-jieli.com {
server 127.0.0.1:8080;
#server 192.168.8.203:8080;
}
#配置代理參數(shù)
proxy_redirect off;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 65;
proxy_send_timeout 65;
proxy_read_timeout 65;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
#緩存配置
proxy_cache_key '$host:$server_port$request_uri';
proxy_temp_file_write_size 64k;
proxy_temp_path /dev/shm/jielierp/proxy_temp_path;
proxy_cache_path /dev/shm/jielierp/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=5d max_size=1g;
proxy_ignore_headers x-accel-expires expires cache-control set-cookie;
server{
listen 80;
server_name erp.zh-jieli.com;
location / {
index index; #默認(rèn)主頁(yè)為 /index
#proxy_pass http://jieli;
}
location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
proxy_cache cache_one;
proxy_cache_valid 200 304 302 5d;
proxy_cache_valid any 5d;
proxy_cache_key '$host:$server_port$request_uri';
add_header x-cache '$upstream_cache_status from $host';
proxy_pass http:
//static.zh-jieli.com;
#所有靜態(tài)文件直接讀取硬盤
# root /var/lib/tomcat7/webapps/jielierp/web-inf ;
expires 30d; #緩存30天
}
#其他頁(yè)面反向代理到tomcat容器
location ~ .*$ {
index index;
proxy_pass http:
//zh-jieli.com;
}
}
server{
listen 808;
server_name static;
location / {
}
location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
#所有靜態(tài)文件直接讀取硬盤
root /var/lib/tomcat7/webapps/jielierp/web-inf ;
expires 30d; #緩存30天
}
}
}基本配置這個(gè)文件,就可以實(shí)現(xiàn)負(fù)載了。但是里面的各種關(guān)系要了解就比較麻煩了。
2.基礎(chǔ)講解
現(xiàn)在假使有一臺(tái)電腦192.168.8.203這臺(tái)電腦,上面部署了tomcat,里面8080端口有j2ee的服務(wù),通過(guò)瀏覽器可以正常瀏覽網(wǎng)頁(yè)。現(xiàn)在有一個(gè)問(wèn)題tomcat是一個(gè)比較全面的web容器,對(duì)靜態(tài)網(wǎng)頁(yè)的處理,應(yīng)該是比較費(fèi)資源的,特別是每次都要從磁盤讀取靜態(tài)頁(yè)面,然后返回。這中間會(huì)消耗tomcat的資源,可能會(huì)使那些動(dòng)態(tài)頁(yè)面解析性能影響。秉承l(wèi)inux哲學(xué),一個(gè)軟件只做一件事的原則。tomcat就應(yīng)該只處理jsp動(dòng)態(tài)頁(yè)面。這里就用到以前了解的nginx來(lái)進(jìn)行反向代理。第一步代理,實(shí)現(xiàn)動(dòng)靜網(wǎng)頁(yè)分離。這個(gè)很簡(jiǎn)單的。
worker_processes 8;
pid /var/run/nginx.pid;
worker_rlimit_nofile 65535;
events{
use epoll;
worker_connections 65535;
}
http{
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
proxy_redirect off;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 65;
proxy_send_timeout 65;
proxy_read_timeout 65;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
server{
listen 80;
server_name xxx.com;
location / {
index index;
}
location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
proxy_pass http:
//192.168.8.203:8080;
expires 30d;
}
location ~ .*$ {
index index;
proxy_pass http:
//192.168.8.203:8080;
}
}
}
worker_processes 8;
pid /var/run/nginx.pid;
worker_rlimit_nofile 65535;
events{
use epoll;
worker_connections 65535;
}
http{
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
proxy_redirect off;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 65;
proxy_send_timeout 65;
proxy_read_timeout 65;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
server{
listen 80;
server_name xxx.com;
location / {
index index;
}
location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
proxy_pass http:
//192.168.8.203:8080;
expires 30d;
}
location ~ .*$ {
index index;
proxy_pass http:
//192.168.8.203:8080;
}
}
}修改nginx的配置文件 /etc/nginx/nginx.conf 默認(rèn)有個(gè)配置文件的。其實(shí)大部分都差不多,關(guān)鍵還是server段的設(shè)置。這里我設(shè)置server段如上所示,其他段復(fù)制就可以了。server段里面的解釋如下:第35行為監(jiān)聽(tīng)本機(jī)80端口。37-39行表示默認(rèn)主頁(yè),這里的默認(rèn)主頁(yè)我是index.jsp 對(duì)應(yīng)到我項(xiàng)目中是一個(gè)index。 這里根據(jù)需要可以改為
index index.jsp index.html index.htm index.php
具體可參考其他文章。 關(guān)鍵的第40行,這個(gè)是正則匹配,網(wǎng)上也有很多介紹。這里匹配我項(xiàng)目中用到的所有靜態(tài)網(wǎng)頁(yè)后綴。第41行是代理地址。這里我代理到我的web應(yīng)用中。expires 30d緩存為30天,這里的緩存是對(duì)應(yīng)到前端頁(yè)面,用戶的cache-control字段,

第44行中那個(gè)正則是匹配無(wú)后綴的頁(yè)面。我項(xiàng)目中jsp頁(yè)面是無(wú)后綴的。這里可以根據(jù)需要進(jìn)行修改。同樣代理到192.168.8.203:8080這里。到這里你可能會(huì)問(wèn),我艸,這有毛意思啊?當(dāng)然不是這樣了。簡(jiǎn)單的實(shí)現(xiàn)靜動(dòng)分離,我們可以把第41行進(jìn)行修改,改為
root /var/lib/tomcat7/webapps/jielierp/web-inf
表示不代理,直接從本地磁盤拿。通過(guò)查tomcat日志可以看到靜態(tài)頁(yè)面是沒(méi)有訪問(wèn)到的。但這樣又有一個(gè)問(wèn)題。這樣的靈活性不好,對(duì)下面要講到的內(nèi)存緩存和集群部署來(lái)說(shuō)都是不友好的,所以又有了下面的這種寫法。再寫一個(gè)server段。
server{
listen 808;
server_name static;
location / {
}
location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
#所有靜態(tài)文件直接讀取硬盤
root /var/lib/tomcat7/webapps/jielierp/web-inf ;
expires 30d; #緩存30天
}
}這次監(jiān)聽(tīng)808端口,然后上上面的代碼41行就可以修改為 proxy_pass http://192.168.8.203:808了,到這里就實(shí)現(xiàn)了動(dòng)靜分離了。如果多臺(tái)服務(wù)器,就修改對(duì)應(yīng)的ip就可以了。如果發(fā)現(xiàn)連接不上的,要檢查一下防火墻,權(quán)限等外部問(wèn)題,這個(gè)配置是這樣的。
如果單純這樣的話,我們會(huì)發(fā)現(xiàn)頁(yè)面直接傳輸過(guò)于占用帶寬。對(duì)應(yīng)web的優(yōu)化,這里想到的是通過(guò)對(duì)頁(yè)面進(jìn)行g(shù)zip壓縮,然后傳到用戶那里,再解壓,這樣可以有效的減少帶寬。這里就會(huì)用到nginx 的gzip模塊了。默認(rèn)的nginx是集成有g(shù)zip模塊的。只需在http段增加下面配置即可。
gzip on; gzip_min_length 1k; #最小1k gzip_buffers 16 64k; gzip_http_version 1.1; gzip_comp_level 6; gzip_types text/plain application/x-javascript text/css application/xml application/javascript; gzip_vary on;
給個(gè)首頁(yè)看看效果

不要在意請(qǐng)求數(shù)不一樣,那兩個(gè)請(qǐng)求是谷歌插件來(lái)的。不用覺(jué)得我在騙你。
作為假使有很多人訪問(wèn)的網(wǎng)站來(lái)說(shuō),緩存肯定是很重要的東西了。一開(kāi)始是想通過(guò)插件,讓nginx和redis進(jìn)行合成,然后nginx使用redis來(lái)緩存的,但是發(fā)現(xiàn)配置起來(lái)很麻煩,還要自己下載插件,重新編譯nginx,比較麻煩,所以這里覺(jué)得用nginx自帶的緩存也是不錯(cuò)的選擇。雖然效率比不上redis,但是有還是比沒(méi)有好。nginx默認(rèn)的緩存是磁盤文件系統(tǒng)的緩存,而不是像redis那樣的內(nèi)存級(jí)別的緩存。一開(kāi)始我以為nginx就只有這樣。后來(lái)查了寫資料,才知道是我太天真了,對(duì)linux不是很了解導(dǎo)致的。linux的一切皆文件。原來(lái)我們可以把文件緩存到內(nèi)存對(duì)應(yīng)的linux文件系統(tǒng)中。我說(shuō)的可能比較難以理解,請(qǐng)自行搜索/dev/shm 這個(gè)文件目錄。我們把文件緩存到這個(gè)文件目錄里,其實(shí)就相當(dāng)與內(nèi)存的緩存了。只不過(guò)還是靠文件系統(tǒng)管理。所以比不上自定義格式的redis那樣的內(nèi)存緩存。
在http段進(jìn)行基本配置
#緩存配置
proxy_cache_key '$host:$server_port$request_uri';
proxy_temp_file_write_size 64k;
proxy_temp_path /dev/shm/jielierp/proxy_temp_path;
proxy_cache_path /dev/shm/jielierp/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=5d max_size=1g;
proxy_ignore_headers x-accel-expires expires cache-control set-cookie;
location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
proxy_cache cache_one;
proxy_cache_valid 200 304 302 5d;
proxy_cache_valid any 5d;
proxy_cache_key '$host:$server_port$request_uri';
add_header x-cache '$upstream_cache_status from $host';
proxy_pass http:
//192.168.8.203:808;
expires 30d; #緩存30天
}經(jīng)過(guò)這兩個(gè)的配置就基本能實(shí)現(xiàn)了,這里說(shuō)幾個(gè)注意項(xiàng),也是困擾我很久的問(wèn)題。上面第一段代碼第6行,proxy_ignore_headers 如果web項(xiàng)目中的html的head頭里面指定
<meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0">
這些不緩存的話,就要加上proxy_ignore_headers的配置項(xiàng)了。還有一點(diǎn)就是/dev/shm下面的文件系統(tǒng)權(quán)限默認(rèn)只給root用戶,所以要chmod 777 -r /dev/shm 這樣不是很安全的做法,如果實(shí)際上線可以給定某個(gè)用戶組,關(guān)于用戶組的設(shè)置是配置的第一行
user www www;
上面第二段代碼的第6行是增加一個(gè)header字段方便查看是否擊中緩存。
我們r(jià)m -rf /dev/shm/jielierp/proxy_* 下面的所有文件(注意這里如果是進(jìn)行多次測(cè)試的話要nginx -s reload 重新讀取配置或重啟服務(wù),因?yàn)槟鉹m -rf只是刪除了緩存文件,但是緩存的結(jié)構(gòu)信息還在nginx進(jìn)程里面,結(jié)構(gòu)還在,如果不重啟的話,是會(huì)出現(xiàn)訪問(wèn)不到的)

所以要記得重啟哦。下面是運(yùn)行效果
第一次訪問(wèn)

第二次訪問(wèn),在瀏覽器中ctrl+shift+r 強(qiáng)制刷新

到這里就可以看到效果了。我們查看一下/dev/shm這個(gè)里面

到這里已經(jīng)快結(jié)束了。最后也是比較關(guān)鍵的一個(gè)技術(shù)點(diǎn),就是集群,集群,集群。這個(gè)就要用到upstream了,看到最開(kāi)頭的配置文件了嗎,就是那個(gè)
#負(fù)載均衡組
#靜態(tài)服務(wù)器組
upstream static {
server 127.0.0.1:808 weight=1;
server 192.168.8.203:808 weight=1;
}
#動(dòng)態(tài)服務(wù)器組
upstream dynamic {
server 127.0.0.1:8080;
#server 192.168.8.203:8080;
}上面那個(gè)就是集群組了。upstream是關(guān)鍵字,static 和 dynamic是兩個(gè)服務(wù)器集群組的名稱。以第一個(gè)為例,server 127.0.0.1:808 是服務(wù)器地址,后面的weight=1 是權(quán)重。有多個(gè)就寫多個(gè)。親測(cè)試過(guò),集群中的一個(gè)壞了,不影響系統(tǒng)運(yùn)行。至于更多的輪詢規(guī)則,可以參考網(wǎng)上更多的資料。這里不多說(shuō)。至于怎么使用呢? proxy_pass http://192.168.8.203:808 改為 proxy_pass http://static; 這樣即可實(shí)現(xiàn)均衡。
到這里就結(jié)束了。把上面各個(gè)部分根據(jù)自己需求配置起來(lái)就可以實(shí)現(xiàn)單機(jī)房負(fù)載均衡了。 上面這種做法有一個(gè)缺點(diǎn)就是在前面的那一臺(tái)nginx如果當(dāng)機(jī),后面所以機(jī)器就失去了被訪問(wèn)的能力了,所以需要在前面實(shí)現(xiàn)多個(gè)nginx多機(jī)房的負(fù)載。關(guān)于這個(gè)就是另外一個(gè)話題了。目前還沒(méi)有研究。以后有機(jī)會(huì)再說(shuō)了。
上面動(dòng)態(tài)服務(wù)器組如果是那種需要保存用戶狀態(tài)的話,會(huì)有問(wèn)題,就是session問(wèn)題,比如我在server1進(jìn)行登錄后,下一次動(dòng)態(tài)服務(wù)器組進(jìn)行輪詢后可能分配到server2,就會(huì)造成要重新登錄。治標(biāo)的辦法是,配置輪詢規(guī)則,根據(jù)用戶請(qǐng)求的ip進(jìn)行hash,然后分配對(duì)應(yīng)的服務(wù)器。具體配置如下:
upstream dynamic{
ip_hash;
server 127.0.0.1:8080;
server 192.168.0.203:8080;
}這樣就可以實(shí)現(xiàn)一個(gè)用戶對(duì)應(yīng)一個(gè)服務(wù)器節(jié)點(diǎn)。這樣就不會(huì)有重復(fù)登錄的問(wèn)題。另一種治本的辦法是,利用緩存系統(tǒng)進(jìn)行session的統(tǒng)一存儲(chǔ)管理。
感謝各位的閱讀,以上就是“Debian下搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡的方法”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Debian下搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡的方法這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
標(biāo)題名稱:Debian下搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡的方法
網(wǎng)站鏈接:http://chinadenli.net/article8/ipsoip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站維護(hù)、用戶體驗(yàn)、Google、App設(shè)計(jì)、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)