dockerコンテナ + nginx + php-fpm WEBサーバのレスポンスを計測
2018年 02月 27日
本エントリーの概要
dockerコンテナ + nginx WEBサーバのレスポンスを計測 のエントリーでは、静的コンテンツ測定にとどまりました。
今回は、php環境を加えて動的コンテンツのレスポンス測定をレポートしたいと思います。
php-fpm は、UNIXドメインソケットで動作させています。
前回同様に各種設定時にはまってしまった点を備忘録として残しています。
環境A(現状環境)は、Ubuntu16.04 + nginx/1.10.3 + php7.0-fpm です。
環境B(新規dockerコンテナ環境)は、Ubuntu16.04 + docker(17.09.0-ce) + nginx/1.10.3 + php7.0-fpm です。
ハード環境は、同じスペックで動的コンテンツphpを設置しリクエスト負荷をかけました。
環境A (nginx + php-fpm) | 環境B (docker + nginx + php-fpm) | |
---|---|---|
ホストOS | Ubuntu16.04 | Ubuntu16.04 |
dockerコンテナ | なし | あり |
webサーバ | nginx | nginx(※) |
php | php-fpm | php-fpm(※) |
vhost | bm01.jp | bm02.jp |
※同一dockerコンテナで動作させました。
Ubuntu16.04 + nginx + php-fpm 環境の構築
シンプルにnginx、php-fpmをインストールした構成になります。
sudo apt-get update
sudo apt-get install -y nginx
sudo apt-get install -y php7.0-fpm
sudo /usr/sbin/php-fpm7.0 -c /etc/php
sudo service nginx restart
バーチャルホストbm01.jpのconf設定
server {
listen 80;
server_name bm01.jp;
root /home/hoge-hoge/bm01.jp/htdocs;
# レスポンス設定
charset UTF-8;
server_tokens off;
sendfile off;
etag off;
if_modified_since off;
add_header Cache-Control no-cache;
client_max_body_size 0;
# gzip 圧縮有効化
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
location / {
index index.html;
}
location ~ \.php$ {
index index.php;
include snippets/fastcgi-php.conf;
# With php7.0-fpm:
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
}
本環境構築ではまったポイント
何事もなく環境が構築できました。
Ubuntu16.04 + docker + nginx + php-fpm 環境の構築
Docker CEをインストールしnginx、php-fpmが動作するdockerコンテナを起動した構成になります。
dockerイメージは、プロキシ経由で取得しています。
dockerコンテナ内にnginxとphp-fpmを共存させるためにsupervisorを用いました。
dockerインストール
Docker CE(Community Edition)をインストールしました。
下記は、Docker CEのインストールコマンド備忘録となります。
#
#docker-ce インストール(※1)
#
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-cache madison docker-ce
sudo apt-get install -y docker-ce
sudo service docker status
sudo docker info
#
# dockerでプロキシ設定(※2)
#
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf
=====ファイルの中身
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/" "HTTPS_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1"
=====
sudo service docker restart
#
# プロキシ情報が参照できれば設定完了です。
#
docker info | grep 'Proxy'
> Http Proxy: http://proxy.example.com:80
> Https Proxy: http://proxy.example.com:80
> No Proxy: localhost,127.0.0.1
#
# 任意ユーザ(hoge-user)でdockerコマンドが実行できるように設定
#
sudo gpasswd -a hoge-user docker
sudo service docker restart
#
# hoge-userでログインしコマンドが実行できれば設定完了です。
#
docker info
※1 docker-ceインストールについて
インストールについて公式を参照ください。
https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#trusty-1404
※2 docker プロキシ設定について
HTTP プロキシサーバの背ろにいる場合の設定について参照ください。
http://docs.docker.jp/engine/articles/systemd.html
dockerコンテナでnginx + php-fpm webサーバ環境を構築
dockerコンテナの構成
bm02.jp
┣ docker/
┃ ┣ Dockerfile
┃ ┣ addon /
┃ ┣ supervisord.conf
┃
┣ nginx/
┃ ┣ log/
┃ ┣ sites-enabled/
┃ ┣ bm02.jp.conf
┃
┣ htdocs/
┃ ┣ index.php
┃
┣ php7.0-fpm/
docker image のベースイメージは、ubuntu:16.04になります。
https://hub.docker.com/_/ubuntu/
# base image
FROM ubuntu:16.04
# set proxy
ARG http_proxy
RUN echo "http_proxy : ${http_proxy}"
## set up nginx
RUN set -ex \
&& apt-get update \
&& apt-get install -y nginx \
&& apt-get install -y php7.0-fpm \
&& apt-get install -y supervisor \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
ADD addon/supervisord.conf /etc/supervisord.conf
CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]
supervisorの設定
[supervisord]
nodaemon=true
[program:nginx]
command=/usr/sbin/nginx
autostart=true
autorestart=true
[program:php-fpm]
command = /usr/sbin/php-fpm7.0 -c /etc/php
autostart=true
autorestart=true
ビルドコマンド
cd /home/hoge-user/bm02.jp/docker
docker build --network host --build-arg http_proxy=${http_proxy} -t bm02-image -f ./Dockerfile .
バーチャルホストbm02.jpのconf設定
server {
# 基本設定
listen 80;
server_name bm02.jp;
root /var/www/htdocs;
# レスポンス設定
charset UTF-8;
server_tokens off;
sendfile off;
etag off;
if_modified_since off;
add_header Cache-Control no-cache;
client_max_body_size 0;
# gzip 圧縮有効化
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
location / {
index index.html;
}
location ~ \.php$ {
index index.php;
include snippets/fastcgi-php.conf;
# With php7.0-fpm:
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
}
構築したdockerイメージからdockerコンテナ起動をします。
起動時にbm02.jp バーチャルホストconf、ドキュメントルート、nginxログ出力パスをdockerコンテナ内にマウントします。
docker run \
-d \
-v /home/hoge-user/bm02.jp/php7.0-fpm:/run/php:rw \
-v /home/hoge-user/bm02.jp/nginx/sites-enabled:/etc/nginx/sites-enabled \
-v /home/hoge-user/bm02.jp/nginx/log:/var/log/nginx \
-v /home/hoge-user/bm02.jp/htdocs:/var/www/htdocs:ro \
--name bm02-container \
--net=host \
bm02-image
本環境構築ではまったポイント
docker環境にプロキシ設定を追加したものの dockerコンテナ内からapt-get updateを実行してもまったく進行しない(通信できてない?)状況にはまりました。
試行錯誤の末、ネットワークをhost モードにすることで無事 apt-get update, install が実施できました。
オプションの追加
--net=host
bridgeモードは、引き続きの課題です。
同じdockerコンテナに複数プロセス(nginxとphp-fpm)を動作させる手段。
自作shellを書いたりと悩みましたが公式サイトにプロセス管理ツール Supervisorを用いるドキュメントがありました。
JMeter でレスポンス計測
JMeter で環境Aと環境Bのサーバレスポンスを計測しました。
index.phpには、phpinfo();のみ記述しました。
計測内容は、秒間50・100リクエスト送信を1秒スリープで100回・50回試行し、総リクエストが5,000リクエストになるように調整しています。
それぞれの結果を散布図でレポートします。
秒間50リクエスト送信を1秒スリープで100回試行
環境Aの平均レスポンスタイム = 92ms
環境Bの平均レスポンスタイム = 77ms
秒間100リクエスト送信を1秒スリープで50回試行
環境Aの平均レスポンスタイム = 181ms
環境Bの平均レスポンスタイム = 140ms
参考
お忙しい中、お付き合いくださりありがとうございました。
何かしらお役にたちましたら幸いでございます。