Raspberry Pi docker Nginx Web Server

nginxにはstable版とmainline版がありますが今回はコンテナ内でmainline版をbuild、ビルドしてできたファイルを別のコンテナにインストールしてnginx serverを動かしてみたいと思います。

mainline版は約1ヶ月毎に新機能やbugfixその他変更が加わります。当サイトのRaspberry Piでは無理にmainline版を追いかける必要はないのですが初回インストール時位は最新のバージョンにしたいものです。

現時点(20180912)の最新バージョンはnginx 1.15.3

元ネタはこちらです。
Raspberry Piにnginx (mainline)をインストール

ビルド用コンテナの作成

コンテナイメージは前回作成したstretch_liteを使います。

$ docker container run --name nginx_build -v ~/build:/mnt -it stretch_lite-img /bin/bash

コンテナ内で作業開始
認証キーの登録

# curl http://nginx.org/keys/nginx_signing.key | apt-key add -
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1561  100  1561    0     0   2774      0 --:--:-- --:--:-- --:--:--  2772
OK

ソースリストの登録

/etc/apt/sources.list.d/nginx.list
deb-src http://nginx.org/packages/mainline/debian/ stretch nginx

コンパイルに必要なパッケージのインストール

# apt update && apt -y upgrade
# apt -y build-dep nginx

作業ディレクトリの変更
共有ディレクトリに/mnt/nginx_1.15.3を作成

# mkdir /mnt/nginx_1.15.3
# cd /mnt/nginx_1.15.3

ビルドを実行(約10分)
ソースを取得する際下記のメッセージが出ますがダウンロードはできているのでOKと思います。
stretchでは特にoptionを指定する必要はないようです。

# apt-get -y source nginx
W: ファイル 'nginx_1.15.3-1~stretch.dsc' がユーザ '_apt' からアクセスできないため、ダウンロードは root でサンドボックスを通さずに行われます。 - pkgAcquire::Run (13: 許可がありません)
# cd nginx-*
# export DEB_BUILD_MAINT_OPTIONS=hardening=+pie
# dpkg-buildpackage -uc -b
# cd ../
# ls -la nginx_*~stretch_armhf.deb
-rw-r--r-- 1 root root 724588  9月 12 22:41 nginx_1.15.3-1~stretch_armhf.deb
# exit

共有ディレクトリ~/build/nginx_1.15.3内にはnginx_1.15.3-1~stretch_armhf.debができています。

Web Server用コンテナの作成

ビルドしたnginx_1.15.3-1をインストールするため新たにWeb Server用として上記同様のコンテナイメージ(stretch_lite)から作成します。
ネットワークはnginx_networkを作成して固定IPを割り当ててみます。

$ docker network create --subnet=172.21.0.0/24 nginx_network
$ docker container run --privileged -d --net=nginx_network --ip=172.21.0.11 -p 80:80 --name nginx_server -v ~/build:/mnt stretch_lite-img /lib/systemd/systemd
$ docker container ls
85913f8c1af1  stretch_lite-img  "/lib/systemd/systemd" 2 minutes ago  Up 2 minutes        0.0.0.0:80->80/tcp   nginx_server
$ ping -c 3 172.21.0.11
PING 172.21.0.11 (172.21.0.11) 56(84) bytes of data.
64 bytes from 172.21.0.11: icmp_seq=1 ttl=64 time=0.248 ms
64 bytes from 172.21.0.11: icmp_seq=2 ttl=64 time=0.125 ms
64 bytes from 172.21.0.11: icmp_seq=3 ttl=64 time=0.186 ms

--- 172.21.0.11 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2111ms
rtt min/avg/max/mdev = 0.125/0.186/0.248/0.051 ms

コンテナに入って作業開始

$ docker container exec -it nginx_server /bin/bash

nginxのインストール

# dpkg -i /mnt/nginx_1.15.3/nginx_1.15.3-1~stretch_armhf.deb
以前に未選択のパッケージ nginx を選択しています。
(データベースを読み込んでいます ... 現在 15203 個のファイルとディレクトリがインストールされています。)
.../nginx_1.15.3-1~stretch_armhf.deb を展開する準備をしています ...
----------------------------------------------------------------------

Thanks for using nginx!

Please find the official documentation for nginx here:
* http://nginx.org/en/docs/

Please subscribe to nginx-announce mailing list to get
the most important news about nginx:
* http://nginx.org/en/support.html

Commercial subscriptions for nginx are available on:
* http://nginx.com/products/

----------------------------------------------------------------------
nginx (1.15.3-1~stretch) を展開しています...
nginx (1.15.3-1~stretch) を設定しています ...
invoke-rc.d: policy-rc.d denied execution of start.
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /lib/systemd/system/nginx.service.
systemd (232-25+deb9u4) のトリガを処理しています ...
# systemctl start nginx


無事動いているようです。


インストールされる/etc/nginx以下の設定ファイルはパッケージからインストールされるdebian(raspbian)形式とは違って多分nginxデフォルトの形式と思います。
dpkg -iで導入する際は既存の設定ファイルがあっても問答無用で置き換えてしまうので注意が必要です。

php7.0-fpmのインストール、設定

# apt install php7.0-fpm

nginxデフォルトの設定ファイルでphpが動く最低限の設定をしてみます。
/etc/nginx/conf.d/default.conf
index.phpを追記

location / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;
    }

location ~ \.php$を以下のとおり

location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        root   /usr/share/nginx/html;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include        fastcgi_params;
    }

/etc/php/7.0/fpm/pool.d/www.conf
www-dataからnginxに変更

listen.owner = nginx
listen.group = nginx

/usr/share/nginx/html/phpinfo.php

<?php
phpinfo();
?>
# systemctl restart nginx
# systemctl restart php7.0-fpm


ブラウザからhttp://172.21.0.11/phpinfo.php