OracleHTTPServerとクラスタ化されたWeblogicの連携

環境

OS Windows10Pro(非推奨)
JAVA JDK1.8.0
MicrosoftVisualC++2012 11.0
Fusion Middleware 12.2.1.4.0
OracleHTTPServer 12.2.1.4.0
WeblogicServer12c 12.2.1.4.0

OracleHTTPServerをロードバランサとして裏に控えているクラスタ化されたWebLogicServerにリクエストをプロキシする。その際、裏で控えているWebLogicServerはSessionを3台で共有する。

この設定によりクラスタのマシンが停止しても他のマシンがSessionを引き継ぎSessionを失うことはない。

 

 

1.インストール

Fusion Middleware 、 OracleHTTPServer 、 WeblogicServer12c 全て同じORACLE_HOMEにインストールする。

① Fusion Middleware インストール

 

 

②WeblogicServer12c インストール

Weblogicインストール参照

 

 

③OracleHTTPServer インストール

OK

 

2.構成を行う

コンフィグ起動

C:\OracleWeb122\Middleware\Oracle_Home\oracle_common\common\bin\config.cmd

OK

 

3.ノードマネージャ起動

C:\OracleWeb122\Middleware\Oracle_Home\user_projects\domains
\base_domain\bin\startNodeManager.cmd

 

4.管理サーバ起動

C:\OracleWeb122\Middleware\Oracle_Home\user_projects\domains
\base_domain\bin\startWeblogic.cmd

 

5.oracleHTTPServerを作成する、起動する

emコンソール起動

http://localhost:7001/em

 

ohs1という名前で作成する

 

OracleHTTPServerを作成したので(ohs1)、 OracleHTTPServer にプロキシ・プラグインの設定を行う。(これによってOracleHTTPServerはロードバランサの機能も兼ね、WeblogicServerにリクエストをプロキシできるようになる)

 

C:\OracleWeb122\Middleware\Oracle_Home\user_projects\domains
\base_domain\config\fmwconfig\components\OHS\ohs1\mod_wl_ohs.conf

C:\OracleWeb122\Middleware\Oracle_Home\user_projects\domains
\base_domain\config\fmwconfig\components\OHS\instances\ohs1\mod_wl_ohs.conf
以下のように書き換える

■mod_wl_ohs.conf
# NOTE : This is a template to configure mod_weblogic.
LoadModule weblogic_module “${PRODUCT_HOME}/modules/mod_wl_ohs.so”
# This empty block is needed to save mod_wl related configuration from EM to this file when changes are made at the Base Virtual Host Level
<IfModule weblogic_module>
# WebLogicHost <WEBLOGIC_HOST>
# WebLogicPort <WEBLOGIC_PORT>
# MatchExpression *.jsp
WebLogicCluster localhost:7003,localhost:7004
</IfModule>
# <Location /weblogic>
# SetHandler weblogic-handler
# PathTrim /weblogic
# ErrorPage http:/WEBLOGIC_HOME:WEBLOGIC_PORT/
# </Location>
<Location />
SetHandler weblogic-handler
</Location>
 
↑の”WebLogicCluster localhost:7003,localhost:7004”は全部書かなくてよい
注:クラスタに含まれるすべてのWebLogicサーバーのロケーションを指定する必要はありません。一度接続に成功すると、クラスタ内で現在実行されているすべてのサーバーのロケーションがこのサーバーによってプラグインに提供されます。 その後、このサーバー・リストは各リクエストによって更新されます。
 
 
 
プロキシ・プラグインの設定後、emコンソールでOracleHTTPServerを再起動する
 

6.WeblogicServerのクラスタ化された3台の管理対象サーバを起動する

http://localhost:7001/console

 

起動OK

 

7.Sessionレプリケーションを確認するJavaアプリ作成

Javaアプリは以下の2点が必須である

①Sessionはシリアライズ可能である

②weblogic.xml(web.xmlと同階層)にreplicated_if_clusteredを記述(下記参照)

 

javaアプリ構成
index.jsp
CreateSessionPage.java
GetSessionPage.java
TopPage.java
web.xml
weblogic.xml

 

■index.jsp
<!DOCTYPE html>
<%@ page contentType=”text/html;charset=windows-31j”%>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=windows-31j”/>
</head>
<body>
<br>
<form action=’./TopPage’ method=’Post’>
<input type = ‘submit’ value = ‘TopPage’>
</form>
<br>
</body>
</html>
</html>

 

■CreateSessionPage.java

package project1;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet(name = “CreateSessionPage”, urlPatterns = { “/CreateSessionPage” })
public class CreateSessionPage extends HttpServlet {
private static final String CONTENT_TYPE = “text/html; charset=windows-31j”;
private static final long serialVersionUID = 1L;

public void init(ServletConfig config) throws ServletException {
super.init(config);
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute(“personSeri”, new PersonSeri(“name1”));//シリアライズ
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println(“<!DOCTYPE html>”);
out.println(“<html>”);
out.println(“<head>”);
out.println(“<title></title>”);
out.println(“</head>”);
out.println(“<body>”);

out.println(“<br>”);
out.println(“CreateSessionPage”);
out.println(“<br>”);
out.println(“Session=name1<br>”);

out.println(“<form action=’./GetSessionPage’ method=’Post’>”);
out.println(“<input type = ‘submit’ value = ‘GetSessionPage’>”);
out.println(“</form>”);
out.println(“<br>”);
out.println(“<br>”);

out.println(“<form action=’./TopPage’ method=’Post’>”);
out.println(“<input type = ‘submit’ value = ‘TopPage’>”);
out.println(“</form>”);
out.println(“<br>”);

out.println(“<form action=’./index.jsp’ method=’Post’>”);
out.println(“<input type = ‘submit’ value = ‘index.jsp’>”);
out.println(“</form>”);
out.println(“<br>”);

out.println(“</body>”);
out.println(“</html>”);
}
}

 

■GetSessionPage.java

package project1;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet(name = “GetSessionPage”, urlPatterns = { “/GetSessionPage” })
public class GetSessionPage extends HttpServlet {
private static final String CONTENT_TYPE = “text/html; charset=windows-31j”;
private static final long serialVersionUID = 1L;

public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println(“<html>”);
out.println(“<head><title>GetSessionPage</title></head>”);
out.println(“<body>”);

out.println(“<br>”);
out.println(“GetSessionPage”);
out.println(“<br>”);

out.println(“PersonSeri ” + ((PersonSeri)request.getSession().getAttribute(“personSeri”)).getName());
out.println(“<br>”);
//out.println(request.getSession().getId());
out.println(“<br>”);
out.println(“<form action=’./TopPage’ method=’Post’>”);
out.println(“<input type = ‘submit’ value = ‘TopPage’>”);
out.println(“</form>”);
out.println(“<br>”);

out.println(“<form action=’./index.jsp’ method=’Post’>”);
out.println(“<input type = ‘submit’ value = ‘index.jsp’>”);
out.println(“</form>”);
out.println(“<br>”);

out.println(“</body>”);
out.println(“</html>”);
}
}

 

■TopPage.java

package project1;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet(name = “TopPage”, urlPatterns = { “/TopPage” })
public class TopPage extends HttpServlet {
private static final String CONTENT_TYPE = “text/html; charset=windows-31j”;
private static final long serialVersionUID = 1L;

public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println(“<html>”);
out.println(“<head><title>TopPage</title></head>”);
out.println(“<body>”);
out.println(“<br>”);
out.println(“TopPage”);
out.println(“<br>”);
out.println(“<br>”);

out.println(“<form action=’./CreateSessionPage’ method=’Post’>”);
out.println(“<input type = ‘submit’ value = ‘CreateSessionPage’>”);
out.println(“</form>”);
out.println(“<br>”);
out.println(“<br>”);

out.println(“<form action=’./GetSessionPage’ method=’Post’>”);
out.println(“<input type = ‘submit’ value = ‘GetSessionPage’>”);
out.println(“</form>”);
out.println(“<br>”);

out.println(“<form action=’./index.jsp’ method=’Post’>”);
out.println(“<input type = ‘submit’ value = ‘index.jsp’>”);
out.println(“</form>”);
out.println(“<br>”);

out.println(“</body>”);
out.println(“</html>”);
}
}

 

■PersonSeri.java
package project1;
import java.io.Serializable;
public class PersonSeri implements Serializable {
@SuppressWarnings(“compatibility:-6848355860387642004”)
private static final long serialVersionUID = 1L;
private String name;
public PersonSeri(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

 

■web.xml
<?xml version = ‘1.0’ encoding = ‘windows-31j’?>
<web-app xmlns=”http://java.sun.com/xml/ns/javaee” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd”
version=”3.0″>
<servlet>
<servlet-name>CreateSessionPage</servlet-name>
<servlet-class>project1.CreateSessionPage</servlet-class>
</servlet>
<servlet>
<servlet-name>GetSessionPage</servlet-name>
<servlet-class>project1.GetSessionPage</servlet-class>
</servlet>
<servlet>
<servlet-name>TopPage</servlet-name>
<servlet-class>project1.TopPage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CreateSessionPage</servlet-name>
<url-pattern>/CreateSessionPage</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>GetSessionPage</servlet-name>
<url-pattern>/GetSessionPage</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>TopPage</servlet-name>
<url-pattern>/TopPage</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

 

■weblogic.xml
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<weblogic-web-app xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.7/weblogic-web-app.xsd”
xmlns=”http://xmlns.oracle.com/weblogic/weblogic-web-app”>
<context-root>Clusterwl2</context-root>
<session-descriptor>
<persistent-store-type>replicated_if_clustered</persistent-store-type>
</session-descriptor>
</weblogic-web-app>

 

アプリをデプロイする

 

 

OK

 

8.Sessionがレプリケートされているか確認

http://localhost:7777/Clusterwl2/CreateSessionPage

 

現在全サーバ起動中..当たり前だがSession取得成功

 

・クラスタのモニタで、前記の動作確認はnew_ManagedServer_3(プライマリ・セッション)で動いているのが判る
・セッションがレプリカされるか、new_ManagedServer_3 , new_ManagedServer_2を停止してみる。

※ちなみに、プライマリ・セッションとセッション・レプリカのサーバを同時に停止するとセッションは消えてしまう

この状態で一度TopPageへ移動 → GetSessionPageを表示してSessionが継続されるか確認

Session取得成功!!