PHP
nginx
docker
nginx-unit

NGINX Unit 公式Dockerイメージをためしてみた

NGINX Unit 0.6 Betaがリリースされてた

https://www.nginx.com/blog/unit-0-6-beta-release-available-now/

公式のブログで書いてあったのは以下の4点。

  • Perl/PSGIのサポート
  • Amazon Linux でコンパイル済みのものがインストール可能になった
  • 公式Dockerイメージが公開
  • プロセスのより高度な設定が可能に

いよいよAmazon Linuxのサポートも入って、実用に近づいてきたなというところ。

とりあえず、公式のDockerイメージを試してみた。

ほんとはdocker-composeでぱっとやりたかったのだけれども、unitの設定を行うタイミングがうまくいかなくて一旦置いておいた。
(nginx-unit起動 -> unitのsocketへjsonをPUTでリクエスト の流れをうまく入れられなかった)

ファイル構成

.
├── nginx
│   ├── Dockerfile
│   └── nginx
│       ├── conf.d
│       │   └── default.conf
│       └── nginx.conf
└── nginx-unit-php
    ├── Dockerfile
    ├── index.php
    └── unit.conf.json

nginx/Dockerfile

From nginx

COPY nginx /etc/nginx

nginx/nginx/conf.d/default.conf

基本デフォルトのままなので変更箇所だけ抜粋。

# :
    location / {
        proxy_pass http://nginx-unit:8888/;
        proxy_set_header Host $host;
    }
# :

nginx/nginx.conf

は変更なしなので省略

nginx-unit-php/Dockerfile

From nginx/unit:0.6-php7.0

RUN mkdir -p /var/www/test

COPY index.php /var/www/test/

COPY unit.conf.json /tmp/

nginx-unit-php/unit.conf.json

{
    "listeners": {
        "*:8888": {
            "application": "test"
        }
    },
    "applications": {
        "test": {
            "type": "php",
            "processes": {
                "max": 10,
                "spare": 5,
                "idle_timeout": 20
            },
            "root": "/var/www/test",
            "index": "index.php"
        }
    }
}

nginx-unit-php/index.php

<?php

echo 'hi', PHP_EOL;

Docker

なにはなくともイメージをpull

local$ docker pull nginx/unit:0.6-php7.0
local$ docker pull nginx

(nginx/unit:latestはサポートしている言語全部入り)

build

local$ docker build -t yokotano/test/nginx/unit:php ./nginx-unit-php
local$ docker build -t yokotano/test/nginx ./nginx

run

local$ docker run --rm -d --name nginx-unit-php -p 8888:8888 yokotano/test/nginx/unit:php
local$ docker run --rm -d --name nginx -p 8080:80 --link nginx-unit-php:nginx-unit yokotano/test/nginx

unitのコンテナに入って設定

local$ docker exec -it nginx-unit-php /bin/bash
container# curl -X PUT -d @/tmp/unit.conf.json --unix-socket /var/run/control.unit.sock http://localhost/

結果

スクリーンショット 2018-03-21 17.13.20.png

とりあえずできた。

2018/03/26 追記

とりあえずtail吐かせてやればcomposeでもいけた。

#!/bin/sh
# run.sh

unitd --control unix:/var/run/control.unit.sock --log /var/log/unit.log

curl -X PUT -d @/tmp/unit.conf.json --unix-socket /var/run/control.unit.sock http://localhost/

tail -f /var/log/unit.log
# Dockerfile
From nginx/unit:0.6-php7.0

RUN mkdir -p /var/www/test

COPY index.php /var/www/test/

COPY unit.conf.json /tmp/
COPY run.sh /tmp/run.sh

CMD ["sh", "/tmp/run.sh"]
# docker-compose.yml
version: '3'

services:
  nginx:
    build: ./nginx
    ports:
      - '8080:80'
    links:
      - nginx-unit-php:nginx-unit


  nginx-unit-php:
    build: ./nginx-unit-php
    ports:
      - '8888:8888'

でもtail吐かせるのってなんか違う気がするので、これでいいのかなあという思いがある。
雰囲気以下の感じでやれないかなあと。

set -m

RUN='unitd --no-daemon --control unix:/var/run/control.unit.sock &'

eval "${RUN}"

sleep 3

curl -X PUT -d @/tmp/unit.conf.json --unix-socket /var/run/control.unit.sock http://localhost/

jobs

JOB=`jobs | grep "${RUN}" | cut -d ' ' -f1 | sed -e 's/\[\([0-9]\{1,\}\)\]+/\1/'`

fg ${JOB}

一応docker自体をフォアグラウンドで動かした時はこれでも期待通りに動く。
が、裏で動かそうとするとなんでか終了してしまう。
dockerのそもそもの仕組み的なところでダメなのかなという気がするけど、調べるためのキーワードがわからない。。