haproxy経由のvarnishでPOSTをパースしようとしてハマったメモ
varnishでPOSTデータをパースしようとしていて、しばらくハマってました。。。
原因はvarnishでパースをするとPOSTデータが切れてしまうという現象。。。
■原因
haproxyの不具合。(使用していたのはepelの1.4.19-1)
(1.4.20-1で直ってました。fedora16のupdateから持って来て確認)
changelogはこちら。 http://haproxy.1wt.eu/download/1.4/src/CHANGELOG
■詳細
POSTデータがそこそこ大きいのでパケットが分割され、次のパケットの間に、
IP 192.168.x.x.http > 192.168.x.xx.34693: Flags [.], ack 3863, win 151, options [nop,nop,TS val 1921941632 ecr 1942253543], length 0
というパケットがあり、Varnish側が終了したと判断し、コネクションをCLOSEしていたと推測される。
なので、次のパケットが来る前の不完全な状態のPOSTデータとなっていた。
tcpdumpは以下。(POSTしているデータは全く同じ内容です)
●1.4.19-1
0x0b40: 3041 2530 4425 3041 2530 4425 3041 2d2d 0A%0D%0A%0D%0A-- 0x0b50: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- 0x0b60: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- 0x0b70: 2d2d 2d2d 2d2d 2d25 3044 2530 4125 4532 -------%0D%0A%E2 0x0b80: 2538 3025 %80% 21:44:49.221422 IP 192.168.x.x.http > 192.168.x.x.34693: Flags [.], ack 3863, win 151, options [nop,nop,TS val 1921941632 ecr 1942253543], length 0 ☆ 0x0000: 4500 0034 b4fe 4000 4006 01f0 c0a8 0144 E..4..@.@......D 0x0010: c0a8 0141 0050 8785 e74a 3494 98f2 2ccd ...A.P...J4...,. 0x0020: 8010 0097 b221 0000 0101 080a 728e 8080 .....!......r... 0x0030: 73c4 6fe7 s.o. 21:44:49.221491 IP 192.168.x.x.34693 > 192.168.x.x.http: Flags [.], seq 3863:4867, ack 1, win 115, options [nop,nop,TS val 1942253543 ecr1921941632], length 1004 0x0000: 4500 0420 726b 4000 4006 4097 c0a8 0141 E...rk@.@.@....A 0x0010: c0a8 0144 8785 0050 98f2 2ccd e74a 3494 ...D...P..,..J4. 0x0020: 8010 0073 87e8 0000 0101 080a 73c4 6fe7 ...s........s.o.
●1.4.20-1
0x0b40: 3041 2530 4425 3041 2530 4425 3041 2d2d 0A%0D%0A%0D%0A-- 0x0b50: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- 0x0b60: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- 0x0b70: 2d2d 2d2d 2d2d 2d25 3044 2530 4125 4532 -------%0D%0A%E2 0x0b80: 2538 3025 %80% 14:57:43.004932 IP 192.168.x.xx.50111 > 192.168.x.xx.http: Flags [P.],seq 3911:4915, ack 1, win 115, options [nop,nop,TS val 2004234985 ecr1983794750], length 1004 0x0000: 4500 0420 83c3 4000 4006 2f41 c0a8 0141 E.....@.@./A...A 0x0010: c0a8 0142 c3bf 0050 ab0a c0b6 54ee fa9b ...B...P....T... 0x0020: 8018 0073 87e6 0000 0101 080a 7776 32e9 ...s........wv2.
めでたく。POSTデータが切れることはなくなりましたが、まだパースするには対応しないといけない問題があります。。。
まぁ、POSTをパースしなければこの問題起きないというか、気づくことすらなかったんですけどね。。。(;´∀`)
いろいろとご協力、ご教授頂いた、@xcirこと、いわなちゃんさん ありがとうございます。
まぁ、自分のvarnish力とC言語力のないこと。。。orz