目錄
一、Nginx代理服務(wù)器概念
1.正向代理
2.反向代理
二、動(dòng)靜分離
三、負(fù)載均衡?
四、Nginx七層代理實(shí)驗(yàn)
1.部署Nginx服務(wù)
2.?部署Tomcat服務(wù)
?2.1在192.168.88.50 虛擬機(jī)上部署雙實(shí)例
2.2在192.168.88.60 上部署Tomcat服務(wù)器3
3.動(dòng)靜分離配置
3.1Tomcat1 server 配置
3.2?Tomcat2?server 配置
3.3Tomcat3?server 配置
4.Nginx server 配置
4.1準(zhǔn)備靜態(tài)頁(yè)面和靜態(tài)圖片
4.2修改nginx配置文件
5.測(cè)試效果
四、Nginx四層代理服務(wù)
1.在192.168.88.60上配置nginx七層負(fù)載均衡器?
1.1安裝nginx服務(wù)
1.2配置靜態(tài)頁(yè)面和圖片
1.3配置七層nginx配置文件?
2.配置nginx四層代理
3.測(cè)試
一、Nginx代理服務(wù)器概念
代理是在服務(wù)器和客戶端之間假設(shè)的一層服務(wù)器,代理將接收客戶端的請(qǐng)求并將它轉(zhuǎn)發(fā)給服務(wù)器,然后將服務(wù)端的響應(yīng)轉(zhuǎn)發(fā)給客戶端。
不管是正向代理還是反向代理,實(shí)現(xiàn)的都是上面的功能。
1.正向代理
正向代理:一個(gè)位于客戶端和原始服務(wù)器(origin server)之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容,客戶端向代理發(fā)送一個(gè)請(qǐng)求并指定目標(biāo)(原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請(qǐng)求并將獲得的內(nèi)容返回給客戶端。
正向代理是為我們服務(wù)的,即為客戶端服務(wù)的,客戶端可以根據(jù)正向代理訪問(wèn)到它本身無(wú)法訪問(wèn)到的服務(wù)器資源。
正向代理對(duì)我們是透明的,對(duì)服務(wù)端是非透明的,即服務(wù)端并不知道自己收到的是來(lái)自代理的訪問(wèn)還是來(lái)自真實(shí)客戶端的訪問(wèn)。
2.反向代理
反向代理(Reverse Proxy)方式是指以代理服務(wù)器來(lái)接受 Internet 上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給 Internet 上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器。
反向代理是為服務(wù)端服務(wù)的,反向代理可以幫助服務(wù)器接收來(lái)自客戶端的請(qǐng)求,幫助服務(wù)器做請(qǐng)求轉(zhuǎn)發(fā),負(fù)載均衡等。
反向代理對(duì)服務(wù)端是透明的,對(duì)我們是非透明的,即我們并不知道自己訪問(wèn)的是代理服務(wù)器,而服務(wù)器知道反向代理在為他服務(wù)。
反向代理的優(yōu)勢(shì):
- 隱藏真實(shí)服務(wù)器
- 負(fù)載均衡便于橫向擴(kuò)充后端動(dòng)態(tài)服務(wù)
- 動(dòng)靜分離,提升系統(tǒng)健壯性
?
二、動(dòng)靜分離
動(dòng)靜分離是指在 Web 服務(wù)器架構(gòu)中,將靜態(tài)頁(yè)面與動(dòng)態(tài)頁(yè)面或者靜態(tài)內(nèi)容接口和動(dòng)態(tài)內(nèi)容接口分開(kāi)不同系統(tǒng)訪問(wèn)的架構(gòu)設(shè)計(jì)方法,進(jìn)而提示整個(gè)服務(wù)的訪問(wèn)性和可維護(hù)性。
一般來(lái)說(shuō),都需要將動(dòng)態(tài)資源和靜態(tài)資源分開(kāi),由于 Nginx 的高并發(fā)和靜態(tài)資源緩存等特性,經(jīng)常將靜態(tài)資源部署在 Nginx 上。如果請(qǐng)求的是靜態(tài)資源,直接到靜態(tài)資源目錄獲取資源,如果是動(dòng)態(tài)資源的請(qǐng)求,則利用反向代理的原理,把請(qǐng)求轉(zhuǎn)發(fā)給對(duì)應(yīng)后臺(tái)應(yīng)用去處理,從而實(shí)現(xiàn)動(dòng)靜分離。
使用前后端分離后,可以很大程度提升靜態(tài)資源的訪問(wèn)速度,即使動(dòng)態(tài)服務(wù)不可用,靜態(tài)資源的訪問(wèn)也不會(huì)受到影響。
?
三、負(fù)載均衡?
一般情況下,客戶端發(fā)送多個(gè)請(qǐng)求到服務(wù)器,服務(wù)器處理請(qǐng)求,其中一部分可能要操作一些資源比如數(shù)據(jù)庫(kù)、靜態(tài)資源等,服務(wù)器處理完畢后,再將結(jié)果返回給客戶端。
這種模式對(duì)于早期的系統(tǒng)來(lái)說(shuō),功能要求不復(fù)雜,且并發(fā)請(qǐng)求相對(duì)較少的情況下還能勝任,成本也低。隨著信息數(shù)量不斷增長(zhǎng),訪問(wèn)量和數(shù)據(jù)量飛速增長(zhǎng),以及系統(tǒng)業(yè)務(wù)復(fù)雜度持續(xù)增加,這種做法已無(wú)法滿足要求,并發(fā)量特別大時(shí),服務(wù)器容易崩。
很明顯這是由于服務(wù)器性能的瓶頸造成的問(wèn)題,除了堆機(jī)器之外,最重要的做法就是負(fù)載均衡。
請(qǐng)求爆發(fā)式增長(zhǎng)的情況下,單個(gè)機(jī)器性能再?gòu)?qiáng)勁也無(wú)法滿足要求了,這個(gè)時(shí)候集群的概念產(chǎn)生了,單個(gè)服務(wù)器解決不了的問(wèn)題,可以使用多個(gè)服務(wù)器,然后將請(qǐng)求分發(fā)到各個(gè)服務(wù)器上,將負(fù)載分發(fā)到不同的服務(wù)器,這就是負(fù)載均衡,核心是「分?jǐn)倝毫Α?。Nginx 實(shí)現(xiàn)負(fù)載均衡,一般來(lái)說(shuō)指的是將請(qǐng)求轉(zhuǎn)發(fā)給服務(wù)器集群。
?
Nginx 實(shí)現(xiàn)負(fù)載均衡的策略:
-
輪詢策略:默認(rèn)情況下采用的策略,將所有客戶端請(qǐng)求輪詢分配給服務(wù)端。這種策略是可以正常工作的,但是如果其中某一臺(tái)服務(wù)器壓力太大,出現(xiàn)延遲,會(huì)影響所有分配在這臺(tái)服務(wù)器下的用戶;
-
最小連接數(shù)策略:將請(qǐng)求優(yōu)先分配給壓力較小的服務(wù)器,它可以平衡每個(gè)隊(duì)列的長(zhǎng)度,并避免向壓力大的服務(wù)器添加更多的請(qǐng)求;
-
最快響應(yīng)時(shí)間策略:優(yōu)先分配給響應(yīng)時(shí)間最短的服務(wù)器;
-
客戶端 IP?綁定策略:來(lái)自同一個(gè) IP 的請(qǐng)求永遠(yuǎn)只分配一臺(tái)服務(wù)器,有效解決了動(dòng)態(tài)網(wǎng)頁(yè)存在的 session 共享問(wèn)題。
nginx應(yīng)用配置核心:
upstream:用于定義上游服務(wù)器(后臺(tái)提供的應(yīng)用服務(wù)器)的相關(guān)信息
可在upstream內(nèi)使用的指令:
-
server 定義上游服務(wù)器地址;
-
zone 定義共享內(nèi)存,用于跨 worker 子進(jìn)程;
-
keepalive 對(duì)上游服務(wù)啟用長(zhǎng)連接;
-
keepalive_requests 一個(gè)長(zhǎng)連接最多請(qǐng)求 HTTP 的個(gè)數(shù);
-
keepalive_timeout 空閑情形下,一個(gè)長(zhǎng)連接的超時(shí)時(shí)長(zhǎng);
-
hash 哈希負(fù)載均衡算法;
-
ip_hash 依據(jù) IP 進(jìn)行哈希計(jì)算的負(fù)載均衡算法;
-
least_conn 最少連接數(shù)負(fù)載均衡算法;
-
least_time 最短響應(yīng)時(shí)間負(fù)載均衡算法;
-
random 隨機(jī)負(fù)載均衡算法。
server: 定義上游服務(wù)器地址
parameters?可選值:
-
weight=number 權(quán)重值,默認(rèn)為1;
-
max_conns=number 上游服務(wù)器的最大并發(fā)連接數(shù);
-
fail_timeout=time 服務(wù)器不可用的判定時(shí)間;
-
max_fails=numer 服務(wù)器不可用的檢查次數(shù);
-
backup 備份服務(wù)器,僅當(dāng)其他服務(wù)器都不可用時(shí)才會(huì)啟用;
-
down 標(biāo)記服務(wù)器長(zhǎng)期不可用,離線維護(hù)。
四、Nginx七層代理實(shí)驗(yàn)
準(zhǔn)備三個(gè)虛擬機(jī):
- Nginx服務(wù)器:192.168.88.40
- Tomcat服務(wù)器1,2:192.168.88.50
- Tomcat服務(wù)器3:192.168.88.60
1.部署Nginx服務(wù)
#關(guān)閉防火墻
systemctl stop firewalld
setenforce 0
#安裝編譯器
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
#創(chuàng)建運(yùn)行用戶
useradd -M -s /sbin/nologin nginx
cd /opt
tar zxvf nginx-1.24.0.tar.gz -C /opt/
#編譯安裝nginx服務(wù)
cd nginx-1.24.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \ #啟用文件修改支持
--with-http_stub_status_module \ #啟用狀態(tài)統(tǒng)計(jì)
--with-http_gzip_static_module \ #啟用 gzip靜態(tài)壓縮
--with-http_flv_module \ #啟用 flv模塊,提供對(duì) flv 視頻的偽流支持
--with-http_ssl_module #啟用 SSL模塊,提供SSL加密功能
--with-stream
make && make install
#將nginx服務(wù)加入可執(zhí)行文件
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
#將nginx服務(wù)加入系統(tǒng)服務(wù)
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
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/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
2.?部署Tomcat服務(wù)
?2.1在192.168.88.50 虛擬機(jī)上部署雙實(shí)例
1.安裝好 jdk
cd /opt
rpm -qpl jdk-8u201-linux-x64.rpm
rpm -ivh jdk-8u201-linux-x64.rpm
java -version
#設(shè)置JDK環(huán)境變量
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
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
2.安裝 tomcat
cd /opt
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
3.配置 tomcat 環(huán)境變量
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
4.修改 tomcat2 中的 server.xml 文件,要求各 tomcat 實(shí)例配置不能有重復(fù)的端口號(hào)
vim /usr/local/tomcat/tomcat2/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN"> #22行,修改Server prot,默認(rèn)為8005 -> 修改為8006
<Connector port="8081" protocol="HTTP/1.1" #69行,修改Connector port,HTTP/1.1 默認(rèn)為8080 -> 修改為8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" /> #116行,修改Connector port AJP/1.3,默認(rèn)為8009 -> 修改為8010
5.修改各 tomcat 實(shí)例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 環(huán)境變量
vim /usr/local/tomcat/tomcat1/bin/shutdown.sh(startup.sh)
添加
export CATALINA_HOME=$CATALINA_HOME1
export CATALINA_BASE=$CATALINA_BASE1
export TOMCAT_HOME=$TOMCAT_HOME1
vim /usr/local/tomcat/tomcat2/bin/shutdown.sh(startup.sh)
添加
export CATALINA_HOME=$CATALINA_HOME2
export CATALINA_BASE=$CATALINA_BASE2
export TOMCAT_HOME=$TOMCAT_HOME2
#重啟tomcat服務(wù)
/usr/local/tomcat/tomcat1/bin/stutdown.sh
/usr/local/tomcat/tomcat2/bin/startup.sh
#查看tomcat服務(wù)是否開(kāi)啟
netstat -lntp | grep java
2.2在192.168.88.60 上部署Tomcat服務(wù)器3
systemctl stop firewalld
setenforce 0
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
vim /etc/profile
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
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
3.動(dòng)靜分離配置
3.1Tomcat1 server 配置
mkdir /usr/local/tomcat/tomcat1/webapps/test
vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title> #指定為 test1 頁(yè)面
</head>
<body>
<% out.println("動(dòng)態(tài)頁(yè)面 1,http://www.test1.com");%>
</body>
</html>
vim /usr/local/tomcat/tomcat1/conf/server.xml
#由于主機(jī)名 name 配置都為 localhost,需要?jiǎng)h除前面的 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">
</Context>
</Host>
/usr/local/tomcat/tomcat1/bin/shutdown.sh
/usr/local/tomcat/tomcat1/bin/startup.sh
3.2?Tomcat2?server 配置
mkdir /usr/local/tomcat/tomcat2/webapps/test
vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title> #指定為 test2 頁(yè)面
</head>
<body>
<% out.println("動(dòng)態(tài)頁(yè)面 2,http://www.test2.com");%>
</body>
</html>
vim /usr/local/tomcat/tomcat2/conf/server.xml
#由于主機(jī)名 name 配置都為 localhost,需要?jiǎng)h除前面的 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.3Tomcat3?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 test3 page</title> #指定為 test3 頁(yè)面
</head>
<body>
<% out.println("動(dòng)態(tài)頁(yè)面 3,http://www.test1.com");%>
</body>
</html>
vim /usr/local/tomcat/conf/server.xml
#由于主機(jī)名 name 配置都為 localhost,需要?jiǎng)h除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true"/>
</Host>
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
4.Nginx server 配置
4.1準(zhǔn)備靜態(tài)頁(yè)面和靜態(tài)圖片
mkdir /usr/local/nginx/html/test
將game.jpg上傳到/usr/local/nginx/html/test目錄下
vim /usr/local/nginx/html/test/index.html
<html>
<body>
<h1>this is hello web!</h1>
<img src="game.jpg" />
</body>
</html>
4.2修改nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
http {
#gzip on;
#配置負(fù)載均衡的服務(wù)器列表,weight參數(shù)表示權(quán)重,權(quán)重越高,被分配到的概率越大
upstream tomcat_server {
server 192.168.80.50:8080 weight=1;
server 192.168.80.50:8081 weight=1;
server 192.168.80.60:8080 weight=1;
}
server {
listen 8080;
server_name localhost;
charset utf-8;
#配置Nginx處理動(dòng)態(tài)頁(yè)面請(qǐng)求,將 .jsp文件請(qǐng)求轉(zhuǎn)發(fā)到Tomcat 服務(wù)器處理
location ~ .*\.jsp$ {
proxy_pass http://tomcat_server;
#設(shè)置后端的Web服務(wù)器可以獲取遠(yuǎn)程客戶端的真實(shí)IP
##設(shè)定后端的Web服務(wù)器接收到的請(qǐng)求訪問(wèn)的主機(jī)名(域名或IP、端口),默認(rèn)HOST的值為proxy_pass指令設(shè)置的主機(jī)名。如果反向代理服務(wù)器不重寫(xiě)該請(qǐng)求頭的話,那么后端真實(shí)服務(wù)器在處理時(shí)會(huì)認(rèn)為所有的請(qǐng)求都來(lái)自反向代理服務(wù)器,如果后端有防攻擊策略的話,那么機(jī)器就被封掉了。
proxy_set_header HOST $host;
##把$remote_addr賦值給X-Real-IP,來(lái)獲取源IP
proxy_set_header X-Real-IP $remote_addr;
##在nginx 作為代理服務(wù)器時(shí),設(shè)置的IP列表,會(huì)把經(jīng)過(guò)的機(jī)器ip,代理機(jī)器ip都記錄下來(lái)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#配置Nginx處理靜態(tài)圖片請(qǐng)求
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /usr/local/nginx/html/;
expires 10d;
}
location / {
root html;
index index.html index.htm;
}
}
}
5.測(cè)試效果
測(cè)試靜態(tài)頁(yè)面效果
瀏覽器訪問(wèn) http://192.168.88.40:8080/test/
測(cè)試負(fù)載均衡效果,不斷刷新瀏覽器測(cè)試
瀏覽器訪問(wèn) http://192.168.88.40:8080/test/index.jsp
不斷刷新會(huì)輪詢tomcat1、tomcat2、tomcat3
?
四、Nginx四層代理服務(wù)
?在七層基礎(chǔ)上再加一臺(tái)虛擬機(jī): nginx四層轉(zhuǎn)發(fā)服務(wù)器:192.168.88.70??
1.在192.168.88.60上配置nginx七層負(fù)載均衡器?
1.1安裝nginx服務(wù)
過(guò)程同上
1.2配置靜態(tài)頁(yè)面和圖片
mkdir /usr/local/nginx/html/test
將game.jpg上傳到/usr/local/nginx/html/test目錄下
vim /usr/local/nginx/html/test/index.html
<html>
<body>
<h1>this is world web!</h1>
<img src="game.jpg" />
</body>
</html>
1.3配置七層nginx配置文件?
vim /usr/local/nginx/conf/nginx.conf
upstream tomcat_server {
server 192.168.88.50:8080 weight=1;
server 192.168.88.50:8081 weight=1;
server 192.168.88.60:8080 weight=1;
}
server {
listen 80;
server_name localhost;
charset utf-8;
server 192.168.88.50:8081 weight=1;
server 192.168.88.60:8080 weight=1;
}
location ~ .*\.jsp$ {
proxy_pass http://tomcat_server;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /usr/local/nginx/html/;
expires 10d;
}
2.配置nginx四層代理
vim /usr/local/nginx/conf/nginx.conf
和http同等級(jí):所以一般只在http上面一段設(shè)置,
stream {
upstream appserver {
server 192.168.80.40:8080 weight=1;
server 192.168.80.60:80 weight=1;
}
server {
listen 8080;
proxy_pass appserver;
}
}
3.測(cè)試
vim /usr/local/nginx/conf/nginx.xonf
#關(guān)閉長(zhǎng)連接
keepalive_timeout 0;
測(cè)試靜態(tài)頁(yè)面效果,不斷刷新測(cè)試
瀏覽器訪問(wèn) http://192.168.88.70:8080/test/
測(cè)試負(fù)載均衡效果,不斷刷新瀏覽器測(cè)試
瀏覽器訪問(wèn) http://192.168.88.70:8080/test/index.jsp
?
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-475060.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-475060.html
到了這里,關(guān)于Nginx+Tomcat 負(fù)載均衡、動(dòng)靜分離的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!