일부 사진에서 nginx가 연결을 닫습니다.


8

에 문제가 nginx있습니다. 클라이언트 다운로드가 완료되기 전에 연결을 닫습니다. 다음과 같습니다.

 $ wget -O /dev/null http://www.site.com/images/theme/front/clean.jpg
--2012-07-11 21:37:03--  http://www.site.com/images/theme/front/clean.jpg
Resolving www.site.com (www.site.com)... 123.234.123.234
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 90707 (89K) [image/jpeg]
Saving to: `/dev/null'

26% [===============>                    ] 24,291      --.-K/s   in 8.7s    

2012-07-11 21:37:12 (2.74 KB/s) - Connection closed at byte 24291. Retrying.

--2012-07-11 21:37:13--  (try: 2)  http://www.site.com/images/theme/front/clean.jpg
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 90707 (89K), 66416 (65K) remaining [image/jpeg]
Saving to: `/dev/null'

53% [+++++++++++++++============>        ] 48,555      --.-K/s   in 8.7s    

2012-07-11 21:37:23 (2.74 KB/s) - Connection closed at byte 48555. Retrying.

--2012-07-11 21:37:25--  (try: 3)  http://www.site.com/images/theme/front/clean.jpg
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 90707 (89K), 42152 (41K) remaining [image/jpeg]
Saving to: `/dev/null'

100%[+++++++++++++++++++++++++++========>] 90,707      --.-K/s   in 0.1s    

2012-07-11 21:37:25 (311 KB/s) - `/dev/null' saved [90707/90707]

더 작은 이미지로 동시에 괜찮습니다.

 $ wget -O /dev/null http://www.site.com/images/theme/front/grease.jpg
--2012-07-11 21:41:28--  http://www.site.com/images/theme/front/grease.jpg
Resolving www.site.com (www.site.com)... 123.234.123.234
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 21404 (21K) [image/jpeg]
Saving to: `/dev/null'

100%[====================================>] 21,404      --.-K/s   in 0.07s   

2012-07-11 21:41:29 (316 KB/s) - `/dev/null' saved [21404/21404]

이것이 브라우저에서이 그림을 전체 크기로 그릴 수없는 이유입니다. 나는 그것의 머리 만 볼 수 있습니다.

Nginx는 프론트 엔드로 구성되고 아파치는 백엔드로 구성됩니다. 아파치에 대한 직접 링크가 잘 작동하므로 nginx에 문제가 있습니다. 내가 맞아?

nginx 설정 :

user satellite;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    multi_accept on;
}

http {
    include       /etc/nginx/mime.types;
    access_log  /var/log/nginx/access.log;

    sendfile        on;
    keepalive_timeout  0;
    tcp_nodelay        on;

    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    client_max_body_size 100m;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    server {
            listen 123.234.123.234:80;
            server_name site.com www.site.com;
            location ~* ^/(admin/|dump/|webmail/|myadmin/|webim/) {
                    proxy_pass http://123.234.123.234:8080;
                    proxy_redirect http://site.com:8080/ /;
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Real-IP $remote_addr;
            }
            location / {
                    proxy_pass http://123.234.123.234:8080;
                    proxy_redirect http://site.com:8080/ /;
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_cache ino;
                    proxy_cache_valid 12h;
                    proxy_hide_header "Set-Cookie";
                    proxy_ignore_headers "Cache-Control" "Expires";
            }
            location ~* ^.+\.(jpg|swf|flv|ico|txt|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
                    access_log /home/satellite/logs/site.com.nginx.access.log;
                    error_page 404 = @fallback;
                    if ( $host ~* ^((.*).site.com)$ ) {
                            set $proot /home/satellite/www/$1;
                            break;
                    }
                    if ( $host = "www.site.com" ) {
                            break;
                    }
                    if ( $host = "site.com" ) {
                            break;
                    }

                    root /home/satellite/www/site.com;
            }
            location @fallback {
                    proxy_pass http://123.234.123.234:8080;
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Real-IP $remote_addr;
            }
    }

이 문제를 해결하기 위해 어디서 파야합니까?


1
전원을 끄려고 했습니까 sendfile?
VBart

예, 변경된 것이 없습니다.
rush

답변:


9

내가 잊어 버린 가장 중요한 것은 확인하는 것 /var/log/nginx/error.log입니다.

2012/07/12 08:46:44 [crit] 24074#0: *3 open() 
"/var/lib/nginx/proxy/1/00/0000000001" failed (13: Permission denied) 
while reading upstream, client: 109.173.96.30, server: site.com, request: 
"GET /images/theme/front/clean.jpg HTTP/1.1", upstream: 
"http://123.234.123.234:8080/images/theme/front/clean.jpg", 
host: "www.site.com", referrer: "http://www.google.com"

그래서 나는 /var/lib/nginx/proxy/*디렉토리 권한 ( sudo chown -R www-data:www-data /var/lib/nginx/proxy/*)을 고쳤으며 이제는 모든 것이 잘 작동합니다. 도움을 주셔서 감사합니다.


고마워 명백한 조언처럼 보이지만 나는 확인하지 않았습니다. 내 경우에는 원인은 다음과 같습니다. [crit] 6 # 6 : * 2577 mkdir () "/ var / cache / nginx / proxy_temp / 8"실패 (28 : 업스트림을 읽는 동안 장치에 남은 공간 없음)
Damian Moore

1

연결을 닫을 수있는 가능한 이유는 연결이 느리고 연결이 짧기 때문 keepalive_timeout입니다. 기본값 에 대한이 keepalive_timeout75S입니다. 너무 짧고 연결이 느리면 너무 일찍 닫힐 수 있습니다.

http {
    ..
    keepalive_timeout 75;
}

이미지 다운로드 속도가 느린 이유 중 하나는 응용 프로그램입니다. Nginx와 함께 Asset Pipeline 과 함께 Ruby-on-Rails 애플리케이션을 사용하는 경우 자산 파이프 라인 에서 생성 된 지문이없는 잘못된 이미지 URL을 사용하여 이미지 다운로드가 느려질 수 있습니다. Rails 헬퍼 asset_path 및 image_tag는 신속하게 다운로드 할 수있는 지문이있는 올바른 URL 양식 파일을 생성합니다.


1

확인해야 할 또 다른 중요한 사항은 다음과 같습니다. 디스크 공간이 남아 있는지 확인하십시오!

나에게 그것은 다음과 같았다.

[user@server]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        30G   29G     0 100% /

나에게 nginx가 디스크에 쓸 수 없어 결국 같은 문제가 발생했습니다! 그것이 누군가를 돕기를 바랍니다!


디스크 공간 부족으로 인해 TCP 연결이 예기치 않게 종료 될 수 있다고 생각하는 이유를 설명하십시오. 그리고 새로운 TCP 연결을 여는 것이 일시적으로 그 문제를 해결하는 방법.
kasperd

1
물론이지! 시나리오는 다음과 같습니다.-Nginx가 프록시 서버로 작동합니다.-아파치에서 파일을 수신 중입니다.-Nginx는 파일의 첫 번째 청크를 수신합니다 (응답 코드 206)-청크를 하드 드라이브에 기록하고 다음 청크에 대한 요청을 보냅니다. -다음 청크를 수신하고 남은 공간이 없어 하드 드라이브에 쓰지 못합니다! -Nginx는 응답 코드 206으로 연결을 닫습니다. 전체 내용이 클라이언트에 제공되지 않았습니다! 그 희망이 명확 해집니다!
랩터

1
Rush의 경우 24,291 크기의 첫 번째 이미지 청크가 성공적으로 수신되었습니다. 메모리에서 직접 nginx를 통해 최대 24,291 개를 제공 할 수 있습니다. 이것이 21,404 크기의 다음 이미지가 HDD 쓰기가 필요하지 않아 성공적으로 게재 된 이유입니다.
랩터

0

다운로드 속도가 엄청나게 낮습니다. (2.74 KB / s!). Nginx가있는 동일한 시스템에서 wget을 실행할 때 동일한 결과를 얻습니까? Nginx가 매우 느린 링크를 통한 요청에 합리적으로 반응하고있을 수 있습니다.

그렇지 않으면 Nginx docs 에서 다양한 시간 지시문을 탐색하는 것이 좋습니다 . 페이지에서 "timeout"에 대한 모든 언급을 검색하고 일치하는지 확인하십시오. 예를 들어, 10 초 간격으로 시간이 초과되는 것을 볼 수 있으므로 약 10 초의 시간 초과는 추가 검사를 받아야합니다.

예를 들어, lingering_timeout 지시문의 기본값은 10 초이므로 확인할 수 있습니다.

또한 클라이언트와의 연결이 왜 그렇게 느린 지 조사해야합니다.

또 다른 아이디어 :과 같은 대체 클라이언트를 사용해 보시고 curl동일한 결과를 얻으십시오 wget. 제대로 curl작동 wget하면 요청하는 것이 이상한 것 같습니다 .


그것은 클라이언트 문제가 아닙니다. 파이어 폭스조차도 같은 문제가 있습니다. 다른 지리적 위치의 다른 컴퓨터에서 시도했습니다. 같은 행동. 게다가, 당신이 말할 수 있듯이 작은 그림에서 속도는 꽤 좋습니다. 추신. nginx가있는 머신에서는 모든 것이 정상입니다. 그래서 타임 아웃 지시문을 파헤 치려고합니다. pps. 그것은 네트워크 문제가 아니며 동일한 이미지에 대한 직접적인 아파치 링크가 완벽하게 작동합니다.
rush

0

nginx.conf 에서 lingering_time 값을 확인하십시오 . 기본적으로 30 초로 설정됩니다. 따라서 nginx는 클라이언트가 데이터를 보낼 때까지 최대 30 초 동안 대기합니다.

완료하는 데 30 초 이상 걸릴 수있는 파일의 업로드 또는 POST를 수행하는 경우 업로드 시간이 30 초를 초과하면 nginx 서버는 클라이언트에 RST 패킷을 전송하여 클라이언트에 대한 연결을 재설정합니다.

nginx가 클라이언트 데이터를 청취하기 위해 더 많은 시간을 기다리려면이 값을 더 높은 값으로 설정하십시오.

lingering_time에 대한 자세한 정보는 여기를 참조하십시오. lingering_time

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.