インターネットなこと: 2016年2月アーカイブ

Apache2.2 と Tomcat の連携を行う。

URL で Tomcat のポート番号を指定して直接アクセスするのではなく、あくまでクライアントからは Web サーバ(Apache)にアクセスし、Apache がこっそり裏でアプリケーションサーバ(Tomcat)にクライアントからのリクエストを中継し、返ってきた内容をさも自分が処理したかのようにクライアントに返す・・・という形。

ちなみに、Apache 2.2 は yum インストールしたものである。

# rpm -qa|grep http
httpd-tools-2.2.15-31.el6.centos.x86_64
httpd-2.2.15-31.el6.centos.x86_64

まず、Tomcat の設定をする。

・直接クライアントがポート番号を指定してアクセスしてきても無視する。
・Apache からのアクセスは許す。

# cd /usr/local/tomcat/conf
# cp server.xml server.xml_20160226
# vi server.xml

修正箇所は下記の 2箇所。

1.HTTP/1.1 プロトコルを受けるポートの指定のところをコメントにする。
    <!--
    <Connector port="9880" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->

2.AJP からリダイレクトされてくるポートの指定を 9880 に修正する。
 ※変えなくてもいいんだけど、まあ、少しだけでも安全になるように(笑)
    <Connector port="9880" protocol="AJP/1.3" redirectPort="8443" />

で、Apache の方の設定。

ソースから入れれば、/usr/local/apache2/conf とその下の extra ディレクトリに必要な設定ファイル(httpd.conf と httpd-proxy.conf)が存在していると思うが、yum で入れるとなんでもかんでも httpd.conf に書く古いやり方がディフォルトになってるようで・・・

/etc/httpd/conf/httpd.conf に VirtualHost の設定なんかも書かれているし、気持ち悪いんだけど、今回は、まあ、その書き方に従って、Proxy 設定も httpd.conf に追加しちゃう(^^;

ちなみに、関係するモジュールを読み込むための、

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

この設定は元々有効になってた。
(テスト用サーバなので、予め全部有効にしてたんかね・・・???もう記憶にない(^^;)

# find / -name "mod_proxy_ajp.so" -print
/usr/lib64/httpd/modules/mod_proxy_ajp.so

モジュールもちゃんと存在してるね。

# cp httpd.conf httpd.conf_20160226
# vi httpd.conf
# diff httpd.conf httpd.conf_20160226
956,959d955
< <Location /s/>
<     ProxyPass ajp://localhost:9880/
< </Location>
<

Apache を再起動

# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

Tomcat も再起動。

# service tomcat restart
Stopping tomcat:                                           [  OK  ]
Starting tomcat:                                           [  OK  ]

これで、今まで

http://www.exsample.com:9876/test.jsp 

にアクセスしていたものが、

http://www.exsample.com/s/test.jsp

でアクセスできるようになる。

一番最初に書いたように、一旦、80番ポートで待つ Apache にアクセスし、Apache が 9876番ポートで待つ Tomcat にアクセスし、返ってきた内容をクライアントのブラウザに返す・・・ということだね。
ほんじゃ、ブラウザにお約束の「Hello World!」を表示してみようか。

コマンドラインで表示させるならこんな感じで。
ソースファイル(.java)を作成し、javac コマンドでコンパイルしてクラスファイル(.class)を作成する。
で、そのクラスファイルを java コマンドで実行する。

# cat > HelloWorld.java
public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello World!");
  }
}
# javac HelloWorld.java
# ls -la  HelloWorld*
-rw-r--r-- 1 root root 425 Feb 12 16:16 HelloWorld.class
-rw-r--r-- 1 root root 114 Feb 12 16:16 HelloWorld.java
# java HelloWorld
Hello World!

これを、ブラウザ上で表示する方法の一つが JSP(JavaServer Pages)。
Javaによるサーバサイド・スクリプティングを実装する技術であります。

まずは、こんな内容で .jsp ファイル(例:test.jsp とか)を作成。

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h1>
<%
    out.println("Hello World!");
%>
</h1>
</body>
</html>

これを、tomcat の DocumentRoot に置いてやれば、

http://www.exsample.com:9876/test.jsp
※ホスト名、ポート番号は適当

で、ブラウザに Hello World! と表示される。サーバ側で <% %> で囲まれた部分の Java の println メソッドが実行されブラウザに返されるんやね。
まあ、PHP なんかのサーバサイドプログラミングと一緒ですな。
続いてアプリケーションサーバ Tomcat のセットアップ。

取り敢えず、最新を入れておきたいので、Apache Tomcat のサイトからダウンロードしてセットアップすることにしよう。

現時点では Tomcat 8.0.32 が最新版か。

(1) 最新版のダウンロード

Tomcat 8 のダウンロードサイトより、apache-tomcat-8.0.32.tar.gz を /usr/local 上にダウンロード

# cd /usr/local/
# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-8/v8.0.32/bin/apache-tomcat-8.0.32.tar.gz
# ls -la apache-tomcat-8.0.32.tar.gz
-rw-r--r-- 1 root root 9169108 Feb  3 05:03 apache-tomcat-8.0.32.tar.gz


(2) tar.gz ファイルの展開

# tar xvfzp apache-tomcat-8.0.32.tar.gz

(3) ディレクトリ名の変更

展開した配布物のディレクトリ名を、apache-tomcat-8.0.32 から tomcat に変更する。

# mv apache-tomcat-8.0.32 tomcat

でもいいけど、今後、新しいバージョンを入れた時に切り替えやすいよう、シンボリックリンクにしとこうか。

# ln -s apache-tomcat-8.0.32 tomcat
# ls -la tomcat
lrwxrwxrwx 1 root root 20 Feb 12 16:26 tomcat -> apache-tomcat-8.0.32

(4) 所有者を tomcat に変更

安全のため、実行ユーザを tomcat という一般ユーザにする。
そのため、tomcat ディレクトリ以下の所有者も tomcat に。
(シンボリックリンクしているので、実体の方を chown する)

# useradd -s /sbin/nologin tomcat
# chown -R tomcat apache-tomcat-8.0.32

(5) 実行してみる

# sudo -u tomcat tomcat/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

自宅PCのブラウザで、
http://www.exsample.com:8080/
にアクセスしてみると、無事、Apache Tomcat/8.0.32 の画面が見えた。

(6) ポート番号 8080 を別の番号に変更

どうも、8080番のポート番号はプロキシサーバのものという認識なので(昔からサーバ屋をしている人は皆そうだと思うけど(^^;)、別のポート番号に変更する。

# grep 8080 tomcat/conf/server.xml
         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
    <Connector port="8080" protocol="HTTP/1.1"
               port="8080" protocol="HTTP/1.1"

ここを修正かね?

# cp tomcat/conf/server.xml tomcat/conf/server.xml_20160212
# vi tomcat/conf/server.xml
# diff tomcat/conf/server.xml tomcat/conf/server.xml_20160212
67c67
<          Define a non-SSL/TLS HTTP/1.1 Connector on port 8080 ==> 9876
---
>          Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
69c69
<     <Connector port="9876" protocol="HTTP/1.1"
---
>     <Connector port="8080" protocol="HTTP/1.1"
75c75
<                port="9876" protocol="HTTP/1.1"
---
>                port="8080" protocol="HTTP/1.1"

kill -HUP XXX じゃ駄目で、ちゃんと、シャットダウンコマンドで終わらせてから再起動しないと新しいポート番号は有効にならんようやね。

# tomcat/bin/shutdown.sh
# sudo -u tomcat tomcat/bin/startup.sh

これで、
http://www.exsample.com:9876/
でアクセス可能となる。

iptables とかで制限かけてる時は、そっちの設定変更も必要よ。

(7) 自動起動の設定をする

# cat > /etc/init.d/tomcat
#!/bin/bash
#
# Startup script for the Tomcat Servlet Container
#
# chkconfig: 2345 35 65
# description: Tomcat is the servlet container that is used in the official \
#              Reference Implementation for the Java Servlet and JavaServer \
#              Pages technologies

TOMCAT_USER=tomcat
CATALINA_HOME=/usr/local/tomcat

. /etc/rc.d/init.d/functions
prog=tomcat

start() {
    echo -n $"Starting $prog: "
    daemon --user $TOMCAT_USER $CATALINA_HOME/bin/startup.sh > /dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
    else
        echo_failure
    fi
    echo
    [ $RETVAL = 0 ] && touch /var/lock/subsys/$prog
    return $RETVAL
}
stop() {
    echo -n $"Stopping $prog: "
    daemon --user $TOMCAT_USER $CATALINA_HOME/bin/shutdown.sh > /dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
    else
        echo_failure
    fi
    echo
    [ $RETVAL = 0 ] && rm -f /var/lock/subsys/$prog
    return $RETVAL
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  status)
    INSTANCES=`ps --columns 512 -aef|grep java|grep tomcat|grep org.apache.catalina.startup.Bootstrap|wc -l`
    if [ $INSTANCES -eq 0 ]; then
        echo $prog is stopped
        RETVAL=3
    else
        if [ $INSTANCES -eq 1 ]; then
            echo $prog is running 1 instance...
        else
            echo $prog is running $INSTANCES instances...
        fi
        RETVAL=0
    fi
    ;;
  *)
    echo $"Usage: $prog {start|stop|restart|status|help}"
    exit 1
esac

exit $RETVAL

ozuma さんのサイトに載っていたスクリプト例の丸パクリです。

# chmod 755 /etc/init.d/tomcat
# chkconfig --add tomcat
# chkconfig --list tomcat
tomcat          0:off   1:off   2:on    3:on    4:on    5:on    6:off

(8) 自動起動スクリプトを使って起動

まず、現在立ち上げている Tomcat を落とす。

# tomcat/bin/shutdown.sh

そして、service コマンドで起動。

# service tomcat start
Starting tomcat:                                           [  OK  ]
# ps auxww|grep tomcat
tomcat   12464 57.1  7.4 2726440 75868 ?       Sl   19:12   0:04 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root     12489  0.0  0.0 103244   872 pts/0    S+   19:12   0:00 grep tomcat

バッチリ。

取り敢えず Apache との連携はせず、これで Java(JSP、サーブレット)の自習をしましょう。
「Java 案件があるのでしっかり勉強しておいてください」とお客さんから指示があったので、早速自社サーバに環境構築。
Java に関しては仕事でやったことがないもので・・・

というわけで、まずは、JSP の動く環境作るか。

サーバの OS は CentOS 6.5 64ビット版。
取り敢えず、Java 関係の何かを入れてたっけ?自分でソースから構築した記憶はないので、OS インストール時に自動で入っている何かが無いか rpm コマンドで確認。

# rpm -qa|grep java
# rpm -qa|grep jdk

何も入ってない。

以前は何でもソースから構築してたんだけど、今回はなるべく yum インストールにしよう。

(1) RPM ファイルのダウンロード

Java SE Downloads ページから Java SE 8u73 / 8u74 のダウンロードページに飛んで、Java SE Development Kit 8u74 の RPM 版(jdk-8u74-linux-x64.rpm)をダウンロード。

Accept License Agreement にチェックをして落とさないといけないので(直接 URL を指定しても落ちてこない)、一旦 Windows 機に落としてサーバにアップする。

(2) yum によるインストール

# yum localinstall jdk-8u74-linux-x64.rpm

(3) インストール内容の確認

# rpm -qa|grep jdk
jdk1.8.0_74-1.8.0_74-fcs.x86_64
# java -version
java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)

よさ気。

さて、次は Apache Tomcat のインストールやね。

つづく

このアーカイブについて

このページには、2016年2月以降に書かれたブログ記事のうちインターネットなことカテゴリに属しているものが含まれています。

前のアーカイブはインターネットなこと: 2015年11月です。

次のアーカイブはインターネットなこと: 2016年4月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら