はじめてのWebサーバ構築（centOS Stream 9, Java 11, tomcat 9, サーブレット)

# はじめてのWebサーバ構築

## 1\. 前提条件
### 済ませておくこと
- さくらのVPS [サーバ申込を済ませておく]
- お名前.com [ドメイン申込を済ませておく]
※さくらVPSサーバのグローバルIPが分かり次第Aレコードの設定を済ませておく]
- Tera Term 5 [インストールを済ませておく]

### このページで設定するもの
- centOS Stream 9
- javaEE 11
- tomcat 9.0.88


## 2\. VPSサーバの設定

さくらのVPSサーバの設定は以下の通り。
![さくらのvps01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781397/23bd34da-3017-90b6-b493-7aee68e3a4e8.png)
![さくらのvps02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781397/9fa8e6ff-e48c-a8c3-a161-75d6eb5c3c64.png)

※追記
パケットフィルター設定では、「フィルターの種類」にWeb（TCP 80, 443)を「すべて許可する」で追加してください。

## 3\. Tera Termより、初期ユーザcentosでログイン
![Tera Term5 01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781397/339c2f6e-d49b-39b6-f0f8-dffed04686cd.png)
![Tera Term5 02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781397/fd5890a7-d48b-a75c-d5eb-fbe4285d44b6.png)
![Tera Term5 03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781397/eee1b807-7d4d-b567-abaa-659b7379f352.png)
※パスフレーズはさくらのVPSで設定した「管理ユーザーのパスワード」です。


```rb
[sentos@hostname ~]# sudo -s  #rootに変更
[root@hostname ~]# useradd somebody  #一般ユーザsombody（例）の作成
[root@hostname ~]# passwd somebody   #sombodyユーザーのパスワード設定
[root@hostname ~]# cat /etc/passwd   #ユーザ一覧の確認
[root@hostname ~]# usermod -G wheel somebody    #管理者ユーザをwheelグループに追加
```
※なお、Tera Termではコピペが可能です。ペーストはTera Term上で右クリックしてください。

このあと、一度exitコマンドで接続を切断し、作成したユーザー名で入り直します。その後、デフォルトで作成したcentosユーザを削除します。

```rb
[somebody@hostname ~]# sudo -s
[root@hostname ~]# userdel centos
```

:::note warn
・ここではssh接続についての説明を省略しています
・管理者の制限は別で行ってください。
:::

## 4\. Apacheのインストール

この設定は以下ページを参照。
[Apache httpd : インストール](https://www.server-world.info/query?os=CentOS_Stream_9&p=httpd&f=1)

```rb
dnf -y install httpd
```
ウェルカムページの名前を変更
```rb
mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.org
```
httpdの設定
```rb
vi /etc/httpd/conf/httpd.conf
```
httpdの設定は以下の通り
```rb
# 91行目 : 管理者アドレス指定
ServerAdmin root@(ドメイン名)
# 100行目 : コメント解除しサーバー名指定
ServerName (ドメイン名):80
# 149行目 : 変更 (Indexes は削除)
Options FollowSymLinks
# 156行目 : 変更
AllowOverride All
# 169行目 : 必要に応じて追記 (ディレクトリ名のみでアクセスできるファイル名)
DirectoryIndex index.html index.php index.cgi index.jsp
# 最終行に追記
# サーバーの応答ヘッダ
ServerTokens Prod
```

## 5\. JAVA JDKのインストール

以下、設定はこちらのページを参考に実行しました。
なお、Tomcatのバージョンを10から9に変更しています。

[How to Install Apache Tomcat Server on CentOS Stream 9 Tutorial（英文）](https://cloudinfrastructureservices.co.uk/how-to-install-apache-tomcat-server-on-centos-stream-9-tutorial/)

```rb
dnf install java-11-openjdk-devel -y
```
## 6\. javaがインストールできているか、バージョン確認

```rb
java --version
```
このような表示を確認できるはず（上のページより抜粋）
```rb
openjdk 11.0.15 2022-04-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.15+9-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.15+9-LTS, mixed mode, sharing)
```

## 7\. Tomcatのインストール

まず、tomcatユーザを作成します。セキュリティ目的です。
```rb
useradd -m -U -d /opt/tomcat -s /bin/false tomcat
```
tomcat9の最終バージョンの確認

[Apache Tomcat](https://tomcat.apache.org/download-90.cgi)
※2024.5.7現在ではver9.0.88が最新のようです。ver10も存在しますがecripsの開発環境と揃える目的でver9を選択します。

### wgetコマンドのインストール
インストール済みでないことを確認してインストールします。
```rb
yum list installed | grep wget   #ここで何も表示されないことを確認
yum -y install wget
```

### tomcatのインストール
```rb
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.88/bin/apache-tomcat-9.0.88.tar.gz
```

成功すると、以下のような表示を確認できます。
※上のページより抜粋なので、ver10になっています
```rb
--2022-05-19 15:51:50--  https://dlcdn.apache.org/tomcat/tomcat-10/v10.0.21/bin/apache-tomcat-10.0.21.tar.gz
Resolving dlcdn.apache.org (dlcdn.apache.org)... 151.101.2.132, 2a04:4e42::644
Connecting to dlcdn.apache.org (dlcdn.apache.org)|151.101.2.132|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11928158 (11M) [application/x-gzip]
Saving to: ‘apache-tomcat-10.0.21.tar.gz’

apache-tomcat-10.0.21.tar.gz        100%[=================================================================>]  11.38M  64.9MB/s    in 0.2s

2022-05-19 15:51:50 (64.9 MB/s) - ‘apache-tomcat-10.0.21.tar.gz’ saved [11928158/11928158]
```

### tarコマンドのインストール
```rb
yum list installed | grep tar   #ここでtarだけのインストールを確認できないならインストールする
yum -y install tar
```

ダウンロードしたファイルをひとまとめにする
```rb
tar -xvzf apache-tomcat-9.0.88.tar.gz -C /opt/tomcat/
```

tomcatが保存されたディレクトリに行き、名前をシンプルなものに変更する
```rb
cd /opt/tomcat
mv apache-tomcat-9.0.88 tomcat9
```

tomcatディレクトリの所属を変更する
```rb
chown -R tomcat:tomcat /opt/tomcat
```

## 8\. Serviceファイルを作成する

viコマンドでserviceファイルを作成する
```rb
vi /etc/systemd/system/tomcat.service
```

中身は以下の通り
```rb
[Unit]
Description=Apache Tomcat 9 Servlet container
Wants=network.target
After=network.target

[Service]
Type=forking

User=tomcat
Group=tomcat

Environment="JAVA_HOME=/usr/lib/jvm/jre"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"

Environment="CATALINA_BASE=/opt/tomcat/tomcat9"
Environment="CATALINA_HOME=/opt/tomcat/tomcat9"
Environment="CATALINA_PID=/opt/tomcat/tomcat9/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"

ExecStart=/opt/tomcat/tomcat9/bin/startup.sh
ExecStop=/opt/tomcat/tomcat9/bin/shutdown.sh
Restart=always

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

viの書き込みから保存、編集終了までは以下の通り。
i     ：書き込みモード開始
Esc   ：書き込みモード終了
:w    ：保存
:q    ：編集の終了

編集したServiceファイルを機能させるためdaemonを再起動します。
```rb
systemctl daemon-reload
```

Tomcatがシステム再起動の度に自動的に起動するよう設定します。
```rb
systemctl enable tomcat --now
```

Tomcatが稼働しているか、以下のコマンドで確認します。
```rb
systemctl status tomcat
```

成功すると、以下のような表示を確認できます。
※上のページより抜粋なので、ver10になっています
```rb
● tomcat.service - Apache Tomcat 10 Servlet container
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2022-05-19 15:53:18 UTC; 6s ago
  Process: 1945 ExecStart=/opt/tomcat/tomcat10/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 1952 (java)
    Tasks: 29 (limit: 23696)
   Memory: 156.6M
   CGroup: /system.slice/tomcat.service
           └─1952 /usr/lib/jvm/jre/bin/java -Djava.util.logging.config.file=/opt/tomcat/tomcat10/conf/logging.properties -Djava.util.logging.>

May 19 15:53:18 centos systemd[1]: Starting Apache Tomcat 10 Servlet container...
May 19 15:53:18 centos systemd[1]: Started Apache Tomcat 10 Servlet container.
```

## 9\. リモートログインを使用できるようにする

Tomcatを使用するためのユーザー（manager, admin）を追加する
```rb
vi /opt/tomcat/tomcat9/conf/tomcat-users.xml
```
当ファイルの一番下</tomcat-users>の上に以下を挿入、保存して終了する。
```rb
<role rolename="manager-gui"/>
    <user username="manager" password="managerpassword" roles="manager-gui" />
<role rolename="admin-gui"/>
    <user username="admin" password="adminpassword" roles="admin-gui"/>
```

現状ではローカルホストしかアクセスできないため、xmlファイルを編集します。
```rb
vi /opt/tomcat/tomcat9/webapps/manager/META-INF/context.xml
```
ファイル中段（21行目あたり）に、以下の表示があります。
```rb
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
```

これを、コメントアウト（\<!-- -->で囲む）をします。
```rb
<!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
```

tomcatを再起動します。
```rb
systemctl restart tomcat
```

## 10\. Nginx（エンジンエックス）の設定を行う
※nginxとは、Webサーバの一つです。2024年2月の記事ではApacheに置き換わる存在のようです。
参考：
[NGINXとはどんなソフトウェア？Apacheとは何が違うのか](https://hnavi.co.jp/knowledge/blog/nginx/)

Nginxをインストールする
```rb
dnf install nginx -y
```

Nginxを起動、システム再起動の度に自動的に起動するよう設定します。
```rb
systemctl start nginx
systemctl enable nginx
```

Tomcat用のNginx Virtual Hostを作成します。
```rb
vi /etc/nginx/conf.d/tomcat.conf
```

tomcat.confの中身は以下の通りです。
```rb
server {
    listen       80;
    server_name  tomcat.example.com; #自身のドメイン名を入力

    access_log  /var/log/nginx/tomcat.access.log;
    error_log   /var/log/nginx/tomcat.error.log;


    location / {
      proxy_pass http://127.0.0.1:8080;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}
```

以下のコマンドで構文エラーを見つけてくれます。
```rb
nginx -t
```

成功していれば、以下のようなコメントを見ることが出来ます。
```rb
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

Nginxを再起動します。
```rb
systemctl restart nginx
```

Nginxの状態を確認します。
```rb
systemctl status nginx
```

成功すると、以下のような表示を確認できます。
※上のページより抜粋です。
```rb
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2022-05-19 15:55:42 UTC; 13s ago
  Process: 4657 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 4654 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 4652 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 4658 (nginx)
    Tasks: 3 (limit: 23696)
   Memory: 5.0M
   CGroup: /system.slice/nginx.service
           ├─4658 nginx: master process /usr/sbin/nginx
           ├─4659 nginx: worker process
           └─4660 nginx: worker process

May 19 15:55:42 centos systemd[1]: nginx.service: Succeeded.
May 19 15:55:42 centos systemd[1]: Stopped The nginx HTTP and reverse proxy server.
May 19 15:55:42 centos systemd[1]: Starting The nginx HTTP and reverse proxy server...
May 19 15:55:42 centos nginx[4654]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
May 19 15:55:42 centos nginx[4654]: nginx: configuration file /etc/nginx/nginx.conf test is successful
May 19 15:55:42 centos systemd[1]: Started The nginx HTTP and reverse proxy server.
```

## 11\. ファイアーウォールの設定

ファイアーウォールをを起動、システム再起動の度に自動的に起動するよう設定します。
```rb
systemctl start firewalld.service
systemctl enable firewalld.service
```

ファイアーウォールを設定します。
```rb
firewall-cmd --runtime-to-permanent
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
```

ファイアーウォールを再起動します。
```rb
firewall-cmd --reload
```

## 12\.確認

tomcatのテストページが表示されることを確認してください。
![tomcat 01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781397/310f91f6-3181-1684-7bbb-1801c5d766c8.png)
また、ページ右側の[Manager App]や[Host Manager]に、上で作成したユーザ
user username="manager" password="managerpassword"
user username="admin" password="adminpassword"
でログインできるかどうかを確認してください。

## 13\.アプリケーションをデプロイする
アプリケーションは、特定のディレクトリにwarファイルを設置することで稼働させることが出来ます。

:::note info
warファイルを準備してください。
:::

:::note warn
・ここではwarファイルの生成は割愛します。Ecripsから生成することが可能です。
:::

作成したwarファイルをTera Term上にドラッグ&ドロップしてください。

ユーザ(rootでない)のルートフォルダに転送できます。

作成したユーザのルートディレクトリに移動し、warファイルが存在することを確認してください。
warファイルをtomcatが保存されているディレクトリ内の、webappsディレクトリに移動させます。

```rb
mv (準備したファイル名).war /opt/tomcat/tomcat9/webapps
```

最後に、webアプリが表示されたことを確認します。
ブラウザを用いて、以下にアクセスしてください。

```rb
http://(サーバ名).(ドメイン名)/(アプリケーション名)/(最初に表示するファイル名)
```

※(最初に表示するファイル名)をindex.jspにしておけば(アプリケーション名）までの表示でOKです。

## 13\.おわりに
これが初めての投稿です。
誰かのお役に立ちますように。