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によるアプリケーション実行環境構築