dockerを使ってUbuntu20.04コンテナ上に最新のnginxをインストール

# はじめに
nginxの勉強をしようと思って，dockerを使ってUbuntuコンテナを起動し，その中にnginxをインストールしようと思ったはいいものの，そこそこインストールするのに手間取ってしまったので，同じような人がいればぜひ参考にしてください．

# nginxのインストール方法
nginxにはインストールの仕方が2通りある．一つ目はnginxの公式サイトからnginxをダウンロードしビルドする方法，二つ目はUbuntuの`apt`コマンドを使ってインストールする方法である．本記事ではそれぞれの方法で最新バージョンのnginxをインストールする方法を解説する．

二つの方法の違いは，ビルドする方法は自分で自由にモジュールを組み込んでカスタムすることができ，`apt`を使う方法は自由度は低いものの予め最低限のモジュールが組み込まれたものを使うことができることだ．プロダクトで使う場合は，ビルドする方法が推奨されるが，趣味や練習であれば`apt`コマンドを使う方法でも全く問題ない．

## 公式サイトからnginxをダウンロードしビルドする
### Mainline版とStable版
nginxにはMainline版とStable版があるわけだが，違いとしては，Mainline版は最新の機能追加やバグ修正が頻繁に行われているのに対し，Stable版は重大な脆弱性の修正以外はほとんど変更が行われない点だ．その代わり，Mainline版はサードパーティモジュールがビルドできなくなるといった事態が起こりうる．ただ勘違いして欲しくないのはどちらも十分に安定している版だということだ．基本的にはMainline版を使う方がいい．

### インストール方法
[公式サイト](https://nginx.org/en/download.html)を確認し，Mainline版の最新バージョンのリンクURLをコピペして`wget`でUbuntuコンテナ上にダウンロードする．Mainline版は1.21.6が最新（2022/03/21時点）である．以下の通りに実行していけば大丈夫だろう．ちなみに%はDockerホスト（M1mac）上で実行したことを表し，$はコンテナ上で実行したことを表す．

ちなみにnginxがインストールされるディレクトリを`—prefix`オプションで指定している．余談だが，Ubuntu14.04から`apt-get`ではなく，`apt`を使うように推奨されている．
```shell
% docker run -dit -p 8100:80 --name ubuntu-for-nginx-study ubuntu:20.04
% docker exec -it ubuntu-for-nginx-study /bin/bash
$ mkdir nginx
$ cd nginx
$ apt update
$ apt install wget
$ wget https://nginx.org/download/nginx-1.21.6.tar.gz
$ tar xvf nginx-1.21.6.tar.gz
$ cd nginx-1.21.6
$ apt install sudo
$ sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev
$ ./configure --prefix=/usr/local/nginx
$ make
$ sudo make install
$ export PATH=/usr/local/nginx/sbin:$PATH
$ nginx -V
$ pwd
/nginx/nginx-1.21.6
```

## Ubuntuのaptコマンドを使ってインストールする
コンテナを用意するところまでは「公式サイトからnginxをダウンロードしビルドする」の項目と同じである．具体的には`$ cd nginx`の行までである．

### そのままでは最新版をインストールできない
そのままインストールしようとすると古いバージョンのものがインストールされてしまう．nginxは外部に直接晒されるので，セキュリティの観点からなるべく最新のものを使用する方がいい．
```shell
$ sudo apt info nginx
Package: nginx
Version: 1.18.0-0ubuntu1.2
Priority: optional
Section: web
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Nginx Maintainers <pkg-nginx-maintainers@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 45.1 kB
Depends: nginx-core (<< 1.18.0-0ubuntu1.2.1~) | nginx-full (<< 1.18.0-0ubuntu1.2.1~) | nginx-light (<< 1.18.0-0ubuntu1.2.1~) | nginx-extras (<< 1.18.0-0ubuntu1.2.1~), nginx-core (>= 1.18.0-0ubuntu1.2) | nginx-full (>= 1.18.0-0ubuntu1.2) | nginx-light (>= 1.18.0-0ubuntu1.2) | nginx-extras (>= 1.18.0-0ubuntu1.2)
Homepage: http://nginx.net
Download-Size: 3620 B
APT-Sources: http://ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 Packages
Description: small, powerful, scalable web/proxy server

N: There is 1 additional record. Please use the '-a' switch to see it
$ sudo apt update
$ sudo apt install nginx
```

### 最新版のインストール方法
[公式サイトの該当ページ](http://nginx.org/en/linux_packages.html)を開き，自身が使っているLinuxディストリビューションの項目を見る．今回はUbuntuを使っているのでUbuntuの項目を見る．ちなみにページの一番上のUbuntuの箇所を見ると，Ubuntuのバージョンが20.04の場合はfocalという名前のnginxがインストールされることがわかる．

基本的にはUbuntuの箇所に飛んでそこに書いてあるコードをそのまま順番に実行していけば問題ない．ただ，Ubuntuコンテナには`sudo`コマンドは予めインストールされていないので，最初に以下のコマンドを実行しておく必要がある．

```shell
$ apt update
$ apt install sudo
```

# おわりに
以上で本記事は終了である．以外に古い記事が多く，nginxをaptを使わずにビルドする方法については特に情報が少なかったので少し手間取ってしまった．