[Webサイト運営] サーバーが重いときにすること

そうなったときに備えて覚え書き。

参考サイト

開発者の為のサーバ監視(初心者向け) – Qiita
アプリエンジニア向け:「サーバがなんか重い」時にすること – Qiita
単独のサーバーの「負荷」の正体を突き止める – tetsuyai’s blog

[MySQL] 壊れたテーブルを修復する

前のエントリで書いた通り、突然サーバーが高負荷になって何も受け付けなくなったので、仕方なくシャットダウン。再起動後にログを見回ったら、MySQL (実体はMariaDB) のログにエラーが記録されていた。やばい予感。

WordPressは問題なく動作しているように見えるけど、念のためリカバリしておいたほうがいいだろう。ということで、エラーチェックとリカバリ用のコマンド (SQL) を覚え書き。

これらコマンドを実行してみたけど何も起きなかった。起動時に走ったリカバリ処理が問題を解決してくれた模様。大事にならなくて良かったねー

参考サイト

MySQL の壊れたテーブルを修復
http://macperson.net/mysql-table-repair/

[Webサイト運営] 突然サーバー負荷上昇。DDoSか?

ある晩、監視サービスからアラートメールが飛んできた。このウェブサーバーがダウンした模様。原因は読み込みタイムアウトだって。500とかじゃなくてタイムアウト?早速調べるためにssh接続を試みるもログインプロンプトさえ表示されない。やばい予感、マジで焦る。

DigitalOceanのコントロールパネルからサーバーのロード状態を見ると、CPU負荷が140%、ディスクアクセスが2MB/sを超えている。普段はCPU負荷は10%を超えることは稀で、ディスクアクセスも常時ゼロに等しい。明らかに何かが起きているな。コントロールパネルからコンソール接続を試みるも反応無し。もう打つ手無しと諦めてDropletを電源オフする。少し待って再投入したところ、元の静かな状態に戻った。

以下がロード状態のグラフ。8:00pmごろから負荷が急激に上がっている。再起動したことで元の状態に戻ったので、高負荷状態は20分以内で収まった。もし外出先とかですぐ対応できなかったらと思うと恐ろしい。

loading_graph

原因は何だったのだろうか。最初に疑ったのはDDoS。Apacheのログを見たんだけど、疑わしいアクセスは十数件程度しか記録されていない。それは異なるGeoロケーションからのアクセスだけどAgentはどれも同じ名前のロボット。各地のマシンを踏み台にして集中アクセスしてきたのだろうか。だとしたらログ件数が少なすぎる。こんな弱小サイトが、ウェブサーバーでログが記録できなくなるほどの集中砲火を浴びるとは考え難いよなぁ。

他の可能性としては、サーバー上で稼動するソフトの暴走とか?。でも、サーバー上のログを一通り目を通してみたけど、怪しい挙動を示すものは見つからず。もう何ヶ月も同じコンフィギュレーションで稼動させているけど、こんなことが起こったのは初めて。原因がわからないのは気持ち悪いけど、いろいろ考えて出来る限りの方策はしておかないとなーと実感した出来事だった。

[Elasticsearch] LogstashでNginxアクセスログをバッチで読み込む

今回読み込もうとするNginxのアクセスログは以下の形式。

設定ファイル

ngnix-import.conf

アクセスログの読み込み

実際に試してみたら、大きなアクセスログファイルではLogstashが途中終了してしまった。5万行ずつ分割したら、それぞれ最後まで正常に読み込めた。分割すればいいのならそうしようと調べず仕舞いだけど、もしかすると何か設定があるのかもしれない。

参考サイト

NGINX Log Analysis with Elasticsearch, Logstash, and Kibana
http://logz.io/blog/nginx-log-analysis/

Setting up Logstash 1.4.2 to forward Nginx logs to Elasticsearch | Bravo Kernel
http://www.bravo-kernel.com/2014/12/setting-up-logstash-1-4-2-to-forward-nginx-logs-to-elasticsearch/

[Elasticsearch] 予備知識 – shardとreplica

Headプラグインでは数字の四角が画面に表示される。それらはshardとかreplicaを示してるらしい。何だそれ?

以下、予備知識として参考サイト。

Elasticsearchのshardとreplica – なんかかきたい
http://t-cyrill.hatenablog.jp/entry/2015/02/18/190310

elasticsearch シャードとか、インデックスとか – notebook
http://swfz.hatenablog.com/entry/2015/07/22/040354

Elasticsearch システム概要 — Hello! Elasticsearch. — Medium
https://medium.com/hello-elasticsearch/elasticsearch-afd52d72711#.mnapv5rm3

[Laravel] タスクスケジューリングを使って処理を自動実行する

ざっと実装手順を覚え書き。

コマンドの実装

app\Console\Commands\DailyUpdate.php

app\Console\Kernel.php

テスト

スケジューリング

app\Console\Kernel.php

あとはcronを設定する。

参考サイト

Task Scheduling – Laravel – The PHP Framework For Web Artisans
https://laravel.com/docs/master/scheduling

Laravel5でバッチ開発 | プログラミングメカブログ
http://blog.mekachan.net/?p=198

laravelでバッチ作ってcronで動かしてみた – Qiita
http://qiita.com/ritukiii/items/a70d89fa988b2d9afbc4

[WordPress] 問い合わせフォームプラグイン

以下の2つが定番っぽいのでメモ。共に開発は日本人の模様。

Contact Form 7

Contact Form 7
http://contactform7.com/ja/

Contact Form 7プラグイン(問い合わせメールフォームを作成) – WordPressプラグインの一覧
http://www.adminweb.jp/wordpress-plugin/list/index10.html

NW WP Form

Contact Form 7に無い機能として以下がある。

  • 「お問い合わせ画面」「確認画面」「送信完了画面」「エラー画面」を作ることが出来る
  • メールのデータをデータベース内に保存出来る (保存機能はオフにできる)

問い合わせデータをデータベースに保存することでCRMのようにも使えそう。

MW WP Form
http://plugins.2inc.org/mw-wp-form/

Contact Form7よりも使いやすいお問い合わせフォーム用WordPressプラグインMW WP Formの紹介 | mono-lab
http://www.mono-lab.net/147/

受託案件で活躍しそうなWordPressメールフォームプラグイン「MW WP Form」を使ってみた – マイペースクリエイターの覚え書き
http://mypacecreator.net/blog/archives/2063

[PHP] クロージャーが親のスコープから変数を引き継ぐ方法

use を使えば引き継げる。覚え書きとして、以下マニュアルからサンプルを抜粋。

参考サイト

PHP: 無名関数 – Manual
http://php.net/manual/ja/functions.anonymous.php

PHPでクロージャーを使う – Qiita
http://qiita.com/hugo-sb/items/3e344486658e3cfbd407

[JavaScript] クリックしても何も起きないダミーのアンカー(リンク)

デザイナーから上がってきたHTMLファイルに、ページ遷移を必要としないんだけどアンカーが使われている箇所が幾つかあった。

スタイルシートで “foo a” の見栄えが設定されているけど、アンカーは生きているのでクリックするとページがリロードされてしまう。クリッカブルな挙動はjQueryで制御するとして、HTMLのアンカーとしての機能は殺しておきたい。どうするか。

手っ取り早いのは以下かな。

参考サイト

クリックしても何も起こらないダミーのa要素 – Qiita
http://qiita.com/448jp/items/dbd2e4ee0a6ec500d329