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