[Laravel] FULLTEXTインデックスを使った全文検索

LaravelでFULLTEXTインデックスを使った検索を行うためのメモ。ざっくり。

マイグレーション

テーブルに検索対象ワードを格納するフィールド(keywords)を定義して、FULLTEXTインデックスを振る。

検索対象ワードのセット

記事登録時にタイトルや本文をNgram/形態素解析するなどして、keywordsフィールドに検索対象となるワードを格納する。何をセットするかで検索の精度が変わってくるだろうから工夫する。

全文検索

whereRawで全文検索のためのクエリーを記述する。

参考サイト

FULLTEXT Indexes at migrations
https://laracasts.com/discuss/channels/general-discussion/fulltext-indexes-at-migrations

How to do a full text search in laravel 5
https://laracasts.com/discuss/channels/laravel/how-to-do-a-full-text-search-in-laravel-5?page=1

[MySQL] 全文検索するための基礎知識 (FULLTEXTインデックスの使い方)

ネットで検索したらいろんな記事がヒットしたけど、以下の記事は執筆日が割と最近で、かつ、僕のような初心者にも解りやすく書かれていたので覚え書きリンク。

MySQLで全文検索をするために必要なこと – 小さな星がほらひとつ
http://quotto.hatenablog.com/entry/2016/03/21/221821

[MySQL] MariaDBを5から10にアップデートする

FULLTEXTを使いたいけど、MariaDB 5だとMyISAMでしか使えない。MySQLならInnoDBで使えるので、MariaDBからMySQLに乗り換えるしかないか。と思っていたら、MariaDB 10.0.5からはInnoDBでもFULLTEXTが使えるようになっていた。

Fulltext Index Overview – MariaDB Knowledge Base
https://mariadb.com/kb/en/mariadb/fulltext-index-overview/

この恩恵に預かるべく、ステージング環境のMariaDB 5.5.44を最新の10.1にアップデートする。

手順

環境はCentOS 7、インストールにはyumを使う。

yum による MariaDB のインストール – MariaDB Knowledge Base
https://mariadb.com/kb/ja/yum/

このページの手順にほぼ従って作業する。

1. オンラインのrepository generatorを使ってMariaDB.repoエントリを作成する。

MariaDB – Setting up MariaDB Repositories – MariaDB
https://downloads.mariadb.org/mariadb/repositories/#mirror=jmu

2. /etc/yum.repos.d/ にファイルを作成して貼り付ける。

3. MariaDBサーバーとクライアントをアップデートする。

確認。

4. 再起動

参考サイト

MariaDB5からMariaDB10にアップデート | ネットワークエンジニアの居酒屋
https://www.superweibu.com/archives/5092.html

[Laravel] クライアントのIPアドレスを取得する

クライアントのIPアドレスを取得するにはどうするか。

$_SERVERに直アクセスするのも手だけど、Laravel内でスマートなやり方はないものかなーと、調べてみたらRequestクラスにメソッドが用意されていたので覚え書き。

参考サイト

php – How to get Client Ip Address in Laravel 5.1? – Stack Overflow
http://stackoverflow.com/questions/33268683/how-to-get-client-ip-address-in-laravel-5-1

[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