<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Nginx實現負載均衡是通過反向代理實現
反向代理(Reverse Proxy) 是指以 代理伺服器(例:Nginx) 來接受 internet 上的連線請求,然後將請求轉發給內部網路上的伺服器(例:Tomcat),並將從伺服器上得到的結果返回給 internet 上請求連線的使用者端,此時代理伺服器(例:Nginx)對外就表現為一個反向代理伺服器。
我們從使用者端的視野來看,實際上使用者端並不知道真實的服務提供者是哪臺伺服器,它只知道它請求了反向代理伺服器。因此反向代理這種方式又對外隱藏了真實伺服器的地址,從一定程度上降低了安全隱患。
伺服器端接收來自使用者端的請求中,既有靜態資源也有動態資源,靜態資源由 Nginx 提供服務,動態資源由 Nginx 轉發至後端。
Nginx 伺服器:192.168.136.30:80 Tomcat伺服器1:192.168.136.20:8080 Tomcat伺服器2:192.168.136.40:8080 192.168.136.40:8081
systemctl stop firewalld setenforce 0 yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make useradd -M -s /sbin/nologin nginx #建立nginx使用者不可登入家目錄
將壓縮包傳到opt目錄下
cd /opt tar zxvf nginx-1.12.0.tar.gz -C /opt/ cd nginx-1.12.0/ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio #啟用檔案修改支援 --with-http_stub_status_module #啟用狀態統計 --with-http_gzip_static_module #啟用 gzip靜態壓縮 --with-http_flv_module #啟用 flv模組,提供對 flv 視訊的偽流支援 --with-http_ssl_module #啟用 SSL模組,提供SSL加密功能 ---------------------------------------------------------------------------------------------------------- ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module
make && make install ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ vim /lib/systemd/system/nginx.service [Unit] Description=nginx After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx ExecrReload=/bin/kill -s HUP $MAINPID ExecrStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target chmod 754 /lib/systemd/system/nginx.service systemctl start nginx.service systemctl enable nginx.service
將所需軟體包傳到opt目錄下
tomcat1:
systemctl stop firewalld setenforce 0 tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/ vim /etc/profile.d/java.sh export JAVA_HOME=/usr/local/jdk1.8.0_91 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH source /etc/profile.d/java.sh tar zxvf apache-tomcat-8.5.16.tar.gz mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat /usr/local/tomcat/bin/shutdown.sh /usr/local/tomcat/bin/startup.sh netstat -ntap | grep 8080
tomcat2:
cd /opt rpm -qpl jdk-8u201-linux-x64.rpm rpm -ivh jdk-8u201-linux-x64.rpm java -version systemctl stop firewalld systemctl disable firewalld setenforce 0 tar zxvf apache-tomcat-9.0.16.tar.gz mkdir /usr/local/tomcat mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1 cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2 vim /etc/profile.d/tomcat.sh #tomcat1 export CATALINA_HOME1=/usr/local/tomcat/tomcat1 export CATALINA_BASE1=/usr/local/tomcat/tomcat1 export TOMCAT_HOME1=/usr/local/tomcat/tomcat1 #tomcat2 export CATALINA_HOME2=/usr/local/tomcat/tomcat2 export CATALINA_BASE2=/usr/local/tomcat/tomcat2 export TOMCAT_HOME2=/usr/local/tomcat/tomcat2 ------------------------------ source /etc/profile.d/tomcat.sh vim /usr/local/tomcat/tomcat2/conf/server.xml <Server port="8006" shutdown="SHUTDOWN"> #22行,修改Server prot,預設為8005 -> 修改為8006 <Connector port="8081" protocol="HTTP/1.1" #69行,修改Connector port,HTTP/1.1 預設為8080 -> 修改為8081 <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" /> #116行,修改Connector port AJP/1.3,預設為8009 -> 修改為8010 ------------------------------ 第一個聯結器預設監聽8080埠,負責建立HTTP連線。在通過瀏覽器存取Tomcat伺服器的Web應用時,使用的就是這個聯結器。 第二個聯結器預設監聽8009埠,負責和其他的HTTP伺服器建立連線。在把Tomcat與其他HTTP伺服器整合時,就需要用到這個聯結器。 ------------------------------ vim /usr/local/tomcat/tomcat1/bin/startup.sh #------------------------------ # Start Script for the CATALINA Server #------------------------------ ##新增以下內容 export CATALINA_BASE=$CATALINA_BASE1 export CATALINA_HOME=$CATALINA_HOME1 export TOMCAT_HOME=$TOMCAT_HOME1 vim /usr/local/tomcat/tomcat1/bin/shutdown.sh #------------------------------ # Stop script for the CATALINA Server #------------------------------ export CATALINA_BASE=$CATALINA_BASE1 export CATALINA_HOME=$CATALINA_HOME1 export TOMCAT_HOME=$TOMCAT_HOME1 vim /usr/local/tomcat/tomcat2/bin/startup.sh #------------------------------ # Start Script for the CATALINA Server #------------------------------ export CATALINA_BASE=$CATALINA_BASE2 export CATALINA_HOME=$CATALINA_HOME2 export TOMCAT_HOME=$TOMCAT_HOME2 vim /usr/local/tomcat/tomcat2/bin/shutdown.sh #------------------------------ # Stop script for the CATALINA Server #------------------------------ export CATALINA_BASE=$CATALINA_BASE2 export CATALINA_HOME=$CATALINA_HOME2 export TOMCAT_HOME=$TOMCAT_HOME2 /usr/local/tomcat/tomcat1/bin/startup.sh /usr/local/tomcat/tomcat2/bin/startup.sh netstat -natp | grep java
tomcat1
tomcat2
(1)Tomcat1 server 設定
mkdir /usr/local/tomcat/webapps/test vim /usr/local/tomcat/webapps/test/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP test1 page</title> #指定為 test1 頁面 </head> <body> <% out.println("動態頁面 1,http://www.test1.com");%> </body> </html> vim /usr/local/tomcat/conf/server.xml #由於主機名 name 設定都為 localhost,需要刪除前面的 HOST 設定 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true"> </Context> </Host> /usr/local/tomcat/bin/shutdown.sh /usr/local/tomcat/bin/startup.sh
(2)Tomcat2 server 設定
mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP test2 page</title> #指定為 test2 頁面 </head> <body> <% out.println("動態頁面 2,http://www.test2.com");%> </body> </html> vim /usr/local/tomcat/tomcat1/conf/server.xml #刪除前面的 HOST 設定 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" /> </Host> /usr/local/tomcat/tomcat1/bin/shutdown.sh /usr/local/tomcat/tomcat1/bin/startup.sh vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP test3 page</title> #指定為 test3 頁面 </head> <body> <% out.println("動態頁面 3,http://www.test3.com");%> </body> </html> vim /usr/local/tomcat/tomcat2/conf/server.xml #刪除前面的 HOST 設定 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" /> </Host> /usr/local/tomcat/tomcat2/bin/shutdown.sh /usr/local/tomcat/tomcat2/bin/startup.sh
(3)Nginx server 設定
#準備靜態頁面和靜態圖片 echo '<html><body><h1>這是靜態頁面</h1></body></html>' > /usr/local/nginx/html/index.html mkdir /usr/local/nginx/html/img cp /opt/game.jpg /usr/local/nginx/html/img vim /usr/local/nginx/conf/nginx.conf ...... http { ...... #gzip on; #設定負載均衡的伺服器列表,weight參數列示權重,權重越高,被分配到的概率越大 upstream tomcat_server { server 192.168.136.20:8080 weight=1; server 192.168.136.40:8080 weight=1; server 192.168.136.40:8081 weight=1; } server { listen 80; server_name www.t2.com; charset utf-8; #access_log logs/host.access.log main; #設定Nginx處理動態頁面請求,將 .jsp檔案請求轉發到Tomcat 伺服器處理 location ~ .*.jsp$ { proxy_pass http://tomcat_server; #設定後端的Web伺服器可以獲取遠端使用者端的真實IP ##設定後端的Web伺服器接收到的請求存取的主機名(域名或IP、埠),預設HOST的值為proxy_pass指令設定的主機名。如果反向代理伺服器不重寫該請求頭的話,那麼後端真實伺服器在處理時會認為所有的請求都來自反向代理伺服器,如果後端有防攻擊策略的話,那麼機器就被封掉了。 proxy_set_header HOST $host; ##把$remote_addr賦值給X-Real-IP,來獲取源IP proxy_set_header X-Real-IP $remote_addr; ##在nginx 作為代理伺服器時,設定的IP列表,會把經過的機器ip,代理機器ip都記錄下來 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #設定Nginx處理靜態圖片請求 location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css)$ { root /usr/local/nginx/html/img; expires 10d; } location / { root html; index index.html index.htm; } ...... } ...... } systemctl restart nginx
測試靜態頁面效果
瀏覽器存取 http://192.168.136.30/
瀏覽器存取 http://192.168.136.30/game.jpg
測試負載均衡效果,不斷重新整理瀏覽器測試
瀏覽器存取 http://192.168.136.30/index.jsp
這裡的層是OSI 7層網路模型,OSI 模型是從上往下的,越底層越接近硬體,越往上越接近軟體,這七層模型分別是物理層、資料鏈路層、網路層、傳輸層、對談層、表示層、應用層。
4層是指傳輸層的 tcp / udp 。 7層是指應用層,通常是http 。
4層用的是NAT技術。NAT英文全稱是“Network Address Translation”,中文意思是“網路地址轉換”,請求進來的時候,nginx修改封包裡面的目標和源IP和埠,然後把封包發向目標伺服器,伺服器處理完成後,nginx再做一次修改,返回給請求的使用者端。
7層代理:需要讀取並解析http請求內容,然後根據具體內容(url,引數,cookie,請求頭)然後轉發到相應的伺服器,轉發的過程是:建立和目標機器的連線,然後轉發請求,收到響應資料在轉發給請求使用者端。
效能: 理論上4層要比7層快,因為7層代理需要解析封包的具體內容,需要消耗額外的cpu。但nginx具體強大的網路並行處理能力, 對於一些慢連線,nginx可以先將網路請求資料緩衝完了一次性轉發給上游server,這樣對於上游網路並行處理能力弱的伺服器(比如tomcat),這樣對tomcat來說就是慢連線變成快連線(nginx到tomcat基本上都是可靠內網),從而節省網路資料緩衝時間,提供並行效能。
靈活性: 由於4層代理用的是NAT,所以nginx不知道請求的具體內容,所以nginx啥也幹不了。 用7層代理,可以根據請求內容(url,引數,cookie,請求頭)做很多事情,比如:
a:動態代理:不同的url轉發到不同伺服器。
b.風控:遮蔽外網IP請求某些敏感url;根據引數遮蔽某些刷單使用者。
c.審計:在nginx層記錄請求紀錄檔。
反向代理 代理伺服器端 7層反向代理 4層反向代理 正向代理 代理使用者端 代理快取
●rr 負載均衡模式:
每個請求按時間順序逐一分配到不同的後端伺服器,如果超過了最大失敗次數後(max_fails,預設1),在失效時間內(fail_timeout,預設10秒),該節點失效權重變為0,超過失效時間後,則恢復正常,或者全部節點都為down後,那麼將所有節點都恢復為有效繼續探測,一般來說rr可以根據權重來進行均勻分配。
●least_conn 最少連線:
優先將使用者端請求排程到當前連線最少的伺服器。
●ip_hash 負載均衡模式:
每個請求按存取ip的hash結果分配,這樣每個訪客固定存取一個後端伺服器,可以解決session的問題,但是ip_hash會造成負載不均,有的服務請求接受多,有的服務請求接受少,所以不建議採用ip_hash模式,session 共用問題可用後端服務的 session 共用代替 nginx 的 ip_hash(使用後端伺服器自身通過相關機制保持session同步)。
●fair(第三方)負載均衡模式:
按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
●url_hash(第三方)負載均衡模式:
基於使用者請求的uri做hash。和ip_hash演演算法類似,是對每個請求按url的hash結果分配,使每個URL定向到同一個後端伺服器,但是也會造成分配不均的問題,這種模式後端伺服器為快取時比較好。
./configure --with-stream 和http同等級:所以一般只在http上面一段設定, stream { upstream appserver { server 192.168.136.20:8080 weight=1; server 192.168.136.40:8080 weight=1; server 192.168.136.40:8081 weight=1; } server { listen 8080; proxy_pass appserver; } } http { ......
以上就是Nginx Tomcat負載均衡動靜分離原理解析的詳細內容,更多關於Nginx Tomcat負載均衡動靜分離的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45