1
2

More than 1 year has passed since last update.

ポートフォリオ作成の過程で学んだ技術を振り返る ~Webサーバ構築編~

Last updated at Posted at 2022-05-08

はじめに

 Javaのポートフォリオ作成の過程でWebサーバを構築する必要があり、リバースプロキシからSSL証明書の設定,取得までの手順をまとめました。自身の備忘録として、linuxコマンドやオプションの意味も一部まとめております。

前提

 AWSにて、以下の環境が構築されている前提で話を進めます。ドメインを取得し、Route53にDNSレコードを設定済みです。
 EC2にはnginxをインストールしているだけになります。この状態からtomcatをインストールし、リバースプロキシ、ssl証明書の取得,設定を行っていきます。
sample.jpg
こちらのサイトを参考に、tomcatのインストールを行いました。

nginx

オープンソースなWebサーバ。
特徴や他ソフトウェアとの比較は、こちらの記事が分かりやすいです。

Tomcat

Javaのwebアプリを動かすソフトウェア。
当初私は「tomcatだけでアプリ動かせるなら、nginxインストールしなくてもいいんじゃ?」と思っていましたが、こちらの記事を読んで両方必要だと学びました。

Tomcatをインストール~設定

何はともあれ、まずはインストール

$ cd ~
$ wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-9/v9.0.60/bin/apache-tomcat-9.0.60.tar.gz

wgetは、HTTPアクセスをしてコンテンツをファイルに保存するコマンド。
「wget URL」と命令する。

ファイルを解凍

$ tar -xzvf ~/apache-tomcat-9.0.60.tar.gz

tarは、複数のファイルを1つのアーカイブファイルにまとめたり、逆に展開したりするコマンド。
以下オプションコマンドの内容
 -x:アーカイブファイルを展開する
 -z:圧縮または展開を同時に行う
 -v:処理の進行しているファイル名を表示する
 -f:アーカイブファイル名をパラメータで指定する

解凍したファイルを移動

$ sudo mv ~/apache-tomcat-9.0.60 /opt

mvは、ファイルを移動させるコマンド。
「mv ファイル名 移動先ディレクトリ名」と命令する。

/opt is どこ?

OSの一番上の階層(ルートディレクトリ)の一つ下にあるフォルダ。
参考にした記事によると、「パッケージ管理ツール以外でインストールしたディレクトリ構造になっているアプリケーションの格納先に適している」そう。

シンボリックリンクを作成

$ sudo ln -s /opt/apache-tomcat-9.0.60 /opt/tomcat

lnは、ファイルのリンクを作成するためのコマンド。
「ln リンク元 登録名」と命令する。
-sオプションによって、シンボリックリンクが作成される。

シンボリックリンク is 何?

ファイルに別名をつけ、異なった名前でファイルにアクセスする仕組み。いわゆるショートカット。
上記コマンドでは、「/opt/tomcat」という別名で「/opt/apache-tomcat-9.0.60」にアクセスすることが出来る。

Tomcat用のユーザー作成

$ sudo useradd -s /sbin/nologin tomcat

useraddは、新規ユーザーを作成しユーザーごとの設定を決めるコマンド。
「useradd [オプション] ユーザー名」と命令する。
-sオプションによって、ログインシェルを指定できる。

ログインシェル is 何?

ログインして最初に動き出すシェル(プログラム)のこと。
「/sbin/nologin」は、ユーザログインを拒否する(不正なログインを防ぐイメージ?)。

フォルダの所有者を設定

$ sudo chown -R tomcat:tomcat /opt/apache-tomcat-9.0.60

chownは、指定したファイルやディレクトリのユーザー所有権を変更するコマンド。
「chown 所有者名:[グループ] ファイル名またはディレクトリ名」と命令する。
-Rオプションによって、ディレクトリ内の所有者も変更する。

サービス登録

$ sudo vi /etc/systemd/system/tomcat.service

viは、テキストエディタを起動するコマンド。
linixにおけるサービスとは「アプリケーション」のことで、サービス登録すると「systemctl 〇〇 サービス名」というコマンドが使えるようになる。

tomcat.serviceに記述する内容
tomcat.service
[Unit]
 Description=Apache Tomcat 9
 After=network.target
[Service]
 User=tomcat
 Group=tomcat
 Type=oneshot
 PIDFile=/opt/apache-tomcat-9.0.60/tomcat.pid
 RemainAfterExit=yes
 ExecStart=/opt/apache-tomcat-9.0.60/bin/startup.sh
 ExecStop=/opt/apache-tomcat-9.0.60/bin/shutdown.sh
 ExecReStart=/opt/apache-tomcat-9.0.60/bin/shutdown.sh;/opt/apache-tomcat-9.0.60/bin/startup.sh
[Install]
 WantedBy=multi-user.target

実行権限を与える

$ sudo chmod 755 /etc/systemd/system/tomcat.service

chmodは、ファイルの権限や所有者を変更するコマンド。
「chmod 設定するパーミッション ファイルorディレクトリ」と命令する。

$ sudo systemctl enable tomcat
$ sudo systemctl start tomcat

起動時の登録、実行を確認する。

パーミッションの数字について

3桁の8進数で「所有者・グループ・その他ユーザー」の順に指定でき、権限に対応した数値を足し合わせて表現する。

数値 権限
4 読み取り
2 書き込み
1 実行

今回のコマンドの場合は、
所有者:7 = 4 + 2 + 1 : 読み取り&書き込み&実行権限
グループ:5 = 4 + 1 : 読み取り&実行権限
その他ユーザ:5 = 4 + 1 : 読み取り&実行権限

リバースプロキシ

設定完了後にtomcatを起動してURLを叩いても、Nginxのデフォルトページが表示されてしまいます。tomcatでJavaのwebアプリを起動する予定なので、リクエストをtomcatで処理できるようにするために、「リバースプロキシ」を行います。
Wikipediaでリバースプロキシの意味を調べると、

リバースプロキシ(英: Reverse proxy)または逆プロキシは、特定のサーバへのリクエストが必ず通過するように設置されたプロキシサーバである。一般的なプロキシとは逆で、不特定多数のクライアントのアクセスに備えて特定のサーバー専用に設けられる。クライアントに取ってはサービスの窓口として機能し、普通はクライアントがリバースプロキシを意識することはない。

...なるほど分からん。。。

なるほど分かった!
自分なりに解釈して図で表してみました。
qiita-linux.png

Nginxでリバースプロキシの設定

$ sudo vim /etc/nginx/nginx.conf

confファイルの設定を変更します(修正箇所とその周辺だけ載せます)。

nginx.comf
#
server {
        listen       80;
        listen       [::]:80;
        server_name  ~~実際のドメイン名~~;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location /{
            proxy_pass https://localhost:8080; #追加
        }
#
}

serverコンテキスト内のlocationに「proxy_pass https://localhost:8080」を追加しました。これでポート80でNginxにアクセスが来た場合、ポート8080(tomcat)のページを返すようになります。
URLを叩いて、tomcatのデフォルトページが表示されればOK!

SSL接続

アドレスにアクセスするとURLの左側に「保護されていない通信」と表示されています。このままアプリをリリースしても、怪しまれて誰も利用してくれませんね。。

SSLサーバ証明書があると「ウチのサイトは個人情報などの通信データを暗号化しています。安全して利用できますよ」とユーザに証明できるわけです。
こちらの方々を参考に、SSL設定を行いました。
https://youtu.be/13NTn6WiQvU
https://ti-tomo-knowledge.hatenablog.com/entry/2018/08/03/203726

EC2の443ポートの解放

EC2に紐づくセキュリティグループに、HTTPS通信を許可するように設定を追加します。
Inkedqiita-linux3_LI.jpg

SSL証明書の取得

リバースプロキシで設定した「proxy_pass https://localhost:8080;」は#でコメントアウトしておきます。

$ sudo yum install -y certbot python3-certbot-nginx

certbotという、SSL証明書を無料で発行してくれるツールをインストールします。

$ sudo certbot certonly --webroot -w /usr/share/nginx/html --debug -d ~~~実際のドメイン名~~~ --email ~~~実際のメースアドレス~~~

SSL証明書を取得します。オプションが多い。。。

SSL設定

$ sudo vim /etc/nginx/nginx.conf

リバースプロキシの時は、serverのポート80のlocationを修正しました。ファイルの下のほうに、serverのポート443がコメントアウトされているので、今回はそこも修正します。

nginx.conf
    server {
        listen       80;
        listen       [::]:80;
        server_name  ~~実際のドメイン名~~;
        #root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
         include /etc/nginx/default.d/*.conf;

         location /{
          # proxy_pass https://localhost:8080;
            return 301 https://~~実際のドメイン名~~; #追加
         }
    }
    server {
        listen       443 ssl http2 default_server; #修正
        listen       [::]:443 ssl http2 default_server; #修正
        server_name  ~~実際のドメイン名~~;
        root         /usr/share/nginx/html;

        ssl_certificate "/etc/letsencrypt/live/~~実際のドメイン名~~/cert.pem"; # 追加
        ssl_certificate_key "/etc/letsencrypt/live/~~実際のドメイン名~~/privkey.pem"; # 追加

 #        ssl_certificate "/etc/pki/nginx/server.crt";
 #        ssl_certificate_key "/etc/pki/nginx/private/server.key";
 #        ssl_session_cache shared:SSL:1m;
 #        ssl_session_timeout  10m;
 #        ssl_ciphers PROFILE=SYSTEM;
 #        ssl_prefer_server_ciphers on;
 #
        # Load configuration files for the default server block.
        # include /etc/nginx/default.d/*.conf;

        location /{ 
            proxy_pass http://localhost:8080; #追加
            proxy_redirect http:// https://; #追加
        } 

ポート80でNginxにアクセスが来た場合はポート443(https)へリダイレクトし、ポート443へアクセスが来た場合はポート8080(tomcat)のページを返すようになります。

動作確認

SSL接続できていれば、アドレスの左側に鍵マークが付きます。
Inkedqiita-linux2_LI.jpg

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2