docker で、nginx php7.1 MySQL5.7 SSL http/2

この記事は約8分で読めます。

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

タイトルとURLをコピーしました