CentOS 6.0のVPSサーバ構築/(4) WEBサーバの設定

GMOクラウド VPSCentOS 6.0」にサーバー環境を構築している。前回、メールサーバの設定ができたので、HTTPサーバとTOMCATをインストールし、既存のホームページや自前のサービスを移行させたのだ。過去の記事も参照のこと。
  (1) VNCサーバの設定
  (2) DNSサーバの設定とDropboxの設定
  (3) メールサーバの設定
  (4) WEBサーバの設定

今回は、まずローカルでHTTPDTOMCAT、そして自前のサービスが動作するまでを行った。ホームページや自前のサービスの移行では、以下の状況が作業を難しくしていた。手順が複雑になるので、以下の詳細は次回としたい。
  ■ 外部ネームサーバの設定(動的DNS)を併用したい
  ■ 同じドメイン名のままで移行したい
  ■ 契約したVPSは1つのサーバー(1つのIPアドレス)であり、1台で2つのドメインを扱うためにVirtualHostの設定が必要

MySQLをデータ移行した

まず、ホームページや自前のサービス一式をWinSCPなどを経由してサーバにコピーしておく。自宅サーバーのMySQLからデータをエクスポートして、新サーバにインポートしておく。MySQLについては、過去に何度も設定を行っているので、まったく問題はなかった。/etc/my.cnfには以下の記述を追加しておく。大文字・小文字の扱いを統一し、文字はUTF-8で統一して扱うようにしておく。このあたりのことは、以前にも MySQLのデータをWindowsからLinuxへ移行する手順 にメモしておいた。


[mysqld]
lower_case_table_names=1 // 大文字・小文字の扱いを統一。1=小文字で扱う
default-character-set=utf8
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
[mysql.server]
default-character-set=utf8
[mysqldump]
default-character-set=utf8
後は、MySQLのコンソールから、create databeseし、userを定義、パスワード設定、databaseに対するアクセス権限を設定しておく。そしてcreate tableしておく。詳細は割愛。そして、データをインポートすればいい。以下の手順になる。

# 自宅サーバ
> mysqldump -uroot -p*** data-basename > mysql-backup.utf8
# 新サーバ
> mysql -root -p*** data-basename < mysql-backup.utf8

HTTPDを設定した

自前サービスはJavaで実装しているので、Apache httpdとTomcat6の組合せで動作させる。申し込んだVPSが「CentOS6.0+Java開発環境パック」だったためか、必要なものはプリインストールされていた。まずは、Apache httpdの設定だ。


# httpd
> yum list | grep httpd
httpd.x86_64 2.2.15-15.el6.centos.1 @base
httpd-tools.x86_64 2.2.15-15.el6.centos.1 @base
httpd-devel.x86_64 2.2.15-15.el6.centos.1 base
> vi /etc/httpd/conf/httpd.conf
Listen 80
ServerAdmin webmaster@hogehoge.co.jp
ServerName www.hogehoge.co.jp:80
DocumentRoot "/var/www/html" // デフォルトのまま
> vi /etc/httpd/conf.d/proxy_ajp.conf // デフォルトのまま。最初はTOMCATと連携させない。
> service httpd restart
Firefoxから http://localhost:80/ で試すと、Apacheのデフォルトのページが表示され、問題はない。

TOMCAT6を設定した

次は、TOMCAT6だ。TOMCAT6ではいくつか苦戦させられた。まず、8080ポートが既に利用されていると出た。またTOMCATマネージャにログインできない事象に陥ったことだ。設定の手順は以下のとおり。


# tomcat6
> yum install tomcat6-webapps // examplesは入っていなかったので試しに入れてみた。
> yum list | grep tomcat6
tomcat6.noarch 6.0.24-45.el6 @base
tomcat6-el-2.1-api.noarch 6.0.24-45.el6 @base
tomcat6-jsp-2.1-api.noarch 6.0.24-45.el6 @base
tomcat6-lib.noarch 6.0.24-45.el6 @base
tomcat6-servlet-2.5-api.noarch 6.0.24-45.el6 @base
tomcat6-webapps.noarch 6.0.24-45.el6 @base
tomcat6-admin-webapps.noarch 6.0.24-45.el6 base
tomcat6-docs-webapp.noarch 6.0.24-45.el6 base
tomcat6-javadoc.noarch 6.0.24-45.el6 base
tomcat6-log4j.noarch 6.0.24-24.el6_0 base

# 面倒なのは、tomcat6関連のファイルはいろんなところに散らばっていること。
# 常に /usr/share/tomcat6 から辿るようにすると間違えにくい。
> ls -lag /usr/share/tomcat6
drwxr-xr-x 2 tomcat 4096 bin
lrwxrwxrwx 1 tomcat 12 conf -> /etc/tomcat6
lrwxrwxrwx 1 root 23 lib -> /usr/share/java/tomcat6
lrwxrwxrwx 1 root 16 logs -> /var/log/tomcat6
lrwxrwxrwx 1 root 23 temp -> /var/cache/tomcat6/temp
lrwxrwxrwx 1 root 24 webapps -> /var/lib/tomcat6/webapps
lrwxrwxrwx 1 root 23 work -> /var/cache/tomcat6/work
> cd /usr/share/tomcat6/conf
> ls -R
# 以下は便宜上、ツリー表現にしておく。
+-- Catalina
| +-- localhost
| +-- ROOT.xml // 自前サービス。メインであるためROOTに配置。
| +-- homepage.xml // ホームページ(動的)
| +-- manager.xml // TOMCATマネージャ
+-- context.xml
+-- server.xml // 編集が必要。後述。
+-- tomcat-users.xml // 編集が必要。後述。
+-- tomcat6.conf // 編集が必要。後述。
+-- web.xml

> cd /usr/share/tomcat6/webapps/
> ls
+-- ROOT // 自前サービスのルート。メインであるためROOTに配置。
+-- homepage // ホームページ(動的)のルート
+-- manager // TOMCATマネージャのルート

設定が必要なconfファイルやxmlファイルについてのみ説明しておく。

> vi /etc/tomcat6/tomcat6.conf
JAVA_HOME="/usr/lib/jvm/java-1.6.0"
TOMCAT_USER="tomcat"
# Connector port is 8080 for this tomcat6 instance
CONNECTOR_PORT="8081" // VPSサーバでは、なぜか8080が衝突するため8081を利用した。後述。

> vi /etc/tomcat6/context.xml // デフォルトのままでいい。
> vi /etc/tomcat6/server.xml

# (1) 以下を追記する。追記場所は、市販本やネット情報を参照のこと。
...
// tomcat7でないと効果がないらしいが、一応記述。

...
# (2) ポート番号を8080から8081に変更したので、該当する箇所(2箇所ほど)を置換しておくこと。

> vi /etc/tomcat6/tomcat-users.xml

# 以下のようにusernameとpasswordを追記する。
# ちなみに、指定を間違えるとTOMCATマネージャ画面でログインに失敗したとき
# manager-guiとか、manager-scriptといったロールを定義せよと警告が出る。ただこれはtomcat7の
# 話のようだ。tomcat6では、adminとmanagerのロールのみでいい。






> vi Catalina/localhost/ROOT.xml など
# 以下を含んでいること
// Attributeは空でいい。docBaseが記述されているとWARNINGが出る。

> service tomcat6 restart
> tail -200 /var/log/tomcat6/catalina.out // ログをチェック

といった設定で、うまくいけば、Firefoxから http://localhost:8081/ で自前サービスが、また http://localhost:8081/homepage/ でホームページが開くはずだ。さらに http://localhost:8081/manager/htmlTOMCATマネージャが利用できるはずであった。しかし、TOMCATマネージャではtomcat-users.xmlで設定したアカウントでログインできない事態となっていた。その説明の前に、8080ポートが何と衝突しているのか調べてみたので補足しておこう。

# 8080ポートが何に利用されているかの特定
> yum install lsof // インストールしないとこのコマンドは使えない
> lsof -i:8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
jsvc 4568 tomcat 34u IPv4 12817 0t0 TCP *:webcache (LISTEN)
> lsof -i:8081
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 6835 tomcat 33u IPv4 23855 0t0 TCP *:tproxy (LISTEN)
jsvcが8080を利用しているというのだ。そもそもjsvcが必要なのか、不要なのかはっきりしない。「CentOS6.0+Java開発環境パック」に最初から入っていたのだろうと思うが、しらぬ間に何かをインストールした際に依存関係からインストールされてしまったものなのかもしれない。サービスの一覧にもjsvcが現れて、OSの起動時にstartされているようだ。不勉強でjsvcが分かっていない。誰かレクチャしてほしい。自宅サーバFedoraではjsvcは入っていないし、サービスにも登録されていない。とりあえず、回避策として、tomcat6はポート番号を8081に変更することにした。ちなみに、8080や8081はファイアウォールでポートを開けておく必要はない。localhostで利用できればいい。

で、話を戻して、TOMCATマネージャにログインできない問題だ。認証に失敗すると、また紛らわしいのだが「maneger-guiとか、maneger-scriptといったロールを定義せよ」と読める警告が出るのだ。しかし、そのように記述してもダメ。manager-guiというロールはtomcat7からの概念のようだった。tomcat6では、managerのままでいいはずだ。

実際には何が問題であったかというと、/usr/share/tomcat6/webapps/managerの配下に .htaccess というファイルがあったためだった。自宅サーバーからコピーしてきたときに含まれていた。このファイルを削除すれば、ログイン可能になった。また、コピーしてきたフォルダやファイルのアクセス権限がおかしいままのものがあった。chown tomcat、chmod 644 などが適切かどうかチェックすると、結構問題の箇所があった。たとえば、/usr/share/tomcat6/Catalina/localhostに書き込みができなくなっていたりした。

外部からフォルダやファイルをコピーして持ち込んだとき、rootで勝手にファイルを作成したときには、chown、chmodでアクセス権限を調整しておくことがLinuxでは非常に重要だと再認識させられた。結構、油断してしまうんですよね。前回も、Thunderbirdでコピーしてきたメールボックスが参照できないということもあったばかりだ。

残りの問題は次回に繰越そう

それでも、TOMCAT6の設定は比較的すんなりと終わり、http://localhost:8081/ で自前サービスが利用できるようになった。同様に http://localhost:8081/homepage/ でホームページも参照できるようになった。実際には、もう1つ問題が残っていた。jsessionというIDが勝手にURLのリクエストパラメータに追加されてしまう事象が起きるのだ。TOMCAT7では解消するらしい。当面は、回避策で繰り越すこととした。

今日はここまで。実は、最大の難関だったのは、HTTPDTOMCATの連携の部分だ。契約したVPSは1つのサーバー(1つのIPアドレス)であり、1台で2つのドメインを扱うためにVirtualHostの設定が必要であった。しかも自宅サーバと同じドメイン名であるため、問題が複雑化してしまった。一般には大したこともない作業なのかもしれないが、私にとってははじめての作業であり、試行錯誤の繰り返しで苦労させれたのである。