タグ

ブックマーク / sfujiwara.hatenablog.com (31)

  • nginx で gzip_static と gunzip を使ってストレージを節約する - 酒日記 はてな支店

    一月ほど前に 社内Gyazoの画像をAmazon S3に逃がしてスケーラブルに運用する - 酒日記 はてな支店 というエントリを書いて一段落と思いきや、そのサーバには社内向けの nopaste アプリも同居しており、気がつけばテキストファイルが10GB以上積もっていたのでした… 社内 nopaste アプリの実装はDBなどを使用せず単にテキストファイルを保存しているだけだったので、ファイルを gzip して nginx の http_gzip_static_module を使って配信したらディスクを節約できていいんじゃないか、と思いついたのですが、Accept-Encoding: gzip でないクライアントからアクセスすると 404 になってしまうので圧縮前のファイルが消せない。 今時ブラウザで対応していないものは少ないとはいえ、curlとか各種言語のHTTPクライアントでアクセスする場

    nginx で gzip_static と gunzip を使ってストレージを節約する - 酒日記 はてな支店
    aki77
    aki77 2014/01/29
  • 社内Gyazoの画像をAmazon S3に逃がしてスケーラブルに運用する - 酒日記 はてな支店

    Gyazo、便利ですよね。大変便利なので、社内でプライベートなGyazoサーバを用意して使っている会社も多いと思います。 うちでもサーバのパフォーマンスは特に必要ないので社内に適当なVMを立てて運用していたのですが、数年単位で運用していると画像ファイルが増えていくためdiskをなんとかする必要に迫られました。 ここでどんどん増えるファイルはAmazon S3に逃がそう、という自然な発想に至るわけですが、Gyazoサーバアプリが投稿を受けたときにS3にアップロードするような改修をするのは年末の忙しい時期に面倒。楽したい。 ということで S3 と nginx を組み合わせていいかんじに運用できるようにしてみました。 Gyazoに限らず、 ローカルに書き込んだファイルをhttpで閲覧する 一度書き込まれたファイルには変更がない ファイルは消えないでどんどん増える ようなものには応用できると思いま

    社内Gyazoの画像をAmazon S3に逃がしてスケーラブルに運用する - 酒日記 はてな支店
  • [fluentd] 同じメッセージを間引く fluent-plugin-suppress を書いた - 酒日記 はてな支店

    fluentdで、なんらかの理由で大量に同じメッセージが送信されてきたときに、それを渡す output plugin によってはちょっと困ることがあります。たとえば out_mail を使うとメールが大量に飛んでしまう。 ということで、同じ (指定したkeyの値を連結したものが同じ) メッセージを適当に間引いてくれるプラグインを書きました。 fujiwara/fluent-plugin-suppress · GitHub fluent-plugin-suppress | RubyGems.org | your community gem host 使いかた <match foo.**> type suppress interval 10 num 2 attr_keys host,message add_tag_prefix sp. </match>[interval] 秒間に [num]

    [fluentd] 同じメッセージを間引く fluent-plugin-suppress を書いた - 酒日記 はてな支店
  • nginxでメソッドごとにリクエスト数制限を掛けたい - 酒日記 はてな支店

    アプリケーションでどうしても捌けない量のリクエストが一時的に押し寄せてしまう場合、アプリケーションサーバが死ぬのを避けるために GET は制限を掛けたいが、POST はリトライが面倒なのでなるべく通してあげたい、というような要求を nginx で処理できるかどうか。 実装として一番望ましいのは GET は 100 req/sec で制限 (超えたら503) POST は無制限 のようにメソッドごとに別々の制限を掛けることだったのですが、とりあえず HttpLimitReqModule を使うことで、メソッドごとに同一の上限を設定することはできました。 http { limit_req_zone $request_method zone=method:1m rate=100r/s; server { listen 80; location / { limit_req zone=method;

    nginxでメソッドごとにリクエスト数制限を掛けたい - 酒日記 はてな支店
    aki77
    aki77 2013/06/20
  • chef-soloがcookbookから実行するscriptの無限ループで大量にメモリを食って死んだ件 - 酒日記 はてな支店

    とあるホストで初期設定をしようと思って chef-solo を実行していたところ、メモリを全部い尽くして chef-solo (11.4.4) が死亡するという事案が発生。 追ってみたところ、どうやら原因はこんなかんじ。 cookbook から shell script を実行していて、その中で perl Makefile.PL && make && make install していた CPAN.pm が初期設定を終えていない場合、対話モードに入る 対話モードで標準入力が閉じられていると途中まではデフォルトの入力で進むが、地域を選択するところはデフォルトがないためここでメッセージを表示しながら無限ループする 無限ループで大量に出力されたメッセージを、(詳細は確認していないですが) chef がメモリに乗せ続けて太る ということで、cookbook 内で実行する script には注意しま

    chef-soloがcookbookから実行するscriptの無限ループで大量にメモリを食って死んだ件 - 酒日記 はてな支店
    aki77
    aki77 2013/05/27
  • MySQLでデータ領域をシステムと別diskにするならtmpdirも設定した方がいい - 酒日記 はてな支店

    某所に300ホスト以上を2年ほど監視していたZabbixのMySQLがありまして、データが100GBぐらいになってメモリ8GBのホストではdisk IOが辛くなってきたので、移行することにしました。普段はそんなにでもないのですが、housekeeperが動作して古いデータを消しに行くとバッファプールに乗っていない部分に読みに行って重いのです。 この際折角なので Intel S3700 (サーバ用のSSD) をおごり、 Zabbix-1.8 から 2.0 にアップグレード MySQL-5.0.77 から MySQL-5.6.11 に変更 システムは HDD で /dev/sda1 データは SSD で /dev/sdb1 を /data にマウント という構成で移行の検証を行っていたところ… MySQLのバージョンが大きく上がるので mysqldump を取得して restore 後、pat

  • #fluentd で maillog を読み込んで MongoDB に投入 - 酒日記 はてな支店

    MTA が吐く maillog は普段あまり見ないのだけど、トラブルがあったときには大変重要。これも Mongo に入れれば、問い合わせがあったアドレスで検索してログを管理画面で見るとかできて便利!ということでやってみた。 # fluentd.conf <source> type tail path /var/log/maillog tag maillog format /^(?<date>[^ ]+) (?<host>[^ ]+) (?<process>[^:]+): (?<message>((?<key>[^ :]+)[ :])? ?((to|from)=<(?<address>[^>]+)>)?.*)$/ </source>正規表現がなかなかですが、これで maillog を parse して以下のような生ログから 2012-03-26T19:49:56+09:00 worker00

    #fluentd で maillog を読み込んで MongoDB に投入 - 酒日記 はてな支店
  • Redisでログの書き込みがblockを引き起こす - 酒日記 はてな支店

    「RedisかわいいよRedis」(by typester)……というほど自分は Redis 期でもないのですが、最近 Redis を使ったサービスの面倒を見ていて時々レスポンスが悪化する現象に出会ったので調べました。 前提 使用しているのは Redis 2.4.16 です。 redis.conf に "save [t] [n]" を定義すると、最後に save をしてから [t]秒間に [n]個以上の key が更新された場合に background で save (=bgsave) が実行されます。 save 60 10000これだと、60秒間に 10,000 keys です。 bgsave では redisは自分自身のプロセスを fork() し、子プロセス側は自分のメモリに乗っている内容をファイルにすべて書き出します。 この仕組みによって、1プロセス 1スレッドで動作している re

    Redisでログの書き込みがblockを引き起こす - 酒日記 はてな支店
    aki77
    aki77 2012/12/05
  • #isucon2 で優勝してきました - 酒日記 はてな支店

    なんでもありのいい感じにスピードアップコンテスト ISUCON が 2 になって帰ってきたので、参加して優勝を勝ち取ってきました。 まとめ的なものはこちらから livedoor Techブログ : ISUCON チームメンバーのblogも併せてご覧ください。 おそらくはそれさえも平凡な日々: #isucon2 で連覇させてもらってきました Redis布教活動報告 ISUCON 編 - unknownplace.org 今回は前回の ISUCON 優勝メンバーのひとり @sugyan が転職して出題側に回ってしまったので、@typester を招聘してチーム編成。@songmu と共に3人でチーム「fujiwara組」として再参戦です。 以下、作業用IRCのログからふりかえりますと…… 11:39:29 <typester> とりあえずrecent_soldはキャッシュってのはまずやることか

    #isucon2 で優勝してきました - 酒日記 はてな支店
    aki77
    aki77 2012/11/05
  • fluentdで複数箇所から同一のファイルに出力する - 酒日記 はてな支店

    このエントリは「ウィークリーFluentdユースケースエントリリレー」への参加記事です。 ウィークリーFluentdユースケースエントリリレーまとめ(現在12まで。) - iをgに変えるとorangeになることに気づいたoranieの日記 fluentd で一番手軽な出力 plugin といえば out_file ですね。path を指定するだけでファイルに出力できますが、使い方に気をつけないと落とし穴があるよ、という話です。 簡単な使いかた 一番単純な使いかたはこのような記述で、 <match app.**> type file path /path/to/logs/app.log </match>これで /path/to/logs/app.log にJSON形式で出力されます。 2012-10-27T17:55:00+09:00 app.info {"message":"info m

    fluentdで複数箇所から同一のファイルに出力する - 酒日記 はてな支店
  • MySQL 5.6のInnoDB memcached pluginを使ってみる - 酒日記 はてな支店

    MySQL 5.6の RC 版が出ましたね。魅力的な機能が満載で皆さんwktkしていることと思います。早速、個人的に気になっていた memcached plugin を試してみました。 最初に結論から言いますが、現時点 (5.6.7rc) では HandlerSocket の代わりに使えるようなものではなさそうです。 memcached protocol でアクセスできるのは全体で 1 テーブルのみ 訂正: namespace という仕組みで複数テーブルにmapが可能です テーブルの文字コードは latin1 である必要がある 【2012-11-22 追記】5.6.8RCでは、文字コードが latin1 であるという制限は撤廃されました 「MySQL のテーブルに memcached protocol でアクセスできる」というよりは、「memcached のストレージを InnoDB にで

    MySQL 5.6のInnoDB memcached pluginを使ってみる - 酒日記 はてな支店
  • ロードアベレージを監視して任意のコマンドを実行する(monitで) - 酒日記 はてな支店

    他に似たツールがあれば教えて欲しいです ロードアベレージを監視して任意のコマンドを実行するコマンド - blog.nomadscafe.jp いままで使ったことはなかったのですが、monit でできるはず、と思って実験。一般的には、負荷が上がったりプロセスが応答しなくなったら再起動、のような用途に使うツールです。 # /etc/monit/monitrc check system localhost start program = "/path/to/command" if loadavg (1min) > 2 then start[追記] exec を使うほうがよいとのご指摘をコメントでいただきました。 check system localhost if loadavg (1min) > 2 then exec "/path/to/command"これでロードアベレージの1分平均が2を超

    ロードアベレージを監視して任意のコマンドを実行する(monitで) - 酒日記 はてな支店
    aki77
    aki77 2012/07/27
  • cron で > /dev/null して椅子を投げられないための3つの方法 - 酒日記 はてな支店

    (タイトルは釣りです) いい加減、>/dev/null 2>&1と書くのをやめたらどうか - DQNEO起業日記 この記事のタイトルが twitter で流れてきたのを見て、「そうだ!出力を /dev/null に捨てるなんてとんでもないよね!」と思ってよく読んだら /dev/null に間違いなく捨てる方法だったのでつい crontabに > /dev/null 書いたら椅子投げる 2012-06-13 00:01:17 via YoruFukurou とつぶやいてしまったのですが、では出力を捨てないためにはどうすればいいのか。現時点での個人的ベストプラクティスを書き留めておきます。 デフォルト : メールで送る (MAILTO) せっかく cron daemon がログを捨てないためにわざわざメールで送ってくれるのに、それを > /dev/null で踏みにじるとはひどい。 とはいえ、

  • 標準入力から読んでFluentdに送信するにはfluent-agent-liteが便利 - 酒日記 はてな支店

    標準入力から受けたログを syslog に送信する場合に使えるのが logger(1) コマンドです。 $ echo "log message" | logger -t myapp -p local0.info自分のところではバッチ処理の出力や、daemontools で起動したコマンドの出力を log/run で logger に渡して syslog に集約するなどしていました。 これを syslog ではなく、Fluentd に送りたい場合にどうするか。 Fluentd 体には fluent-cat というコマンドが同梱されていますが、これは入力に JSON 形式を要求するので単純に代替はできません。 何か適当なワンライナーで wrap する手もありますが…… $ echo "log message" | perl -MJSON -nE 'say JSON::encode_json(

    標準入力から読んでFluentdに送信するにはfluent-agent-liteが便利 - 酒日記 はてな支店
  • [fluentd] #Fluentd Casual Talks で「fluentdでWebサイト運用を楽にする」話をしてきました - 酒日記 はてな支店

    id:tagomoris さんにお声がけいただきまして、Fluentd Casual Talks にて「fluentdでWebサイト運用を楽にする」というタイトルで発表させていただきました。 発表資料はこちら 主催者の id:tagomoris さん、会場を提供していただいた DeNA 様、いろいろ準備をしてくださった id:riywo さんはじめ多くの方々、参加してくださった100名以上の皆様、ありがとうございました!楽しかったです。 発表ではここ半年ほど Fluentd を運用して来た経験をお話ししましたが、発表内で触れなかったことで大事(?)なことがありますので以下に補遺をいくつか書いておきます。 MongoDB にログを溜めすぎない方がいいかも 太田さん (@kzk_mover) の発表内でも触れられていましたが、数千万件程度にしておいたほうがいいのでは……という実感です。 発表内

  • nginxでX-Accel-Redirectを使う場合に余計なヘッダを削除する - 酒日記 はてな支店

    アプリケーションで認証後 S3 のコンテンツを返したかったのだけど、nginx で BASIC 認証を掛けていたらうまくいかなかった、というお話。 Amazon S3 の認証トークン付き URL をアプリケーションで生成し X-Accel-Redirect ヘッダに出力 nginx が S3 から取得してきてクライアントに返す という動作をさせたくて、以下のように設定。 # nginx.conf location = /reproxy { internal; set $reproxy $upstream_http_x_reproxy_url; proxy_pass $reproxy; proxy_hide_header Content-Type; }アプリケーションからは以下のようなレスポンスヘッダを出力。 X-Accel-Redirect: /reproxy X-Reproxy-URL:

    nginxでX-Accel-Redirectを使う場合に余計なヘッダを削除する - 酒日記 はてな支店
  • #isucon で優勝してきました - 酒日記 はてな支店

    なんでもありのWebアプリケーション高速化バトル、#isucon に会社の同僚 @Songmu @sugyan と3人で、fujiwara組として参戦してきました。結果、幸いにも優勝を勝ち取ることが出来ました。 こんなに楽しいイベントを企画、運営していただいた Livedoor の皆様、当にありがとうございます!! さて、ざっとチューニングした経過などを記録しておきます。 [追記] もっと詳しいレポートを @Songmu が上げているのでそちらもご覧ください おそらくはそれさえも平凡な日々: #isucon で優勝させてもらってきました [さらに追記] #isucon ではどんなことを考えながら作業していたか - 酒日記 はてな支店 自分でももう少し詳しく振り返りエントリ書きました。 まず説明を聞いて、環境を作るところから。IPアドレスでは作業がしにくいし事故も起こりそうなので、host

    #isucon で優勝してきました - 酒日記 はてな支店
  • MySQLで参照の負荷分散を行うslaveは3台から構成するのがよいのでは - 酒日記 はてな支店

    前回の記事 MySQLをmaster:slave=1:1構成にして参照をslaveに向けるのがなぜ良くないか の続きです。 master : slave = 1 : 1 で参照を slave に分散してもまったく美味しくないわけですが、では参照の負荷分散を行いたい場合の slave は何台で構成するとよいのか考察してみます。具体的には slave 2台の場合と 3台の場合でどちらがお得か。 台数を増やすということは、どこかに障害が発生する確率が高まる、ということです。1台の slave に障害が発生してダウンした場合のことを考えてみます。 slave * 2 → 残り 1台で処理継続 生き残った1台あたりの処理が 2倍になる slave * 3 → 残り 2台で処理継続 生き残った1台あたりの処理が 1.5倍になる たとえば 1台あたり最大 1000qps の処理能力があるとします。sla

    MySQLで参照の負荷分散を行うslaveは3台から構成するのがよいのでは - 酒日記 はてな支店
  • Unbound で一部の名前だけ置き換える DNS cache サーバを立てる - 酒日記 はてな支店

    とある特定の名前だけ、来のとは別の IP アドレスを返したい場面というのが開発中によくあります。 (追記) PCならば hosts を書き換えればいいのですが、iPhoneなどそういう手段が容易にとれない端末に対して行いたい Unbound を使ってそのような DNS cache サーバを立てるメモ。 homebrew で Unbound をインストール。 $ brew install unboundlocal-data で書き換えたいレコードを定義。 /usr/local/etc/unbound/unbound.conf server: interface: "0.0.0.0" access-control: 192.168.0.0/24 allow username: "nobody" local-data: "foo.example.com A 192.168.0.10"一時的に動

    Unbound で一部の名前だけ置き換える DNS cache サーバを立てる - 酒日記 はてな支店
    aki77
    aki77 2011/06/21
  • MySQLをmaster:slave=1:1構成にして参照をslaveに向けるのがなぜ良くないか - 酒日記 はてな支店

    MySQLのmasterとslave 1:1にして参照をslave向けるのってやりたがる人多いみたいだけど、性能たいして上がらない割に可用性落ちるだけだからやめようキャンペーン 2011-06-19 00:16:30 via YoruFukurou MySQL はレプリケーションが簡単に構成できるのですが、時折 master 1台 に対して slave 1台、更新処理は master に、参照は slave に、という構成を目にします。 個人的にはこの構成はお勧めでないと思っているので、その理由を考察してみます。 1. 可用性が落ちる 当然ですが、master, slave のどちらが落ちても影響を受けるために可用性が低下します。 2. 全体の性能がほとんど上がらない master 1台ですべてのクエリを処理する場合と比べて、可用性が落ちる引き換えとして見合った性能向上が得られるか、という