一、理論
nginx用于處理靜態頁面以及做調度器,tomcat用于處理動態頁面
lvs(四層)
輪詢(rr)
加權輪詢(wrr)
最小連接(lc)
加權最小連接(wlc)
nginx(四層、七層)
輪詢(rr)
最小連接(leastconn)
ip哈希(ip_hash)
haproxy(四層、七層)
輪詢(roundrobin)
加權輪詢(static-rr)
最小連接(leastconn)
源地址哈希(source)
調度器和代理服務器的區別
代理服務器:客戶端的請求和服務器的應答都通過代理服務器來傳輸。
調度器:
?? ?NAT ?客戶端的請求和服務器的應答都通過代理服務器來傳輸。
?? ?DR ? 客戶端的請求通過調度器傳輸,服務器直接應答給客戶端,不經過調度器。
?? ?TUN ?客戶端的請求通過調度器傳輸,服務器直接應答給客戶端,不經過調度器。
?
二、實踐
1、實驗環境
tomcat1 192.168.10.101
tomcat2 192.168.10.102
nginx 192.168.10.103
2、過程
[root@tomcat1 ~]# ls
anaconda-ks.cfg apache-tomcat-9.0.8.tar.gz jdk-8u102-linux-x64.rpm
[root@tomcat1 ~]# java -version
-bash: java: 未找到命令
[root@tomcat1 ~]# dnf -y install jdk-8u102-linux-x64.rpm
[root@tomcat1 ~]# java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
[root@tomcat1 ~]# tar xf apache-tomcat-9.0.8.tar.gz
[root@tomcat1 ~]# mv apache-tomcat-9.0.8/ /usr/local/tomcat9
[root@tomcat1 ~]# /usr/local/tomcat9/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat9
Using CATALINA_HOME: /usr/local/tomcat9
Using CATALINA_TMPDIR: /usr/local/tomcat9/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat1 ~]# netstat -anpt | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 2401/java
[root@tomcat1 ~]# mkdir -pv /web/webapp1
mkdir: 已創建目錄 '/web'
mkdir: 已創建目錄 '/web/webapp1'
[root@tomcat1 ~]# cat /web/webapp1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html>
<head>
<title>JSP test1 page</title> </head>
<body>
<% out.println("動態頁面1,http://www.ooos.com");%> </body>
<body>
<div>靜態頁面的圖片1 </div><br><img src="logo.png">
</body></html>[root@tomcat1 ~]# vim /usr/local/tomcat9/conf/server.xml<Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true">……略<Context docBase="/web/webapp1" path="" reloadable="false"></Context></Host>
[root@tomcat1 ~]# /usr/local/tomcat9/bin/shutdown.sh
[root@tomcat1 ~]# /usr/local/tomcat9/bin/startup.sh[root@tomcat2 ~]# ls
anaconda-ks.cfg apache-tomcat-9.0.8.tar.gz jdk-8u102-linux-x64.rpm
[root@tomcat2 ~]# java -version
-bash: java: 未找到命令
[root@tomcat2 ~]# dnf -y install jdk-8u102-linux-x64.rpm
[root@tomcat2 ~]# java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
[root@tomcat2 ~]# tar xf apache-tomcat-9.0.8.tar.gz
[root@tomcat2 ~]# mv apache-tomcat-9.0.8/ /usr/local/tomcat9
[root@tomcat2 ~]# /usr/local/tomcat9/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat9
Using CATALINA_HOME: /usr/local/tomcat9
Using CATALINA_TMPDIR: /usr/local/tomcat9/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat2 ~]# netstat -anpt | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 2401/java
[root@tomcat2 ~]# mkdir -pv /web/webapp1
mkdir: 已創建目錄 '/web'
mkdir: 已創建目錄 '/web/webapp1'
[root@tomcat2 ~]# cat /web/webapp1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html>
<head>
<title>JSP test2 page</title> </head>
<body>
<% out.println("動態頁面2,http://www.sooo.com");%> </body>
<body>
<div>靜態頁面的圖片2 </div><br><img src="logo.png">
</body></html>[root@tomcat2 ~]# vim /usr/local/tomcat9/conf/server.xml<Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true">……略<Context docBase="/web/webapp1" path="" reloadable="false"></Context></Host>
[root@tomcat2 ~]# /usr/local/tomcat9/bin/shutdown.sh
[root@tomcat2 ~]# /usr/local/tomcat9/bin/startup.sh[root@nginx ~]# dnf -y install gcc* make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker
[root@nginx ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# ls
anaconda-ks.cfg logo.png nginx-1.26.3.tar.gz
[root@localhost ~]# tar zxf nginx-1.26.3.tar.gz
[root@localhost ~]# cd nginx-1.26.3
[root@localhost nginx-1.26.3]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-pcre
[root@localhost nginx-1.26.3]# make -j$(nproc) && make install[root@localhost nginx-1.26.3]# cat /usr/local/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>靜態頁面</title>
<style>
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>靜態頁面</h1>
<p>這是個靜態頁面</p>
</body>
</html>
[root@localhost nginx-1.26.3]# vim /usr/local/nginx/conf/nginx.conf
http {……略
upstream tomcat_server {server 192.168.10.101:8080 weight=1;server 192.168.10.102:8080 weight=1;
}server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location ~.*.jsp$ {proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header Client-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://tomcat_server;}注: ~是匹配規則 用于正則url前,表示url包含正則表達式,區分大小寫。.*兩者組合表示匹配任意個字符串, .表示匹配除換行外任意一個字符串,*表示匹配0個或多個字符串。. 表示匹配除換行外任意一個字符串。jsp$ 表示匹配以jsp結尾的。proxy_set_header HOST $host;+ proxy_set_header表示設置請求頭,HOST是變量名,$host是變量值,$host是nginx內置的函數,用于表示請求的虛擬主機。該值會封裝在請求頭中,用于請求tomcat中的具體虛擬主機。(該參數僅在后端服務器是tomcat時添加,因為tomcat中使用<Host></Host>標簽符來表示虛擬主機,傳遞給tomcat時,tomcat通過該請求頭就能知道客戶端請求的是哪個虛擬主機,給它提供服務。如果不添加,訪問網站會顯示400 bad request。)proxy_set_header X-Real-IP $remote_addr; proxy_set_header表示設置請求頭,X-Real-IP是變量名, $remote_addr是變量值,$remote_addr是nginx內置的函數,用于表示客戶端的ip地址。 該值用于傳遞給tomcat使用,客戶端通過代理訪問tomcat,在tomcat上更改日志設置,即可在tomcat的訪問日志中會顯示客戶端的真實IP地址。proxy_set_header Client-IP $remote_addr; proxy_set_header表示設置請求頭,Client-ip是變量名 $remote_addr是變量值,$remote_addr是nginx內置的函數,用于表示客戶端的IP地址。該值會封裝在請求頭中,交給代理服務器使用。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header表示設置請求頭,X-Forwarded-For是變量名,$proxy_add_x_forwarded_for是變量值,$proxy_add_x_forwarded_for是nginx內置的函數,用于將客戶端的ip地址傳遞給后端真實服務器。在多層代理中(例如,nginx01代理四層,nginx02代理七層,nginx01將請求發送給nginx02,nginx02再將請求發送給后端真實服務器)需要獲取客戶端的真實ip,就加上該參數即可。該參數會逐級傳遞客戶端的真實ip。location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {root /usr/local/nginx/html/img;expires 30d;}注:expires 設置緩存,30d表示緩存30天。location / {root html;index index.html index.htm;}
}
}[root@localhost ~]# mkdir /usr/local/nginx/html/img
[root@localhost ~]# cp logo.png /usr/local/nginx/html/img/
[root@localhost ~]# /usr/local/nginx/sbin/nginx
[root@localhost sbin]# curl 192.168.10.103
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>靜態頁面</title>
<style>
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>靜態頁面</h1>
<p>這是個靜態頁面</p>
</body>
</html>
[root@localhost sbin]# curl 192.168.10.103/index.jsp<html>
<head>
<title>JSP test1 page</title> </head>
<body>
動態頁面1,http://www.ooos.com</body>
<body>
<div>靜態頁面的圖片1 </div><br><img src="logo.png">
</body></html>[root@localhost sbin]# curl 192.168.10.103/index.jsp<html>
<head>
<title>JSP test1 page</title> </head>
<body>
動態頁面2,http://www.sooo.com</body>
<body>
<div>靜態頁面的圖片2 </div><br><img src="logo.png">
</body></html>tomcat server.xmlpattern="%{X-Real-IP}i"