我尝试使用NGINX Unit官方的Docker镜像

NGINX Unit 0.6 Beta已发布。

以下是在公式博客中提到的四点内容。

    • Perl/PSGIのサポート

 

    • Amazon Linux でコンパイル済みのものがインストール可能になった

 

    • 公式Dockerイメージが公開

 

    プロセスのより高度な設定が可能に

终于为Amazon Linux提供支持,接近实用阶段了。

暫時試用了官方的Docker映像。

实际上我本来想用docker-compose轻松地完成这个任务,但在设置unit时机上遇到了问题,所以暂时搁置了。
(无法成功实现nginx-unit的启动和向unit套接字进行PUT请求的json流程)

文件结构

.
├── 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 可以进行如下的汉语翻译:

nginx/nginx/conf.d/default.conf 文件夹中的 default.conf 文件。

由于基本设置没有变动,所以只提取修改的部分。

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

nginx/nginx.conf: nginx的配置文件

因为没有变更所以省略。

nginx-unit-php/Dockerfile的中文释义可以是:nginx-unit-php镜像构建文件。

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 可以被改写成: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可以被改写为:nginx单元PHP索引文档。

<?php

echo 'hi', PHP_EOL;

Docker – 容器

即使没有什么,也能提取出想象力。

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

最新版本的nginx/unit支持所有语言。

建立

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

奔跑

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本身在其基本机制上存在问题,但我不知道应该搜索什么关键词来进行调查。

广告
将在 10 秒后关闭
bannerAds