天天看點

Windows下Nginx實作負載均衡

Apache,Nginx

Apache和Nginx都屬于屬于 靜态頁面伺服器,都有插件支援動态程式設計語言處理,但Nginx的IO模比Apache更适合跑代理。是以一般都作為前端緩沖代理(Nginx的反向代理功能)。

Tomcat,Jetty

tomcat和Jetty都是Java Servlet容器,可以用來生成動态頁面,主要用來跑Java的Web功能,當然也提供一個簡單靜态頁面轉換:

  • Jetty 是面向 Handler 的架構,就像 Spring 是面向 Bean 的架構,iBATIS 是面向 statement 一樣,而 Tomcat 是以多級容器建構起來的,它們的架構設計必然都有一個“元神”,所有以這個“元神“建構的其它元件都是肉身
  • Jetty 可以很容易被擴充和裁剪,相比之下,Tomcat 要臃腫很多,Tomcat 的整體設計上很複雜

負載均衡

tomcat的最大優勢在于處理動态請求,處理靜态内容的能力不如Apache和Nginx,并且經過測試發現,tomcat在高并發的場景下,其接受的最大并發連接配接數是由限制的,連接配接數過多會導緻tomcat處于"僵死"狀态,是以,在這種情況下,我們可以利用Nginx的高并發,低消耗的特點與tomcat一起使用。是以,tomcat與Nginx、Apache結合使用共有如下幾點原因:

  1. Tomcat處理html的能力不如Apache和Nginx,tomcat處理靜态内容的速度不如Apache和Nginx。
  2. tomcat接受的最大并發數有限,接連接配接數過多,會導緻tomcat處于"僵屍"狀态,對後續的連接配接失去響應,需要結合Nginx一起使用。

通常情況下,tomcat與Nginx、Apache結合使用,Nginx、Apache既可以作為 靜态頁面伺服器,也可以 轉發動态請求 至tomcat伺服器上。但在一個高性能的站點上,通常Nginx、Apache隻提供代理的功能,也就是轉發請求至tomcat伺服器上,而對于靜态内容的響應,則由前端 負載均衡 器來轉發至專門的靜态伺服器上進行處理。其架構類似于如下圖:

Windows下Nginx實作負載均衡

在這種架構中:

  • Nginx作為前端代理時,如果是靜态内容,如html、css等内容,則直接交給靜态伺服器處理;如果請求的圖檔等内容,則直接交給圖檔伺服器處理。
  • 如果請求的是動态内容,則交給tomcat伺服器處理。

是以在這裡,我們通過用Nginx作為代理伺服器來轉發來自前端的請求,

安裝多個Tomcat

  1. 修改Tomcat端口為:8081,8082(在同一台電腦上,避免端口沖突)
SHUTDOWN HTTP/1.1 redirectPort AJP/1.3
預設 8005 8080 8443 8009
Tomcat7.1 8101 8081 -
Tomcat7.2 8102 8082
  1. 在兩個Tomcat中context.xml中加入(與

    redis

    用戶端互動)
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
              host="localhost"
              port="6379"
              database="0"
              maxInactiveInterval="60" />
           
  1. 兩個Tomcat中加入jar包
  • commons-pool2-2.4.2.jar
  • jedis-2.7.3.jar
  • tomcat-redis-session-manager-1.2-tomcat-7-java-7.jar

Redis

安裝redis(Google,百度一下redis作為nosql,但是下載下傳我的redis版本,在最後),看一下bin下的RedisService.docx

Windows下Nginx指令

  1. 啟動

    直接點選Nginx目錄下的Nginx.exe 或者 cmd運作start Nginx

  2. 關閉

    Nginx -s stop 或者 Nginx -s quit

    stop表示立即停止Nginx,不儲存相關資訊

    quit表示正常退出Nginx,并儲存相關資訊

  3. 重新開機(因為改變了配置,需要重新開機)

    Nginx -s reload

  4. 關閉程序

    tskill Nginx

Nginx負載均衡配置

在Nginx.conf配置檔案中加入注釋部分

#  upstream  localhost   {
#     server   localhost:8081;
#     server   localhost:8082;
#  }
server {
    listen       80;
    server_name  localhost;
    location / {
        root   html;
        index  index.html index.htm;
  #     proxy_pass        http://localhost;
  #     proxy_set_header   Host             $host;
  #     proxy_set_header   X-Real-IP        $remote_addr;
  #     proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
     }
}
           

測試

  1. 在兩個Tomcat中的webapps下的ROOT下加入一個session.jsp
<%=session.getId()%> + Tomcat7.1
           
<%=session.getId()%> + Tomcat7.2
           
  1. 依次運作redis,Tomcat,Nginx
Windows下Nginx實作負載均衡
Windows下Nginx實作負載均衡

成功

jar包,redis,Nginx,Tomcat : http://pan.baidu.com/s/1c1NSPzU

總結

Tomcat9配置

最開始,我采用的是Tomcat9,在我安裝的時候總是有問題,很多東西已經改了,tomcat9安裝來安裝去,結果都是同一個Tomcat,有時候版本高就是有點坑。

Tomcat9必須要配置

CATALINA_HOME

問題 :

  1. 必須配置CATALINA_HOME變量,不然就閃退,但是如果配置就打開了自己的用的Tomcat,不是需要測試的Tomcat,結果是加的東西改變了他的屬性

具體配置參考 : windows下安裝多個tomcat服務

  1. 安裝服務

    在指令行中進入/Tomcat路徑/bin/,執行“service.bat install”:

    說明:

  2. 服務名和顯示名稱:service.bat中設定了預設的服務名稱,不同版本分别命名為Tomcat4、Tomcat5、Tomcat6,如果需要自 定義服務名或服務的顯示名稱,可在service.bat中修改SERVICE_NAME或PR_DISPLAYNAME;
  3. 防火牆的影響:/bin/tomcat6.exe(或tomcat4.exe、tomcat5.exe)将被作為服務程式,如果有防火牆,需要設為允許作為服務。
  4. 解除安裝服務

    在指令行中進入/Tomcat路徑/bin/,執行“service.bat remove”:

Jar包

jar包是一個很大的問題,有些jar包不支援(錯誤為仔細記錄),而且Tomcat-session jar的實作版本也不一樣。

不過正因為踩了坑,才更有趣,不是嗎?