溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》
  • 首頁 > 
  • 教程 > 
  • 服務(wù)器 > 
  • Debian下怎么搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡

Debian下怎么搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡

發(fā)布時(shí)間:2022-10-11 14:37:48 來源:億速云 閱讀:111 作者:iii 欄目:服務(wù)器

這篇文章主要介紹了Debian下怎么搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Debian下怎么搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡文章都會(huì)有所收獲,下面我們一起來看看吧。

負(fù)載均衡的基本概念

負(fù)載平衡(load balancing)是一種計(jì)算機(jī)網(wǎng)絡(luò)技術(shù),用來在多個(gè)計(jì)算機(jī)(計(jì)算機(jī)集群)、網(wǎng)絡(luò)連接、cpu、磁盤驅(qū)動(dòng)器或其他資源中分配負(fù)載,以達(dá)到最佳化資源使用、最大化吞吐率、最小化響應(yīng)時(shí)間、同時(shí)避免過載的目的。

使用帶有負(fù)載平衡的多個(gè)服務(wù)器組件,取代單一的組件,可以通過冗余提高可靠性。負(fù)載平衡服務(wù)通常是由專用軟體和硬件來完成。

負(fù)載平衡最重要的一個(gè)應(yīng)用是利用多臺(tái)服務(wù)器提供單一服務(wù),這種方案有時(shí)也稱之為服務(wù)器農(nóng)場。通常,負(fù)載平衡主要應(yīng)用于web網(wǎng)站,大型的internet relay chat網(wǎng)絡(luò),高流量的文件下載網(wǎng)站,nntp(network news transfer protocol)服務(wù)和dns服務(wù)?,F(xiàn)在負(fù)載平衡器也開始支持?jǐn)?shù)據(jù)庫服務(wù),稱之為數(shù)據(jù)庫負(fù)載平衡器。

對(duì)于互聯(lián)網(wǎng)服務(wù),負(fù)載平衡器通常是一個(gè)軟體程序,這個(gè)程序偵聽一個(gè)外部端口,互聯(lián)網(wǎng)用戶可以通過這個(gè)端口來訪問服務(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),阻止了用戶直接訪問后臺(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ì)提供一些特殊的功能來處理這種情況。例如轉(zhuǎn)發(fā)請(qǐng)求到一個(gè)備用的負(fù)載平衡器、顯示一條關(guān)于服務(wù)中斷的消息等。負(fù)載平衡器使得it團(tuán)隊(duì)可以顯著提高容錯(cuò)能力。它可以自動(dòng)提供大量的容量以處理任何應(yīng)用程序流量的增加或減少。

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;
#開啟全局錯(cuò)誤日志類型
error_log /var/log/nginx/error.log info;
#進(jìn)程文件
pid /var/run/nginx.pid;
#一個(gè)nginx進(jìn)程打開的最多文件描述數(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)主頁為 /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天
 }
 #其他頁面反向代理到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ù),通過瀏覽器可以正常瀏覽網(wǎng)頁。現(xiàn)在有一個(gè)問題tomcat是一個(gè)比較全面的web容器,對(duì)靜態(tài)網(wǎng)頁的處理,應(yīng)該是比較費(fèi)資源的,特別是每次都要從磁盤讀取靜態(tài)頁面,然后返回。這中間會(huì)消耗tomcat的資源,可能會(huì)使那些動(dòng)態(tài)頁面解析性能影響。秉承l(wèi)inux哲學(xué),一個(gè)軟件只做一件事的原則。tomcat就應(yīng)該只處理jsp動(dòng)態(tài)頁面。這里就用到以前了解的nginx來進(jìn)行反向代理。第一步代理,實(shí)現(xiàn)動(dòng)靜網(wǎng)頁分離。這個(gè)很簡單的。

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)聽本機(jī)80端口。37-39行表示默認(rèn)主頁,這里的默認(rèn)主頁我是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)頁后綴。第41行是代理地址。這里我代理到我的web應(yīng)用中。expires 30d緩存為30天,這里的緩存是對(duì)應(yīng)到前端頁面,用戶的cache-control字段,

Debian下怎么搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡

第44行中那個(gè)正則是匹配無后綴的頁面。我項(xiàng)目中jsp頁面是無后綴的。這里可以根據(jù)需要進(jìn)行修改。同樣代理到192.168.8.203:8080這里。到這里你可能會(huì)問,我艸,這有毛意思?。慨?dāng)然不是這樣了。簡單的實(shí)現(xiàn)靜動(dòng)分離,我們可以把第41行進(jìn)行修改,改為

root  /var/lib/tomcat7/webapps/jielierp/web-inf

表示不代理,直接從本地磁盤拿。通過查tomcat日志可以看到靜態(tài)頁面是沒有訪問到的。但這樣又有一個(gè)問題。這樣的靈活性不好,對(duì)下面要講到的內(nèi)存緩存和集群部署來說都是不友好的,所以又有了下面的這種寫法。再寫一個(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)聽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)限等外部問題,這個(gè)配置是這樣的。

如果單純這樣的話,我們會(huì)發(fā)現(xiàn)頁面直接傳輸過于占用帶寬。對(duì)應(yīng)web的優(yōu)化,這里想到的是通過對(duì)頁面進(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è)首頁看看效果

Debian下怎么搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡

不要在意請(qǐng)求數(shù)不一樣,那兩個(gè)請(qǐng)求是谷歌插件來的。不用覺得我在騙你。

作為假使有很多人訪問的網(wǎng)站來說,緩存肯定是很重要的東西了。一開始是想通過插件,讓nginx和redis進(jìn)行合成,然后nginx使用redis來緩存的,但是發(fā)現(xiàn)配置起來很麻煩,還要自己下載插件,重新編譯nginx,比較麻煩,所以這里覺得用nginx自帶的緩存也是不錯(cuò)的選擇。雖然效率比不上redis,但是有還是比沒有好。nginx默認(rèn)的緩存是磁盤文件系統(tǒng)的緩存,而不是像redis那樣的內(nèi)存級(jí)別的緩存。一開始我以為nginx就只有這樣。后來查了寫資料,才知道是我太天真了,對(duì)linux不是很了解導(dǎo)致的。linux的一切皆文件。原來我們可以把文件緩存到內(nèi)存對(duì)應(yīng)的linux文件系統(tǒng)中。我說的可能比較難以理解,請(qǐng)自行搜索/dev/shm 這個(gè)文件目錄。我們把文件緩存到這個(gè)文件目錄里,其實(shí)就相當(dāng)與內(nèi)存的緩存了。只不過還是靠文件系統(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)過這兩個(gè)的配置就基本能實(shí)現(xiàn)了,這里說幾個(gè)注意項(xiàng),也是困擾我很久的問題。上面第一段代碼第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)行多次測試的話要nginx -s reload 重新讀取配置或重啟服務(wù),因?yàn)槟鉹m -rf只是刪除了緩存文件,但是緩存的結(jié)構(gòu)信息還在nginx進(jìn)程里面,結(jié)構(gòu)還在,如果不重啟的話,是會(huì)出現(xiàn)訪問不到的)

Debian下怎么搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡

所以要記得重啟哦。下面是運(yùn)行效果

第一次訪問

Debian下怎么搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡

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

Debian下怎么搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡

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

Debian下怎么搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡

到這里已經(jīng)快結(jié)束了。最后也是比較關(guān)鍵的一個(gè)技術(shù)點(diǎn),就是集群,集群,集群。這個(gè)就要用到upstream了,看到最開頭的配置文件了嗎,就是那個(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è)。親測試過,集群中的一個(gè)壞了,不影響系統(tǒng)運(yùn)行。至于更多的輪詢規(guī)則,可以參考網(wǎng)上更多的資料。這里不多說。至于怎么使用呢? proxy_pass http://192.168.8.203:808 改為 proxy_pass http://static; 這樣即可實(shí)現(xiàn)均衡。

到這里就結(jié)束了。把上面各個(gè)部分根據(jù)自己需求配置起來就可以實(shí)現(xiàn)單機(jī)房負(fù)載均衡了。 上面這種做法有一個(gè)缺點(diǎn)就是在前面的那一臺(tái)nginx如果當(dāng)機(jī),后面所以機(jī)器就失去了被訪問的能力了,所以需要在前面實(shí)現(xiàn)多個(gè)nginx多機(jī)房的負(fù)載。關(guān)于這個(gè)就是另外一個(gè)話題了。目前還沒有研究。以后有機(jī)會(huì)再說了。

上面動(dòng)態(tài)服務(wù)器組如果是那種需要保存用戶狀態(tài)的話,會(huì)有問題,就是session問題,比如我在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ù)登錄的問題。另一種治本的辦法是,利用緩存系統(tǒng)進(jìn)行session的統(tǒng)一存儲(chǔ)管理。

關(guān)于“Debian下怎么搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Debian下怎么搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI