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はフロントエンドとして構成され、Apacheはバックエンドとして構成されます。Apacheへの直接リンクは適切に機能するため、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

はい、何も変わっていません。
ラッシュ

回答:


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;
}

画像のダウンロードが遅くなる理由の1つはアプリケーションです。Nginxと組み合わせてアセットパイプラインでRuby-on-Railsアプリケーションを使用している場合、間違った画像URL(アセットパイプラインによって生成されたフィンガープリントなし)を使用しているため、画像のダウンロードが遅くなる可能性があります。Railsヘルパーのasset_pathとimage_tagは、フィンガープリントを含む適切なURLフォームファイルを生成し、すばやくダウンロードできます。


1

チェックするもう1つの非常に重要なことは、ディスク領域が残っていることを確認することです。

私にとっては次のようなものでした:

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

私にとって、nginxはディスクに書き込むことができず、最終的に同じ問題が発生しました!それが誰かを助けることを願っています!


ディスク容量の不足によりTCP接続が予期せず終了する可能性があると思われる理由を説明してください。また、新しいTCP接続を開くと、一時的にその問題がどのように解決されるかがわかります。
kasperd 2014年

1
はい、そうです!ここにシナリオがあります:-Nginxはプロキシサーバーとして機能しています-Apacheからファイルを受信して​​います-Nginxはファイルの最初のチャンクを受信します(応答コード206)-チャンクをハードドライブに書き込み、次のチャンクのリクエストを送信します-次のチャンクを受け取り、空き容量がないためハードドライブへの書き込みに失敗します。-Nginxは応答コード206で接続を閉じます。完全なコンテンツがクライアントに提供されませんでした!それが明らかになることを願っています!
ラプター

1
ラッシュの場合、サイズが24,291の最初の画像チャンクが正常に受信されました。つまり、最大24,291までnginxがメモリから直接提供できます。これが、HDD書き込みを必要としないサイズ21,404の次のイメージが正常に処理された理由です。
ラプター

0

あなたのダウンロード率は信じられないほど低いです。(2.74 KB /秒!)。Nginxが配置されている同じマシンでwgetを実行しても同じ結果が得られますか?Nginxが非常に低速なリンクを介した要求に適切に反応している可能性があります。

それ以外の場合は、Nginxドキュメントのさまざまな時間ディレクティブを調べることをお勧めします。ページ上の「タイムアウト」に関するすべての言及を検索し、それが適切に一致するかどうかを確認します。たとえば、タイムアウトが10秒間隔のように見えるので、約10秒のタイムアウトがある場合は、さらに詳しく調査する必要があります。

たとえば、lingering_timeoutディレクティブのデフォルトは10秒なので、これを確認する場合があります。

また、クライアントとの接続が明らかに遅いのはなぜかを調査する必要もあります。

別のアイデア:などの代替クライアントを試してみてcurl、と同じ結果が得られることを確認してくださいwget。正常にcurl動作する場合wgetは、リクエストを作成することに奇妙な点があると思われるはずです。


これはクライアントの問題ではありません。Firefoxでも同じ問題が発生します。別の地理位置情報で別のマシンから試してみました。同じ行動。さらに、あなたが言うことができるように、速度は小さな画像でかなり良いです。ps。nginxが配置されているマシンでは、すべて問題ありません。そこで、タイムアウトディレクティブについて詳しく説明します。pps。これはネットワークの問題ではありません。同じ画像への直接のapacheリンクが完全に機能するためです。
ラッシュ

0

チェックlingering_timeの nginx.confの値を。これはデフォルトで30秒に設定されます。つまり、これにより、nginxはクライアントがデータを送信するまで最大30秒待機します。

完了までに30秒以上かかる可能性のあるファイルのアップロードまたはPOSTを実行している場合、アップロードの時間が30秒を超えると、nginxサーバーはクライアントにRSTパケットを送信してクライアントへの接続をリセットします。

nginxがクライアントデータをリッスンするためにより長い時間待機するようにするには、この値をより高い値に設定します。

lingering_timeの詳細については、こちらをご覧くださいlingering_time

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.