三姉妹年子ママのtoi toi toi!日記

長女4歳、次女3歳、3女2歳の子育て中です。いつの間にか3人の子供に囲まれて日々過ごしています。3年育休から昨年復職し、慌ただしい日々ですが、この日々を少しでも残しておきたいと思い書いています。最近は特に子供の教育についてばかり考えています。

EC2上にApache+Tomcat9のクラスタ構成構築

Amazon Linuxを1ノード作成し、1ノード上にApache+Tomcat9のクラスタ構成方法です。

まず、最新のJavaをインストール
・Javaのバージョンを確認

$ java -version

・yumを更新

$ sudo yum update -y

・javaを探す

$ sudo yum search java
java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment

・インストール

$ sudo yum install -y java-1.8.0-openjdk-devel.x86_64

・Javaのコマンドのヴァージョンを切り替える

$ sudo alternatives --config java
※2を選択
Enter to keep the current selection[+], or type selection number: 2

・Javaのバージョンを確認

# java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

次に、Tomcatをインストール
・TomcatのZIPをダウンロード
https://tomcat.apache.org/download-90.cgi
apache-tomcat-9.0.14.zip

・/optに置く

#unzip apache-tomcat-9.0.14.zip

・/opt/apache-tomcat-9.0.14/binの下のシェルの権限を変更

#chmod u+x *.sh

・Tomcat起動

#/opt/apache-tomcat-9.0.14/bin/startup.sh

・Javaのプロセス確認すると起動されている

# ps -ef |grep java
root     11436     1  0 Jan11 ?        00:01:21 /usr/lib/jvm/java/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-9.0.14/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/apache-tomcat-9.0.14/bin/bootstrap.jar:/opt/apache-tomcat-9.0.14/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache-tomcat-9.0.14 -Dcatalina.home=/opt/apache-tomcat-9.0.14 -Djava.io.tmpdir=/opt/apache-tomcat-9.0.14/temp org.apache.catalina.startup.Bootstrap start
root     19983 19743  0 06:37 pts/1    00:00:00 grep --color=auto java

・以下をブラウザに入力すると、Tomcatの画面が出てきたら成功

http://localhost:8080/

次に、もう1つのTomcatを手早く作成
・インストールされているディレクトリをコピー

#cp -r /opt/apache-tomcat-9.0.14 /opt/apache-tomcat-9.0.14_2

・ポート番号が被らないようにserver.xmlを変更
/opt/apache-tomcat-9.0.14 /conf/server.xml
以下の4種類の数字を何か所かあるのですべて変更
8005→8006
8080→8181
8443→8444
8009→8010

<Server port="8005" shutdown="SHUTDOWN">
↓
<Server port="8006" shutdown="SHUTDOWN">


    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
↓
    <Connector port="8181" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8444" />

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
↓
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

・Tomcat2号機を起動してみる

/opt/apache-tomcat-9.0.14_2/bin/startup.sh

・プロセス確認して起動されている

[root@ip-172-31-30-8 conf]# ps -ef |grep java
root     11436     1  0 Jan11 ?        00:01:21 /usr/lib/jvm/java/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-9.0.14/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/apache-tomcat-9.0.14/bin/bootstrap.jar:/opt/apache-tomcat-9.0.14/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache-tomcat-9.0.14 -Dcatalina.home=/opt/apache-tomcat-9.0.14 -Djava.io.tmpdir=/opt/apache-tomcat-9.0.14/temp org.apache.catalina.startup.Bootstrap start
root     11490     1  0 Jan11 ?        00:01:19 /usr/lib/jvm/java/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-9.0.14_2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/apache-tomcat-9.0.14_2/bin/bootstrap.jar:/opt/apache-tomcat-9.0.14_2/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache-tomcat-9.0.14_2 -Dcatalina.home=/opt/apache-tomcat-9.0.14_2 -Djava.io.tmpdir=/opt/apache-tomcat-9.0.14_2/temp org.apache.catalina.startup.Bootstrap start
root     19983 19743  0 06:37 pts/1    00:00:00 grep --color=auto java
[root@ip-172-31-30-8 conf]#

・以下をブラウザに入力すると、Tomcatの画面が出てきたら成功

http://localhost:8181/

最後にApacheのインストール
・バージョン確認して何も出てこなければインストール

$ httpd -version

・パッケージを確認

$ yum list | grep httpd24
httpd24.x86_64 

・Apacheインストール

$ sudo yum install -y httpd24

・/etc/httpd/conf/httpd.confに以下を追加

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<IfModule proxy_module>
ProxyRequests Off
<Proxy balancer://mycluster/>
BalancerMember http://localhost:8080
BalancerMember http://localhost:8081
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</IfModule>

・Apache起動

$ sudo service httpd start


これで割り振り完成
サンプルアプリなどデプロイし、ラウンドロビンされているのを確認してみてください。
Javaのサンプル
Testというプロジェクトにて以下のプログラムを入ったWARファイルを用意

import java.io.IOException;
import java.io.PrintWriter;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class HelloWorldServlet extends HttpServlet {
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
     Logger logger = LogManager.getLogger(HelloWorldServlet.class);
     try { 
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World!</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello World!</h1>");
        out.println("<p>First Servlet</p>");
        out.println("</body></html>");
        
        PrintWriter out1 = response.getWriter();
        HttpSession session = request.getSession();
        String port = (String)session.getAttribute("port");
        if(port == null) {
            port = String.valueOf(request.getLocalPort());
            session.setAttribute("port", port);
        }   
        out1.println("port:" + String.valueOf(request.getLocalPort()));
        out1.println("port(session):" + port);
        
     } catch (Exception e) {
      //ex.printStackTrace();
      logger.error("error", e);
     }
    }
}

・WARファイルをデプロイ
以下のようにWAR配置し、Tomcat再起動
/opt/apache-tomcat-9.0.14/webapps/Test.war
/opt/apache-tomcat-9.0.14_2/webapps/Test.war


・以下を連続してクリックすると、8080と8181が交互に出てくる

http://18.136.21.227/Test/HelloWorldServlet