亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > Nginx > 正文

Debian下搭建Nginx和Tomcat服務器實現負載均衡的方案

2024-08-30 12:27:48
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Debian下搭建Nginx和Tomcat服務器實現負載均衡的方案,其主要思想依然是動靜分離并且以Nginx來進行反向代理這樣的路子,需要的朋友可以參考下
 

負載均衡的基本概念

負載平衡(Load balancing)是一種計算機網絡技術,用來在多個計算機(計算機集群)、網絡連接、CPU、磁盤驅動器或其他資源中分配負載,以達到最佳化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。

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

負載平衡最重要的一個應用是利用多臺服務器提供單一服務,這種方案有時也稱之為服務器農場。通常,負載平衡主要應用于Web網站,大型的Internet Relay Chat網絡,高流量的文件下載網站,NNTP(Network News Transfer Protocol)服務和DNS服務。現在負載平衡器也開始支持數據庫服務,稱之為數據庫負載平衡器。

對于互聯網服務,負載平衡器通常是一個軟體程序,這個程序偵聽一個外部端口,互聯網用戶可以通過這個端口來訪問服務,而作為負載平衡器的軟體會將用戶的請求轉發給后臺內網服務器,內網服務器將請求的響應返回給負載平衡器,負載平衡器再將響應發送到用戶,這樣就向互聯網用戶隱藏了內網結構,阻止了用戶直接訪問后臺(內網)服務器,使得服務器更加安全,可以阻止對核心網絡棧和運行在其它端口服務的攻擊。

當所有后臺服務器出現故障時,有些負載平衡器會提供一些特殊的功能來處理這種情況。例如轉發請求到一個備用的負載平衡器、顯示一條關于服務中斷的消息等。負載平衡器使得IT團隊可以顯著提高容錯能力。它可以自動提供大量的容量以處理任何應用程序流量的增加或減少。

下面我們就來看一下如何搭建具備負載均衡能力的Nginx+Tomcat服務器組合:

0.前期準備

使用Debian環境。安裝Nginx(默認安裝),一個web項目,安裝tomcat(默認安裝)等。

1.一份Nginx.conf配置文件

# 定義Nginx運行的用戶 和 用戶組 如果對應服務器暴露在外面的話建議使用權限較小的用戶 防止被入侵# user www www;#Nginx進程數, 建議設置為等于CPU總核心數worker_processes 8;#開啟全局錯誤日志類型error_log /var/log/nginx/error.log info;#進程文件pid /var/run/nginx.pid;#一個Nginx進程打開的最多文件描述數目 建議與ulimit -n一致#如果面對高并發時 注意修改該值 ulimit -n 還有部分系統參數 而并非這個單獨確定worker_rlimit_nofile 65535;events{ #使用epoll模型提高性能 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; #日志 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; #負載均衡組 #靜態服務器組 upstream static.zh-jieli.com { server 127.0.0.1:808 weight=1; } #動態服務器組 upstream zh-jieli.com { server 127.0.0.1:8080; #server 192.168.8.203:8080; } #配置代理參數 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; #默認主頁為 /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; #所有靜態文件直接讀取硬盤 # 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) { #所有靜態文件直接讀取硬盤 root /var/lib/tomcat7/webapps/JieLiERP/WEB-INF ; expires 30d; #緩存30天 } }}

基本配置這個文件,就可以實現負載了。但是里面的各種關系要了解就比較麻煩了。

2.基礎講解

現在假使有一臺電腦192.168.8.203這臺電腦,上面部署了Tomcat,里面8080端口有J2EE的服務,通過瀏覽器可以正常瀏覽網頁?,F在有一個問題tomcat是一個比較全面的web容器,對靜態網頁的處理,應該是比較費資源的,特別是每次都要從磁盤讀取靜態頁面,然后返回。這中間會消耗Tomcat的資源,可能會使那些動態頁面解析性能影響。秉承Linux哲學,一個軟件只做一件事的原則。Tomcat就應該只處理JSP動態頁面。這里就用到以前了解的Nginx來進行反向代理。第一步代理,實現動靜網頁分離。這個很簡單的。

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 默認有個配置文件的。其實大部分都差不多,關鍵還是server段的設置。這里我設置server段如上所示,其他段復制就可以了。server段里面的解釋如下:第35行為監聽本機80端口。37-39行表示默認主頁,這里的默認主頁我是index.jsp 對應到我項目中是一個index。 這里根據需要可以改為

index index.jsp index.html index.htm index.php

具體可參考其他文章。 關鍵的第40行,這個是正則匹配,網上也有很多介紹。這里匹配我項目中用到的所有靜態網頁后綴。第41行是代理地址。這里我代理到我的web應用中。expires 30d緩存為30天,這里的緩存是對應到前端頁面,用戶的Cache-Control字段,

Debian下搭建Nginx和Tomcat服務器實現負載均衡的方案

第44行中那個正則是匹配無后綴的頁面。我項目中jsp頁面是無后綴的。這里可以根據需要進行修改。同樣代理到192.168.8.203:8080這里。到這里你可能會問,我艸,這有毛意思啊?當然不是這樣了。簡單的實現靜動分離,我們可以把第41行進行修改,改為

root  /var/lib/tomcat7/webapps/JieLiERP/WEB-INF

表示不代理,直接從本地磁盤拿。通過查tomcat日志可以看到靜態頁面是沒有訪問到的。但這樣又有一個問題。這樣的靈活性不好,對下面要講到的內存緩存和集群部署來說都是不友好的,所以又有了下面的這種寫法。再寫一個server段。

server{ listen 808; server_name static; location / {}location ~ .*/.(js|css|ico|png|jpg|eot|svg|ttf|woff) { #所有靜態文件直接讀取硬盤 root /var/lib/tomcat7/webapps/JieLiERP/WEB-INF ; expires 30d; #緩存30天 } }

這次監聽808端口,然后上上面的代碼41行就可以修改為 proxy_pass http://192.168.8.203:808了,到這里就實現了動靜分離了。如果多臺服務器,就修改對應的ip就可以了。如果發現連接不上的,要檢查一下防火墻,權限等外部問題,這個配置是這樣的。

如果單純這樣的話,我們會發現頁面直接傳輸過于占用帶寬。對應web的優化,這里想到的是通過對頁面進行gzip壓縮,然后傳到用戶那里,再解壓,這樣可以有效的減少帶寬。這里就會用到Nginx 的gzip模塊了。默認的Nginx是集成有gzip模塊的。只需在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;

給個首頁看看效果

Debian下搭建Nginx和Tomcat服務器實現負載均衡的方案

不要在意請求數不一樣,那兩個請求是谷歌插件來的。不用覺得我在騙你。

作為假使有很多人訪問的網站來說,緩存肯定是很重要的東西了。一開始是想通過插件,讓Nginx和Redis進行合成,然后Nginx使用Redis來緩存的,但是發現配置起來很麻煩,還要自己下載插件,重新編譯Nginx,比較麻煩,所以這里覺得用Nginx自帶的緩存也是不錯的選擇。雖然效率比不上redis,但是有還是比沒有好。Nginx默認的緩存是磁盤文件系統的緩存,而不是像Redis那樣的內存級別的緩存。一開始我以為Nginx就只有這樣。后來查了寫資料,才知道是我太天真了,對Linux不是很了解導致的。Linux的一切皆文件。原來我們可以把文件緩存到內存對應的Linux文件系統中。我說的可能比較難以理解,請自行搜索/dev/shm 這個文件目錄。我們把文件緩存到這個文件目錄里,其實就相當與內存的緩存了。只不過還是靠文件系統管理。所以比不上自定義格式的Redis那樣的內存緩存。

在http段進行基本配置

#緩存配置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天 }

 

經過這兩個的配置就基本能實現了,這里說幾個注意項,也是困擾我很久的問題。上面第一段代碼第6行,proxy_ignore_headers 如果web項目中的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的配置項了。還有一點就是/dev/shm下面的文件系統權限默認只給root用戶,所以要chmod 777 -R /dev/shm 這樣不是很安全的做法,如果實際上線可以給定某個用戶組,關于用戶組的設置是配置的第一行

user www www;

上面第二段代碼的第6行是增加一個header字段方便查看是否擊中緩存。

我們rm -rf /dev/shm/JieLiERP/proxy_* 下面的所有文件(注意這里如果是進行多次測試的話要nginx -s reload 重新讀取配置或重啟服務,因為你rm -rf只是刪除了緩存文件,但是緩存的結構信息還在nginx進程里面,結構還在,如果不重啟的話,是會出現訪問不到的)

Debian下搭建Nginx和Tomcat服務器實現負載均衡的方案

所以要記得重啟哦。下面是運行效果

第一次訪問

Debian下搭建Nginx和Tomcat服務器實現負載均衡的方案

第二次訪問,在瀏覽器中Ctrl+Shift+R 強制刷新

Debian下搭建Nginx和Tomcat服務器實現負載均衡的方案

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

Debian下搭建Nginx和Tomcat服務器實現負載均衡的方案

到這里已經快結束了。最后也是比較關鍵的一個技術點,就是集群,集群,集群。這個就要用到upstream了,看到最開頭的配置文件了嗎,就是那個

#負載均衡組#靜態服務器組upstream static { server 127.0.0.1:808 weight=1; server 192.168.8.203:808 weight=1;}#動態服務器組upstream dynamic { server 127.0.0.1:8080; #server 192.168.8.203:8080;}

上面那個就是集群組了。upstream是關鍵字,static 和 dynamic是兩個服務器集群組的名稱。以第一個為例,server 127.0.0.1:808 是服務器地址,后面的weight=1 是權重。有多個就寫多個。親測試過,集群中的一個壞了,不影響系統運行。至于更多的輪詢規則,可以參考網上更多的資料。這里不多說。至于怎么使用呢? proxy_pass http://192.168.8.203:808 改為 proxy_pass http://static; 這樣即可實現均衡。

到這里就結束了。把上面各個部分根據自己需求配置起來就可以實現單機房負載均衡了。 上面這種做法有一個缺點就是在前面的那一臺nginx如果當機,后面所以機器就失去了被訪問的能力了,所以需要在前面實現多個nginx多機房的負載。關于這個就是另外一個話題了。目前還沒有研究。以后有機會再說了。

上面動態服務器組如果是那種需要保存用戶狀態的話,會有問題,就是session問題,比如我在server1進行登錄后,下一次動態服務器組進行輪詢后可能分配到server2,就會造成要重新登錄。治標的辦法是,配置輪詢規則,根據用戶請求的IP進行Hash,然后分配對應的服務器。具體配置如下:

upstream dynamic{ip_hash;server 127.0.0.1:8080;server 192.168.0.203:8080;}

這樣就可以實現一個用戶對應一個服務器節點。這樣就不會有重復登錄的問題。另一種治本的辦法是,利用緩存系統進行session的統一存儲管理。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久激情| 国产欧美在线视频| 丝袜美腿亚洲一区二区| 伊人久久久久久久久久| 国产精品久久电影观看| 欧美成人精品激情在线观看| 日韩成人中文电影| 国产一区二区三区免费视频| 亚洲深夜福利视频| 亚洲一区二区三区777| 成人在线中文字幕| 欧美成人免费网| 国产精品户外野外| 亚洲欧美日韩成人| 一本一本久久a久久精品牛牛影视| 国产欧美日韩亚洲精品| 亚洲91精品在线观看| 国产精品久久久久久久av大片| 日韩欧美精品中文字幕| 欧美大尺度电影在线观看| 日韩网站免费观看高清| 亚洲理论在线a中文字幕| 国产精品99久久久久久久久久久久| 亚洲伊人一本大道中文字幕| 亚洲欧美日韩在线高清直播| 精品久久久久久久久久ntr影视| 欧美日韩免费看| 欧美巨猛xxxx猛交黑人97人| 超碰97人人做人人爱少妇| 欧美在线视频导航| 亚洲欧美精品在线| 欧美在线观看网站| 亚洲人成在线观看网站高清| 久久久91精品国产| 欧美人在线视频| 久久精品国产v日韩v亚洲| 欧美成人亚洲成人| 欧美性极品xxxx娇小| 91理论片午午论夜理片久久| 国产欧美精品xxxx另类| 亚洲精品美女久久久久| 亚洲精美色品网站| 色偷偷9999www| 久久久成人的性感天堂| 国产成人在线一区| 欧美一级高清免费| 日韩av网站在线| 国产成人精品av| 成人精品视频99在线观看免费| 精品国产乱码久久久久久虫虫漫画| 国产日韩欧美电影在线观看| 日韩精品亚洲精品| 欧美中文字幕在线观看| 国产精品第七影院| 国产91露脸中文字幕在线| 最近的2019中文字幕免费一页| 欧美激情一区二区三区成人| 欧美在线观看网站| 2019精品视频| 国产精品久久久久不卡| 亚洲成人网久久久| 欧美黑人xxxⅹ高潮交| 国产精品视频自在线| 久久久久久久久久久人体| 亚洲日韩第一页| 91性高湖久久久久久久久_久久99| 亚洲福利视频二区| 亚洲成av人乱码色午夜| 狠狠躁夜夜躁人人爽超碰91| 777午夜精品福利在线观看| 中文字幕日韩精品在线观看| 欧美最猛性xxxxx免费| 亚洲第一免费播放区| 久久久亚洲影院| 久久视频免费在线播放| 日本亚洲欧洲色α| 国产欧美一区二区三区四区| 国产精品久久久久久影视| 国产精品中文字幕在线| 中文字幕日韩在线观看| 中文字幕自拍vr一区二区三区| 国产亚洲美女久久| 欧美久久精品午夜青青大伊人| 成人高h视频在线| 精品中文字幕视频| 中文字幕一区二区精品| 久久影院免费观看| 91成品人片a无限观看| 亚洲精品在线视频| 亚洲综合精品一区二区| 亚洲人成网7777777国产| 欧美日韩国产精品一区二区三区四区| 国产精品手机播放| 亚洲一区二区三区sesese| 51视频国产精品一区二区| 亚洲最大成人网色| 国产日产欧美a一级在线| 欧美精品福利视频| 91麻豆桃色免费看| 亚洲三级黄色在线观看| 国产精品高潮视频| 日韩精品在线观看一区二区| 中文字幕欧美日韩在线| 97婷婷涩涩精品一区| 亚洲精品久久在线| 国产精品高潮呻吟久久av野狼| 欧美成人国产va精品日本一级| 国产suv精品一区二区三区88区| 亚洲日本中文字幕免费在线不卡| 日韩视频免费看| 亚洲国产精品一区二区三区| 亚洲成色999久久网站| 国产精品对白刺激| 午夜精品99久久免费| xxxx欧美18另类的高清| 欧美洲成人男女午夜视频| 成人免费网站在线| 久热在线中文字幕色999舞| 狠狠色香婷婷久久亚洲精品| 日韩69视频在线观看| 欧美一区二区三区免费观看| 91精品国产高清久久久久久| 91精品国产91久久久久福利| 亚洲欧美国产一本综合首页| 亚洲国产中文字幕久久网| 国产精品网站视频| 日韩在线观看视频免费| 日本国产一区二区三区| 青草青草久热精品视频在线网站| 亚洲自拍偷拍第一页| 亚洲一区国产精品| 国产精品丝袜高跟| 热久久99这里有精品| 久久精品成人一区二区三区| 亚洲欧美日韩一区在线| 97婷婷大伊香蕉精品视频| 久久久久久久一区二区| 青青a在线精品免费观看| 精品国产成人av| 日韩电视剧在线观看免费网站| 亚洲白拍色综合图区| 亚洲香蕉成视频在线观看| 高清日韩电视剧大全免费播放在线观看| 日韩美女视频免费看| 国产成人97精品免费看片| 伊人一区二区三区久久精品| 亚洲成色www8888| 国产亚洲成av人片在线观看桃| 午夜欧美大片免费观看| 成人网欧美在线视频| 国外成人在线直播| 在线亚洲男人天堂| 国产精自产拍久久久久久| 狠狠躁18三区二区一区| 欧美成人午夜剧场免费观看| 久久久久中文字幕| 欧美精品videofree1080p| 久久久av亚洲男天堂| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美精品做受xxx性少妇| 日韩毛片在线观看| 成人淫片在线看| 国产91精品久| 亚洲高清在线观看|