Docker上のNginx UnitでWordPressを動かしてみた。

会社でNginx Unitなるものを聞いたので、試してみた。

Nginx Unitについては割愛。
大雑把な認識だと、Nginx社が作ってるアプリケーションサーバーで、uWsgiとかphp-fpmの代わりになるものと言った感じ。
今回はCoreOS + Docker上にUbuntu環境を作って、Nginx Unitを入れてWordPressを走らせてみた。
本当はCoreOS + Docker + Alpine linuxで試したかったけど、Alpine linuxにパッケージがないのと、ビルドが成功しなかったのでUbuntuでテスト。
Alpine Linuxのmusl-devのlibpthreadにはmakecontextとかgetcontextとかsetcontextが無いっぽいけど、そんなもんなのか?


ファイル構成

[text]
server_nginx_unit
│ docker-compose.yml

└─blog
│ config.json
│ Dockerfile

└─nginx
default.conf
[/text]
blogディレクトリ内にDockerfileとNginx unitの設定ファイルを、nginxディレクトリにnginxの設定ファイルを置いといた。

Dockerfile

[text]
FROM ubuntu:xenial
ENV WORDPRESS_IMAGE wordpress-4.8.1-ja.tar.gz
RUN apt-get update && apt-get -y upgrade
RUN apt-get install -y git
RUN apt-get install -y nginx build-essential php-dev libphp-embed
RUN apt-get install -y php7.0-json php7.0-mcrypt php7.0-mysql php7.0-curl php7.0-gd php7.0-zip
RUN git clone https://github.com/nginx/unit
RUN cd unit && \
bash ./configure –bindir=/bin –sbindir=/bin –modules=/usr/share/nginx-unit/modules && \
bash ./configure php –module=php70 –config=/usr/bin/php-config7.0 –lib-path=/usr/lib && \
make all && \
make install && \
cd ../
RUN curl https://ja.wordpress.org/$WORDPRESS_IMAGE -o $WORDPRESS_IMAGE
RUN tar xzf $WORDPRESS_IMAGE
RUN rm -f $WORDPRESS_IMAGE
COPY nginx/default.conf /etc/nginx/sites-available/default
COPY config.json /etc/nginx-unit/config.json
[/text]
Ubuntuにはパッケージがあるんだけど、要求するpythonが2.7だったり、そもそも今回pythonもGoも必要ないので自前でビルド。
php7.0系のパッケージは多分足りないけど、index.phpが動いたあたりで力尽きた。
./configure –modulesでモジュールのインストール先を指定しないと、buildディレクトリからbuildディレクトリにphp70.unit.soをコピーしようとして死ぬのはなんなんだろう…

config.json

[javascript]
{
"listeners": {
"*:8080": {
"application": "blog"
}
},
"applications": {
"blog" : {
"type": "php",
"workers": 1,
"root": "/wordpress",
"index": "index.php"
}
}
}
[/javascript]
ポート8080でlistenして、/wordpress以下のphpを呼び出す設定。
ポート8080はDockerコンテナから外には出さないので、ブラウザから直接アクセスは不可のはず。

default.conf

[text]
server {
listen 80;
server_name localhost;
client_max_body_size 10m;
#charset koi8-r;
error_log /var/log/nginx/error.log warn;
root /wordpress;
location / {
index index.html index.htm index.php;
}
location ~ .*\.php {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_redirect http://$host:8080 http://$host;
}
}
[/text]
phpが呼ばれたら、Nginx Unitに丸投げ。その他のときはそのままファイル取得して返す。
proxy周りの設定忘れた…一応これで動いた。

docker-compose.yml

[text]
version: ‘2’
services:
# Webページ
blog:
build: blog
links:
– mysql
ports:
– "80:80"
command: sh -c "if [ -e control.unit.sock ]; then rm -f control.unit.sock; fi && unitd –log /tmp/unitd.log && sleep 1s && curl -X PUT -d @/etc/nginx-unit/config.json –unix-socket control.unit.sock http://localhost/ && nginx -g ‘daemon off;’"
mysql:
image: mysql:latest
environment:
– MYSQL_ROOT_PASSWORD=mysqlroot
[/text]
unixdを起動してから、curlで設定ファイルを食わせて、nginx -g ‘daemon off;’でDockerを殺さないようにして起動。
docker-compose upで起動したあとCtrl+Cで殺すと、control.unit.sockが残って次回起動時にunitdが起動できなくなるので、control.unit.sockが残ってたら消すようにした。
mysqlはDockerHubから拾ってきたもの。
これで
[text]
docker-compose up blog
[/text]
をするとNginx UnitとNginxが起動したので、ブラウザでアクセス。

とりあえず動いたっぽい。
…が、進めてみるとトップページ無限リダイレクトループにハマり苦戦。
wp-include/template-loader.phpの12行目の
[php]
<?php
/**
* Loads the correct template based on the visitor’s url
* @package WordPress
*/
if ( defined(‘WP_USE_THEMES’) && WP_USE_THEMES )
/**
* Fires before determining which template to load.
*
* @since 1.5.0
*/
do_action( ‘template_redirect’ );
/**
[/php]

[php]
<?php
/**
* Loads the correct template based on the visitor’s url
* @package WordPress
*/
if ( defined(‘WP_USE_THEMES’) && WP_USE_THEMES )
/**
* Fires before determining which template to load.
*
* @since 1.5.0
*/
//do_action( ‘template_redirect’ );
/**
[/php]
にしたら動いたけど、これ結構前に治ったバグじゃないの?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です