天天看點

nginx+resin session 問題解決

測試環境:

server1   伺服器上安裝了  nginx + resin

server2  伺服器上隻安裝了 resin          

server1  IP 位址: 192.168.6.121

server2  IP 位址: 192.168.6.162

安裝步驟:

shell $> svn checkout http://nginx-upstream-jvm-route.googlecode.com/svn/trunk/ nginx-upstream-jvm-route-read-only

shell $> tar zxvf  nginx-0.7.61

shell $> cd nginx-0.7.61

shell $> patch -p0 < ../nginx-upstream-jvm-route-read-only/jvm_route.patch

shell $> useradd www

shell $> ./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module  --add-module=/root/nginx-upstream-jvm-route-read-only

shell $> make

shell $> make install

2.分别在兩台機器上 安裝 resin

### 修改環境變量###

shell $> vim /etc/profile

###在 umask 022 下填加以下###

JAVA_HOME=/usr/lib/jvm/java-6-sun

export JAVA_HOME

JRE_HOME="${JAVA_HOME}"/jre

export JRE_HOME

CLASSPATH=.:"${JAVA_HOME}"/lib/tools.jar:"${JAVA_HOME}"/lib/dt.jar${RESIN_HOME}"/lib/resin.jar:"${CLASSPATH}

export CLASSPATH

RESIN_HOME=/usr/local/resin

export RESIN_HOME

PATH="${JAVA_HOME}"/bin:"${PATH}"

export PATH

shell $> tar zxvf resin-3.1.9.tar.gz

shell $> cd resin-3.1.9

shell $> ./configure --prefix=/usr/local/resin

3. 配置兩台機器 的 resin

shell $> cd /usr/local/resin

shell $> cd conf

shell $> vim resin.conf

##  查找     <http address="*" port="8080"/>

## 注釋掉 <!--http address="*" port="8080"/-->

## 查找      <server id="" address="127.0.0.1" port="6800">

## 替換成    

    <server id="a" address="192.168.6.121" port="6800">

    <!-- server2 address=192.168.6.162 -->

    <http id="" port="8080"/>

    </server>

    <server id="b" address="192.168.6.121" port="6801">

    <!-- server2 address=192.168.6.162 -->

    <http id="" port="8081"/>

shell $> cd /usr/local/resin/webapps/ROOT/

shell $> mv index.jsp   index.jsp.bak

shell $> vim index.jsp

## 填入以下内容

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%

%>

<html>

  <head>

    </head>

      <body>

        121

       <!--server2  這裡為 162 -->

        <br />

       <%out.print(request.getSession()) ;%>

       <!--輸出session-->

        <%out.println(request.getHeader("Cookie")); %>

      <!--輸出Cookie--> 

      </body>

 </html>

###重新開機  resin 服務#####

### server1 伺服器#####

shell $> /usr/local/resin/bin/httpd.sh -server a start

###注意 如果沒修改 環境變量會報錯

### server2 伺服器 ####

shell $> /usr/local/resin/bin/httpd.sh -server b start

### 注意的是  server2 伺服器 隻啟動  server_id b  ###

4.整合 ngxin  resin

shell $> cd /usr/local/nginx/conf

shell $> mv nginx.conf nginx.bak

shell $> vim nginx.conf

## 以下是配置 ###

user  www www;

worker_processes 4;

error_log  logs/nginx_error.log  crit;

pid        /usr/local/nginx/nginx.pid;

#Specifies the value for maximum file descriptors that can be opened by this process.

worker_rlimit_nofile 51200;

events

{

 use epoll;

 worker_connections 2048;

}

http

  upstream backend {

    server 192.168.6.121:8080 srun_id=a; 

    ####  這裡 srun_id=a   對應的是 server1  resin 配置裡的 server id="a"

    server 192.168.6.162:8081 srun_id=b;

    ####  這裡 srun_id=b   對應的是 server2 resin 配置裡的 server id="b"

    jvm_route $cookie_JSESSIONID|sessionid;

  }

 include       mime.types;

 default_type  application/octet-stream;

 #charset  gb2312;

 charset UTF-8;

 server_names_hash_bucket_size 128;

 client_header_buffer_size 32k;

 large_client_header_buffers 4 32k;

 client_max_body_size 20m;

 limit_rate  1024k;

 sendfile on;

 tcp_nopush     on;

 keepalive_timeout 60;

 tcp_nodelay on;

 fastcgi_connect_timeout 300;

 fastcgi_send_timeout 300;

 fastcgi_read_timeout 300;

 fastcgi_buffer_size 64k;

 fastcgi_buffers 4 64k;

 fastcgi_busy_buffers_size 128k;

 fastcgi_temp_file_write_size 128k;

 gzip on;

#gzip_min_length  1k;

 gzip_buffers     4 16k;

 gzip_http_version 1.0;

 gzip_comp_level 2;

 gzip_types       text/plain application/x-javascript text/css application/xml;

 gzip_vary on;

 #limit_zone  crawler  $binary_remote_addr  10m;

server

 {

   listen       80;

   server_name  192.168.6.121;

   index index.html index.htm index.jsp;

   root  /var/www;

   location ~ .*\.jsp$

   {

     proxy_redirect    off;

     proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

     proxy_set_header  X-Real-IP  $remote_addr;

     proxy_set_header  Host $http_host;

   }

   location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

     expires      30d;

   location ~ .*\.(js|css)?$

     expires      1h;

   location /stu {

     stub_status on;

     access_log   off;

  log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '

             '$status $body_bytes_sent "$http_referer" '

             '"$http_user_agent" $http_x_forwarded_for';

#  access_log  off;

session  顯示 aXXXXX  通路的是  121 伺服器也就是  server1,因為是第一次通路是以Cookie 沒有獲得,重新整理一下看他是否輪詢會通路到 162 server2.

重新整理 N 遍後仍然是 121,也就是更新檔起作用了,cookie 值 也獲得了,為了測試,我又打開了 “火狐浏覽器”(因為session 和 cookie問題是以從新打開别的浏覽器),輸入網址:

顯示的是 162 ,session 值 是以 bXXX 開頭的,重新整理 N遍後:

仍然是 162  server 2伺服器!!大家測試的時候如果有疑問可一把 nginx 配置檔案的

srun_id=a  srun_id=b 去掉,然後在通路,就會知道 頁面是輪詢通路得了!!

PS:最後 謝謝

Weibin Yao  指導

還有 Cluster服務技術群2  的張濤大哥對 JSP 代碼的幫助!!!

我上傳的更新檔清在 linux 系統上解壓,因為 51cto 不支援 gz格式,是以我就改了一字尾名,在linux 系統上執行

shell $>  tar zxvf nginx-upstream-jvm-route-read-only.rar

就可以了!

tomcat 的解決方法 README 上有:

1.For resin

upstream backend {

    server 192.168.0.100 srun_id=a;

    server 192.168.0.101 srun_id=b;

    server 192.168.0.102 srun_id=c;

    server 192.168.0.103 srun_id=d;

2.For tomcat

    jvm_route $cookie_JSESSIONID|sessionid reverse;

本文轉自Deidara 51CTO部落格,原文連結:http://blog.51cto.com/deidara/193887,如需轉載請自行聯系原作者