🦈

NGINXをdocker-composeで構築し、HTTPSで公開する

2022/01/31に公開

みなさんこんにちは

本日のお題

Web アプリを作るに当たって、Webアプリケーションを動作させるためのサーバーが必要です。
今回はとりあえず、NGINXで構築します。
少し期間が空きましたが、風邪ひいたり、仕事が忙しかったり、node.jsでもたついたりと、お時間をいただくことになってしましました。

NGINXのインストール

dockerに導入するにあたり、docker hubから導入させていただこうと思います。
https://hub.docker.com/_/nginx

[root@meet nginx]# pwd
/opt/nginx
[root@meet nginx]# ls
[root@meet nginx]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
5eb5b503b376: Pull complete
1ae07ab881bd: Pull complete
78091884b7be: Pull complete
091c283c6a66: Pull complete
55de5851019b: Pull complete
b559bad762be: Pull complete
Digest: sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

[root@meet nginx]# docker images
REPOSITORY      TAG             IMAGE ID       CREATED       SIZE
nginx           latest          c316d5a335a5   4 days ago    142MB
[root@meet nginx]#

docker-compose ファイルの作成

volumesで設定に必要なゲストOS上のファイルを、ホストOSに連結します。

[root@meet nginx]# pwd
/opt/nginx
[root@meet nginx]# ls
default.conf  docker-compose.yml  html

[root@meet nginx]# vi docker-compose.yml
version: "3"
services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "8443:443"
    volumes:
      # NGINXのコンフィグファイルをホストOSから、ゲストOSに連結する
      - ./default.conf:/etc/nginx/conf.d/default.conf
      # HTTPS用の証明書とキーをホストOSから、ゲストOSに連結する
      - /home/yukkuri/certificates/yukkuri.me.crt:/etc/nginx/conf.d/yukkuri.me.crt:Z
      - /home/yukkuri/certificates/yukkuri.me.key:/etc/nginx/conf.d/yukkuri.me.key:Z
      # NGINXのWebアプリ(index.html等)をホストOSから、ゲストOSに連結する
      - ./html:/usr/share/nginx/html

NGINX用のコンフィグファイル

NGINX用のコンフィグファイルは、ホストOS上で設定変更できるようにしてあるので、
ホストOS上のファイルで設定します。

[root@meet nginx]# pwd
/opt/nginx
[root@meet nginx]# ls
default.conf  docker-compose.yml  html

[root@meet nginx]# vi default.conf
server {
    # HTTPSを利用する設定
    listen       443 ssl;
    server_name  localhost;
    # ゲストOS上の証明書とキー配置設定
    ssl_certificate      /etc/nginx/conf.d/yukkuri.me.crt;
    ssl_certificate_key  /etc/nginx/conf.d/yukkuri.me.key;
    location / {
        # ゲストOS上のWebアプリ(index.html等)カレントディレクトリ
        root /usr/share/nginx/html;
    }
}

テスト用に、index.htmlを作成

Webアプリ(index.html等)カレントディレクトリに初期ファイルを配置する。

[root@meet nginx]# pwd
/opt/nginx
[root@meet nginx]# ls
default.conf  docker-compose.yml  html

[root@meet nginx]# vi ./html/index.html
<html>
<head>
<title>yukkuri.me</title>
</head>
<body>
<p>yukkuri shiteitte ne !!!</p>
<p><image src="./img/NiceBoat.png"></p>
</body>
</html>

起動

テスト起動してみます。
動いているみたい。

[root@meet nginx]# docker-compose up
[+] Running 1/0
 ⠿ Container nginx  Created                                                                            0.0s
Attaching to nginx
nginx  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
nginx  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
nginx  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
nginx  | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
nginx  | 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf differs from the packaged version
nginx  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
nginx  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
nginx  | /docker-entrypoint.sh: Configuration complete; ready for start up
nginx  | 2022/01/30 15:28:53 [notice] 1#1: using the "epoll" event method
nginx  | 2022/01/30 15:28:53 [notice] 1#1: nginx/1.21.6
nginx  | 2022/01/30 15:28:53 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
nginx  | 2022/01/30 15:28:53 [notice] 1#1: OS: Linux 5.10.82-83.359.amzn2.x86_64
nginx  | 2022/01/30 15:28:53 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 32768:65536
nginx  | 2022/01/30 15:28:53 [notice] 1#1: start worker processes
nginx  | 2022/01/30 15:28:53 [notice] 1#1: start worker process 30

接続確認

ブラウザからHTTPS(今回はJitsiと同じサーバーなので、8443がNGINXのHTTPSのPORT)で接続して、つながればOK。
AWS上からは、Route53 でwww.yukkuri.me のサブドメイン設定と、セキュリティグループに8443ポートの穴あけをやっています。
ブラウザ上から、8443とするのがいまいちなので、次回は、ALBでいい感じに振り分けていきたいと考えています。

今後の課題

ここに、MySQLと接続するWebアプリを作っていきたいと思います。

今回の所要時間

3時間くらいですか。。。
NGINXの前にnode.jsで似たようなことをやっていたのですが、こっちは数日悩んで、HTTPSで構築するのに手間取ったりを繰り返して、悩みに悩んで、最終的に横の人に、「NGINXで良くないですかね。」と言われて考え直しました。
※node.jsはそのうち解析します。

Discussion