LINUX.ORG.RU

Мигрирование Apache -> Nginx & java upload applet (для TCP экспертов что-ли)


0

0

Перевожу некий joomla сайт c apache на nginx. В joomla есть некий компонент для загрузки на сайт изображений, который использует java applet http://jupload.sourceforge.net/. Этот аплет никак не хочет работать с nginx. К примеру при начальной загрузке аплета он пытается проверить post url c помошью HEAD запроса. В случае apache всё нормально, в случае nginx после посылки аплетом HEAD запроса для сервера выглядить как клиент закрыл соединение, для клиента как сервер закрыл. Включение/выключение tcp_nodelay и tcp_nopush в nginx не помогло. Все это на одной машине, т.е. опции sysctl одни и те же.

Ниже детализованная информация. Пакеты с данными отмечены. То же происходит под разными клиентскими браузерами/os. В случае apache клиент закрывает соединение (FIN) сразу после посылки HEAD запроса, но сервер ещё шлёт данные (как я понимаю это half-close connection). В случае nginx cервер по сути почти сразу закрывает соединие.

apache tcpdump:
21:29:22.974011 IP 192.168.1.158.53590 > server.80: S 1107190968:1107190968(0) win 65535 <mss 1460,nop,wscale 1,nop,nop,timestamp 669841553 0,sackOK,eol>
21:29:23.064207 IP server.80 > 192.168.1.158.53590: S 984647680:984647680(0) ack 1107190969 win 5792 <mss 1460,sackOK,timestamp 367503289 669841553,nop,wscale 7>
21:29:23.064244 IP 192.168.1.158.53590 > server.80: . ack 1 win 33304 <nop,nop,timestamp 669841554 367503289>
21:29:23.064563 IP 192.168.1.158.53590 > server.80: P 1:389(388) ack 1 win 33304 <nop,nop,timestamp 669841554 367503289> - HEAD /administrator/index.php?option=com_joomgallery&task=juploadhandler_receive HTTP/1.1
21:29:23.071329 IP 192.168.1.158.53590 > server.80: F 389:389(0) ack 1 win 33304 <nop,nop,timestamp 669841554 367503289>
21:29:23.156267 IP server.80 > 192.168.1.158.53590: . ack 389 win 54 <nop,nop,timestamp 367503381 669841554>
21:29:23.156299 IP 192.168.1.158.53590 > server.80: F 389:389(0) ack 1 win 33304 <nop,nop,timestamp 669841555 367503381>
21:29:23.200585 IP server.80 > 192.168.1.158.53590: . ack 390 win 54 <nop,nop,timestamp 367503426 669841554>
21:29:23.200637 IP 192.168.1.158.53590 > server.80: . ack 1 win 33304 <nop,nop,timestamp 669841556 367503426>
21:29:23.245360 IP server.80 > 192.168.1.158.53590: . ack 390 win 54 <nop,nop,timestamp 367503470 669841555,nop,nop,sack 1 {389:390}>
21:29:23.334561 IP server.80 > 192.168.1.158.53590: P 1:214(213) ack 390 win 54 <nop,nop,timestamp 367503558 669841556> - HTTP/1.1 200 OK
21:29:23.334566 IP server.80 > 192.168.1.158.53590: F 214:214(0) ack 390 win 54 <nop,nop,timestamp 367503558 669841556>
21:29:23.334626 IP 192.168.1.158.53590 > server.80: . ack 214 win 33197 <nop,nop,timestamp 669841557 367503558>
21:29:23.334654 IP 192.168.1.158.53590 > server.80: . ack 215 win 33197 <nop,nop,timestamp 669841557 367503558>

Для Nginx:
19:49:33.805120 IP 192.168.1.158.51975 > server.80: S 4062245563:4062245563(0) win 65535 <mss 1460,nop,wscale 3,nop,nop,timestamp 669781685 0,sackOK,eol>
19:49:33.809760 IP server.80 > 192.168.1.158.51975: S 3823098756:3823098756(0) ack 4062245564 win 5792 <mss 1460,sackOK,timestamp 290138093 669781685,nop,wscale 7>
19:49:33.809808 IP 192.168.1.158.51975 > server.80: . ack 1 win 65535 <nop,nop,timestamp 669781685 290138093>
19:49:33.809973 IP 192.168.1.158.51975 > server.80: P 1:464(463) ack 1 win 65535 <nop,nop,timestamp 669781685 290138093> - HEAD /administrator/index.php?option=com_joomgallery&task=juploadhandler_receive HTTP/1.1
19:49:33.809996 IP 192.168.1.158.51975 > server.80: F 464:464(0) ack 1 win 65535 <nop,nop,timestamp 669781685 290138093>
19:49:33.815810 IP server.80 > 192.168.1.158.51975: . ack 464 win 54 <nop,nop,timestamp 290138098 669781685>
19:49:33.815843 IP 192.168.1.158.51975 > server.80: F 464:464(0) ack 1 win 65535 <nop,nop,timestamp 669781685 290138098>
19:49:33.818232 IP server.80 > 192.168.1.158.51975: F 1:1(0) ack 465 win 54 <nop,nop,timestamp 290138099 669781685>
19:49:33.818262 IP 192.168.1.158.51975 > server.80: . ack 2 win 65535 <nop,nop,timestamp 669781685 290138099>
19:49:33.820036 IP server.80 > 192.168.1.158.51975: . ack 465 win 54 <nop,nop,timestamp 290138104 669781685,nop,nop,sack 1 {464:465}>

Nginx logs:
==> ../logs/access.log <==
192.168.1.158 - - [27/Jun/2009:23:40:36 -0400] "HEAD /administrator/index.php?option=com_joomgallery&task=juploadhandler_receive HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.18 (KHTML, like Gecko) Version/4.0.1 Safari/530.18"

==> ../logs/error.log <==
2009/06/27 23:40:36 [info] 5110#0: *11 client closed prematurely connection, so upstream connection is closed too while sending request to upstream, client: 192.168.1.158, server: server, request: "HEAD /administrator/index.php?option=com_joomgallery&task=juploadhandler_receive HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.server"

Полный head заголовок:
HEAD /administrator/index.php?option=com_joomgallery&task=juploadhandler_receive HTTP/1.1
Host: www.server
Accept: */*
Accept-Encoding: identity
Connection: close
Cookie: 2d6498ed29010381ca627f9124f1eeba=6fa36898d3935f245e49837a54c8ee64
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.18 (KHTML, like Gecko) Version/4.0.1 Safari/530.18




Re: Мигрирование Apache -> Nginx & java upload applet (для TCP экспертов что-ли)

Как я понимаю сразу после отсылки head запроса клиент делает shutdown(socket, SHUT_WR) , что интерпретируется по разному apache и nginx.

tungus ()

Re: Мигрирование Apache -> Nginx & java upload applet (для TCP экспертов что-ли)

Оказалось что проблема вызвана тем, что nginx и apache по разному обрабатывают half-open connections. Ниже код на perl для воспроизведения. Все начинается если использовать shutdown:

use IO::Socket::INET;
my $host = "www.server";

my $sock = IO::Socket::INET->new(
PeerAddr => $host,
PeerPort => 'http(80)',
Proto => 'tcp'
);
unless ($sock) { die "cannot connect\n" }
$sock->autoflush(0);
print $sock "HEAD / HTTP/1.1\r\n";
print $sock "Host: ".$host."\r\n";
print $sock "Accept: */*\r\n";
print $sock "Accept-Encoding: identity\r\n";
print $sock "Connection: close\r\n\r\n";
$sock->autoflush(1);
# shutdown call creates problems
# if commented works for nginx and apache
# if uncomented works only with apache
shutdown($sock, 1);
while (my $line = <$sock>) {
$line =~ s/[\r\n]$//;
print $line."\n"; }
close $sock;

Собственно вопрос - что делать? Баг-репорт писать что-ли?

tungus ()

Re: Мигрирование Apache -> Nginx & java upload applet (для TCP экспертов что-ли)

Проблема с head решена - fastcgi_ignore_client_abort on.

Но post (т.е. отгрузка изображений) всё равно не работает. В логах nginx 499 error.

tungus ()

Re: Мигрирование Apache -> Nginx & java upload applet (для TCP экспертов что-ли)

Следущий код вызывает проблему. Если $num < 853 (полная длинна POST (Length) < 1025), то всё нормально, если $num >= 853 (полная длинна POST (Length) >= 1025) - ошибка

use IO::Socket::INET;

my $host = "www.server";
my $num = 853;
my $sock = IO::Socket::INET->new(
PeerAddr => $host,
PeerPort => 'http(80)',
Proto => 'tcp'
);
unless ($sock) { die "cannot connect\n" }
my $string = "POST / HTTP/1.1\r\n";
$string .= "Host: ".$host."\r\n";
$string .= "Accept: */*\r\n";
$string .= "Accept-Encoding: identity\r\n";
$string .= "Connection: close\r\n";
$string .= "Content-Type: application/x-www-form-urlencoded\r\n";
$string .= "Content-Length: ".$num."\r\n\r\n";
for (my $i = 0; $i <$num ; $i++) {
$string .= "x";
}
print $sock $string;
# shutdown call creates problems
# if commented works for nginx and apache
# if uncomented works only with apache
shutdown($sock, 1);
while (my $line = <$sock>) {
print $line if $line =~ /^HTTP.*200 OK/;
}
print "Length: ".length($string)."\n";
close $sock;

tungus ()

Re: Мигрирование Apache -> Nginx & java upload applet (для TCP экспертов что-ли)

Аплет подправь.

499 выдаёт тогда когда удалённая сторона закрыла соединение не дождавшись ответа. А это как-то неправильно.

true_admin ★★★★★ ()

Re: Мигрирование Apache -> Nginx & java upload applet (для TCP экспертов что-ли)

Зачем газовать в лужу. Аплет править - это я и сам мог догадаться. Меня интересует почему nginx не совметим с apache на уровне tcp и что делать.

tungus ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.