Ruby & gem インストール
備忘録です。
環境
- CentOS 5.8 (Final)
ruby 2.1.2 インストール
1 | # cd /usr/local/src |
gem インストール
1 | # wget http://production.cf.rubygems.org/rubygems/rubygems-2.2.2.zip |
以上
備忘録です。
1 | # cd /usr/local/src |
1 | # wget http://production.cf.rubygems.org/rubygems/rubygems-2.2.2.zip |
以上
サービス公開前にNginxで
Basic認証を掛ける必要がありました
ちょうど社内公開したときでもあり
Basic認証のポップアップが出るのが鬱陶しいのもあって
社内だけオフりたい、というときに以下のような設定をしました。
1 | # yum install -y httpd-tools |
1 | # cd /etc/nginx |
1 | # vim /etc/nginx/conf.d/default.conf |
1 | location / { |
1 | # vim /etc/nginx/conf.d/default.conf |
1 | location / { |
あとは 許可IPを随時増やせば良いです。
Webアプリケーション開発におけるNginxあるあるかなと思います♪
以上です。
Nginxで以下のようなエラーが発生
[warn]
とあるしものものしさは否めない汗
要求されるバッファサイズが設定量より多く、一時ファイルを利用しますよ、
という警告です。
1 | [warn] 1493#1493: *210 a client request body is buffered to a temporary file /var/cache/nginx/client_temp/0000000001 ... request: "POST /article/save HTTP/1.1", |
そのバッファサイズの設定量
を変更をしてまず対策しました。
取り急ぎ、t2.microで最小構成でとりあえず作れ!というミッションだったので
50kくらいにしておきました。
1 | http { |
取り急ぎは上記設定でwarn は吐き出されないようになりました。
もしまた吐き出されるようになった場合は、
その数値を元にインスタンスのスケールアップも検討しようと思います。
ちなみにバッファのキャッシュ先ディレクトリ(client_body_temp_path
)はデフォルトで/var/cache/nginx/client
となっていたので設定しませんでした。
以上です。
Elasticsearch のインストールされているサーバ内での作業を想定しています。
1 | curl -XGET localhost:9200/_aliases?pretty |
1 | { |
pretty
をクエリストリングに指定すると1 | $ curl -XGET localhost:9200/_mapping?pretty |
1 | { |
1 | $ cd /etc/elasticsearch/ |
以下のように設定し保存
1 | { |
1 | curl -X PUT localhost:9200/_template/template_1 --data @el_mapping.json |
1 | curl -X GET localhost:9200/_template/?pretty |
1 | curl -X DELETE localhost:9200/_template/template_1 |
1 | "dynamic_templates":[{ |
インデックスを指定し削除します。
1 | curl -X DELETE localhost:9200/logstash-2015.09.22 |
1 | $ curl -XDELETE 'http://localhost:9200/*' |
サービス開始前で試行錯誤してるときに何度か利用しました。
極力使わない。
1 | $ curl -XDELETE 'http://localhost:9200/.kibana' |
各フィールド設定は以下まとめていただいている方がいらっしゃいました。
ありがとうございます♪
ある日、Kibana > Discover にアクセスすると以下のようなエラー表示で
Searchingが完了できない状態に陥った。
1 | tail -f /var/log/elasticsearch/elasticsearch.log |
キャストがうまくいってないバグ出てました。
マッピングがうまくいってないのかな?
と問題を想定して色々設定変更していたらここにたどり着いた。
これで治った!
GithubでもClose Issueとして残ってましたね。
エラーログをslackに通知させるようにしてるとほんと便利。
時たまなんですが、なんだこれ?というのが送られてくる。
その一つが掲題のエラー。
1 | duplicate MIME type "text/html" in /etc/nginx/nginx.conf |
nginx.confを見てみると
gzip_typesで設定した text/html
でした。
直訳すると
1 | /etc/nginx/nginx.confでMIMEタイプ「text/html」が重複しています。 |
じゃ、消せばいいかなってことなので消せば解決しました。
/etc/nginx/nginx.conf
1 | gzip on; |
結論を言うと
ngx_http_gzip_module
をインストールしておりgzip on
としているtext/html
がMIMEタイプが指定されます。以下公式サイトを見るとわかります。
text/html
タイプは常に圧縮対象としているそうです。
なので、gzip で圧縮処理をする場合はtext/html
が不要です。
ということでした。
GeoIP Libraryを設定後、access.logにアクセスポイントを表示
GeoIPライブラリを提供しているMaxMindサイトから取得可能です。
有料版もありますが、取り急ぎは無料版で試します。
1 | # mkdir -p /usr/share/GeoIP/ |
※ログのフォーマットはltsv
にしています。
1 | # vim /etc/nginx/nginx.conf |
1 | http { |
1 | # systemctl restart nginx |
1 | # tail -f /var/log/nginx/access.log |
取得できました♪
これをfluentdで流してKibanaでかっこよく表示しましょう。
以上です。
元々yumでNignxをインストールしていましたが
IP制限やfluentdでip情報を割り出す必要があり
geoIPが必要になりました。
その為には
新たにNginxをソースからダウンロードしLibrary追加しコンパイルし直す必要があります。
1 | # nginx -V |
--with-http_geoip_module
がない!
ので geoIPをインストールしてNginxをコンパイルし直します。
1 | $ sudo yum install -y GeoIP GeoIP-devel |
※今回はNginxは1.8.0なのでnginx-1.8.0.tar.gzをダウンロードします。
1 | $ cd /usr/local/src |
先ほどnginx -V
で確認したconfigure arguments
をコピって
そこに--with-http_geoip_module
を追加してコンパイルする。
1 | $ cd /usr/local/src/nginx-1.8.0 |
1 | nginx -V |
--with-http_geoip_module
が
利用可能なモジュールとして設定されていることが確認できました。
以下設定ファイルも特に変更することなくsystemctl restart nginx
しても問題なかったです。
1 | /etc/nginx/nginx.conf |
以上です。
社内でSlackによる連携が進み
ログ管理もfluentdにまとめつつあるので
エラーログで何かあったらSlack通知させようと思いチャレンジ♪
以下のような流れを想定しています。
Nginx error.log —> fluentd —> slack
gemでも作るか!と思ったら既にSlack Pluginは豊富なので
あやからせていただきます!
fluentdが/var/log/nginx/error.log にアクセスできるようにしておいてください。
ログがtailできないなんてときは以下参照♪
1 | 2015/11/18 18:01:47 [error] 23029#0: *9086 open() "/var/golang/src/img/tmp.png" failed (2: No such file or directory), client: ***.**.**.****, server: hogehoge.jp, request: "GET /img/tmp.png HTTP/2.0", host: "hogehoge.jp", referrer: "http://hogehoge.jp" |
1 | format /^(?<time>.+) \[(?<level>[^\]]+)\] *(?<message>.*)$/ |
上記fomat設定によって以下のように key : value
構成で取得できます。
1 | time : 2015/11/18 18:01 |
設定によってはうまく通知させずハマりました汗
上記 で取得した key:value を元に tagを書き換えます。
以下の例だと、level
が error
の場合、 slack.error.${tag} (slack.error.nginx.error)
にタグを書き換えてます。
他、warn, fatal も同様です。
1 | <match nginx.error> |
また message
で取得した値の中に
特定文字列が含まれている場合等も可能です。
例) message に 「PHP Fatal Error」 で始まる文字列が含まれている場合にslack.fatal.${tag}に書き換える。
1 | <match nginx.error> |
time, level, message 以外に source_id
を追加してます。
以下の例では source_id` に tag_suffix[1] を指定しています。
1 | <match slack.**> |
tag が reformed.slack.error.nginx.error とすると
以下のような仕様です。
1 | tag_suffix[0] → reformed.slack.error.nginx.error |
1 | <match reformed.slack.**> |
Slackに通知しても休日で業務連絡を見ないということは往々にしてあるので
Twillioで電話通知するpluginもあります。
株式会社KDDIウェブコミュニケーションズが提供する有料サービスです。
比較的安価なので導入検討してみてください。
かつての「メール見てませんでした💦」
なんてことがなくなりそうなのは良いですね
以上です。
1 | $ sudo curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh |
1 | $ sudo systemctl start td-agent |
systemctl enable
するとchkconfig使ってと怒られます。
1 | $ sudo systemctl enable td-agent |
設定ファイル (/etc/td-agent/td-agent.conf)を見ると
デフォルト設定では、httpプロトコル
でport:8888
からLoggingしtd-agent.log(/var/log/td-agent/td-agent.log)に流すようにしています。
1 | # HTTP input |
以下のようにコマンドを実行してtd-agent.logを確認してみる。
1 | $ curl -X POST -d 'json={"json":"TEST!!"}' http://localhost:8888/debug.test |
上記のように正しくロギングされていることが確認できました。