Tomcat

2013/09/01

先月Javaのサーブレット関連でハマったこと2点

先月、Java関連の仕事でハマったこと2点を備忘録。

1、サーブレットのフィルタは、サーブレット以外のアクセスにも適用される。

Tomcatだけの問題なのかもしれないけど、サーブレットのフィルタはイメージとかCSSを取得した際にも動きます。
セッションが無い状態でTomcat上に有る画像のURLを直接指定したら、フィルタで処理しているセッションエラー画面が出てきて発覚。
Web上にはなぜか情報がほとんど無かったのだけど、良い設計では静的ファイルはTomcat上に置かず、Apacheで処理させるはずだから、問題になる事例が少ないのかもしれないけど。


2、WARファイル内のリソースにgetRealPathは使えない。

サーブレットで、サーブレットのコンテキスト配下に有るファイルを取得する際、
javax.servlet.ServletContext
 java.lang.String getRealPath(java.lang.String path)
で相対パスから絶対パスを取得するのは定石だけど、これはWARファイルが展開されていないと使用できないことが判明。
APIの説明にも、
「Servlet コンテナが何かの理由 (コンテンツが .war アーカイブで提供されているなど) で仮想パスを実際のパスに変換できなかった場合には null を返します。 」
ってしっかり書かれているし。

javax.servlet.ServletContext
 java.io.InputStream getResourceAsStream(java.lang.String path)
で、相対パスからファイルのInputStreamを取得することは可能なので、いちおうファイルの中身を取得する方法は有ります。

| | コメント (0) | トラックバック (0)

2008/08/06

Webサーバ構築時の全コマンド

うちのWebサーバは、サポート切れのVineLinux2.6です。
サーバ構築時に使用したコマンドは、
Webサーバ構築時の全コマンド(VineLinux2.6)
に記載しています。

でも外部に公開しているサーバがサポート切れってのはよろしく無いので、現在最新のVineLinux4.2へ移行したいな、と思っていました。
そこでVirtualBoxにVineLinux4.2をインストールしテスト環境を作って検証した所、移行の目処が立ったので実行に移しました。

インストール時は、インストールするパッケージにサーバを選択しましたが、GUIでも設定したいのでXWindowsとGNOMEをインストールしました。
ログインはテキストログインです。
(GUIを使うときは、$ startx とコマンドすれば使えるので。)
ファイアウォールは使用します。GUIを使えば簡単に設定できるので。(設定内容も簡単になりますけど・・。)


◯SSHの設定
特定ユーザー 以外の接続を禁止します。
/etc/ssh/sshd_config に以下を追加
# AllowUsers
AllowUsers ユーザー名

sshdの再起動
# /etc/init.d/sshd restart
sshdを停止中: [ OK ]
sshdを起動中: [ OK ]

Telnetサーバが動いていたら止めようと思いましたが、もともと入っていませんでした。

◯NTPサーバ
GUIのデスクトップ→システム管理→時刻と日付の設定
で「インターネット上のサーバと時刻を同期させる」にチェックを入れればいちおう設定できます。
最初の行のNICTとMFEEDを選択しておけばOKです。
ただ、GUIの設定では設定ファイル上のserverを追加したり減らしたりということしかできなくて、凝った設定にするには結局設定ファイルを書き換えなくてはいけません。

設定は「パソコンおやじ」さんの設定などを参考にしました。
同期するNTPサーバをNICTとMFEEDにして、Lan内の他のPCからNTPサーバを参照できるようにします。
/etc/ntp.conf に以下を追加します。
# Security Setting
# Default
restrict default ignore

# Local Allow
restrict 127.0.0.1

# Lan Allow
restrict 許可するIP mask マスク nomodify notrap

# Server
restrict ntp.nict.jp mask 255.255.255.0 nomodify notrap noquery
restrict ntp.jst.mfeed.ad.jp mask 255.255.255.0 nomodify notrap noquery

server ntp.nict.jp
server ntp.jst.mfeed.ad.jp


ntpdが起動していなければ起動させます。
# /etc/init.d/ntpd start

ファイアウォールの 123 ポートを開けます。
これはGUIで設定しました。
デスクトップ→システム管理→セキュリティレベルとファイアウォールの設定
で、その他のポートに、
123 UDP
を追加します。
ポートが正しいと、その他のポートの表示がntpになります。

動作確認
ntpd再起動(# /etc/init.d/ntpd restart)から数分後に、以下のコマンドで確認。
# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*ntp-b3.nict.go. .NICT. 1 u 4 128 377 5.073 -31.026 11.903
+ntp2.jst.mfeed. 210.173.160.86 2 u 10 128 377 1.757 -33.074 7.026

*が付いていればOKです。

◯Apacheの基本設定
Apacheは1.3系から2.2系に大幅に変わってしまいました。
そこでまず、基本的な部分を調べてみました。
VineLinux4.2のApache2.2について
/usr/sbin/ に本体がいます。
設定ファイルなどは
/etc/apache2
以下にあり、モジュールの置き場所もここから辿っていけます。
コンテンツは、
/var/www 以下に設置します。

以上が解れば設定できます。
まず、お手軽にGUIで起動させます。
デスクトップ→システム管理→サービスの管理
の ウェブ・サーバ(apache2) にチェックを入れます。
これでApacheが起動します。同時に自動起動の設定もできています。

デフォルトでファイル一覧が表示されるようになっているので
表示しないように設定します。
/etc/apache2/conf/httpd.conf を編集します。
Options Indexes FollowSymLinks
を、以下のように変更
Options -Indexes FollowSymLinks

設定ファイルの確認
# /etc/init.d/apache2 configtest
Syntax OK
apacheを再起動
# /etc/init.d/apache2 restart
httpdを停止中: [ OK ]
httpdを起動中: [ OK ]

◯BASIC認証用htpasswdの作成
/etc/apache2 に .htpasswdファイルを作成します。
# htpasswd2 -c /etc/apache2/.htpasswd 認証するユーザー名
New password:(パスワードを入力)
Re-type new password:(もう一度パスワードを入力)
Adding password for user 入力したユーザー名が表示される

htpasswd2 でファイルを作成する場合は、-cを付けます。
ファイルが既に作成されている時はいりません。
ここで入力したパスワードが、認証時のパスワードになります。
ファイル名、ファイルを作る場所はなんでもいいのですが、
Webサーバで公開している場所はダメです。
また、このパスワードファイルはWebサーバが読める必要があるので、これも注意です。

パスワードファイルをapacheユーザーのみ閲覧可能にします。
# chown apache:apache ./.htpasswd
# chmod 400 ./.htpasswd

○WebDAVの設定
以前検証したVineLinux4.2でWebDAVを使用する。の内容とだいたい同じです。

WebDAVは標準で使用可能になっていますが、
/etc/apache2/conf/httpd.conf
には、ロックファイルの設定のみ書かれています。
/etc/apache2/conf/extra
に、httpd-dav.conf
があるので、これを設定のベースに使います。
/etc/apache2/conf.d へコピー。
# cd /etc/apache2/conf.d/
# cp ../conf/extra/httpd-dav.conf ./

httpd-dav.confを編集
# vi httpd-dav.conf
ロックファイルなどの設定がありますが、Vineの設定とは異なっているので、
15行目~36行目までをコメントします。
/var/www/dav をWebDAV用のフォルダとして設定することにします。
また、認証にBasic認証を使用し、SSL使用を必須にします。

Alias /dav "/var/www/dav"

<Location "/dav">
    DAV On
    SSLRequireSSL
    AuthUserFile /etc/apache2/.htpasswd←Basic認証設定時に作成したパスワードファイルの場所
    AuthGroupFile /dev/null
    AuthName "Private Area"
    AuthType Basic
    Require user 許可するユーザー名
</Location>

/var/www/dav ディレクトリを作成し、apacheユーザー権限にします。
# cd /var/www
# mkdir dav
# chown apache:apache dav

Apacheの再起動
# service apache2 restart

ファイアウォールのSSLのポートを開けます。
またまたGUIで設定しました。
デスクトップ→システム管理→セキュリティレベルとファイアウォールの設定
Secua WWW (HTTPS) にチェックを入れる。

VineLinuxの「サーバへ接続」、から
http://localhost/dav/
に接続し、ファイルが置けるか確認します。


このままだとWindowsから使うと文字化けするので、
mod_encoding をインストールします。
http://elug.selfip.org/index.php?WebDAV
にパッチを当てたものをまとめてくれているので、ここの
mod_encoding-20061118.tar.gz
を使います。

apxsを使用できるようにSynapticから、apache2-devel をインストールします。
apxs は、/usr/bin/ にインストールされます。

mod_encoding-20061118.tar.gz
をダウンロードし、とりあえずユーザーのホームディレクトリに置きます。
展開します。
$ cd
$ tar xzvf mod_encoding-20061118.tar.gz

インストール
$ cd mod_encoding-20061118
$ ./configure --with-apxs=/usr/bin/apxs
$ make
$ gcc -shared -o mod_encoding.so mod_encoding.o -Wc,-Wall
できたモジュールをrootでコピー。
$ su
# cp mod_encoding.so /etc/apache2/modules/

httpd.conf の
LoadModule dav_fs_module modules/mod_dav_fs.so
の下に、
LoadModule encoding_module modules/mod_encoding.so
を追加。

httpd-dav.conf に以下を追加

<IfModule mod_encoding.c>
    EncodingEngine on
    NormalizeUsername on
    SetServerEncoding UTF-8
    DefaultClientEncoding JA-AUTO-SJIS-MS SJIS
    AddClientEncoding  "cadaver/" EUC-JP
</IfModule>

SetServerEncoding にEUC-JPを使いたいのですが、そうすると文字化けしてしまいます。
この設定のようにUTF-8にすると今度はターミナルなどからファイルを見た時には化けてしまいます。
あくまでWindowsで使用するための苦肉の策です。

Apacheを再起動して動作を確認します。
# /sbin/service apache2 restart
(# /etc/init.d/apache2 restart でもいいです。いろんなやり方があるということで。(笑) )

○DiCEの設定
前のサーバで、IP変更時に自動更新されないことがあったので、
今回は、外部CGIにスクリプトを置くパソコンおやじさんの方法を参考にしました。
http://www.aconus.com/~oyaji/ddns/ddns_linux.htm
なんかインストール&設定方法を文章にするのが難しいので上記ページを参考にして下さい。

設定後、デーモン起動
# /usr/local/bin/DiCE/diced -d -l
確認
# ps -C diced
PID TTY TIME CMD
19907 ? 00:00:00 diced ←いればOK

Diceの設定後、
/etc/rc.d/rc.local の最後に
/usr/local/bin/DiCE/diced -d -l
を追加しておくと、サーバ起動時に勝手に起動してくれます。

○TOMCAT
Javaのインストール
GUIでアプリケーション→ システム・ツール→ Synapticパッケージマネージャ
を起動し、 java-1.6.0-sun-devel をインストールしました。
java等のリンクが/usr/binにあるので、通常はPATHなどを通さずに使えます。(これが後でハマる原因になったのだけど・・・。)

http://tomcat.apache.org/
から
apache-tomcat-6.0.16.tar.gz
をダウンロード。
md5sumで正常にダウンロードできたか確認。
$ md5sum ./apache-tomcat-6.0.16.tar.gz
4985fed02341a9e04ea43e91e6444ace ./apache-tomcat-6.0.16.tar.gz

ファイルの移動 /usr/local 以下にインストールします。
# mv ./apache-tomcat-6.0.16.tar.gz /usr/local/
# cd /usr/local

ファイルの展開
# tar xzvf apache-tomcat-6.0.16.tar.gz

起動チェック
# ./apache-tomcat-6.0.16/bin/startup.sh
Using CATALINA_BASE: /usr/local/apache-tomcat-6.0.16
Using CATALINA_HOME: /usr/local/apache-tomcat-6.0.16
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-6.0.16/temp
Using JRE_HOME: /usr

JRE_HOMEの位置がおかしいけれども後で直します。
ブラウザで http://localhost:8080/ にアクセスし、表示されればOK。

停止
# ./apache-tomcat-6.0.16/bin/shutdown.sh
Using CATALINA_BASE: /usr/local/apache-tomcat-6.0.16
Using CATALINA_HOME: /usr/local/apache-tomcat-6.0.16
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-6.0.16/temp
Using JRE_HOME: /usr


TOMCAT起動ユーザー、起動スクリプトの作成
参考 @IT “安全”のためにTomcatを理解し、構築し、動作させる
http://www.atmarkit.co.jp/fjava/rensai4/safetomcat_01/safetomcat_01_1.html

リンクの作成(/usr/locdal/tomcatから使用できるようにする)
# ln -s apache-tomcat-6.0.16 tomcat

TOMCAT用ユーザの作成
# useradd -d /usr/local/tomcat/ -s /sbin/nologin tomcat
useradd: 警告: ホームディレクトリが既に存在します。
skel ディレクトリからのコピーは行いません。
# chown -R tomcat:tomcat /usr/local/tomcat/

自動起動
jsvcのコンパイル
# cd /usr/local/tomcat/bin/
# tar xzvf jsvc.tar.gz
# cd jsvc-src/
# autoconf ←いらないかも・・・。よく判りません。

次に、configure前にJAVA_HOMEを設定しておく必要があるのですが、ここでハマりました。
さっきも書きましたが、私は JAVA_HOME=/usr/bin だと思っていたので、この通りにすると、makeに失敗します。
configureがうまく行くだけに最初はなぜ失敗するのかさっぱり判りませんでした。
で、出力されたエラーを眺めるうちに原因が判りました。
なんかjni関係のコンパイルをしようとして失敗していたのですね。
私はC言語をあまり知らないのですが、ヘッダーファイルが無くてエラーが出てるような感じは判りました。
ということは、/usr/lib/jvm/java-1.6.0-sun-1.6.0.07/include/jni.hが参照できる位置にJAVA_HOMEを設定しなくてはいけません。

# JAVA_HOME=/usr/lib/jvm/java-1.6.0-sun-1.6.0.07/
# export JAVA_HOME
# sh configure
# make
エラーが出なければ jsvc というファイルができています。
それを /usr/local/tomcat/bin/ に置きます。
# cd ../
# cp ./jsvc-src/jsvc ./
# chown tomcat:tomcat jsvc

後かたづけです。使ったディレクトリを削除してます。
# rm -rf ./jsvc-src/

起動スクリプトの作成
# cd /etc/rc.d/init.d/
新規でファイルを作成します。
# vi jsvc
内容は、
http://www.atmarkit.co.jp/fjava/rensai4/safetomcat_01/safetomcat_01_2.html
にある起動スクリプトをパクってきました。

上記内容から以下を修正します。
JAVA_HOME=/usr/lib/jvm/java
CATALINA_HOME=/usr/local/tomcat

ちなみにvi(vim)で普通に張り付けると勝手にインデントされて大変なことになるので、
viのコマンドで
:set paste
と打ってからペーストするとOKです。

アクセス権の変更
# chmod +x jsvc
自動起動させます。
# chkconfig jsvc on

起動実験
# /etc/init.d/jsvc start
Starting jsvc: [ OK ]
# /etc/init.d/jsvc status
jsvc (pid 11815 11814 11813 11812 11811 11810 11809 11808 11807 11805) を実行中...

ブラウザで http://localhost:8080/ にアクセスし、表示されればOK。

停止
# /etc/init.d/jsvc stop
Shutting down jsvc: [ OK ]

○PostgreSQL
Synapticで
postgresql-server と postgresql-jdbc をインストールしました。
インストール後、GUIのサービスの管理でPostgreSQLを起動させます。

rootでログインし、postgres ユーザーにパスワードを設定します。
# passwd postgres
Changing password for user postgres.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

ロールの設定
# su postgres
bash-2.05b$ createuser ユーザー名
新しいロールをスーパーユーザとしますか? (y/n) n
新しいロールにデータベース作成権限を与えますか? (y/n) y
新しいロールにロールを作成する権限を与えますか? (y/n) n
CREATE ROLE

ロールで設定したユーザーでログイン
データベースの作成
$ createdb データベース名
CREATE DATABASE

ネットワークからの接続を許可するため、設定ファイルを修正
# vi /var/lib/pgsql/data/postgresql.conf

以下の行を追加
listen_addresses = '*'
#listen_addresses = 'localhost' # what IP address(es) to listen on;

他PCからネットワーク越しに接続する許可をあたえるため、設定ファイルを修正
# vi /var/lib/pgsql/data/pg_hba.conf
以下の行を追加
host all ユーザー名 192.168.1.0/24 trust

ちなみにむちゃ弱設定です。
Windows上からお手軽にデータ移行したかったもので・・・。

再起動します。
# /etc/init.d/postgresql restart

ファイアウォールの 5432 ポートを開けます。
デスクトップ→システム管理→セキュリティレベルとファイアウォールの設定 を起動し、
その他のポートに、
5432 tcp
を追加します。

JDBCをTOMCATへ設定
JDBCの場所を確認
# rpm -qs postgresql-jdbc
通常 /usr/share/pgsql/postgresql-8.1-410.jdbc2.jar
通常 /usr/share/pgsql/postgresql-8.1-410.jdbc2ee.jar
通常 /usr/share/pgsql/postgresql-8.1-410.jdbc3.jar
TOMCATのlibディレクトリへ移動
# cd /usr/local/tomcat/lib/
JDBCのリンクを作成
# ln -s /usr/share/pgsql/postgresql-8.1-410.jdbc3.jar ./


ApacheとTOMCATの連携
mod_proxy.soの設定が無いので使えないのか!?と思い調べたら、
ひとにやさしく の apache2.2 + Tomcat 5.5 のページで既にやってる人がいました。助かります!

/etc/apache2/conf/httpd.confの
LoadModule proxy_module modules/mod_proxy.so
の下に以下を追加
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

/etc/apache2/conf.d/ に proxy_ajp.conf を作成
# cd /etc/apache2/conf.d/
# vi proxy_ajp.conf
以下を記入
ProxyPass /Web上のディレクトリ/ ajp://localhost:8009/TOMCAT上のWEBアプリの位置/

以上で、サーバ構築時のコマンド全てです。


以下、その他ハマった設定集

○TOMCATのGETメソッドの文字コード対策
server.xmlファイルのタグに
useBodyEncodingForURI="true"
を指定しないとsetCharacterEncodingが無視されてUTF-8で処理されてしまう。
これ、TOMCAT4→5への移行時にハマったにも関わらず、忘れていてハマりました。

# vi /usr/local/tomcat/conf/server.xml
ポート8080と8009の記述が
connectionTimeout="20000"
redirectPort="8443"
useBodyEncodingForURI="true" />
のような感じになります。
useBodyEncodingForURI="true"
を追加するだけです。

Apacheと連携している時は、当たり前ですが
ポート8080と8009
というのがミソで、(8080は使わないなら塞いでおいてもいいのですが)
一般的なWeb上の解説では8080ポートの事しか書いてないから、鵜呑みにするとハマります。
(経験者談

TOMCATを再起動
# /etc/init.d/jsvc restart
Shutting down jsvc: [ OK ]
Starting jsvc: [ OK ]

○PostgreSQL8.0のJDBCドライバを7.4.x互換モードで動作させる
JDBC8から大幅に仕様が変わったそうで、Web上でももめてました。(笑)判るまでけっこうハマりました。
JDBC7と同じ動きをするように
JDBCの接続文字列に protocolVersion=2 を追加する必要があります。
↓参考記事
http://tidus.ultimania.org/wiki/index.php?PostgreSQL

○PostgresSQLが文字化けで落ちる対策
VineLinux4.2のPostgreSQLでデータベースを作成すると、
デフォルトでEUC-JPになりますが、UTF8にあってEUC-JPに変換できない文字を
使用するとJDBCからの文字コード変換時にエラーが出て落ちる仕様になってしまいました。
Java使いには、大いに問題です。Windowsの「~」をINSERTすると落ちます!
なんで文字化けしないで落ちる仕様にするかなあ・・・。

そこで、JAVA→PostgreSQL間の文字コード変換を行わない為に、データベースをUTF8で作成しておきます。

まず、EUC-JPで作成したデータベースを削除
# su - postgres
$ dropdb データベース名
DROP DATABASE

同じデータベースを、UTF8で作成します。
$ createdb -E UTF8 データベース名
CREATE DATABASE

EUC-JPのVineから見ると文字化けしまくりですけどね。

| | コメント (0) | トラックバック (0)

2006/01/03

Webサーバ構築時の全コマンド(VineLinux2.6)

Webサーバ構築時にコマンドをコピーしておいたので、それを載せます。
新しいWebサーバを購入してから、その後すぐにインストール&設定等済ませていたのですが、なかなかココログに載せる暇が無くて、今になってしまいました。(汗)

Vine Linux2.5をインストールしてから、Webサーバとして動かすまでの全コマンドです。(一部抜けがあるかもしれません(汗))
Linuxで自宅サーバを参考にさせてもらってます。


○Webminの設定 --------------------------------------------------
Vine Linux2.5のWebminは自動アップデートできないので、
手動でアップデートする必要がある。
・WebminのRPMをダウンロードし、Webminの
「ソフトウェアパッケージ」→「新たなパッケージをインストール」という項目があるので、
「ローカルファイルから」を選択しアップデートする
その後、setup コマンドで、システム起動時にwebminを自動起動するように設定する
・IPアクセス制限の設定を行う


○sshのセキュリティ設定 ---------------------------------------------
特定ユーザー 以外の接続を禁止
/etc/ssh/sshd_config に以下を追加
# AllowUsers
AllowUsers ユーザー名

sshdの再起動
# /etc/init.d/sshd restart
sshdを停止中: [ OK ]
sshdを起動中: [ OK ]


○TELNETの停止 --------------------------------------------------
setupコマンドから、telnetの自動起動を停止させる→既に止まってた
/etc/inetd.confの、telnetをコメントする
#telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd

inetdの再起動
# /etc/init.d/inet restart
Stopping INET services: [ OK ]
Starting INET services: [ OK ]


○PostgreSQLの設定 ----------------------------------------------
PostgreSQLを起動する
# /etc/init.d/postgresql start
データベースを初期化中: [ OK ]
Starting postgresql service: [ OK ]

postgresユーザーのパスワード設定
# passwd postgres
Changing password for user postgres
New UNIX password: パスワード入力
Retype new UNIX password: パスワード入力
passwd: all authentication tokens updated successfully


tcpip接続の許可(Windowsからcseなどのツールで接続する場合に必要)
/var/lib/pgsql/data/postgresql.conf を編集
#tcpip_socket = false
tcpip_socket = true

/var/lib/pgsql/data/pg_hba.conf を編集
#host all 127.0.0.1 255.255.255.255 trust
のコメントを取って
host all 127.0.0.1 255.255.255.255 trust
にする
他のIPから接続するために、以下を追加
host all 接続するIP マスク trust


一度再起動する
# /etc/init.d/postgresql restart
PostgreSQLサービスを停止中: [ OK ]
Starting postgresql service: [ OK ]


特定ユーザーにPostgreSQLの権限を与える
# su postgres
bash-2.05$ createuser ユーザー名
Shall the new user be allowed to create databases? (y/n) y
Shall the new user be allowed to create more new users? (y/n) n
CREATE USER

特定ユーザーでデータベースの作成
特定ユーザーでログイン
$ createdb データベース名
CREATE DATABASE

SQLの実行などなど・・・
Windowsからcseで接続できればOK

# setup
でセットアップを表示し、システムサービス設定からpostgresqlにチェックを付ける


○JAVAのインストール----------------------------------------------
j2sdk-1_4_2_09-linux-i586-rpm.binをダウンロード
JAVAのダウンロードページのインストールガイド通りにインストール

RPMパッケージ名を検索
# rpm -qa | grep j2sdk
j2sdk-1.4.2_09-fcs

RPMのインストール先を検索
# rpm -qs j2sdk-1.4.2_09-fcs | less
/usr/java/j2sdk1.4.2_09/bin/ に、java,javac があるのがわかる

リンクの作成(/usr/java/jdkから使用できるようにする)
# cd /usr/java
# ls
j2sdk1.4.2_09
# ln -s j2sdk1.4.2_09 jdk
# ls
j2sdk1.4.2_09 jdk

環境変数の設定
/etc/profileの最終行に以下を追加
# PATH
export JAVA_HOME=/usr/java/jdk
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/lib

設定を反映
# source /etc/profile


○TOMCATのインストール -------------------------------------------
jakarta-tomcat-5.0.28.tar.gz をダウンロード
MD5チェック
# cd /tmp
# md5sum jakarta-tomcat-5.0.28.tar.gz
2a189b6be6d8d6801097d4a658edfa05 jakarta-tomcat-5.0.28.tar.gz

ファイルを展開
# cd /usr/local/
# tar xzvf /tmp/jakarta-tomcat-5.0.28.tar.gz

リンクの作成(/usr/locdal/tomcatから使用できるようにする)
# ln -s jakarta-tomcat-5.0.28 tomcat

環境変数の設定
/etc/profileの最終行に以下を追加
export TOMCAT_HOME=/usr/local/tomcat

設定を反映
# source /etc/profile

起動テスト
# /usr/local/tomcat/bin/startup.sh
停止
# /usr/local/tomcat/bin/shutdown.sh

管理者の設定
# cd /usr/local/tomcat/conf/
# vi tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>部分に
<role rolename="manager"/>←追加
<role rolename="admin"/>←追加
<user username="ユーザー名" password="パスワード" roles="admin,manager"/>←追加
</tomcat-users>

JDBCドライバを探す
# find / -name jdbc*
/usr/share/pgsql/jdbc7.1-1.1.jar
/usr/share/pgsql/jdbc7.1-1.2.jar
/usr/share/pgsql/jdbc7.2dev-1.1.jar
/usr/share/pgsql/jdbc7.2dev-1.2.jar
4つあった
TOMCATにPostgreSQLのJDBCドライバを設置
# cp /usr/share/pgsql/jdbc7.1-1.2.jar /usr/local/tomcat/common/lib/

Administration Toolでデータソースの設定をする
リソース→データソースに、
新規でデータソースを作成
JNDI名: jdbc/データソース名
データソースURL: jdbc:postgresql:データベース名
JDBCドライバクラス: org.postgresql.Driver
ユーザ名: データベースユーザー名
パスワード: データベースパスワード
有効な最大接続数: 4(デフォルト)
アイドル状態の最大接続数: 2(デフォルト)
最大接続待ち時間: 5000(デフォルト)
クエリの検証: ?テスト用に適当なSQLを記入すればいいの?(未記入)

Administration Toolでリソースリンクの登録をする
サービス→ホスト→コンテキスト から、Webアプリケーションを選択
そこの リソース→リソースリンク
名前: jdbc/データソース名
グローバル: 上記のJNDI名
型: javax.sqlDataSource

WARファイルの設置

TOMCAT5.0.28では、デフォルトでGETから送られてきたリクエストの
request.setCharacterEncoding()を無視する仕様の為、
server.xmlを変更する必要がある。
Administration Toolで、
サービス→コネクタ→8080と
サービス→コネクタ→8009の←Apacheと連携している時
URIクエリパラメータにボディのエンコーディングを使用:TRUE に設定

TOMCATの再起動


○ApacheとTomcatの連携 -------------------------------------------
jakarta-tomcat-connectors-jk2-src-current.tar.gz をダウンロード
aprとapr-util ver0.9.4がなかったので、ver.0.9.7をダウンロード
ファイル3つとも/usr/local/src に置いて、tarする

コンパイル
# cd jakarta-tomcat-connectors-jk2-2.0.4-src/jk/native2/
# ./configure --with-apxs=/usr/sbin/apxs --with-apr=/usr/local/src/apr-0.9.7 --with-apr-util=/usr/local/src/apr-util-0.9.7
# make

作成したモジュール、設定ファイルのコピー
# cd ../
# cp build/jk2/apache13/mod_jk2.so /etc/httpd/modules
# cp conf/workers2.properties /etc/httpd/conf/

/etc/httpd/conf/httpd.conf に
LoadModule jk2_module modules/mod_jk2.so
AddModule mod_jk2.c
を追加


/etc/httpd/conf/workers2.properties の設定
[uri:/Webアプリケーションのディレクトリ/*]
info=適当に記入 ←単なる説明

Apacheを再起動する
# /etc/init.d/httpd restart

htmlファイルをApacheに置く


TOMCATでファイル一覧を出さないように設定
# cd /usr/local/tomcat/conf/
web.xml を修正
<servlet>の
<init-param>
<param-name>listings</param-name>部分
<param-value>false</param-value>←trueをfalseに変更
</init-param>
</servlet>

Apacheのhttpd.confを設定する
/etc/httpd/conf/httpd.confに追加
#
# My Contents Directry
#
<Directory 絶対パス/htmlファイルのあるディレクトリ名(最後の/はいらない)>
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>


○Diceの設定 -----------------------------------------------------
diced01912.tar.gz をダウンロード
# cd /usr/local/bin/
# mv /tmp/diced01912.tar.gz ./

展開
# tar xzvf diced01912.tar.gz
diceの実行
# cd DiCE/
# ./diced
質問に答える

デーモン起動
# ./diced -d -l
確認
# ps -C diced
PID TTY TIME CMD
19907 ? 00:00:00 diced ←いればOK


○タイムサーバの設定 ----------------------------------------------
IP取得にDHCPを使用していないのが条件(DHCPを使用していると起動時に設定が上書きされる)

現在の設定ファイルのバックアップ
# cp /etc/ntp.conf /etc/ntp.conf.back
/etc/ntp.conf に以下を追加
# Security Setting
# Default
restrict default ignore

# Local Allow
restrict 127.0.0.1

# Lan Allow
restrict 許可するIP mask マスク nomodify notrap

# NTP Servers
restrict 210.173.160.87 mask 255.255.255.255 nomodify notrap noquery

server 210.173.160.87 # MFEED ntp3.jst.mfeed.ad.jp

一度ntpdateで時刻を設定しておく
# ntpdate 210.173.160.87

ntpdの起動
# /etc/init.d/ntpd start

# setup からシステム設定を行い、ntpdを自動起動させる

数分経ってから
# ntpq -p

remote refid st t when poll reach delay offset jitter
==============================================================================
*ntp2.jst.mfeed. nttpf-isdn0.cr1 2 u 31  64 377 14.074 -21.121 0.676
LOCAL(0) LOCAL(0) 10 l 30 64 17 0.000 0.000 0.008

*が付いていればOK

| | コメント (4) | トラックバック (1)

2005/08/27

Eclipse+LombozプラグインでStrutsの環境を作る

Eclipse+Lombozの設定ができ、TomcatでStrutsのアプリケーションが動くようになったとくれば、この2つを連携したくなるのが人情ってもんです。(笑)
というわけで、EclipseでStrutsのアプリケーション開発環境を作ってみることにしました。

頼みの「オープンソース徹底活用 Eclipse3によるJavaアプリケーション開発」本では、LombozはWebサービスクライアントの開発用でしか載っておらず、Struts開発ではMyEclipse(有料)を使っています。

そこで参考にしたのが、Lombozの設定でお世話になった Javaの道 です。
Eclipse(Tomcat向け開発)で、サーブレットの作り方が載っています。
サーブレットが作れるなら、Strutsも動くだろう!ってなことです。(汗)

試した環境 Windows2000 Tomcat5.0.28 Java5 Eclipse3.0.1(日本語化済み)


新規にプロジェクトを作る場合
「ファイル」→「新規」→「プロジェクト」を選択し、「新規プロジェクト」画面を開く。
新規プロジェクト画面で「Java」→「Lomboz J2EE Wizards」→「Lomboz J2EE Project」を選択。「次へ」を押す。
「プロジェクト名」にプロジェクト名を入力。
「Java設定」画面ではそのまま「次へ」ボタンを押す。
「Create J2EE Module」画面で「Web Modules」タブを押す。「Add」ボタンを押しModule名を入力。
(このModule名がTomcatのコンテナ名になる。)

同じプロジェクトにコンテナを追加する時は、
追加するプロジェクトを選択して右クリック。Lomboz Web Module を選択してModule名を入力。


「Targeted Servers」タブを押し、「Type」で「Apache Tomcat v5.0.x」を選択し「Add」ボタンで追加。

「終了」ボタンを押すとEclipseにJ2EEプロジェクトが作られる。WEB-INFディレクトリなども自動生成される。

ってところまでは、「Javaの道」に載っているとおりにしました。

ここからサーブレットを作る場合は、「Lomboz J2EE Wizards」→「Lomboz Servlet Wizard」を選択すればよいそうです。


が、Strutsの場合はここからまだやることがあります。

・Strutsの場合は、必要なJARファイルなどを\WEB-INF\libディレクトリに置く必要があります。
パッケージエクスプローラから\WEB-INF\libを右クリック→インポート→ファイルシステムで、
commons-beanutils.jar
commons-digester.jar
filter.jar
struts.jar
を WebModule名\WEB-INF\lib に、
struts-bean.tld
struts-config.xml
struts-html.tld
struts-logic.tld
web.xml
を WebModule名\WEB-INF に置きました。

・srcディレクトリの作成
パッケージエクスプローラからWEB-INFディレクトリを右クリック
新規作成→ディレクトリ で、srcディレクトリを作成する。

・srcをソースフォルダにする
パッケージエクスプローラからsrcディレクトリを右クリック
新規ソースフォルダを選択。
プロジェクト名に今のプロジェクト名が入っているのを確認し、
フォルダー名の「参照」ボタンから Web Module名/WEB-INF/src を選択。

・Javaのビルド・パスの設定
パッケージエクスプローラからプロジェクトを右クリック
プロパティーを選択。
Javaのビルド・パスを選択 デフォルト出力フォルダを WebModule名/WEB-INF/classes にする。
ライブラリのタブを選択し、JARの追加で、
Web Module名/WEB-INF/lib に置いたJARファイルをすべて追加する。

ちなみに、ソースフォルダを普通のフォルダにしたい時は、
パッケージエクスプローラからプロジェクトを右クリック
プロパティーを選択
Javaのビルド・パスを選択
ソースフォルダのタブからフォルダを選択&除去でOKです。


これで準備完了
ソースフォルダ内に、クラス(サーブレットではない)を作っていきます。
struts-config.xmlは、Web Module名/WEB-INF/ に置きます。
ApplicationResource.propertiesは、ソースフォルダに置くと、自動でclassesフォルダにも置いてくれますが、
日本語が含まれる場合はnativ2asciiコマンドで変換したものを置く必要があります。

最後に、画面下の「Lomboz J2EE View」にあるWebModule名を右クリックして、Deployを選ぶと、TOMCATにWARファイルを作成してデプロイできます。


よ~し、Strutsの勉強をするか!(ってこれからかい。(汗))

| | コメント (0) | トラックバック (0)

2005/08/21

JSPのコンパイルができなくなりハマる

近頃、Strutsに興味があり、ソフトバンクから出版されている「StrutsによるWebアプリケーションスーパーサンプル」っていう本を買ってきました。
しばらくこいつで勉強しようかな、と。

で、サンプルプログラムを試してみようと、サンプルのWARファイルをデプロイした時に問題が発生しました。
エラーが出てサンプルが表示できないのです。
そんなバカな。サンプルでエラーが出るなんて。

エラーは、JSPファイルのコンパイル時に出ていました。
内容は、
Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK
ってなものでした。
ちなみに環境は、WindowsでTomcat5.0.28です。Javaは5です。

なに~??javacが見つからないだって???
JAVA_HOMEがおかしいとのことなので、環境変数を見てみましたが、ちゃんとJavaのインストールされたフォルダに設定されています。

TomcatのサンプルJSP(JSP Examples)を見たところ、これはちゃんと動いています。
JSPのコンパイル時だけの問題のようです。

どうやら、EclipseのLombozプラグインがうまく動かなくて、Javaのバージョンを変えたりしたのが原因じゃないかなと思います。
いろいろ試してみましたが解決せず、Tomcatを再インストールしてみました。

すると、なにごとも無かったように動くようになりました。
結局どこが原因か判らず・・・。(汗)
エラーのログとか詳細に残しておけばよかった・・・。

私が記憶している中で、再インストール後に変化した部分は、TomcatのConfigure Tomcatツールで設定できる、「Java」のVMの項目が、
C:\Program Files\Java\jdk1.5.0_04\jre\bin\server\jvm.dll
になっていた、ということです。
私はJavaのバージョンを変えた時に、
C:\Program Files\Java\jdk1.5.0_04\jre\bin\client\jvm.dll
に設定してしまったと思うんです。

そう言えば、エラーも単純にjavacが見つからない、と言っているわけではなくて、javac.Mainにclasspathが通っていない、ってことですもんね。
JAVA_HOMEも、今のTomcatでは自動で設定してくれるみたいですから、JAVA_HOMEの設定ミスってのではないみたいです。
今となっては詳細不明ですが、ま、Tomcatの再インストールで復活した、ということです。

サンプル動かすだけで、すげー時間使った。(T_T)

| | コメント (0) | トラックバック (0)

2005/08/12

EclipseのLombozプラグインのインストールでハマる

前に、漫画ビューアをJAVAのアプレットで作ったのですが、その際にEclipseを使ってみてビックリ。すごすぎ!!
テキストエディタのみでガリガリ書くのとは作業効率が全く違います。
こんなスゴいソフトがタダで使えるなんて!って感動したもんです。

そのEclipse、プラグインをインストールすればWebアプリケーション作成にも使えるってんで、本を読んで試してみることにしました。
「オープンソース徹底活用 Eclipse3によるJavaアプリケーション開発」ってな本です。
それによると、LOMBOZ というJ2EE開発用のプラグインがあるそうです。

早速本に書いてあるとおりにプラグインをインストールしました。
インストールといっても plugins のフォルダに追加するだけなんですけどね。

で、Eclipseを起動してみたのですが・・・。設定項目がない・・・・・。
本には、設定画面でLombozの項目を選択できることになっているのですが、項目がありません。

本の環境と自分の環境はほぼ同じで、
Eclipse3.0.1 TOMCAT5.0.28 Lomboz3.0.1です。
唯一違うのがJavaで、
本では1.4を使っているのに対し、5を使っています。
そんなわけで、LombozがJava5に対応していないのではないか?と思って、Java1.4を入れてみましたが、状況は変わりません。

本の出版社のページにも行ってみたのですが、正誤表も無いようです。

ネットでいろいろ調べたのですが、だいたい本に載っているようなインストール方法で大丈夫みたいです。
いったい何が原因なんだろう???

もう少し調べた所、「Javaの道」に解決策が載っていました
Lombozを使用する時は、EMF&SDOのRuntimeもインストールする必要があるそうなんです。
で、「Javaの道」に書いてあるとおりにインストールした所、ちゃんと設定できるようになりました。
やった~。

ですが、本の説明どおりに設定したのにうまくいかなかったのにはまいりました。
出版社のページに正誤表が無いので、もしかしたら、本の書いてある順番にいろんなプラグインをインストールしていけばうまくいくのかもしれません。

ちなみにJavaは5に戻しましたが、問題なく動いています。(汗)

| | コメント (0) | トラックバック (0)

2004/12/04

Tomcatでファイル一覧を表示しない方法

Webアプリケーション作成中に、ちょっと困ったことが起きました。
フォルダにindex.jspが無い場合、フォルダ内のファイルが一覧表示されてしまうのです。
サーブレットを介して表示するJSPもあるので、これはちょっと良くないです。
 
こういう設定って、確かApacheにもありましたよね。
でも、Apacheはただ単にTomcatのレスポンスを受け取ってるだけだろうから、
Tomcatに設定がありそうです。
私の持っているムックは、server.xmlに関しては詳しいことが書かれているのですが、
server.xmlにそのような項目は見つかりません。
そこでネットでいろいろ探してみたところ、ありました。

どうやら、 conf/ にある web.xml に設定があるようです。
param-name 項目の listings がデフォルトでは true になっているので、ここを false にすればOKです。

conf/ ディレクトリにある web.xml は、いろんなデフォルト設定が書かれているようですね。

| | コメント (0) | トラックバック (0)

2004/10/16

Apache1.3とTomcat5を連携させる

今のサーバは基本的にポート80のみ外部に公開しているので、Apacheと連携してTomcatも公開したいな~と思ったのであります。

ApacheとTomcatの連携は、Windowsでやったことがあります。
Apache2.0.48とTomcat4.1を連携したのでした。
当時としてはメジャーなバージョンだったので、苦戦はしましたが資料がけっこうネットで見つかったので、なんとかなりました。
そんなわけで、なんとかなるだろうと思って始めたわけです。

VineLinuxに標準で入っているApacheが1.3で、今使っているTomcatが5.0.28です。
なんかバージョンに差がありすぎるような気がしないでもない・・・。
ApacheとTomcatを連携するのに、mod_jk2というモジュールを使います。
で、mod_jk2がApache1.3に対応しているのか調べてみたところ、どうやら使えるみたいです。
やった~!!
しいしせねっとにすごく詳しく解説がしてあったので、なんとかなりそうです!

まず、jakarta-tomcat-connectors-jk2-src-current.tar.gz をApacheのページから探してダウンロードしてきました。
また、Apache1.3と連携する時は、aprとapr-util が必要らしく、これも探してダウンロードしました。
ちなみに、aprとapr-util は、しいしせねっとではver0.9.4を使っていますが、最近ver1.0.0が出たらしく、モジュールは新しければ新しいほど性能が良いだろうと思って、1.0.0をダウンロードしました。
で、説明のとおりに ./configure をした所、途中でエラーが!!
apr-configファイルが見つからない、みたいなエラーが出たかな?
なんで~!!??

ネットでいろいろ調べた所、NetPlatzに原因が載っていました。
「最新バージョンである apr-1.0.0.tar.gz と apr-util-1.0.0.tar.gz では、この後のインストール作業で失敗してしまうので、0.9.4 でなくてはなりません。」

・・・・・な、な、なに~!?最新版を使うとダメなの??
そんなモジュールにメジャーバージョン名をつけるな~!!!

気を取り直して、ver0.9.4をダウンロードして、configure とmake をした所、待望の mod_jk2 が出来上がりました!
やった~!!
さっそくApacheのモジュールに入れて、ちょちょっと設定した所、ちゃんと80番ポートからServletとJSPが見えるようになりました。

NetPlatzと、しいしせねっと、どちらも大変解りやすく解説してあり、助かりました。
ちなみに、VineLinuxの環境だと、ディレクトリ構成の関係で、しいしせねっとの方が解りやすかったかな。
FedoraCoreなんかだとNetPlatzの方が解りやすいのかも。

| | コメント (0) | トラックバック (0)

2004/10/02

TomcatからPostgresqlに接続してみる

IDG JAPANからでているJava WORLD for Beginnersというムックを買ってきました。

VineLinux2.5ではデフォルトでPostgresqlがインストールされているので、前からこいつを使う方法が無いものか?と思っていたのです。
そんな時に、このムックで Tomcat+Postgresql を使ったWebアプリケーションの作り方が載っていたので、作ってみようと思ったのでした。

この本では、Windows上で動かすのを前提で書いてあります。
Postgresql も、Cygwinで動かしてます。(汗)
ま、CygwinもLinuxも似たようなもんだろうと思って、深く考えずに作り始めたのでした。

で、なんとかPostgresqlを使おう!ってな所までたどり着き、実行してみたところエラーが!!
SQL Exception No suitable driver
そんなドライバは知らん!! と言われてます・・・。
そんなはずは!
ちゃんと Class.forName( "org.postgresql.Driver" ); でクラスを呼んでるし、
Connection connection = DriverManager.getConnection( DB_URL, DB_USER, DB_PASSWORD );
でコネクションオブジェクトも作成できてるはず!!

なんでや~!!と思ってPostgresql(Ver7.43)のページに行ってみた所、ドライバのある所にCLASSPATHを通さなくてはいけないらしい・・・。
「ドライバを使うためには、JAR ファイル (ソースからコンパイルした場合は postgresql.jar、そのほかの場合はそれぞれ JDBC 1、JDBC 2、JDBC 3 バージョンである、pg7.4jdbc1.jar、pg7.4jdbc2.jar、pg7.4jdbc3.jar)をクラスパスに含む必要があります。」
って書いてあったので、それらしきファイルを探してみたのだけど見つかりません・・・。

そんなばかな!
このPostgresqlには、JAVA用のドライバが無いのか?!?
ちょっとまて。こいつのPostgresqlのバージョンっていくつだっけ?と思ったら
/var/lib/pgsql/data/PG_VERSION
ってなそのまんまな名前のファイルを発見し、見てみたところ バージョン7.2でした。

で、バジョン7.2のページを見てみると、
「jar ファイル(ソースからコンパイルした場合は postgresql.jar、さもなくば、それぞれ jdbc1、jdbc2 バージョンである、jdbc7.2-1.1.jar または jdbc7.2-1.2.jar)をクラスパスに含む必要があります。」
って書いてある。

・・・・・ファイル名違うやん!! ころころ変えんな~!!

find / -name jdbc* とコマンド打って検索したら、出てきました! しかもバージョン違うのが4つも!(笑)

とりあえず、その1つにCLASSPATHを通して実行してみました。

・・・・また同じエラーが。 ????なんで????

Googleを使って検索してみると、どうやらJDBCのURLが間違っている時に出るエラーのようです。
ソース見ても間違っていないのにな~。わからん・・・。
CLASSPATHの通し方が違っているのかなと思い、調べてみると、
「TOMCATから使うなら、$TOMCAT_HOME/libが良いでしょう。」ってなのにヒットした。

なに~!?Tomcatに直接置けばいいのか!?
そんなのこのムックのどこにも載って・・・・・・。
・・・。載ってました~。(T_T)

本では、postgresql.jarをコピーし、WEB-INF\lib に置けばいい、みたいなことが書いてありました。
しかも、ここに置いておけばCLASSPATHを設定しなくても勝手に読んでくれるそうです。
で、 jdbc7.1-1.2.jar をWEB-INF\libに置いたら、ちゃんと動くようになりました!!

もっとしっかり本読んでおけば・・・・・。ま、ファイル名が違うことには気づいたんだから良しとするか。

| | コメント (0) | トラックバック (0)