Google App EngineでPelicanを使ってブログをホスティングする方法
PelicanをGAEで使う
Google App Engine(以下GAE)は静的サイトもホスティングできるので、Pythonの静的サイトジェネレーターPelicanを使ったブログサイトを作ってみた。 なお、GAEの利用法(Google Cloud SDKとか)は省きます。Pelicanの使用法は前に書いた記事を参照してください。
GAEの新しいプロジェクトを作成する
ここではプロジェクト名を"myblog"とします。
プロジェクトのディレクトリにひな型を作成
プロジェクト"myblog"のローカルディレクトリにpelicanのpelican-quickstart
コマンドでひな型を作成。ディレクトリはこんな構造になっている。
myblog/
content/
output/
app.yaml
pelicanconf.py
他にもファイルがプロジェクトのディレクトリにありますが、ブログ作成に最低限必要なのはこれだけ。
app.yamlの設定
runtime: python27
api_version: 1
threadsafe: yes
handlers:
- url: /
static_files: output/index.html
upload: output/index.html
- url: /
static_dir: output
記事を書いてジェネレイト
contentディレクトリに書いた記事を保存したら、pelican content
で記事をジェネレイト。
ローカルサーバーで確認
dev_appserver.py .
でサーバーを立ち上げたら、ブラウザでlocalhost:8080にアクセス。ブログが表示されたら成功。
デプロイ
デプロイするのはoutputディレクトリだけでいいので、app.yamlでアップロードしないディレクトリを記述
skip_files:
- themes/
- content/
- plugins/
サイトにアクセス
デプロイしたらhttps://プロジェクト名.appspot.comにアクセス
補足
pelicanconf.py
にURLルールをセッティングをしている場合はapp.yaml
にindex.htmlの場所とアップロードを追記する必要があります。
ARTICLE_URL = '{date:%Y}/{date:%m}/{slug}/index.html'
ARTICLE_SAVE_AS = '{date:%Y}/{date:%m}/{slug}/index.html'
YEAR_ARCHIVE_SAVE_AS = '{date:%Y}/index.html'
MONTH_ARCHIVE_SAVE_AS = '{date:%Y}/{date:%m}/index.html'
僕の場合はurlをドメイン名/年/月/slug/index.htmlにして、年と月のアーカイブも表示する設定にしています。
なのでapp.yaml
にはこう記述しました。
- url: /
static_files: output/index.html
upload: output/index.html
- url: /
static_files: output/(.*)/(.*)/(.*)/index.html
upload: output/(.*)/(.*)/(.*)/index.html
# 年アーカイブの場所
- url: /
static_files: output/(.*)/index.html
upload: output/(.*)/index.html
# 月アーカイブの場所
- url: /
static_files: output/(.*)/(.*)/index.html
upload: output/(.*)/(.*)/index.html
- url: /
static_dir: output
GAEを無料で運用するための設定
GAEはスタンダード環境での無料枠が大きいので月間数万PVくらいまでなら無料枠で運営できる…はず。
しかし何も設定しないとアクセス過多でインスタンスが複数立ち上がって無料で運用することができなくなる可能性があるのでapp.yaml
でこれを制御します。
instance_class: F1
automatic_scaling:
min_idle_instances: automatic
max_idle_instances: 1
min_pending_latency: 3000ms
max_pending_latency: automatic
インスタンスは一番性能が低いが28インスタンス時間が無料のf1-micro、max_idle_instances: 1
でidle状態にあるインスタンスの最大値を1にして複数インスタンスが起動しないようにする。
参考サイト
Google App Engine で静的ウェブサイトをホストする
Pelican
Pelican Hosting on AppEngine
Google App Engineを無料で運用する方法(2018年版)