この Blog は
別に
個人で
[TOC]
前提
この Blog は
環境が
稼働環境
1台のVPS 上で、 All 1 One 構成で ブログシステムは 稼働しています。 OS
CentOS release 6.9 (Final)
HTTP サーバ1
Server version: Apache/2.2.15 (Unix) Server built: Oct 19 2017 16:43:38
Python の
Version Python 2.7.8
Djagno 、
Mezzanine の Version Django (1.10.7) Mezzanine (4.2.3)
実施している こと
以下の
アプリケーションの
ログ設定、 エラーメール通知 Cron ジョブの
設定 GAS (Google Apps Script) で、
Web サイトの 監視、 メトリクスの 測定
CentOS に<wbr>関係する<wbr> OS レベルの<wbr>セキュリティ設定
観点では
CentOS の
アプリケーションの エラーメール通知、 ログ設定
アプリケーションの
エラーメール通知
Django の
全ページで
Error reporting | Django documentation | Django を
500エラーに
対するの メール設定
settings.py に以下を 記載する ことで、 ADMINS に 設定した メールアドレス宛に、 メールが 送付されます。
公開サイトでは基本的に DEBUG は False
かと思いますが、 メールは False
の場合のみ 送付されます。
デフォルトだと、[Django] ERROR (EXTERNAL IP): Internal Server Error:
という 件名で メール送付が あります。
件名に自ドメイン名を 設定したかったので、 EMAIL_SUBJECT_PREFIX
を変更しました。 DEBUG = False ADMINS = ( ('XXXXXXX', 'xxx@gmail.com'), ) EMAIL_SUBJECT_PREFIX = "[Django] monotalk.xyz "
404エラーに
対する メール設定
settings.py に以下を 記載する ことで、 MANAGERS に 設定した メールアドレス宛に、 メールが 送付されます。
こちらも、500エラーと 同様に DEBUG = False
の場合のみ 発動します。
また、IGNORABLE_404_URLS
に404エラーと なっても、 無視する URL を 指定できるので、 不正アクセスが 行われる URL パターンを 指定し、 無駄に 大量に メール送信が 行われるのを 回避できます。ちなみに 私が 使用している VPSではこの 設定で、 メールが 送信されてきます。
root@localhost.com
設定でメールを 受け取れない 場合、 【Django】 Send Mail | MKNOD の 設定を 行って アカウントを 調整する 必要が あります。 MIDDLEWARE_CLASSES = ( ..... # For 404 errors "django.middleware.common.BrokenLinkEmailsMiddleware", ... ) MANAGERS = ADMINS import re IGNORABLE_404_URLS = [ re.compile(r'^/apple-touch-icon.*\.png$'), re.compile(r'\.(php|cgi)$'), re.compile(r'^/phpmyadmin/'), re.compile(r'^/ja/.*$'), ]
Gmail に
送った エラーメールを Google スプレッドシート に 登録する
Gmail 宛にエラーメールは 送付して おり、 定期的に Google スプレッドシート に 送信して、 集計しています。
作成したスクリプトに ついて 以下記事に 記載しています。よろしければご 確認ください。
Django のAdmin 宛の Error Mail を 無理矢理 Google Spread Sheet に 書き出す スプ リプトを 作った | Monotalk
ログ設定
アプリケーションの
ログは、
Info レベル以上を ログファイルに 記録、 Error レベルでは ログで 通知するが、 エラーメールも 送付する。 cron 起動の
バッチ Job は 標準出力に リダイレクトして ログを 記録する
以下、mezzanine_extentions
と
- settings.py
import sys LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' }, 'simple': { 'format': '%(levelname)s %(asctime)s %(message)s' }, }, 'handlers': { 'console': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'simple', 'stream': sys.stdout, }, 'app_log_file': { 'class': 'logging.handlers.RotatingFileHandler', 'filename': '/log_dir/mezzanine_app.log', 'maxBytes': 1024 * 1024 * 10, 'backupCount': 10, 'formatter': 'verbose', }, 'mail_admins': { 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', }, }, 'loggers': { 'django.request': { 'handlers': ['app_log_file',"mail_admins"], 'level': 'INFO', 'propagate': False, }, 'django_crontab': { 'handlers': ['app_log_file',"mail_admins"], 'level': 'INFO', 'propagate': False, }, "mezzanine_extentions": { 'handlers': ['console','app_log_file','mail_admins'], 'level': 'INFO', 'propagate': False, }, }, }
Cron ジョブの 設定
djagno-crontab を
ジョブの
django-crontab に
設定ファイル(settings.py に
記載) # CRONJOBS ########################### CRONJOBS = [ ('00 02 * * *', 'django.core.management.call_command', ['recommend_blog_post'], {}, '>> /log_dir/recommend_blog_post.log'), ('10 0-23/6 * * *', 'django.core.management.call_command', ['clear_cache'], {}, '>> /var/log_dir/clear_cache.log'), ('00 03 * * *', 'django.core.management.call_command', ['clearsessions'], {}, '>> /log_dir/clearsessions.log'), ]
crontab 上に
記載した 内容 30 03 * * * /bin/sh $SCRIPT_HOME/restart_memcached.sh &>> $LOG_DIR/restart_memcached.log # restart memcached 15 0-23/6 * * * /bin/sh $SCRIPT_HOME/domain_root_cache_warmer.sh &>> $LOG_DIR/domain_root_cache_warmer.log && /bin/sh $SCRIPT_HOME/sitemap_cache_warmer.sh &>> $LOG_DIR/sitemap_cache_warmer.log
ジョブの
内容 関連記事の
データの 登録
recommend_blog_post
で、関連記事の データを アイテムレコメンドで 作成しています。
レコメンド用のコマンドは、 Mezzanine の Blog に 関連記事 の レコメンド表示を カスタマイズする | Monotalk で 作成した コマンドを 使用しています。 Django の
session データの クリア
clearsessions
で、Django の ゴミセッションを 削除 しています。 セッションの 削除に ついては、 Django session_data を 定期的に 削除する | Monotalk を ご確認ください。 Memcached の
Cache の クリア
clear_cache
で、Memcached の Cache を 削除しています。 削除後は 再起動 Job が 走るように Cron を 設定しています。 Memcached の
再起動
clear_cache
後に再起動タスクを 実行します。
再起動タスクは、restart_memcached.sh
でスクリプトに まとめています。
Cent OS 6.9 にMemcached を インストール、 ログの 設定まで 実施する | Monotalk で Memcached の インストールを、 Cent OS 6.9 上で 稼働する Django に Memcached の Cache 設定を してみる | Monotalk で Memcached の Django への Cache 設定を 行いました。 Memcached を 設定して、 サイトの パフォーマンスが 頗る 向上しましたので、 設定していない 方は 設定する ことを お勧めします。 Memcached の
Cache の 作成
Memcached を起動後に、 再度 Cache を 作成する ため、 各ページに 一度アクセスしています。 domain_root_cache_warmer.sh
でドメイン直下から リンクされている ページを、 sitemap_cache_warmer.sh
でsitemap.xml から リンクが 貼られている ページに アクセスしています。
Web サイトの 監視、 メトリクスの 測定
Web サイトの
Web サイトの 監視
URL 死活監視
Google Apps Script でWEB死活監視(複数URL編) | Dozens Members’ Blog
を参考に、 URL 死活監視を 実施しています。 5分 おきに 1回サイトに アクセスして、 HTTP レスポンスコード 200 を 返すか 確認しています。 デッドリンクチェック
これもGAS で 実施しています。 Google Apps Scriptで デッドリンクチェッカーを 作ってみる | infoScoop開発者ブログ を 参考に 作成しました。 Sitemap の
ping 送信
これもGAS で 実施しています。 django の commands と しても 存在しますが、 GAS でも 実行可能だったので、 スケジュール実行で 1日1回 ping 送信を 行っています。 作成した スプレッドシートと GAS は、 Sitemap の ping 送信を 行う Google スプレッドシート を 作る | Monotalk に 記載しています。
これは、監視と いうか Batch Job な 気が します。 AMP の
妥当性検証
このBlog は AMP 対応を しましたが、 AMP 対応した 後に、 CLOUDFLARE AMP validator API を 叩く スクリプトを 作成して、 1日1回実行しています。 AMP の
Update Cache 送信
1日1回、Update Cache を 送信する スクリプトを 実行しています。
メトリクスの 測定
以下、
設定変更や、
Page Speed Insights と、
Page Speed Insights の
スコア測定
スプレッドシートに対象ページ、 Key を 設定して、 1日に 何回か Page Speed Insights の スコアを 測定して、 平均値を グラフ化しています。
Page Speed Insights のscore を 定期的に 計測して、 DataStudio でグ ラフ化する | Monotalk で 作った ものは まとめています。
10 URL くらい実行すると、 GAS の 5分の 実行制限に 引っかかるので、 5 URL くらいを サンプリングして 実行しています。 Speed Index の
測定
DataStudioとGASで WebPagetestの 計測結果を グラフ化する | mediba Creator × Engineer Blog を 参考に、 スプレッドシートに Speed Index を 記録して、 Data Studio で 1日の 平均値を グラフ化しています。
まとめ
Blog 運用観点で
スケジュールタスク で
制限内であれば
冷静に
以上です。
セキュリティアップデートが
2017年12月までの 予定なので、 そろそろ バージョンアップを しようかと 思います。 ↩
コメント