VPSにWebApplicationServer(Java)を構築する

Serverのお勉強のためにWebServerを構築し、JavaApplicationを実行するところまでやってみた。


# 目次
1. 動作環境
2. やること
3. 構築手順
4. 参考サイト


# 1. 動作環境
- Cent OS7

# 2. やること
調べたところ、以下をすれば、とりあえず動かすことはできるみたい。

- Javaの実行環境構築
- サーブレットコンテナの準備
- WebServerの構築
- Javaアプリケーションの配置

# 3. 構築手順
### Javaの実行環境構築
サーバー上でJava実行を実行するために、JDKをインストールする。
以下のサイトが分かりやすかった。
■参考： [CentOS 7 に Tomcat 9 を入れてみた](https://www.kagoya.jp/cloud/vps/tutorial/03.html)

サーバーで以下のコマンドを実行してインストール(JDK8)。

```
# yum install java-1.8.0-openjdk-devel.x86_64
```

（他のJDKを検索したい場合は、以下コマンドを実行。）

```
# yum search openjdk
```

インストールされていることを以下コマンドで確認。

```
# java -version
```

以下のような出力が出ればOK。

```
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
```



### サーブレットコンテナの準備
Javaサーブレット（サーバー上で動作するJavaプログラム）を動かすために、サーブレットコンテナであるtomcatをインストールする。tomcatってよく聞くけど、よくわからないまま使ってました・・・
まず、Tomcat を動かすためのユーザーを追加(ユーザー名:tomcat)。

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

※　/sbin/nologin はログインできないユーザーを意味するらしい。ここで作ったユーザー「tomcat」は、サービス起動用のスクリプト？（systemd）で使うだけなので、ログインできる必要がないっぽい。


■参考：[ログインできないユーザでコマンドを実行する方法＋おまけ](https://qiita.com/riekure/items/27e07258a5a3ac4bd3fa)

次に、Tomcatのインストールのため、ファイルをサーバーにダウンロード。

```
＃ curl -O https://ftp.jaist.ac.jp/pub/apache/tomcat/tomcat-9/v9.0.37/bin/apache-tomcat-9.0.37.tar.gz
```

※　「https://ftp.jaist.ac.jp/pub/apache/tomcat/tomcat-9/v9.0.37/bin/apache-tomcat-9.0.37.tar.gz」の部分は変わる可能性あり。以下で確認。
[tomcatのダウンロードサイト](http://tomcat.apache.org/download-90.cgi)

ダウンロードしたファイルを以下コマンドで解凍。

```
# tar -xzvf apache-tomcat-9.0.37.tar.gz
```

以下コマンドで/usr/local/tomcat に移動。

```
# mv apache-tomcat-9.0.37 /usr/local/tomcat
```

以下コマンドでユーザー所有者：グループ所有者を先ほど作成したユーザー「tomcat」に変更

```
# chown -R tomcat:tomcat /usr/local/tomcat
```

Tomcatをサーバーが実行可能なサービスとして認識させるため、以下のコマンドでsystemd unit ファイルを作成する。
※ CentOS7からsystemd というので、サービスを管理しているらしい。

■参考：[これからSystemd入門する](https://qiita.com/bluesDD/items/eaf14408d635ffd55a18)

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

作成したファイルに以下の内容を記載し、保存。
正直、内容はよくわかってない。こういうサービスを作るよ、ってことを宣言してるという理解。

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

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

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

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

さらに、作成したファイルの読み込み権限・書き込み権限・実行権限を設定する

```
# chmod 755 /etc/systemd/system/tomcat.service
```
※「所有者:読み込み・書き込み・実行可能」「所有グループ：読み込み・実行可能」「それ以外（他人）：読み込み・実行可能」を設定している

■参考：[【 chmod 】コマンド――ファイル／ディレクトリのパーミッション（許可属性）を変更する](https://www.atmarkit.co.jp/ait/articles/1605/23/news020.html)


自動起動設定をし、サービスを有効にする

```
# systemctl enable tomcat
Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /etc/systemd/system/tomcat.service.
```

```
# systemctl start tomcat
```
Tomcatを起動する。

以下のURLにアクセスし、tomcatデフォルトの画面が出たらOK。

[http://サーバーのIPアドレス:8080/](http://[サーバーのIPアドレス]:8080/)

<img width="1185" alt="スクリーンショット 2020-07-25 18.18.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164721/19233170-b7d4-2727-acf6-2c7bd2d13fe7.png">

### WebServerの構築
本来ならApatch HTTPサーバーを導入するのが良いみたいだが、
TomcatにもWebServerの機能があるようなので、それを使用する（ため、特にインストールしない）。
じゃあ、そもそもApatch HttpServerなんでいらないのでは、と思ったが、tomcatのWebサーバーはおまけみたいなものらしく、パフォーマンスとか考えると、あったほうが良いらしい。

■参考：[【社内勉強会】ApacheとTomcat(2017/03/09)](https://qiita.com/yuji38kwmt/items/267d4ce618e80785f03d)

### Javaアプリケーションの配置
javaアプリケーションはインストールしたTomcat直下のwebapps（/usr/local/tomcat/webapps/）に配置すれば良いらしい。
この辺も普段意識してないので、よくわからなかった。
以下のサイトがとても分かりやすかった。

■参考：[TomcatでHelloWorld](https://www.searchman.info/java_eclipse/1040.html)

とりあえず、以下のコマンドでプロジェクトフォルダを作成

```
# mkdir /usr/local/tomcat/webapps/javaproject
```

あとはclassファイルとweb.xmlを作成する。
以下のコマンドで、classesディレクトリを作成。

```
# mkdir /usr/local/tomcat/webapps/javaproject/WEB-INF/classes
```

以下のコマンドで、javaソースファイルを作成。

```
# vi /usr/local/tomcat/webapps/javaproject/WEB-INF/classes/HelloWorld.java
```

以下の通り編集して保存する。

```java:HelloWorld.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {
    public void doGet(HttpServletRequest request,
    HttpServletResponse response) throws IOException, ServletException {
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("HelloWorld");
        out.println("</html>");
        out.close();
    }    
}
```

以下のコマンドでコンパイルする。

```
# cd /usr/local/tomcat/webapps/javaproject/WEB-INF/classes/
# javac -classpath /usr/local/tomcat/lib/servlet-api.jar HelloWorld.java 
```

同じディレクトリにHelloWorld．classができてたらOK。
あとはweb.xmlを作成して、URLとservletの紐付けする。
以下のコマンドで、web.xmlを作成。

```
# vi /usr/local/tomcat/webapps/javaproject/WEB-INF/web.xml
```

以下の通り編集して保存する

```xml:web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>
hello
</servlet-name>
<url-pattern>
/servlet/hello
</url-pattern>
</servlet-mapping>

</web-app>
```

やっと終わりに近づいてきた。ハマりまくったので長かった・・・
以下のコマンドでtomcatを再起動します。

```
# systemctl restart tomcat
```

以下のURLにアクセスして、HelloWorldが表示されるとOKです！

[http://サーバーのIPアドレス:8080/javaproject/servlet/hello](http://[サーバーのIPアドレス]:8080/javaproject/servlet/hello)
<img width="1260" alt="スクリーンショット 2020-07-25 22.32.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164721/08af59ae-bf61-4950-bf31-6a5d7529654b.png">