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 2012年

是的,什么都没有改变。
2012年

Answers:


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_timeout是75秒。如果它太短且连接速度很慢,则可能为时过早关闭。

http {
    ..
    keepalive_timeout 75;
}

您的图片下载速度可能较慢的原因之一是您的应用程序。如果您将带资产管道的Ruby-on-Rails应用程序与Nginx结合使用,则图像下载可能会很慢,因为您使用了错误的图像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 2014年

1
是的,当然!这是一个场景:-Nginx充当代理服务器-正在从apache接收文件-Nginx接收文件的第一个块(响应代码206)-将其写入硬盘驱动器并发送对下一个块的请求-它接收到下一个块,由于没有剩余空间而无法写入硬盘!-Nginx用响应代码206关闭连接。未向客户端提供全部内容!希望澄清!
猛禽2014年

1
在Rush的情况下,成功接收到大小为24,291的第一个图像块。这意味着nginx可以直接从内存中提供多达〜24,291的服务。这就是为什么下一个大小为21404的映像被成功提供的原因,因为它不需要HDD写入。
猛禽2014年

0

您的下载速度非常低。(2.74 KB / s!)。在Nginx所在的同一台计算机上运行wget时,您得到的结果是否相同?Nginx可能通过非常慢的链接对请求做出了合理的反应。

否则,建议您在Nginx docs中探索各种时间指令。在页面上搜索提及“超时”的所有内容,看看是否找到合适的匹配条件。例如,您可以看到您似乎以10秒的间隔超时,因此任何大约10秒的超时都应受到额外的检查。

例如,lingering_timeout指令默认为10秒,因此您可以检查一下。

您还应该研究为什么与您的客户端的连接速度如此之慢。

另一个想法:尝试使用替代客户端,例如curl,然后看到与相同的结果wget。如果curl工作正常,您应该怀疑wget提出请求有些奇怪。


那不是客户端的麻烦,因为甚至Firefox也有同样的问题。我在不同的地理位置从另一台机器尝试过。相同的行为。此外,正如您可以提到的,在小图片上速度非常好。ps。在nginx所在的机器上,一切正常。因此,我将尝试深入研究超时指令。pps。这不是网络问题,可以使直接Apache链接到同一图像工作正常。

0

检查lingering_time在nginx.conf值。默认情况下,此设置为30秒。因此,这样做的结果是,nginx将最多等待30秒,以便客户端发送数据。

如果您正在完成文件的上载或POST,可能需要30秒以上才能完成,那么如果上载时间超过30秒,nginx服务器将通过向客户端发送RST数据包来重置与客户端的连接。

为了使nginx等待更多的时间来侦听客户端数据,然后将此值设置为更高的值。

有关lingering_time的详细信息,请在此处查看lingering_time

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.