Webサービス作成までの道のり(その2)

##前回のあらすじ
Webサービス作成の経緯とサービス概要の大枠について話した。
詳しくは、こちら「[Webサービス作成までの道のり(その１)](https://qiita.com/shimatter/items/fc9de977f2ac523a6af5)」。

##今回の内容
今回は、サーバの環境構築を行った作業を載せていく。
作業内容は以下のようになる。
・OSインストール
・JDKインストール
・tomcatとApache httpdのインストールと自動起動設定
・tomcatに簡単にデプロイ出来るようにWebアプリーションマネージャの設定
・tomcatとApache httpdの連携
　Apacheにアクセスすることで、tomcatに処理を引き渡すことが出来るようにする

なぜ、流行りのNginxではなく、Apacheにしたのか。それは、今回のサービス内容と機能面から考えた結果、Apacheが好ましいと考えたからだ。
Nginxは、Apacheの抱えるC10K問題を解決する為に生まれたようだが、今回のサービスは、同時に1万人ものアクセスが行われるようなサービスではない。
そして、イベント駆動型のNginxはメモリ消費が少なく処理は早いが、はじめから多くの機能がついていない。ApacheであればWebサーバとしての機能がはじめから豊富に備わっているので、作業工数を省けて経験の浅い私でも構築し易いと考えたからだ。

##環境構築
###OSインストール
[VMwareにCentOS7.4インストール](https://qiita.com/shimatter/items/e4b8e0bad5b770eb3141)

上記リンクの手順で、CentOSをVMwareにインストールする。私は、普段からOSにはCentOSをメインで使っている。人気で言ったらUbuntuかもしれないが、そもそもLinuxはサーバ用途でしか使っていないので、GUIをメインで使うことがない。その為、Ubuntuに魅力を感じない。また、アップデート頻度の多いUbuntuには不安感を感じてしまう。
CentOSは、RHELクローンで安定感があり、エンタープライズ用として企業で使う頻度が高い為、今後の為にも慣れておきたいのはある。だが、一番は現場でRHELを使ってて一番使いやすいからというのが大きい。

###JDKインストール

```
# yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel 
```

###tomcatユーザ作成
セキュリティを考えてtomcat用の専用ユーザをログインシェルを作らずに作成

```
# useradd -s /sbin/nologin tomcat
```

###tomcatのダウンロード

```
# cd /opt
# wget http://ftp.riken.jp/net/apache/tomcat/tomcat-9/v9.0.8/bin/apache-tomcat-9.0.8.tar.gz
```

yumでもインストールは出来るが、デフォルトでtomcat7がインストールされた。yumリポジトリを編集すれば最新版をインストールできるだろうが面倒なので、直接パッケージをダウンロードして展開する。

###tomcatを展開

```
# tar -xvzf apache-tomcat-9.0.8.tar.gz 
```

###シンボリックリンク作成
バージョン変更も考えてtomcatディレクトリをシンボリックリンクで管理

```
# ln -s /opt/apache-tomcat-9.0.8 /opt/tomcat
```

###環境変数の設定
以下の内容を追加

```# vi /etc/profile```

```
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64
export JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64/jre
export CATALINA_HOME=/opt/tomcat
```

反映

```
# source /etc/profile
```

反映確認

```
# /opt/tomcat/bin/version.sh

Using CATALINA_BASE:   /opt/tomcat
Using CATALINA_HOME:   /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME:        /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64/jre
Using CLASSPATH:       /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/9.0.8
Server built:   Apr 27 2018 19:32:00 UTC
Server number:  9.0.8.0
OS Name:        Linux
OS Version:     3.10.0-693.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_171-b10
JVM Vendor:     Oracle Corporation
```

###firewall設定

現在の設定を確認

```
# firewall-cmd --list-services --zone=public --permanent

ssh dhcpv6-client
```

tomcatをここに追加していく

サービス追加
新規ファイルを作成し、以下の内容を追加

```# vi /etc/firewalld/services/tomcat.xml```

```
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Apache Tomcat 9</short>
  <description>Apache Tomcat 9</description>
  <port protocol="tcp" port="8080"/>
</service>
```

設定を反映

```
# firewall-cmd --add-service=tomcat --zone=public --permanent
# firewall-cmd --reload
```

確認

```
# firewall-cmd --list-services --zone=public --permanent
ssh dhcpv6-client tomcat
```

###SELinux無効化
SELINUXをdisabledに変更

```# vi /etc/selinux/config```

```
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
```

再起動

```
# reboot
```

再起動後に設定確認

```
# getenforce
  Disabled
```

###tomcat起動

```
# /opt/tomcat/bin/startup.sh
Using CATALINA_BASE:   /opt/tomcat
Using CATALINA_HOME:   /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME:        /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64/jre
Using CLASSPATH:       /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar
Tomcat started.
```

ブラウザでも起動を確認
http://localhost:8080
[![https://gyazo.com/56aab39d87ab6e6c5b058efd195376e0](https://i.gyazo.com/56aab39d87ab6e6c5b058efd195376e0.png)](https://gyazo.com/56aab39d87ab6e6c5b058efd195376e0)

###tomcat自動起動設定
新規ファイルでtomcatのサービスファイルを作成

```# vi /etc/systemd/system/tomcat.service```

```
[Unit]
Description=Apache Tomcat 9
After=network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/tomcat/tomcat.pid
RemainAfterExit=yes

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh                                            ExecReStart=/opt/tomcat/bin/shutdown.sh;/opt/tomcat/bin/startup.sh

[Install]
WantedBy=multi-user.target
```

反映

```
# systemctl daemon-reload
```

自動起動有効

```
# systemctl enable tomcat
```

user,groupはtomcatに変更

```
# chown -R tomcat:tomcat /opt/tomcat
```


自動起動の確認

```
# reboot
```

再起動後にステータスを確認。activeになっていること。

```
# systemctl status tomcat 
● tomcat.service - Apache Tomcat 9
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited)
```

念の為、pcブラウザで表示確認
http://[IPアドレス]:8080

###Webアプリケーションマネージャの設定
webアプリの配備や管理をGUIで行えるようにする。
以下の記述をファイルに追加。※XXXXは自身の設定したい管理者名とパス

```# vi /opt/tomcat/conf/tomcat-users.xml ```

```
<role rolename="manager-gui"/>
<user username="XXXX" password="XXXX" roles="manager-gui"/>
```

外部端末からもアクセスを可能にする。
現状では、localhostからしかアクセスできない為、allowの設定を修正

```# vi /opt/tomcat/webapps/manager/META-INF/context.xml```


```
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="\d+\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
```

再起動し、設定反映

```
# systemctl restart tomcat
```

外部からアクセス
http://IPアドレス:8080/manager/html
[![https://gyazo.com/fd312f8dc485aa6a6e44b7270cc5b0a7](https://i.gyazo.com/fd312f8dc485aa6a6e44b7270cc5b0a7.png)](https://gyazo.com/fd312f8dc485aa6a6e44b7270cc5b0a7)

無事、表示されればOK

###Apache httpdのインストールと設定
インストール

```
# yum install httpd
```

確認

```
# httpd -version
Server version: Apache/2.4.6 (CentOS)
Server built:   Apr 20 2018 18:10:38
```

firewall設定

```
# firewall-cmd  --add-service=http  --permanent
# firewall-cmd --reload
```

Apache自動起動設定

```
# systemctl enable httpd
```

設定確認
enabledになっていることを確認

```
# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
```

サービス起動確認
reboot後、ステータスを確認

```
# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running)
```


###AJPプロトコルでapacheとtomcatの連携

AJPプロトコルの設定があることを確認

```# view /opt/tomcat/conf/server.xml```

```
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
```

モジュールの有効設定
以下の2つのモジュールを確認。コメントされていれば、コメントをとる。

```# vi /etc/httpd/conf.modules.d/00-proxy.conf```

```
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
```

これだけでは、有効にしただけなので、続けてApache httpdのリクエストをすべてtomcatに引き渡す為の設定を追加。
```
ProxyPass / ajp://localhost:8009/
```

Apache httpdの再起動を行い、起動を確認

```
# systemctl restart httpd
```
[![https://gyazo.com/2fe182fbafc4bd9b07cbbe83609221ed](https://i.gyazo.com/2fe182fbafc4bd9b07cbbe83609221ed.png)](https://gyazo.com/2fe182fbafc4bd9b07cbbe83609221ed)

ポートを8080にしなくてもApache httpdから引き渡され、tomcatを起動できることを確認

今回の作業では、tomcatのWebアプリケーションマネージャの外部アクセスがハマリポイントだった。設定ファイルの格納先が、ググッて出てきたものの多くがハズレで、経験豊富な上司に相談して、やっと解決できた。
これで、一旦、サーバサイドの環境構築は完了。データベースに関しては、テーブル設計も絡んでくるのでjava開発時にまとめて行うこととする。
次回は、html、Bootstrapあたりの作業をまとめて、掲載する予定。