dockerで、高速型WEBサーバーを!
dockerや、EC2などのインスタンスで、スケールアウトをして、高速化を図ることも可能ですが、根本的な高速な組み合わせをdockerでやってみました。
WEBアプリサーバーは、三層構造
Nginx
PHP
MySQL
の3層構造です。
3層構造自体は、オンプレ時代からあるオーソドックスな手法です。
DBなど、バックエンド側は、グローバルに接続しないで、ローカル接続をしていました。

docker の、「docker-compose.yml」では、「depends_on」で関係性を設定します。
version: "2"
services:
web:
image: nginx:latest
ports:
- "80:80"
- "443:443"
depends_on:
- app
volumes:
- /home/wp10/conf/nginx.conf:/etc/nginx/conf.d/default.conf
- /home/wp10/html:/var/www/html/
- /etc/letsencrypt:/etc/letsencrypt
app:
build: ./app
image: php:7.1.9-fpm
env_file: .env
environment:
DATABASE_HOST: db
depends_on:
- db
volumes:
- /home/wp10/html:/var/www/html/
db:
image: mysql:5.7
env_file: .env
ports:
- 3306:3306
volumes:
- /home/wp10/db:/var/lib/mysql
- ./db.init.sql:/docker-entrypoint-initdb.d/initial.sql
↑docker-compose.ymlは、上記のようになります。
[web]のセクション
nginxの設定ファイル
コンテンツファイル
SSLの設定ファイル
を永続化しています。
server {
listen 80;
server_name www.example.jp;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name www.example.jp;
root /var/www/html;
index index.iphp;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /etc/letsencrypt/live/www.example.jp/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.jp/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
↑nginx.confの設定内容は上記のようになります。
「ssl」で始まる部分で、http/2の設定をしています。
本来であれば、「キャッシュ」の設定をしたほうが、より高速化されますが、ここでは、割愛します。
[app]のセクション
「build: ./app」
で、app/Dockerfileを読み込みます。
FROM php:7.1.9-fpm RUN docker-php-ext-install mysqli pdo_mysql
↑app/Dockerfileは、上記のように「mysqli」「pdo_mysql」をオプションとして取り込みます。
[db]のセクション
# cat db.init.sql CREATE TABLE `test01` ( `testA` int(11) , `testB` varchar(255) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `test01` VALUES (1,'AA'),(2,'BB');
↑./db.init.sql として、上記のSQL分を指定しています。
初期テーブル/データの登録をしています。
dockerにて、HTTP/2のサービスを起動
これで、サービスを起動してみましょう。
# docker-compose up -d Creating network "wp10_default" with the default driver (略) a470862432e2: Pull complete 977375e58a31: Pull complete Digest: sha256:a65beb8c90a08b22a9ff6a219c2f363e16c477b6d610da28fe9cba37c2c3a2ac Status: Downloaded newer image for nginx:latest Creating wp10_db_1 ... done Creating wp10_app_1 ... done Creating wp10_web_1 ... done # docker-compose ps Name Command State Ports --------------------------------------------------------------------------------------------- wp10_app_1 docker-php-entrypoint php-fpm Up 9000/tcp wp10_db_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp wp10_web_1 nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
↑起動しました。
# cat html/check.php
<?php
$db_con = mysqli_connect("$_SERVER[DATABASE_HOST]", "$_SERVER[MYSQL_USER]", "$_SERVER[MYSQL_PASSWORD]", "$_SERVER[MYSQL_DATABASE]");
if (!$db_con){
#エラー
exit();
}
$sql_sel = "SELECT * FROM test01";
$res_sel = mysqli_query($db_con,$sql_sel);
$num_sel = mysqli_num_rows($res_sel);
if ($num_sel > 0){
while($row_sel = mysqli_fetch_assoc($res_sel)){
print " [$row_sel[testA]] [$row_sel[testB]]<br>\n";
}
}
?>
↑初期設定で登録した、DBを呼び出してみます。

↑きちんと表示されました。

↑SSLでの接続ができました。

↑Chromeの
HTTP/2 and SPDY indicator
という拡張機能で見てみると、http/2でのアクセスがなされていることがわかります。
結論
dockerで、環境を作ると、設定が簡単!高速HTTP/2でのアクセスが容易です!
WordPressも超高速になります!
参考書
この書籍は、丁寧な説明でわかりやすいです!
ゼロからはじめる Dockerによるアプリケーション実行環境構築
![]()


