ConoHa VPSでWordPress

2021年5月26日

前回はdockerのnginxを使ってhttpsで公開できるようにしました。

今回はdockerを使ってWordPressをhttpsで公開できるようにしてみます。

前提

  • VPSにUbuntu 20.04などのLinuxを持っている
  • 適切なドメインを持っている
  • ドメインのSSL証明書を持っている
  • そのLinuxにfirewallが構築済
  • そのLinuxにインターネットからSSLでアクセス可能

WordPress用のDockerイメージ

Docker HubにOfficial Imageがあります。

https://hub.docker.com/_/wordpress

以前これを使ってWordPressのphpデバッグ環境を作成しました。

しかし、このとき使ったのはapacheサーバーで、phpはモジュールで、ローカルだったのでhttpでした。
今回はnginxサーバーで、phpはfpmで、httpsで公開します。デバッグ用にはしません。

上のリンクにあるOfficial ImageにはWebサーバーを何にするか、phpの呼び出し方法をどうするか、各バージョンをどうするか、など、その組み合わせにより大量のタグが用意されていますが、今回はfpm(phpは最新でfpm)を使います(参照記事はphp-7.3。phpは7.3でapache)。このイメージは、webサーバーを含まず、ポート9000でfastcgiによるアクセスが出来るだけのものです。webサーバーを別コンテナで用意する必要がありますが、コンテナをまたがせることでセキュリティを強化させ、また同様な方法でphp以外の言語を使う素地も用意出来ます。メモリの圧迫は心配ですが、コンテナなら負荷も比較的軽微なはずなので、利便性もセキュリティも向上した点を評価し、許容範囲としました。なおapacheでなくnginxを使う理由もメモリです。

webサーバーは別途前回記事でも利用したnginxのOffcial Imageを使います。

https://hub.docker.com/_/nginx

MySQLについては参照記事と同じくMySQLのOffical Imageを使います。今回は最新を使います。

https://hub.docker.com/_/mysql

Dockerを使う理由

メリット

以前の記事でも書きましたが、コンテナを使うことにより脆弱性を突かれた場合も、侵入者が自由にできる範囲をコンテナの中だけに抑えられるようにするためです。例えばWordPressの脆弱性を突かれ、phpで任意のコードが実行出来たとしても、nginxの設定などは見ることもできません。

またdockerを使うことで、別の環境への引っ越しも手軽になります。仮にUbuntu 20.04上にパッケージをインストールして環境構築した場合、将来RHEL系のLinux上に引っ越ししたら、各アプリやサーバーのバージョンなどがまるで違ったり、設定方法やデフォルトが違ったりで、それなりの作業が発生します。しかしdockerの場合はdockerさえインストールしてしまえば、残りの手順は全く同じです。

デメリット

dockerを使わないことによるメリットもあります。大抵のディストリビューションではパッケージの自動更新のスクリプトが用意されているので、セキュリティを維持しやすいという点です。dockerには標準でその手のサービスがなく、小規模ではデファクトとなっている方法もありません(大規模だとCIを使って自動でイメージを作成、テストを行って大量デプロイする)。

なるべく公式イメージを使っているのは、このディストリビューションが維持してるセキュリティに近いものを求めた結果です。公式イメージであれば、メンテナンス期間が長そうで、将来的にはイメージが更新されたら、自動でコンテナを追従させたりも比較的楽かもと思っています。公式イメージをベースに自分でイメージをビルドしてもいいのですが、ビルド環境もビルド処理も結構重く、自動化の足枷になりそうというかCIが欲しくなる気がしてなるべくやめています。

Docker Composeの設定

WordPressのOfficial Imageの説明にある、fpmのsimplified example by @md5をdocker-compose.ymlにしました。

version: "3"
services:
  wordpress:
    image: wordpress:fpm
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - ./wordpress:/var/www/html
      - ./php.ini:/usr/local/etc/php/php.ini

  db:
    image: mysql
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - ./db:/var/lib/mysql

  nginx:
    image: nginx
    restart: always
    volumes:
      - ./wordpress:/var/www/html
      - ./wordpress-fpm.conf:/etc/nginx/conf.d/default.conf
      - ./(certbotのあるディレクトリへの相対パス)/etc/letsencrypt:/etc/letsencrypt/
    ports:
      - 443:443

※DBの設定(名前、ユーザー名、パスワード)は適当に変えてます。意味があるかは分かりませんがw

nginxの設定

server { 
  listen 443 ssl; 
  server_name ドメイン名; 
  root /var/www/html; 
  ssl_certificate     /etc/letsencrypt/live/ドメイン名/fullchain.pem;
  ssl_certificate_key   /etc/letsencrypt/live/ドメイン名/privkey.pem;

  index index.php; 

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  rewrite /wp-admin$ $scheme://$host$uri/ permanent;

  location ~ [^/]\.php(/|$) { 
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
      return 404;
    }

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO       $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

    fastcgi_pass   wordpress:9000;
    fastcgi_index  index.php; 
  } 
}

fastcgi_pass wordpress:9000;が、fpmと繋げてるところですね。
docker-composeのservice名がホスト名で、9000がデフォルトのポートです。
(fast)cgiといいつつ、ネットワーク越しに繋がっていてコンテナの境界をまたいでいる点がセキュリティ的には良さげです。

起動・停止

起動: docker-compose up -d

停止: docker-compose down

まとめ

なんとかConoHa VPSでSSL接続可能なWordPressが立ち上がりました(このサイトです)。

次回は今回使ったデータ移行のやり方について書こうかと思います。