ラベル tomcat の投稿を表示しています。 すべての投稿を表示
ラベル tomcat の投稿を表示しています。 すべての投稿を表示
2016年9月28日水曜日

Tomcatとクラウドサービスを組み合わせる場合のメモ

従来、ネットワークやミドルウェアで設定していた分野のクラウドサービスの充実に伴って、アプリサーバの構築方法も変わってきました。

AWSのapi-gateway+lambdaのような組み合わせでサーバレスにすることも可能です。

Tomcatなどもまだまだ現役ですので、今回は、Tomcatとクラウドサービスを組み合わせて作る場合のメモです。

方針

  • インフラ部分は、AWSなどクラウド基盤のサービスをできるだけ使う
  • 基本的に、サーバはアプリのみを使い、できるだけシンプルにする

tomcatの設定

Context

  • 基本、コンテキストパスは一個にする。
  • server.xmlで直指定。コンテキストxmlは、複数のコンテキストを複雑に使う場合。

    <Server ...>
    ...
      <Context path="/"
    docBase="/opt/tomcat/html/ROOT" />
      <Context path="/v1"
    docBase="/opt/tomcat/html/v1" />
    ...
    </Server>

web.xml

  • 上記のWEB-INFに直接設置
  • servlet-mappingでurlパターンとマッチさせる
  • 対応するHTTPメソッドを設定する

HTTPサーバとの連携

この辺りは、できるだけクラウドインフラで行う。

  • ロードバランサ
  • SSL
  • ディレクトリ単位のアクセス制限
  • IP制限

nginx

プロキシ設定

 server {
 ...
   location / {
     proxy_pass http://127.0.0.1:8080;
   }
 }

リバースプロキシを設定するには、SELinuxの設定変更が必要. nginx リバースプロキシ設定時の502 Bad Gatewayエラーを解消する方法

setsebool -P httpd_can_network_relay=1

他にも、ドキュメントルートの変更などSELinuxを変更する必要がある。

その他

この辺りは、httpサーバでしておいた方が安心です。

存在しないパス

  • 200で独自のエラーコードを持ったJSONを返す。
  • 404エラーを返す

Method Not Allowed

  • 許可メソッドを指定する。
  • 200で独自のエラーコードを持ったJSONを返す。
  • 405エラーを返す
  • nginxの444を使う。

死活監視

  • 死活監視用のページを表示させる.
  • example.com/check.html
2016年9月10日土曜日

tomcat7 を CentOS7 に入れる時のメモ

今更ながら、CentOS7tomcat7をインストールして確認するメモです。

Tomcat7のインストール

yumでそのまま入る。

yum update
yum install tomcat*
tomcat version
systemd start tomcat
systemd status tomcat
curl -v localhost:8080

起動しない場合は、JAVA_OPTSを設定する。

vi /etc/tomcat/tomcat.conf
# 以下を追加
JAVA_OPTS="-Xmx512m -XX:MaxPermSize=256m"

Javaのインストール(Tomcat7は、6以上ならOK)

JRE1.8は自動で入る。そのため、1.8でコンパイルしたものは、そのまま動く。

使いたいバージョンのJDKがある場合は指定して入れる。

yum install java-1.6.0-openjdk-devel
java -version
javac -version
# 必要に応じてalternativesで設定
systemd restart tomcat
curl -v localhost:8080

servletの動作確認

cat > HelloServlet.java << EOF
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {
    public void service(HttpServletRequest req,
        HttpServletResponse res)
        throws ServletException, IOException {

        PrintWriter out = res.getWriter();
        out.println("Hello World!");
        
    }
}
EOF

javac -classpath '/usr/share/tomcat/lib/*' HelloServlet.java 
mkdir -p /usr/share/tomcat/webapps/ROOT/WEB-INF/classes
cp HelloServlet.class /usr/share/tomcat/webapps/ROOT/WEB-INF/classes/.
cat > /usr/share/tomcat/webapps/ROOT/WEB-INF/web.xml <<EOF
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/HelloServlet</url-pattern>
    </servlet-mapping>
</web-app>
EOF
systemctl restart tomcat
curl -v localhost:8080/HelloServlet

Contextの設定と確認

cat > /etc/tomcat/Catalina/localhost/mycontext.xml <<EOF
<Context path="/mycontext" docBase="/tmp/mycontext" workDir="/tmp/mycontext/work" />
EOF

mkdir -p /tmp/mycontext/WEB-INF/classes
cp HelloServlet.class /tmp/mycontext/WEB-INF/classes/.
cp /usr/share/tomcat/webapps/ROOT/WEB-INF/web.xml /tmp/mycontext/WEB-INF/.
curl -v localhost:8080/mycontext/HelloServlet

firewallの設定をする

  • クラウドならば、Security Groupなどを設定
  • インスタンスのfirewallを開く(CentOS7はfirewalld)
  • 外部からアクセスできるようにする場合は注意

トラブルシューティング

500系エラー

  • ログを見て対処。
  • ClassNotFound系は、classファイルの設置場所が正しいか確認。

400系エラー

  • web.xmlの指定が正しいか確認。
  • web.xmlの設定が壊れている場合は、どこをたたいても400系エラーが出る。