Aimless Blog

Google App EngineでPelicanを使ってブログをホスティングする方法

Tag:
pythongaepelican

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年版)