1. 程式人生 > >Nginx 服務器 之Nginx與tomcat實現負載均衡

Nginx 服務器 之Nginx與tomcat實現負載均衡

nobody 服務器 listen server events

技術分享

本文講解我們如何使用Nginx做反向帶服務器,實現nginx與tomcat服務器集群做負載均衡。

一、nginx與tomcat實現負載均衡

1、在/usr/local/ngnix/conf 創建文件 nginx-tomcat.conf

文件內容:

技術分享

user  nobody;
worker_processes  2;
events {   
    worker_connections  1024;    
}
http{    # upstream 配置一組後端服務器,
    # 請求轉發到upstream後,nginx按策略將請求指派出某一服務器
    # 即配置用於負載均衡的服務器群信息    upstream tomcats{
        fair;
        server 121.42.41.143:8080;
        server 219.133.55.36;
    }
    server {
        listen       80;
        server_name  121.42.41.143;
        access_log  logs/tomcat-nginx.access.log  combined;        # 反向代理設置,將所有/路徑下請求發給本機上的tomcat
        location / {            #root   html;            index  index.html index.htm;            #==========Nginx提供的代理============
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://tomcats;
        }
   }
}

技術分享

2、使用該配置文件啟動nginx (啟動前先關閉nginx)

[[email protected] bin]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx-tomcat.conf

二、配置文件詳解:

技術分享 View Code

三、fair策略的安裝

fair策略:根據各個服務器的性能的不同,自動選擇使用響應能力強的服務器。該策略是第三方提供的,所以要先安裝。

安裝步驟

1、下載 gnosek-nginx-upstream-fair-a18b409.tar.gz

2、解壓 tar zxvf gnosek-nginx-upstream-fair-a18b409.tar.gz

3、將解壓後的文件移動到 /usr/local目錄下並 改名為 nginx-upstream-fair

技術分享

4、將該模塊添加到我們安裝的nginx中

a、首先進入nginx-1.8.1源文件目錄下在執行:

[[email protected] nginx-1.8.1]# ./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx-upstream-fair/

b、執行:make 進行編譯

c、進入 nginx-1.8.1/objs/下將最新的nginx啟動項 覆蓋原來的 /usr/local/nginx/sbin/nginx啟動項。

[[email protected] objs]# cp nginx /usr/local/nginx/sbin

d、開啟Nginx 看看是可以使用

四、在分布式服務器集群中session共享問題

問題:當我們的用戶在tomcat1服務器上登錄後,tomcat1會保存用戶的登錄信息,但當用戶的請求被代理服務器分配給tomcat2/tomcat3服務器時,這時就會出現tomcat2/tomcat3無法獲取用戶登錄信息,從而導致用戶需要重新登錄的現象。我們有三種解決方案:

1、同一個用戶的請求鎖定在同一臺服務器上,這樣就不會存在session在不同服務器之間共享問題。這種方案簡單,但缺乏容錯性(一旦服務器故障,那用戶的請求將被分配給其他服務器,這時就需要重新登錄)

實現方式:設置集群策略為 ip_hash ;

 upstream tomcats{
        ip_hash;
    }

2、session復制方式: 當任何服務器中session值發生改變,他都會將該改變廣播給其他服務器,當其他服務器收到廣播後也做相應的改變,從而實現session在所有服務器中一直。缺點 當集群中tomcat服務器很多時會增加網絡負荷,性能低下。實現方式:

a、在tomcat的server.xml中配置session廣播

技術分享

      <!-- 基於網絡廣播的策略,一個節點session變化,其它節點同步復制,節點多或數據量大時性能低下 -->
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
        <Channel className="org.apache.catalina.tribes.group.GroupChannel">   
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"  
                      address="192.168.6.223"  
                      port="8080"/> 
        </Channel>
      </Cluster>

技術分享

b、在我們的分布式應用的web.xml 中添加 <distributable/>標簽

<distributable/>:作用是公告我們的應用可以處於集群環境中。

3、通過創建額外的共享空間用來管理session,一般我們使用分布式緩存技術redis、memcached緩存技術,在這裏我麽使用memcached。

  a、memcached的安裝:http://www.cnblogs.com/jalja/p/6121978.html

  b、memcached 的 session共享原理

  粘性共享:

技術分享

  非粘性:

技術分享

c、tomcat訪問memcached的相關環境(我們使用的是tomcat7)

  1. 復制jar包到tomcat/lib目錄,jar分三類

    1)spymemcached.jar memcached java客戶端

    2)memcached相關的包 memcached-session-manager-{version}.jar 核心包 memcached-session-manager-tc{tomcat-version}-{version}.jar Tomcat版本相關的包

    3)序列化工具包,有多種可選方案,不設置時使用jdk自帶序列化,其它可選kryo,javolution,xstream,flexjson等 msm-{tools}-serializer-{version}.jar 其它序列化工具相關包 一般第三方序列化工具不需要實現serializable接口

技術分享

d、配置Context,加入處理session的Manager MemcachedBackupSessionManager
Context配置查找順序:
1)conf/context.xml 全局配置,作用於所有應用
2) conf/[enginename]/[hostname]/context.xml.default 全局配置,作用於指定host下全部應用
3) conf/[enginename]/[hostname]/[contextpath].xml 只作用於contextpath指定的應用
4) 應用META-INF/context.xml 只作用於本應用
5) conf/server.xml <Host>下 作用於Context docBase指定的應用
如果只希望session管理作用於特定應用,最好用3,4方式設置,希望作用全體,可用1,2,5設置

conf/context.xml的配置:

技術分享 View Code

四、集群環境開發註意事項

1、實體類要序列化( implements Serializable)

private static final long serialVersionUID = 3349238980725146825L;

2、獲取客戶端請求地址的方式 。在nginx-tomcat.conf中添加如下配置:

   server {
        location / {
            proxy_set_header   X-Real-IP        $remote_addr; # 真實的客戶端IP        }
   }

java代碼:

public static String  getIp(HttpServletRequest request){
        String remoteIp =request.getRemoteAddr();
        String headIp=request.getHeader("X-Real-IP");        return headIp==null?remoteIp:headIp;
    }

3、動靜分離
  把靜態文件放在nginx服務器中(css、js、圖片)


Nginx 服務器 之Nginx與tomcat實現負載均衡