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が無いっぽいけど、そんなもんなのか?


ファイル構成

server_nginx_unit
    │  docker-compose.yml
    │
    └─blog
        │  config.json
        │  Dockerfile
        │
        └─nginx
                default.conf

blogディレクトリ内にDockerfileとNginx unitの設定ファイルを、nginxディレクトリにnginxの設定ファイルを置いといた。

Dockerfile

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

Ubuntuにはパッケージがあるんだけど、要求するpythonが2.7だったり、そもそも今回pythonもGoも必要ないので自前でビルド。
php7.0系のパッケージは多分足りないけど、index.phpが動いたあたりで力尽きた。
./configure –modulesでモジュールのインストール先を指定しないと、buildディレクトリからbuildディレクトリにphp70.unit.soをコピーしようとして死ぬのはなんなんだろう…

config.json

{
	"listeners": {
		"*:8080": {
			"application": "blog"
		}
	},

	"applications": {
		"blog" : {
			"type": "php",
			"workers": 1,
			"root": "/wordpress",
			"index": "index.php"
		}
	}

}

ポート8080でlistenして、/wordpress以下のphpを呼び出す設定。
ポート8080はDockerコンテナから外には出さないので、ブラウザから直接アクセスは不可のはず。

default.conf

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;
    }
}

phpが呼ばれたら、Nginx Unitに丸投げ。その他のときはそのままファイル取得して返す。
proxy周りの設定忘れた…一応これで動いた。

docker-compose.yml

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

unixdを起動してから、curlで設定ファイルを食わせて、nginx -g ‘daemon off;’でDockerを殺さないようにして起動。
docker-compose upで起動したあとCtrl+Cで殺すと、control.unit.sockが残って次回起動時にunitdが起動できなくなるので、control.unit.sockが残ってたら消すようにした。
mysqlはDockerHubから拾ってきたもの。

これで

docker-compose up blog

をするとNginx UnitとNginxが起動したので、ブラウザでアクセス。

とりあえず動いたっぽい。
…が、進めてみるとトップページ無限リダイレクトループにハマり苦戦。
wp-include/template-loader.phpの12行目の

<?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
/**
 * 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' );

/**

にしたら動いたけど、これ結構前に治ったバグじゃないの?

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください