気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Apache Tomcatの基本を復習してみる

Java ServletをWebサーバー上で動作させるための「サーブレットコンテナ」の一つ。
作成したJava Servletの動作確認をするための簡易的なWebサーバーとしての機能も備えています。

本格的にWebサービスを作成する場合は、Apache(Webサーバーソフト)をサーバーにインストールして
サーバーを動作させます。

ディレクトリ構成

Tomcatで重要なディレクトリとファイルを記載します。

tomcat($CATALINA_HOME)
  ∟ bin ・・・Tomcatプログラム格納先
  ∟ conf ・・・各種設定ファイル格納先
    ∟ context.xml
    ∟ sever.xml
    ∟ tomcat-users.xml  
    ∟ web.xml
  ∟ lib ・・・必要なAPIを格納。DB接続など
  ∟ logs ・・・ログ格納先
  ∟ temp
  ∟ webapps ・・・作成アプリの格納先(デプロイ先)
    ∟ ROOT ・・・http://localhost:8080/でアクセスできる(ROOTの名前の通り、ルートでアクセス可)
      ∟ index.html
      ∟ WEB-INF ・・・WEB-INF以外は公開される。WEB-INF以下は、公開されない。設定ファイルなどを配置
        ∟ web.xml ・・・classes以下のクラスファイルへどのようなURLでアクセスさせるかを記載
        ∟ classes ・・・コンパイル済みファイルを格納
    ∟ docs・・・http://localhost:8080/docs/でアクセスできるアプリ
    ∟ examples
    ∟ host-manager
    ∟ manager
  ∟ work

設定ファイル

次にTomcatの設定ファイルの概要について確認していきます。

  ∟ conf ・・・各種設定ファイル格納先
    ∟ context.xml
    ∟ sever.xml
    ∟ tomcat-users.xml  
    ∟ web.xml

実際の設定ファイルの配置先は、conf¥Catalina¥localhost以下になります。 localhostはホスト毎のディレクトリ。

  ∟ conf ・・・各種設定ファイル格納先
    ∟ Catalina
      ∟ localhost
        ∟ ROOT.xml  ・・・ 静的ファイルを保持するプロジェクトの読み込み使ったりする
        ∟ sampleApp.xml ・・・実際に作成したアプリのcontext.xml

context.xml

コンテキストの登録を行うファイルです。
アプリの配置先とその呼び出し方を設定します。

<Context path="/hello"
docBase="c:/sampleApp/helloworld"/>

docBaseにアプリケーションのルートディレクトリを指定。
pathには、アプリケーションを呼び出すための文字列を指定します。

helloworld以下にindex.htmlが配置されている前提とすると。
呼び出す際は以下のようなURLとなります。

http://localhost:8080/hello/index.html

sever.xml

サーバー単位の設定ファイルです。
Webアプリケーションの登録、ロギング、アクセス方法などが指定してあります。

EnginタグのNameでCatalinaが指定してあったり、defaultHostでlocalhostが指定して
あったりします。Catalinaがサーブレットコンテナ。

昔は、Context pathの指定もこのファイルに存在していたが、現状は、context.xmlとなっている。

tomcat-users.xml

Webアプリケーションマネージャーを使う際にお世話になるファイル。
Webアプリケーションマネージャーは、ウェブ画面でサーバーの配備や起動、停止を行えるツールです。

ウェブ画面にログインするためのアカウントを設定したりします。

以下のアカウントを設定する場合、は以下のように設定します。
ユーザー名:admin
パスワード:pass

<tomcat-users>
<role rolename="manager"/>
<user username="admin" password="pass" roles="manager"/>

<!--
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
-->
</tomcat-users>

web.xml

コンテキストの登録により、静的ファイル(.html)などは参照できますが、
Servletなどは、別途web.xmlに指定が必要です。

フレームワークを導入していると、独自の設定ファイルやアノテーションやクラス名からの推測で設定が不要だったりします。
フレームワークなしの場合の設定を押さえておくことで、Servletを用いていた際の基本設定を理解しておきます。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  version="2.4">

  <servlet>
    <servlet-name>helloworld</servlet-name>
    <servlet-class>HelloWorld</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>helloworld</servlet-name>
    <url-pattern>/helloworld</url-pattern>
  </servlet-mapping>
</web-app>

上記のようにサーブレットのクラス名とサーブレット名、サーブレット名と呼び出しURLに付与するパス名を 紐付けるように指定します。

以下のように呼び出します。

http://localhost:8080/hello/helloworld

IE11 社内サイト向けのCookieをOFFにする方法

IECookieをOFFにするには、インターネットオプション ⇒ プライバシータブ インタネット ゾーンの設定で バーを一番上に移動し、「すべてのCookieをブロック」を選択する。

もし、社内サイトへのCookieブロックを行いたい場合は、 ローカル イントラネットゾーン判別設定をOFFにして、インタネット ゾーンの設定の設定(CookieをOFF)を有効する必要があります。

ゾーン(セキュリティーゾーン)とは?

Webサイトが「ネットワーク上どの位置にあるか」を判定していずれかの"ゾーン"を割り当て、割り当てられたゾーンに 基づいてセキュリティー管理を行う、IE独自の機能です。

  • インターネットゾーン 通常のインターネット上のサイト。セキュリティー厳しめ
  • ローカルイントラネットゾーン 社内、内部ネットワーク。信頼できる管理者に管理されているため、セキュリティー緩め

他にも信頼済みゾーン、制限付きサイトゾーンなどがある。

ローカル イントラネットゾーン

ローカル イントラネットゾーンに追加されているサイトは問答無用でローカル イントラネットゾーンと判定。

どのゾーンにも追加されていないサイトは、設定よって自動判別がなされる。

以下の設定をON,OFFすることでローカル イントラネットゾーンと見なすかのルールを設定する。

  • ほかのゾーンにないローカル (イントラネット) のサイトをすべて含める
  • プロキシ サーバーを使用しないサイトをすべて含める
  • すべてのネットワーク パス (UNC) を含める

上記のチェックをすべて外すと、インターネットゾーンと判別されるようになる。

関連用語

UNCパス

Universal Naming Conventionの略称。 コンピュータネットワーク上のフォルダやファイルへアクセスするための構文

構文
\\<computer name>\<shared directory>\

例
\\pondermatic\public\studyarea.gdb
\\omnipotent\shared_stuff\wednesday\tools

HerokuにJavaアプリをデプロイする

昔、RubyでHerokuにアプリを上げたりしてましたが、
Javaアプリをデプロイするやり方がわからなかったので、作業メモとして、残します。

Herokuのアカウント作成していない方は、作成して下さい。
クレジットカード番号は、不要で、メールアドレスのみ登録ができるようです。

Heroku用開発ツールの設定

「Heroku Toolbelt」というコマンドラインツール(CLI)をダウンロード、インストールします。
このツールにより、herokuへのログインやデプロイを行うコマンドのインストールを行います。

以下のURLを参考。
DL&Install

設定できたら、ログインする。

$ heroku login
Enter your Heroku credentials.
Email: xxxx@xxxxxx.xxx
Password:xxxxxx
Logged in as xxxx@xxxxxx.xxx

Herokuへアプリ作成

アプリのルートディレクトリで、以下のコマンドを実行。
アプリ名を省略するとherokuでランダムな名称のアプリを作成してくれます。

$ heroku create [アプリ名]

これにより、Heroku上にgitリポジトリを作成し、そのリポジトリにローカルgitリポジトリが紐付けられる。
ローカルgitのremoteへHeroku上のgitリポジトリが設定される。
デフォルトのpush先が指定されるわけですね。

アプリのデプロイ

もし、すでにデプロイ済みでデプロイ先を変更したい場合は、以下が参考になるかもしれません。
Heroku 接続先URLを変更する

以下のコマンドで、デプロイします。herokuに対して、masterブランチをpushします。 mavenタスクがダダダッと走ります。エラーなく、完了すれば、デプロイ完了です。

$ git push heroku master

・
・
・
remote:        https://new-app123.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/new-app123.git
 * [new branch]      master -> master

以下でデプロイアプリを確認できます。お疲れ様でした。

$ heroku open

もし、エラーが出る場合は、ログを確認してみると良いです。

$ heroku logs

【参考】DB設定

アプリ内でposgreSQLを使用する設定をpom.xmlに書いておくと、Herokuに勝ってにDBが作成されます。

pom.xml内のposgreSQLの設定

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>

flywayなどのマイグレーションを設定しておくとアプリデプロイ時にDB作成までやってくれますが flywayが未設定の場合は、テーブル作成やマスタデータ登録などが必要です。

ローカルにpsqlがインストールされていると以下のコマンドでheroku上のアプリのDBに接続できます。
この状態でSQLコマンドでテーブル作成をすると良いです。

$ heroku pg:plsql

・
・
--> Connecting to postgresql-xxx-11111
psql (9.5.0, server 9.6.1)
WARNING: psql major version 9.5, server major version 9.6.
         Some psql features might not work.
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

new-app123::DATABASE=> 

PostgreSQLの初期設定

PostgresSQLをインストール

$ brew install postgres

PostgreSQLサーバーの起動

自動起動の設定を以下で行います。

$ ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
/Users/user_name/Library/LaunchAgents/homebrew.mxcl.postgresql.plist -> /usr/local/opt/postgresql/homebrew.mxcl.postgresql.plist
~
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

停止したい場合は、以下コマンドを実行

$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

ログイン

% psql -U postgres
psql (9.5.0)
Type "help" for help.

※現時点、9.5.0は古いので最新を入れて下さい。。 10系を入れて下さい。

ロール(ユーザー)作成

今回は、postgres以外のユーザーが欲しかったので、以下で作成

postgres=# create role user_name with superuser createdb login password 'passString';
CREATE ROLE
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of
-----------+------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB              | {}
 user_name | Superuser, Create DB                           | {}

DB作成

一旦、¥qでログアウトした後、作成したユーザーで新しいDBを作成します。
¥lで作成DBを一覧で確認します。

postgres=# \q

$ psql -U user_name -d postgres
psql (9.5.0)
Type "help" for help.

postgres=# create database new_db;
CREATE DATABASE

postgres=# \l
                                 List of databases
     Name     |  Owner   | Encoding |   Collate   |    Ctype    | Access privileges
--------------+----------+----------+-------------+-------------+-------------------
 postgres     | postgres   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 new_db        | user_name  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |

あとは、テーブル作成、データ投入など行って、初期設定を整えて下さい。

Heroku 接続先URLを変更する

heroku リモートのリポジトリを消した場合、push先のURLを変更しないとpushできなくなる。

現状のリモートURLを確認する。

% git remote -v 
heroku  https://git.heroku.com/before-12345.git (fetch)
heroku  https://git.heroku.com/before-12345.git (push)

pushする際に、以下の様なコマンドを打つが、originにあたるのが、上記のheroku

git push origin master

以下のコマンド、push先のリモートURLを変更する。

git remote set-url heroku https://git.heroku.com/after-12345.git

変更完了したら、めでたく、pushができるようになります。
よかった。。

hostsの使い方

hostsファイル、よく使うファイルですが、 用途や使い方の理解が不十分かつ、よく忘れるので、備忘として記載します。

hostsファイルとは?

  • DNSより先に参照されるIPアドレスドメイン名の一覧のこと。
  • あるドメインのアクセス先IPを自分の端末だけ変更するために用いる。新サーバー構築時など。

ローカルでDNSサーバーのような役割を担う。
DNSサーバーはドメイン(www.google.co.jpなど)にIPアドレスを紐づけるサーバー

ファイルパス(Windows)

以下にhostsファイルが存在する。

c:¥windows¥system32¥drivers¥etc

使用例

DNSサーバーで指定しているロードバランサーを通さず直接、各Webサーバーにアクセスさせる

通常アクセスしているドメインにWebサーバーのIPを指定する。

192.168.122.5 abc.co.jp  

1つのアドレスに複数ドメインを指定して、複数のドメインを一つのサーバーにアクセスさせる

192.168.122.5 aaa.co.jp bbb.co.jp

192.168.122.5のサーバーに複数アプリを載せておき、指定ドメインでアクセスするアプリを切り替えることも可能です。

サーバー構築時(Appache+Tomcat)に知っておきたい設定ファイルやコマンド

1.Tomcatサーバー

設定ファイル server.xml

  • Tomcatサーバー動作を定義する設定ファイルです。
  • 配置パスは、/usr/local/tomcat/conf/以下や/opt/tomcat/conf以下に配置。
    $CATALINA_HOME\confディレクトリ配下に配置するのが一般的。

設定イメージ

<Engine ----->
  <Loggerタグの設定 ログX>
  <Host name="localhostA" >
    <Loggerタグの設定 ログY> <!-- ログXの設定は、ログYの設定で上書きされる -->
  </Host>
  <Host name="localhostB" >
  </Host>
</Engine>

2.Appacheサーバー

設定ファイル httpd.conf

  • Apache動作を定義する設定ファイルです。
  • 配置パスは、/etc/httpd/conf/。インストール時は、 /usr/local/apache2/conf/以下に配置されています。
  • /etc/httpd/conf.d/以下に拡張子が.confのファイルを配置すると、インクルードされます。 複数のアプリを配置する際などは、このconf.d/以下の設定ファイルを作成し、各アプリの設定を記載します。

設定ファイル内の3つのセクション

設定ファイル内の記載内容は以下のようなセクションがあります。

3つのセクション httpd.confの設定項目(ディレクティブ)は、その影響範囲によって主に下記の3つに分類されます。

Section1 GlobalEnvironment
Apache全体に影響を及ぼします
Section2 MainServerConfiguration
→ メインのサーバに影響を及ぼします。VirtualHost設定時のデフォルト値にもなります
Section3 VirtualHosts
→ 指定したドメイン/ホストに影響を与えます。MainServerConfigurationを上書きします
httpd.confについて調べたのでまとめたよ - ✘╹◡╹✘

httpd.confの設定例

Listen 80
ServerRoot "/etc/httpd"
DocumentRoot "/var/www/html/"

User  nobody
Group nobody
<IfModule prefork.c>
MaxClients       150
StartServers     5
MinSpareServers  5
MaxSpareServers 15
</IfModule>

<IfModule worker.c>
StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

MaxRequestsPerChild 0
ErrorLog logs/error_log

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

DocumentRoot以下がアプリの静的ファイルが置かれるディレクトリとなる。

config設定ファイルのシンタックス確認

http.confの文法チェックは以下のコマンドで行います。

$ /sbin/service httpd configtest
or
$ apachectl configtest
or
$ apache2ctl configtest

上記のコマンド実行時に、文法が正しいが正しい場合、「Syntax OK」と表示されます。

3. アプリサーバー構築時に確認する設定ファイル、コマンド

3.1 hosts

hostsファイルのパス:/etc/hosts

ファイル内容(例)

127.0.0.1  localhost
192.168.15.30 appweb.local

アプリにアクセスできない際、IPとドメインを指定する設定できていない場合があります。
その際は、hosts設定を見直します。

hostへのアクセス確認

% ping blog.hatena.ne.jp                                                                                                                   [14:59:20]
PING blog.hatena.ne.jp (52.68.15.58): 56 data bytes
64 bytes from 52.68.15.58: icmp_seq=0 ttl=234 time=53.195 ms
64 bytes from 52.68.15.58: icmp_seq=1 ttl=234 time=80.874 ms
64 bytes from 52.68.15.58: icmp_seq=2 ttl=234 time=94.243 ms
・
・
33 packets transmitted, 33 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 51.527/84.580/125.202/19.215 ms

33パケットを送信して、0%のパケットが喪失したことが上記で分かる。

3.2 httpアドレスへの接続確認

以下のコマンドでunix上から、URLへのアクセス可否を確認できる。

curl http://appweb.local:8080/

3.3 アプリのwar配備を確認

tomcatの場合、以下ディレクトリを参照して、warが配備されているかを確認

/usr/local/tomcat7/webapps

tomcat7の部分はバージョンが異なると変わる。

3.4 tomcat web アプリケーション マネージャー

以下URLにアクセスすることで、画面上でアプリのデプロイ状況を確認できます。
http://domain_name:8080/manager/html

ログインパスの確認場所

$CATALINA_HOME/conf/tomcat-users.xml

id,passwordの記載箇所は上記にあり。

3.5 ログの確認

デプロイができているがエラーが出ている場合は、アプリ内エラーを確認する。
出力先は、server.xmlの設定を確認。

server.xml

<Context path="/sampleAP" docBase="/home/sample/webapp">
  <Valve className="org.apache.catalina.valves.AccessLogValve" 
         directory="/var/log/web"
         prefix="access-"
         fileDateFormat="yyyy-MM-dd"
         suffix=".log"/>
</Context>

value内にディレクトリやファイル名の指定があります。