読者です 読者をやめる 読者になる 読者になる

codes / cipher

文章置き場

GCEでWordPressがほぼ無料運用できるようになったので改めてまとめる

スポンサーリンク

ある企業の採用試験に実技があったので、練習がてら(多少のコストアップは覚悟の上で)Google Cloud Platformに趣味のサイトを移転したのですが、まさかここまでコストダウンする結果になるとは思いませんでした。

私のサイトはテキストコンテンツメインかつアクセス数が少ないため、メディアサイトや大規模サイトの場合はそれなりに費用はかかってくるかもしれません。
小規模な個人サイトを立ち上げる場所としては、費用もスペックも国内の格安サーバーよりずっと良くなります

おさらい

かつて、Google Cloud PlatformにWordPressを載せる方法は2つありました。

WordPressはデータベースを必要とするので、いずれも今年の2月頃までは無料枠では運用できませんでした。

Google Apps Engine + Cloud SQL

  • GAEは無料枠が大きく、個人サイトなら無料枠で大丈夫
  • Cloud SQLが有料
    • GAEと連携したい場合は第1世代しか選択できない(私は第2世代でインスタンスを作成していてここでかなり詰まっていた)→今はできる(コメント欄参照)
    • 月額$10は下らない→当時の価格なので今は知らない
  • .htaccessが使えないので、専用にカスタマイズされたWordPressを用いる必要がある

というわけで、予算と実装の関係でこちらは諦めていました。
やり方自体は色々と先人が書き記してくださっているので以下の記事等を参考にどうぞ。

Google Compute Engine上にLAMP環境またはLEMP環境を構築

IaaSなので、基本的には自分が選択したOS等へのインストール方法と全く同じです。私は初心者だったので無難にDebian上にLAMP環境で構築しました。
GCPからクリックでインストールも出来るようですので、あまり知識が無い人でもGCEを使ってWPサイトを運用する事は可能でしょう。
しかし、Googleのヘルプは素人向けではなく、セキュリティ対策やメモリ周りのチューニングも必要です。これからプログラミングやサーバーについて覚えよう、というつもりならおすすめしません。格安サーバーで自動インストール出来る所もあるのでそちらを利用しましょう。

新料金体系(Always Free)での運用コスト

新無料枠についてはAlways Free の使用制限  |  無料試用  |  Google Cloud Platformを参照。

私はGCEを昨年末から利用し、試用期間後は700円/月程度の費用を予想していました。
3月の途中でGCEの無料枠が拡大され、4月いっぱい新料金体系で運用した所、GCEの費用はアメリカから中国へのデータ通信費1円のみでした。

一応、他にはCloud DNS及びCloud Storageも利用しており、画像等の通信費がかさみそうなものはストレージから配信する等の工夫をしています。
Storageの方は十分無料枠に収まり、DNSの方は請求がありましたが、多少アクセス数が増えたり為替が変動したりしても月100円を超える事は当分なさそうです。

米国リージョンなので、どうしてもアジア方面への通信費が課題でしたが、APACへの通信費が1GBまで無料となり大変助かっています。
一方私のサイトでは、中国への通信費は、今後更に増大する可能性があります。コンテンツの違法コピー問題で、長年中国からのアクセスは(全面的にではないにせよ)締め出す方針を取っていました。しかし、近年は身を置くジャンルでも中国での発展・中国への参入が著しく、中国語翻訳をサイトに追加し、アクセス制限を緩めたためです。
いずれにせよ、WordPressでブログを運用する程度では全く問題無いでしょう。

Google Compute Engine上にWordPressをインストールする

下準備

本当はgcloudコマンドでファイルをコピーするのが良いのでしょうが、私はGoogleの(現時点では)無料の非公開リモートリポジトリを利用しているので、必ずそちらを経由してサーバーとファイルをやり取りすることにします。とりあえず、

をローカルマシンにインストールしておきます。

VMインスタンスの作成とApacheのセットアップ

公式にマニュアルがあります。

Quickstart Using a Linux VM  |  Compute Engine Documentation  |  Google Cloud Platform

注意点としては、

  • 静的IPアドレスVMインスタンス作成時に予約しておく(詳細設定を開いてネットワークから)
  • sudo /etc/init.d/apache2 startApacheを起動しておく
  • HTTPS接続を許可してあっても、https://~~ではエラーが出るので注意。ブラウザからクリックで移動すると自動的にSSL接続になってエラーが出ますが、sを消して起動を確認できます

インスタンス一覧の「接続」から接続情報が確認できます。

mod_rewriteの有効化

以下の記事を参考に、mod_rewriteモジュールのインストールを確認。

junrei.dip.jp

mod_rewrite.soは存在したので、apache2.confにてロードさせたところApacheが起動できない。

どうやら機能そのものが有効化されていなかったので、a2enmod rewriteで有効化。
すると今度はサイトの方で500エラーが出る。ともかく、以下の事をしたら500エラーはなくなった。

  1. 以下をapache2.confに追記して再起動。
<Directory /var/www/html/>
LoadModule rewrite_module modules/mod_rewrite.so
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
  1. WordPressのサイトURL、ホームURLを現在のIPアドレスにする(Adminerから編集)
  2. .htaccessを初期状態にする
#BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
#END WordPress

あとsudo a2enmod expiressudo a2enmod headersもやっておく。

PHP7のインストー

PHP7は自分でコンパイルする必要があるが、GitHubから簡単に取って来れる。

vivibit.net

ただこの記事にも

apxsがインストールされていない場合apache2-devもインストールする必要がある

と書かれている通り、apxsの設定を追加するだけではビルド(インストールだったかも)に失敗した。/usr/lib/apache2/modules/libphp7.soはあったけど/etc/apache2/mods-available/php7.confは無かった。
apache2-devを入れてから再度ビルドしたが、Apacheを切り忘れていたのが原因か、それとも他に原因があるのか、インストールに失敗する。あとはphp.iniがコピーできないとか色々。まあとにかくPHPをちゃんと入れるのが先ですね。

途中で作業を中断し、出かけて帰ってきたら今度はApacheも起動しなくなっていた。

your PHP Module is not compiled to be threadsafe

との事なのでThread SafeなPHPをビルドし直した。

php + apache のメモリ量をおさえる(2) workerを使ってみる | レンタルサーバー・自宅サーバー設定・構築のヒントを参考に、build.shに以下を追加。

--with-tsm-pthreads \
--enable-maintainer-zts \

ただ今度はメモリが足りない。以下の記事の方法で回避。

bitcapitalz.hatenablog.com

ビルドしたら再インストール。

  • /usr/local/php7/etc/conf.d
  • /usr/local/php7/sbin/php7-fpm

が既に存在すると止まってしまうので、削除してから。
とにかくこれで無事インストールできました。

MySQLのインストー

これも公式にマニュアルがあります。日本語情報少ないって言われてたけど、案外ありますね。

データ移転はAdminerを一時的に設置して行いました。
最終的に、容量が大きすぎて一部はコマンド叩いてやったんですけれども。大きいファイルは一旦ローカルのコマンドプロンプトに戻ってから

gcloud compute --project "プロジェクトID" copy-files --zone "ゾーン" hogehoge.sql インスタンス名:hogehoge.sql

GCPにアップロードし、GCP側でsourceコマンドでインポートします。

WordPress用のユーザーの作成

WordPress用のテーブル全てに全権限を持つユーザーを作ればOK。
wp-confing.phpの方は

define('DB_HOST', 'localhost');

にするのを忘れない。

WordPress本体のアップロード

前述の通りリポジトリ経由でアップロード。

自動更新、サイトマップなどファイルの生成、キャッシュシステムの設定など、WPの管理画面側からサイトを管理するには/var/www/html/以下のディレクトリやファイルを、Apacheを起動させているユーザーの所有にしておく必要がある。
パーミッションが664とかでもユーザーが違うと上手くいかない。 (WPはパーミッションよりも所有者を優先させるらしい)今回作った環境でのコマンドは以下。

sudo chown -R www-data:www-data /var/www

メモ:wp-config.phpの属性を400にすると500エラー。404なら大丈夫。サイトが落ちたらまずwp-config.phpの属性と所有者を確認すること。

独自ドメインの設定

静的IPがあるのでそれを各自登録すればOK。

Let’s Encryptの導入

letsencrypt.org

紆余曲折したので、うまくいった結果だけ。環境はDebian/Apache2.4.10。

まずは認証。やり方はググれば沢山出てきます。

koni.hateblo.jp www.apps-gcp.com

そしてApacheの設定。Apacheの仕様は/usr/share/doc/apache2/README.Debian.gzとかとてもわかりやすい記事とかを見ましょう。mod_ssl自体はインストールされているものとする。

  • 有効化されていなかったのでsudo a2enmod sslSSLを有効化(この時点でhttps://でアクセスしたときのブラウザのエラーが変わります)
  • Apache2.confでLoadModule ssl_module modules/mod_ssl.soしておく
  • sudo a2ensite default-sslで読み込ませる設定を指定
  • default-ssl.confは/etc/apache2/sites-availableにあるので、そこに各種.pemを読み込ませる記述を追加
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
  • Apacheを再起動
  • CSSなどが読み込まれなくなっった場合は、http://で読み込んでいるものが無いかチェック&キャッシュを削除。http://でもSSLのファイルにリダイレクトしてくれるCDNもあるけど、ブラウザが読み込みブロックしている場合がある

この他のちょっとしたTIPS等はQiitaに投稿しています。メールの設定もQiitaに書きました。

qiita.com


本当は過去記事を再アップするつもりで書き始めたのに、肝心の過去記事データを紛失していて(しかもその事に書いている今気が付いて)何を書こうと思っていたのかよくわからなくなってしましました。見つかったので編集して再掲しました!
とにかく言いたいことをまとめます。

  • サーバー運用費がほぼ無料になる(独自ドメインは必須となる)
  • Googleのインフラは速い(米国リージョンだと日本から距離があるため、原理的に越えられない速度制限は存在する)
  • SSLやメールも無料で設定できる

これらの点が国内の格安レンタルサーバーに比べてアドバンテージなので、今後サイトを立ち上げる時の候補の一つにしていただければ。
勿論WordPress以外のCMSも入れられます。