タグ別アーカイブ: tomcat

Tomcat の PUTメソッドが息をしていない問題

| コメントをどうぞ

あけましておめでとうございます。
本年も有為無為に関わらず書き散らかしていく所存にございます。
生暖かい眼差しでお付き合いいただければと思います。
どうぞよろしくお願いいたします。
DiceK Mikamiです。

さて突然なのですが、アプリケーションサーバにTomcatを利用していると、たまにとんでもない大穴にはまったりします。
今回はそんなお話です。
続きを読む

New RelicのJavaエージェントのインストールでエラー

| コメントをどうぞ

今回はNew RelicのJavaエージェントをインストールしてみました。

環境

  • OS: Amazon Linux
  • Tomcat7: yumでインストール

公式ドキュメント

以下のドキュメントを参考にインストールを行いました。
https://docs.newrelic.com/docs/agents/java-agent/installation/java-agent-manual-installation

実行した手順

インストールモジュールをダウンロード

New Relicにログインしてダウンロードします。

モジュールを解凍してtomcatのHOMEに置きます。

# unzip newrelic-java-3.12.0.zip -d /usr/share/tomcat7

インストールを実行

# cd /usr/share/tomcat7/newrelic
# java -jar newrelic.jar install

エラー

Dec 5, 2014 13:14:07 +0900 [28863 1] com.newrelic INFO: Agent is using Logback
***** ( ( o))  New Relic Java Agent Installer
***** Installing version 3.12.0 ...
File /usr/share/tomcat7/bin/catalina.sh does not exist, so it can't become an EditableFile.
No need to create New Relic configuration file because:
 .:. A config file already exists: /usr/share/tomcat7/newrelic/newrelic.yml
***** Install incomplete
***** Next steps:
For help completing the install, see https://newrelic.com/docs/java/new-relic-for-java

/usr/share/tomcat7/bin/catalina.shがないためにエラーが出ました。
tomcatをyumでインストールした場合、自動でサービスが/etc/init.d/tomcat7として保存されるため、catalina.shは存在しません。

catalina.shの作成

今回はパッケージされたTomcatのcatalina.shからコピーして、
/usr/share/tomcat7/bin/catalina.sh を作成しました。

再度実行

# java -jar newrelic.jar install

インストールが完了しました。

NR_JARとCATALINA_OPTSの転記

/usr/share/tomcat7/bin/catalina.shを見てみると、以下の行が追記されていました。

# ---- New Relic switch automatically added to start command on 2014 Dec 05, 13:51:37
NR_JAR=/usr/share/tomcat7/newrelic/newrelic.jar; export NR_JAR
CATALINA_OPTS="$CATALINA_OPTS -javaagent:$NR_JAR"; export CATALINA_OPTS

上記をTomcatの起動時に読み込まれる任意のファイルに記述します。
その後Tomcatを起動すると、New RelicのJava監視が開始されました。

[Docker] MySQLコンテナと連携したTomcatコンテナのデータソース設定を動的に行うメモ

| コメントをどうぞ

Dockerにはコンテナ同士をリンクする機能があり、IPアドレスやポート番号などの情報をリンク先コンテナに渡すことができます。

この機能を使って、MySQLコンテナから渡される接続情報をTomcatコンテナのデータソース設定として動的に定義する方法を調査してみました。

以下はTomcatコンテナ “tomcat_test” を作成し、MySQLコンテナ “some-mysql” をリンクするコマンドです。

docker run --link some-mysql:mysql -it -p 8888:8080 --name tomcat_test tomcat:7.0 /bin/bash

Dockerイメージはオフィシャルで提供されているものを利用しています。

printenv で確認すると、以下のような環境変数が追加されていることが確認できます。

MYSQL_ENV_MYSQL_MAJOR=5.6
MYSQL_ENV_MYSQL_VERSION=5.6.22
MYSQL_ENV_MYSQL_ROOT_PASSWORD=mysecretpassword
MYSQL_PORT_3306_TCP=tcp://172.17.0.9:3306
MYSQL_PORT_3306_TCP_ADDR=172.17.0.9
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_PORT=tcp://172.17.0.9:3306
MYSQL_NAME=/tomcat_test/mysql

続きを読む

Amazon Linux + Tomcat7のJDBC接続でBasicDataSourceFactoryがないというエラー

| コメントをどうぞ

Amazon LinuxにTomcat7をyumでインストールして、MySQLと接続するアプリケーションを起動したところ、以下のようなエラーが出ました。

Caused by: java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory

参考URL

解決策として、フォーラムの以下の投稿が参考になりました。
https://forums.aws.amazon.com/thread.jspa?messageID=394470

続きを読む

DynamoDB の Write しきい値が最大値に張り付いたままなのですが

| コメントをどうぞ

年末にはまだ遠い。
かといって始まったばかりとも言いがたい。
そんな11月、いかがお過ごしでしょうか。
ここ湾岸エリアは寒風が吹きすさんでおります。
さ、さむい。。。(懐が
DiceK Mikamiです。

本日はセッションレプリケーションを調査していたときに「ぐぬぬ。。。」となったことに関して共有したいと思います。
続きを読む

EclipseのTomcat Loaderで各種ログファイルを出力する

| コメントをどうぞ

EclipseでWebアプリケーションを開発する際、Tomcat Loaderを利用しているのですが、デフォルトの設定ではTomcatの各種ログファイルが出力されません。

普段はあまり問題にならないのですが、デバッグの際にログファイルが必要になることがあります。
今回はEclipseからTomcatを起動する際のログ出力設定についてご紹介します。・・・と言うか自分の備忘録ですが・・・

続きを読む

AWS EC2上のTomcatにJMX設定をしよう!

| コメントをどうぞ

はじめての方は初めまして、そうでない方はお久しぶりでございます。
DiceK Mikamiです。
諸事により長らくブログから遠ざかっておりましたが、戻って参りました。
決して嫌になったとかそういうんじゃないだからねっ!!
心機一転よろしくお願いいたします。
 
閑話休題
 
さて、4月になり春も真っ盛りと言う感じですが、
日本の社会人である私たちにとって4月とは新年度であり、
バタバタと忙しい日々かと思います。
新年度と言えば、、、そうですね新環境構築ですね。
今回は縁あって、EC2上に設置したTomcatに対してJMX設定を行いましたので、
その設定方法などを共有したいと思います。
これでリモート監視ができる!
 

検証環境

  • OS: Amazon Linux AMI release 2014.03
  • Java: JDK1.7.0
  • Tomcat: 7.0.5

 

リモートホスト(EC2側)の設定手順

1. Tomcatのserver.xmlにリスナーを登録する

素敵なことにJMX用のリスナーが用意されていますので、server.xmlにリスナーを追記します。

<Tomcat Home>/conf/server.xml

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10080" rmiServerPortPlatform="10081"/>

server.xmlの最初の方にリスナーが固まって記述されていますので、そのあたりに追加すれば良いです。
 

2. catalina-jmx-remote.jarをlibフォルダに追加する

リスナー登録だけでは動作してくれませんので、JMX用のライブラリ( catalina-jmx-remote.jar )をTomcatのlibフォルダに追加します。
最初から同梱されていることはほぼないと思いますので、以下から取得してください。

http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.50/bin/extras

バージョン配下にある「 bin/extras 」にjarファイルはありますので、利用するTomcatのバージョンにあわせてライブラリを取得してください。
ライブラリを取得しましたら「 $Tomcatホーム/lib 」配下に置きます。
 

3. Tomcat起動オプションを設定する

次にTomcatの起動オプションを追加します。
setenv.shを作成し、以下のオプションを追加します。

<Tomcat Home>/bin/setenv.sh

export CATALINA_OPTS="-Dcom.sun.management.jmxremote=true
                      -Dcom.sun.management.jmxremote.ssl=false
                      -Dcom.sun.management.jmxremote.authenticate=false
                      -Djava.rmi.server.hostname=<ホスト名>"

bin配下にsetenv.shがある場合、起動時にデフォルトで呼ばれますので、別個に用意しています。
検証時には、設定するホスト名をEC2インスタンスを立ち上げた時のデフォルトホスト名を設定しました。
 

4. Outboundポートを開放する

今回の目的としてEC2上のTomcatをリモート監視すると言うことになりますので、外部から接続するためのポートを開放します。
これはAWSコンソールからの設定になります。
検証では10080ポートと10081ポートを利用しましたので、その2つのポートを開放しました。

EC2側での設定は以上になります。
 

クライアントからの接続手順

いよいよクライアントから接続します。
今回はjdkに付属しているjconsoleから接続してみます。(VisualVMでも接続できます)

$ jconsole service:jmx:rmi://localhost:10081/jndi/rmi://localhost:10080/jmxrmi

これで接続完了!
 

…….
……….. 
 

こ、こんなはずでは。。。

こ、こんなはずでは。。。


!!!!!
なん、、、だと、、、???

はいそうですね。
いくらポートを開放したところでセキュリティがバッチリきいているため接続はできなくて当然ですよね。
みなさんを試したんですよ。
リモートで接続するためにSSHトンネリングを利用しましょう。

$ ssh -i  @ -L 10080:localhost:10080 -L 10081:localhost:10081

これを実行した後、再度jconsoleを起動します。

$ jconsole service:jmx:rmi://localhost:10081/jndi/rmi://localhost:10080/jmxrmi

jmxsuccess
おお、ちゃんとグラフが見えるではないか。
 
ともあれ、これでリモートでTomcatを監視し放題になりました。
今回はコマンドラインと既存ツールを使って行いましたが、
SSHトンネリングとJMXのプロトコルを利用したアプリケーションを利用すればより良い監視ライフが送れることかと思います。

EC2上のTomcatからRDSにSSL接続する方法

| コメントをどうぞ

今回はAWSのEC2にインストールしたTomcatから、RDS(MySQL)にSSLで接続する方法を紹介します。

準備

  • EC2インスタンス(Linux) *1
  • RDSインスタンス *1
  • EC2インスタンスにTomcatをインストールしておく
  • RDSインスタンスのセキュリティグループで、EC2インスタンスからのアクセスを許可しておく

以下のサイトを参考にして設定を行ったところ、SSL接続に成功しました。

Amazon RDS に SSL 接続する (JDBC編)
http://blog.cles.jp/item/5349


以下手順です。

まずはMySQLのクライアントからRDSに接続します。
以下のコマンドを実行して、任意のユーザからはSSL接続のみ許可します。

# mysql -u root -p -h ***.***.ap-northeast-1.rds.amazonaws.com
mysql> GRANT ALL PRIVILEGES ON dbuser.* TO dbuser@"%" IDENTIFIED BY 'mysqlpassword' REQUIRE SSL;


次にAmazonから証明書を取得します。
Amazonから配布される証明書はPEM形式であるため、JKS形式に変換する必要があるようです。

# wget https://rds.amazonaws.com/doc/mysql-ssl-ca-cert.pem
# /usr/java/default/bin/keytool -keystore amazon.jks -importcert -file mysql-ssl-ca-cert.pem
パスワードを2回入力(ここでは jkspassword とします)
・
・
・
Trust this certificate? [no]:  yes(yesと入力してEnter)
Certificate was added to keystore
#


作成したJKSファイルを任意のフォルダに移動します。

# mkdir /opt/jks
# mv amazon.jks /opt/jks


最後にTomcatのサーバーのserver.xmlまたはコンテキストファイルでDBとの接続設定をします。

<Resource name="jdbc/testDB" auth="Container"
           type="javax.sql.DataSource"
           username="dbuser"
           password="mysqlpassword"
           driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://***.***.ap-northeast-1.rds.amazonaws.com:3306/dbName?useUnicode=true&characterEncoding=UTF-8&useSSL=true&requireSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file:///opt/jks/amazon.jks&trustCertificateKeyStoreType=JKS&trustCertificateKeyStorePassword=jkspassword"
/>


SSLに関係しているURLのパラメータは以下です。

useSSL=true
requireSSL=true
verifyServerCertificate=true
trustCertificateKeyStoreUrl=file:///opt/jks/amazon.jks  #作成したJKSファイルのパス
trustCertificateKeyStoreType=JKS  #JKS形式を指定
trustCertificateKeyStorePassword=jkspassword  #JKS作成時に設定したパスワード

Amazon Elastic Beanstalkで複数のwarファイルをアップロードする方法

| コメントをどうぞ

Amazon Elastic Beanstalk (以下 Beanstalk)では、javaアプリケーションを動かす時、warファイルをアップロードしてそのwarファイルをBeanstalkが自動的に展開してtomcatにデプロイしてくれます。 ただし、現在のBeanstalkではwarファイルは1つしかアップロードできません。 複数warファイルがあるアプリケーションをBeanstalk上で動かすのは無理なのかなーと思って色々調べたら、どうにか複数warファイルでもアプリケーションが動作する環境ができたので、その方法をまとめてみます。

ただし、公式の方法ではないので実際に試す時は注意して行なって下さい。

1.Beanstalkで利用可能なEC2インスタンスをAMIから作成する。

まずは、Beanstalkで使用するためのAMI(Amazon Machine Image)のベースになるインスタンスを作成します。

EC2のインスタンス作成時に下記画像のようにCommunity AMIsから「beanstalk」を検索し、beanstalk用のAMIからインスタンスを作成します。

2.Beanstalkで利用しているEC2インスタンスのRubyファイルを編集する。

インスタンスが作成されたら、ssh等でサーバーへログインします。

sshでログイン後に、下記コマンドでrubyファイルを編集します。このrubyファイルが、beanstalkでインスタンスを作成時に実行されて、インスタンス内のtomcatにアプリケーションをデプロイしています。

vi /opt/elasticbeanstalk/srv/hostmanager/lib/elasticbeanstalk/hostmanager/applications/tomcatapplication.rb

編集箇所1

/usr/bin/sudo /usr/bin/unzip -o -qq #{TomcatApplication.tomcat_deploy_dir}/application.war -d #{TomcatApplication.tomcat_webapps_dir}/ROOT


/usr/bin/sudo /usr/bin/unzip -o -qq #{TomcatApplication.tomcat_deploy_dir}/application.war -d #{TomcatApplication.tomcat_webapps_dir}/

編集箇所2

/usr/bin/sudo /bin/chown -R tomcat:elasticbeanstalk #{TomcatApplication.tomcat_webapps_dir}/ROOT

/usr/bin/sudo /bin/chown -R tomcat:elasticbeanstalk #{TomcatApplication.tomcat_webapps_dir}/*

編集箇所3

/usr/bin/sudo mv #{TomcatApplication.tomcat_deploy_dir}/application.war #{TomcatApplication.tomcat_webapps_dir}/ROOT.war

/usr/bin/sudo /usr/bin/unzip -o -qq #{TomcatApplication.tomcat_deploy_dir}/application.war -d #{TomcatApplication.tomcat_webapps_dir}/

編集後に、インスタンスをAMIとして保存します。

3.Warファイルを作成しBeanstalkでアプリケーションを作成する。

Beanstalkに複数のwarファイルをアップロードして複数のアプリケーションを立てる場合は、次のようなwarファイルを用意します。

application.war
├─appA.war
├─appB.war
└─appC.war

また、application.warに含まれている各warファイルのMETA-INFフォルダには、context.xmlを含めるようにして下さい。

次に、Beanstalkでアプリケーションを作成し、用意したwarファイルをbeanstalkのアプリケーションにアップロードします。

Beanstalkでのアプリケーション作成方法は下記URLなどを参考にして下さい。

http://www.atmarkit.co.jp/fjava/rensai4/devtool23/devtool23_1.html

アプリケーションを作成後しばらくすると、EC2のインスタンスが立ち上がりますが、この時点ではアップロードしたwarファイルは正常にデプロイされません。

Beanstalkでアプリケーションを作成する際、一番初めのデプロイではAMIを指定できずにデフォルトとインスタンスでアプリケーションを作成してしまうためです。

複数のwarを含んだアプリケーションをデプロイする場合は、一旦デフォルトのインスタンスで作成された後に、Beanstalk上の設定でAMIを指定する必要があります。

4.BeanstalkでAMIを指定する。

最後に、Beanstalkの「Edit Configuration」をクリックして設定画面を開き、

2で作成したAMIのIDを「Custom AMI ID」の欄に入力して「Apply Changes」で保存します。

しばらくすると3の最後で作成されたインスタンスが破棄され、設定したAMIで新しいインスタンスが起動します。

インスタンス起動後に

http://アプリケーション名.elasticbeanstalk.com/コンテキスト名

のコンテキスト名を変えると、各コンテキストへアクセスできます。

参考:https://forums.aws.amazon.com/thread.jspa?messageID=229121