Hatena::ブログ(Diary)

@camelmasaの開発日記 このページをアンテナに追加 RSSフィード

Githubで活動しています。

2011-05-03

nginx/0.8.53 + Amazon ELB + HttpRealIpModuleでプロセスが死亡する。

| 21:36

検証過程をメモ。

Amazon EC2上で動作しているnginx/0.8.53のerror.logに

worker process XXX exited on signal 11

というログがありSIGSEGVが発生したので検証してみました。


どうも、nginxのHttpRealIpModule内のset_real_ip_from, real_ip_headerディレクティブが原因の様で、何故かX-Forwarded-Forヘッダーを適当なIPを追加してELBを経由した場合のみSIGSEGVが発生します。

(現在も調査中)


上記のディレクティブを有効にするとaccess.logにはploxyのIPでは無く通信元のIPが書き込まれるというディレクティブです。


環境

AMI(OS) Basic 64-bit Amazon Linux AMI

nginx/0.8.53

ELB


telnetによる検証(X-Forwarded-Forを付与しない)

$ telnet ec2-xxx.xxx.xxx.xxx.ap-northeast-1.compute.amazonaws.com 80
Trying xxx.xxx.xxx.xxx...
Connected to ec2-xxx.xxx.xxx.xxx.ap-northeast-1.compute.amazonaws.com.
Escape character is '^]'.
GET /test.html HTTP/1.1
host: ec2-xxx.xxx.xxx.xxx.ap-northeast-1.compute.amazonaws.com
Connection: keep-alive

HTTP/1.1 200 OK
Server: nginx/0.8.53
Date: Tue, 03 May 2011 12:10:17 GMT
Content-Type: text/html
Content-Length: 0
Last-Modified: Tue, 03 May 2011 09:44:49 GMT
Connection: keep-alive
Accept-Ranges: bytes

正常に通信出来ました。


次にELBに通信した場合。

$ telnet nginx-test-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com 80
Trying xxx.xxx.xxx.xxx...
Connected to nginx-test-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com.
Escape character is '^]'.
GET /test.html HTTP/1.1
host: nginx-test-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com
Connection: keep-alive

HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: text/html
Date: Tue, 03 May 2011 12:13:33 GMT
Last-Modified: Tue, 03 May 2011 09:44:49 GMT
Server: nginx/0.8.53
Content-Length: 0
Connection: keep-alive

正常に通信出来ました。



telnetによる検証(X-Forwarded-Forを付与)

まずインスタンスに直接アクセスした場合。

||<

$ telnet ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com 80

Trying xxx.xxx.xxx.xxx...

Connected to ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.

Escape character is '^]'.

GET /test.html HTTP/1.1

host: ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com

X-Forwarded-For: 192.168.0.10, 223.25.164.105

X-Forwarded-Port: 80

X-Forwarded-Proto: http

Connection: keep-alive

HTTP/1.1 200 OK

Server: nginx/0.8.53

Date: Tue, 03 May 2011 11:48:32 GMT

Content-Type: text/html

Content-Length: 0

Last-Modified: Tue, 03 May 2011 09:44:49 GMT

Connection: keep-alive

Accept-Ranges: bytes

||<

正常に通信出来ました。

packet log

10:55:00.494515 IP g1-223-25-164-105.bmobile.ne.jp.57066 > ip-10-150-181-155.ap-northeast-1.compute.internal.http: Flags [P.], seq 1:28, ack 1, win 65535, options [nop,nop,TS val 458615364 ecr 604868263], length 27
E..O.^@........i
......P)N....:~....z......
.U.D$^M..GET /test.html HTTP/1.1^M

10:55:00.494565 IP ip-10-150-181-155.ap-northeast-1.compute.internal.http > g1-223-25-164-105.bmobile.ne.jp.57066: Flags [.], ack 28, win 91, options [nop,nop,TS val 604868625 ecr 458615364], length 0
E..4..@.@.BR
......i.P....:~)N.....[C......
$^M...U.D
10:55:00.707656 IP g1-223-25-164-105.bmobile.ne.jp.57066 > ip-10-150-181-155.ap-northeast-1.compute.internal.http: Flags [P.], seq 28:169, ack 1, win 65535, options [nop,nop,TS val 458615366 ecr 604868625], length 141
E....#@...2_...i
......P)N....:~.....A.....
.U.F$^M..host: ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com^M
X-Forwarded-For: 192.168.0.10, 223.25.164.105^M
X-Forwarded-Port: 80^M
X-Forwarded-Proto: http^M

10:55:00.707692 IP ip-10-150-181-155.ap-northeast-1.compute.internal.http > g1-223-25-164-105.bmobile.ne.jp.57066: Flags [.], ack 169, win 108, options [nop,nop,TS val 604868679 ecr 458615366], length 0
E..4..@.@.BQ
......i.P....:~)N.....lC......
$^M.G.U.F
10:55:01.209798 IP g1-223-25-164-105.bmobile.ne.jp.57066 > ip-10-150-181-155.ap-northeast-1.compute.internal.http: Flags [P.], seq 169:193, ack 1, win 65535, options [nop,nop,TS val 458615371 ecr 604868679], length 24
E..L.Y@...j....i
......P)N....:~....?......
.U.K$^M.GConnection: keep-alive^M


次にELBに通信した場合。

$ telnet nginx-test-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com 80
Trying xxx.xxx.xxx.xxx...
Connected to nginx-test-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com.
Escape character is '^]'.
GET /test.html HTTP/1.1
host: nginx-test-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com
X-Forwarded-For: 192.168.0.10
X-Forwarded-Port: 80
X-Forwarded-Proto: http
Connection: keep-alive

Connection closed by foreign host.
zsh: exit 1     telnet nginx-test-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com 80

接続が切れてしまいました。

packet log

10:55:15.310308 IP ip-10-150-174-112.ap-northeast-1.compute.internal.19782 > ip-10-150-181-155.ap-northeast-1.compute.internal.http: Flags [P.], seq 1:210, ack 1, win 730, options [nop,nop,TS val 44406524 ecr 604870846], length 209
E...=.@.?...
..p
...MF.P.w..8j......K<.....
....$^M..GET /test.html HTTP/1.1^M
host: nginx-test-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com^M
X-Forwarded-For: 192.168.0.10, 223.25.164.105^M
X-Forwarded-Port: 80^M
X-Forwarded-Proto: http^M
Connection: keep-alive^M

error.logに下記が書き込まれました。

2011/05/03 08:26:26 [alert] 8271#0: worker process 8273 exited on signal 11

以上が検証過程です。


若干パケットが違うのが気になるところ。

telnetの通信間に入るパケットsshパケットなのかな?

直接インスタンスに通信する場合とELB経由で通信する場合でパケットを揃える方法が分からないな。

追って検証したい。



[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。

このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。

http://spreecommerce.jp/