携帯コンテンツを作っているとドコモ・AU・ソフトバンクで表示可能サイズが違うため
同じURLで別々のコンテンツを出したいことが多々あります
それでもURLは同じなので単純にキャッシュしてしまうと同じコンテンツを返してしまいます
もちろん携帯に限った話ではなくてPCのブラウザのタイプによって・・・とかいろいろありますね
じゃぁどうすりゃいいのってことで解決方法です
Continue reading »
以下の記事でもチラッと書いたのですがVarnishの現バージョンではESIのTTL指定がesi:includeタグからできません
単純に考えるのであればvcl_fetchでそれぞれのURLで指定すればいいとも言えるのですが
ESIの利点を多少損なっている感もします
(個人的にはデザイナ側がこのパーツは10分キャッシュしてもユーザに影響しないよ!とか設定できるのが利点と思ってる)
じゃぁどうすればいいのでしょうか
あまりスマートではないですが解決方法があります
例えばdocument root直下にあるhello.htmlを
ESIでincludeしたい場合で10秒のTTLを指定する時に
<esi:include src="/esi/t/10s/hello.html"></esi:include>
こんな感じの記述でできるようになります
Continue reading »
軽めのネタで
varnishでVCL(設定ファイル)を作っているとすごく分割したくなります
たとえばACL(アクセス制限まわり)などの定義を書いてみると非常に冗長になったりして困ります
なんか分割方法ないかなーと探してたらありました
include "インクルードしたいファイル名";
ええそのまんまです
公式サイトでも一応書いてはあるのですが
Syntax overview
The VCL syntax is very simple, and deliberately similar to C and Perl. Blocks are delimited by curly braces,statements end with semicolons, and comments may be written as in C, C++ or Perl according to your own preferences.
In addition to the C-like assignment (=), comparison (==) and boolean (!, && and ||) operators, VCL supports regular expression and ACL matching using the ~ operator.
Unlike C and Perl, the backslash (\) character has no special meaning in strings in VCL, which use the (%xx) escape mechanism just like URLs, so it can be freely used in regular expressions without doubling.
Assignments are introduced with the set keyword. There are no user-defined variables; values can only be assigned to variables attached to backend, request or document objects. Most of these are typed, and the values assigned to them must have a compatible unit suffix.
VCL has if tests, but no loops.
The contents of another VCL file may be inserted at any point in the code by using the include keyword followed by the name of the other file as a quoted string.
VCL – Varnish configuation Language
とあって書いてるのですが非英語圏だとさくっと読み飛ばしそうです><
こういう所も参考記述があると助かるんですがね・・・
自分も読み飛ばした口なので自戒も込めて共有です
参考サイト
Poul-Hennings other homepage
Apacheのチューニングでこんなページを教えてもらったのですが
微妙に違うような気がするのでメモ(解釈の違いかも)
注意が必要なのは、リクエストを処理しているプロセスは待機プロセスと呼ばない点である。
つまり、最大時にはMaxClientsとMaxSpareServersを足した数のプロセスが起動するということだ。
MaxSpareServersはあくまでも待機プロセスだと記憶してたので
こんな設定を試してみました
<IfModule prefork.c> StartServers 8 MinSpareServers 20 MaxSpareServers 20 MaxClients 30 ServerLimit 30 MaxRequestsPerChild 4000 </IfModule>
起動時8プロセスでとりあえず20まであがる
負荷時は最大30(+親プロセス1)といった感じです
ABで多重度40で試してみたところ想定どおり31のプロセス数でした
最大時というのが曲者で
おそらく筆者はMaxClientsが十分ある環境の下で負荷+MaxSpareServersの
プロセスがあがるといいたかったのではないかと思うのですが
さっくり読んでしまうとMaxClients+MaxSpareServersが最大あがるプロセス数と勘違いしてしまうかも知れないので・・・
ちなみに聞いた話だとプロセスがあがるのはまだ無視できるけど
プロセスが死ぬときの負荷は無視できないということを聞きましたので
MinSpareServersとMaxSpareServersの値は同じにして
ピークのプロセス数あたりに合わせるといいかもしれません(未検証)
あ、自分の勘違いだったら指摘していただけるとありがたいです
参考サイト
Apache MPM prefork
Apache MPM 共通ディレクティブ
HTTPでの要求でIMS(if-modified-since)というものがあります
ようはこんな感じのやりとりです
ブラウザ「今この日付でオブジェクトもってるんだけどこれって最新?使ってもいい?」
(If-Modified-Since: Sun,14 Feb 2010 03:01:19 GMT)
サーバ「最新だからそれ使ってもいいよ」
(304 Not Modified)
普通であればまったく問題ないやり取りです
ただトラフィックが非常に大きいサーバの場合深刻な問題になります
さっきのやり取りをもうちょい具体的にかくと
ブラウザ「今この日付でオブジェクトもってるんだけどこれって最新?使ってもいい?」
(If-Modified-Since: Sun,14 Feb 2010 03:01:19 GMT)
サーバ「ちょっとまってね(HDDのファイルの更新日時を調べる・・・)最新だからそれ使ってもいいよ」
(304 Not Modified)
もしくは
ブラウザ「今この日付でオブジェクトもってるんだけどこれって最新?使ってもいい?」
(If-Modified-Since: Sun,14 Feb 2010 03:01:19 GMT)
サーバ「ちょっとまってね(HDDのファイルの更新日時を調べる・・・)古いからこれ使って」
(200 OK で実ファイル転送)
いらないioが発生してしまいます
ioといってもファイルの更新日時程度なので少々ならまったく問題ないのですが非常に多いとそれだけでiowaitが大変なことに・・・
304で実ファイルは転送されないため見かけ上のトラフィックはさほど発生せずiowaitが発生してなんだろう?と悩むこともあるかも?
5/29にちょこっと修正しました(vcl_error追加)
Continue reading »
varnishはメモリの使い方もとっても素直でマルチコアにも対応していて結構いいパフォーマンスなので
一台で複数のドメインを管理しても問題ないです
じゃぁどのように設定すればいいでしょうか?
以下VCL記述例
Continue reading »
nginxでapacheで日付風のログを出力する方法がないかなぁと考えてたのでメモ程度に
logrotateを使うしかないのですが dateextオプションをつけるとlogrotateが走った日時の日付になります
結構強引ですがこうすればいけます
logrotate用の設定ファイル
/var/log/nginx/access_log { dateext rotate 365 missingok postrotate /bin/kill -USR1 `/bin/cat /var/run/nginx.pid 2>/dev/null` 2>/dev/null || true /bin/mv /var/log/nginx/access_log-`date '+%Y%m%d'` /var/log/nginx/access_log.`date '+%Y%m%d' -d '1days ago'` endscript }
postrotateのところでmvしてるだけですが意外と思いつかなかったのでメモ
あとnginxでrotateするときはHUPではなくてUSR1なので注意が必要です
rotateの時間は00:00ぴったりがおすすめです
参考
Gmane — Mail To News And Back Again
あんまり話題に上らないで個人的に悔しいVarnishのESI(Edge Side Include)ですが
非常に癖がありますのではまりやすいポイントをとりあえず自分用のメモ程度に
2010/06/23追記:Ver2.1.2では多少注意事項が変わっていますのでこちらも参照ください
そもそもESIってなに?
ページは様々な要素で構成されていますが大きく分けて二つに分かれます
表示される度に更新しなくてはいけないもの(広告・タイムライン)
表示される度に更新しなくてもいいもの(フォロワーなどの数)
別にフォロワー数を表示するためにPHPを動かして、DBかmemcacheにアクセスして整形して・・・
といった処理をしてもいいのですが
PVが多いWEBサイトの場合、毎回呼ばれる処理はできるだけしたくありません
PHP→memcacheとしても負荷が結構痛いです
そういう時にESIがあると、ページの構成要素ごと キャッシュを行い、Varnish側で組み立てて返却してくれます
PHPやDBまでアクセスがこないので負荷に強くなるとともに、そのキャッシュした構成要素を別の画面で再利用できます
PC向けの場合Ajaxなどもあるので、一概にESIがすごく有効とも言い辛いのですが(例でTwを上げましたがちょっと悪かったかも)
携帯向けなどJSが使えない環境で、毎回一枚のHTMLを出力しないといけない場合非常に効果的です
また転送速度が上がるのでPVが上がるかも しれませんしSEOにも効果がありそうです
(Googleはどれぐらいでページが表示されるかをSEOの評価としてるみたいです)
今遊んでるXenServerですがブートドライブが数年前のそろそろ危なさそうなHDDだったのでSSDに換装しました
XenCenterでバックアップとっておいてそれを入れ直せばいいと思ってたのですが予想以上にハマったので作業のメモです
本当はホストバックアップだけでOKだと思ったんですがね・・・
どうもエラー吐いてうまくいかない><
めも:
物理サーバスペック
CPU Intel Core-i7 920(たまにOC)
RAM 12GB
HDD 4TB(2TBx5(RAID1+0) ARC-1680ix-12 Cache4GB)
OS Citrix XenServer5.6
論理サーバ
ゲートウェイサーバ(Nginx)
→Cache/Webサーバ(Varnish/Nginx/FCGI)
→FCGIサーバ(FCGI)
→DBサーバ(MySQL)