Windows下nginx+tomcat實現簡單的負載均衡、動靜分離等


Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。
反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器。客戶端不需要任何配置就可以訪問。反向代理是感知不到的。
正向代理,是一個位於客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求並指定目標(原始服務器),然后代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。正向代理可以感知。
nginx支持配置反向代理,通過反向代理實現網站的負載均衡。


一、nginx的下載

官網:http://nginx.org/en/download.html

下載里面的最新穩定版 Stable version nginx/Windows-1.14.1
下載下來是個壓縮包nginx-1.14.1.zip,解壓如下

確保默認80端口沒被使用,雙擊nginx.exe,在瀏覽器地址欄輸入localhost,可看到如下界面

二、nginx的常用命令(在cmd命令行下定位到nginx目錄)

start nginx 開啟nginx
nginx -v     顯示 nginx 的版本。
nginx -s stop	快速關閉Nginx,可能不保存相關信息,並迅速終止web服務。
nginx -s quit  平穩關閉Nginx,保存相關信息,有安排的結束web服務。
nginx -s reload 修改Nginx配置信息后,不需要關閉nginx后重新啟動nginx,可讓改動生效。
nginx -s reopen 重新打開日志文件。
nginx -c filename 為 Nginx 指定一個配置文件,來代替缺省的。
nginx -t   不運行,僅測試配置文件。nginx 將檢查配置文件的語法正確性,並嘗試打開配置文件中所引用到的文件。

三、簡單實現負載均衡

1、准備兩個tomcat,本次測試用apache-tomcat-9.0.0.M15,復印一份,分別重命名為apache-tomcat-9.0.0.M15-1、apache-tomcat-9.0.0.M15-2
 

2、修改這兩個tomcat的各3個端口,其中第一個tomcat的啟動端口為10001,第2個tomcat的啟動端口為10002,打開tomcat的conf目錄下的server.xml,修改如下:

apache-tomcat-9.0.0.M15-1

<Server port="10011" shutdown="SHUTDOWN"> (原來是8005) 
<Connector port="10001" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> (原來是8080)
<Connector port="10021" protocol="AJP/1.3" redirectPort="8443" /> (原來是8009)

apache-tomcat-9.0.0.M15-2

<Server port="10012" shutdown="SHUTDOWN"> (原來是8005) 
<Connector port="10002" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> (原來是8080)
<Connector port="10023" protocol="AJP/1.3" redirectPort="8443" /> (原來是8009)

為了下面nginx區分訪問的是哪一個tomcat,修改上面兩個tomcat的默認頁面webapps\ROOT\index.jsp,簡單加個標識,
訪問http://localhost:10001,標識“Apache Tomcat/9.0.0.M15 ------tomcat1”,如下
 

訪問http://localhost:10002,標識“Apache Tomcat/9.0.0.M15 ------tomcat2”,如下

3、修改nginx配置文件
D:\javatool\nginx-1.14.1\conf\nginx.conf
因為我本機的80端口被占用了,所以修改nginx的端口為10000,詳細見下圖:

4、啟動nginx
在命令行下start nginx后,一個窗口一閃而過,可以在cmd命令窗口輸入命令 tasklist /fi "imagename eq nginx.exe" ,出現如下結果說明啟動成功

5、瀏覽器訪問http://localhost:10000

可看到訪問的是http://localhost:10001或http://localhost:10002,
手工刷新,可看到兩者的訪問比例是1:2,就是上面nginx.conf配置的weight值1和2。

-------------------------------------------------------------------------------------------------------------

附:

Nginx負載均衡的upstream目前支持以下幾種方式的分配

#1、輪詢(默認)
#每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。

upstream linuxidc { 
server 10.0.0.10; 
server 10.0.0.11; 
} 

#2、weight
#指定輪詢幾率,weight和訪問比率成正比,用於后端服務器性能不均的情況。

upstream linuxidc{ 
server 10.0.0.10 weight=5; 
server 10.0.0.11 weight=10; 
}

#2、ip_hash

#每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。
但是存在一個問題:假如訪問的tomcat掛了,那nginx的故障轉移機制將會分發給另一個tomcat服務器,這樣一來所有請求這個tomcat的所有用戶session會失效,需要重新登陸。

upstream favresin{ 
ip_hash; 
server 10.0.0.10:8080; 
server 10.0.0.11:8080; 
} 

#3、fair(第三方)
#按后端服務器的響應時間來分配請求,響應時間短的優先分配。

upstream favresin{ 
server 10.0.0.10:8080; 
server 10.0.0.11:8080; 
fair; 
}

#4、url_hash(第三方)
#按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效。

upstream還能夠為每一個設備設置狀態值,這些狀態值的含義分別例如以下:
down 表示單前的server臨時不參與負載。
weight 默覺得1.weight越大,負載的權重就越大。
max_fails :同意請求失敗的次數默覺得1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤.
fail_timeout : max_fails次失敗后。暫停的時間。
backup: 其他全部的非backup機器down或者忙的時候,請求backup機器。所以這台機器壓力會最輕。

upstream bakend{ #定義負載均衡設備的Ip及設備狀態 
ip_hash; 
server 10.0.0.11:9090 down; 
server 10.0.0.11:8080 weight=2; 
server 10.0.0.11:6060; 
server 10.0.0.11:7070 backup; 
}

四、實現動態和靜態分離、綁定域名的配置

nginx.conf的配置如下

server {
        listen       80;  #端口號
        server_name  xxx.com;  #域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

		location ~ .*\.(jpg|png|gif|jpeg|css|html|swf)$ {#針對這些擴展名生效
			root D:/deploy/static/; #靜態資源的路徑
		}
		
		location /js/ { #針對路徑/js/生效
			root D:/deploy/static/;  #靜態資源的路徑
		}
		
        location / {
                proxy_pass   http://localhost:8080;  #tomcat的地址
			proxy_set_header Host $http_host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
        }
        #...其它省略...
}

五、nginx集群Tomcat,nginx采用輪詢方式的Session共享解決

多個Tomcat,可以使用Tomcat內置的Session復制方案。

1、多個Tomcat的相關端口號配置不一樣;

參考:https://www.cnblogs.com/gdjlc/p/7026052.html

2、打開tomcat目錄下conf/server.xml,找到下面配置,默認是注釋的,取消注釋

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

3、打開項目的web.xml(不是tomcat/conf/web.xml),增加<distributable/>

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    
    <!--這里是其它配置,略-->

    <distributable/>
</web-app>

4、nginx.conf的配置

upstream local_tomcat{		
		server localhost:8080;
		server localhost:8090;
	}

    server {
        listen       80;  #端口號
        server_name  xxx.com; #域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;		
		
        location / {
                proxy_pass   http://local_tomcat;
	        proxy_set_header Host $http_host;
	        proxy_set_header X-Real-IP $remote_addr;
	        proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
        }	
       
       #其它略......
   }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM