nginx đóng kết nối trên một số hình ảnh


8

Có vấn đề với nginx. Nó đóng kết nối trước khi khách hàng hoàn tất tải xuống. Nó có vẻ như:

 $ 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]

đồng thời với hình ảnh nhỏ hơn tất cả đều ổn:

 $ 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]

Đây là lý do tại sao hình ảnh này không thể vẽ được kích thước đầy đủ trong trình duyệt. Tôi chỉ có thể nhìn thấy đầu của nó.

Nginx được cấu hình là front-end và apache là back-end. Liên kết trực tiếp đến apache hoạt động tốt, vì vậy có vấn đề trong nginx. Tôi có đúng không

cấu hình 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;
            }
    }

Tôi nên đào ở đâu để khắc phục vấn đề này?


1
Bạn đã thử tắt sendfile?
VBart

Vâng, không có gì thay đổi.
vội vàng

Câu trả lời:


9

Điều chính tôi quên là kiểm tra /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"

Vì vậy, tôi đã sửa /var/lib/nginx/proxy/*quyền thư mục ( sudo chown -R www-data:www-data /var/lib/nginx/proxy/*) và bây giờ mọi thứ hoạt động tuyệt vời. Cảm ơn mọi người đã giúp đỡ.


Cám ơn vì cái này. Có vẻ như lời khuyên rõ ràng nhưng tôi cũng không kiểm tra. Trong trường hợp của tôi, nguyên nhân là do: [crit] 6 # 6: * 2577 mkdir () "/ var / cache / nginx / proxy_temp / 8" không thành công (28: Không còn chỗ trống trên thiết bị) khi đọc ngược dòng
Damian Moore

1

Một lý do có thể cho việc đóng kết nối là kết nối chậm và ngắn keepalive_timeout. Các giá trị mặc định cho keepalive_timeoutlà 75 hiện có. Nếu nó quá ngắn và kết nối chậm thì có thể bị đóng quá sớm.

http {
    ..
    keepalive_timeout 75;
}

Một lý do tại sao tải xuống hình ảnh của bạn có thể bị chậm là ứng dụng của bạn. Nếu bạn đang sử dụng ứng dụng Ruby-on-Rails với Đường ống tài sản kết hợp với Nginx, thì quá trình tải xuống hình ảnh có thể bị chậm do bạn đang sử dụng các url hình ảnh sai (không có dấu vân tay do đường ống tài sản tạo ra). Trình trợ giúp Rails property_path và image_tag tạo các tệp biểu mẫu url đúng bằng dấu vân tay có thể được tải xuống nhanh chóng.


1

Một điều rất quan trọng khác để kiểm tra là: Hãy chắc chắn rằng bạn còn dung lượng đĩa!

Đối với tôi nó như sau:

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

Đối với tôi, nginx đã không thể ghi vào đĩa cuối cùng gây ra vấn đề tương tự! Hy vọng nó sẽ giúp được ai đó!


Vui lòng giải thích lý do tại sao bạn nghĩ thiếu không gian đĩa có thể khiến kết nối TCP bị đóng đột ngột. Và cách mở một kết nối TCP mới sẽ tạm thời giải quyết vấn đề đó.
kasperd

1
Vâng, chắc chắn rồi! Đây là một kịch bản: - Nginx đang hoạt động như một máy chủ Proxy - Nó đang nhận một tệp từ apache - Nginx nhận được đoạn đầu tiên của tệp (mã phản hồi 206) - Nó ghi đoạn mã vào ổ cứng và gửi yêu cầu cho đoạn tiếp theo - Nó nhận được đoạn tiếp theo và không ghi vào ổ cứng vì không còn chỗ trống! - Nginx đóng kết nối với mã phản hồi 206. Toàn bộ nội dung không được phục vụ cho khách hàng! Mong rằng làm rõ!
Raptor

1
Trong trường hợp của Rush, đoạn hình ảnh đầu tiên có kích thước 24.291 đã được nhận thành công. Có nghĩa là lên tới ~ 24.291 có thể được phục vụ bởi nginx trực tiếp từ bộ nhớ. Đó là lý do tại sao hình ảnh tiếp theo với kích thước 21.404 được phục vụ thành công vì nó không yêu cầu ghi vào ổ cứng.
Raptor

0

Tốc độ tải xuống của bạn cực kỳ thấp. (2,74 KB / giây!). Bạn có nhận được kết quả tương tự khi chạy wget trên cùng một máy có Nginx không? Có thể là Nginx đang phản ứng hợp lý với một yêu cầu qua một liên kết rất chậm.

Mặt khác, tôi khuyên bạn nên khám phá các chỉ thị thời gian khác nhau trong các tài liệu Nginx . Tìm kiếm mọi đề cập đến "thời gian chờ" trên trang và xem bạn có thấy đó là một kết hợp tốt không. Ví dụ: bạn có thể thấy bạn đang hết thời gian trong khoảng thời gian 10 giây, do đó, bất kỳ khoảng thời gian chờ nào trong khoảng 10 giây sẽ nhận được sự xem xét kỹ lưỡng hơn.

Ví dụ: chỉ thị lingering_timeout mặc định là 10 giây, vì vậy bạn có thể kiểm tra xem.

Bạn cũng nên xem xét lý do tại sao kết nối với khách hàng của bạn lại quá chậm.

Một ý tưởng khác: Hãy thử một khách hàng thay thế, như curl, và thấy bạn nhận được kết quả giống như bạn làm với wget. Nếu curlhoạt động tốt, bạn nên nghi ngờ có điều gì đó kỳ quặc wgetđang thực hiện yêu cầu.


Đó không phải là rắc rối của khách hàng, vì ngay cả firefox cũng có vấn đề tương tự. Tôi đã thử nó từ các máy khác nhau trong các vị trí địa lý không hiệu quả. Hành vi tương tự. Hơn nữa, như bạn có thể đề cập đến tốc độ khá tốt trên bức ảnh nhỏ. ps. Trên máy có nginx, mọi thứ đều ổn. Vì vậy, tôi sẽ cố gắng đào sâu vào chỉ thị thời gian chờ. pps. Đó không phải là sự cố mạng, khiến liên kết apache trực tiếp đến cùng một hình ảnh hoạt động hoàn hảo.
vội vàng

0

Kiểm tra giá trị lingering_time trong nginx.conf. Điều này sẽ được mặc định đặt thành 30 giây. Vì vậy, điều này sẽ làm là, nginx sẽ đợi tối đa 30 giây để khách hàng gửi dữ liệu.

Nếu bạn đang thực hiện tải lên hoặc POST tệp có thể mất hơn 30 giây để hoàn thành thì máy chủ nginx sẽ đặt lại kết nối tới máy khách bằng cách gửi gói RST đến máy khách nếu thời gian tải lên vượt quá 30 giây.

Để nginx chờ thêm thời gian để nghe dữ liệu khách hàng, sau đó đặt giá trị này thành giá trị cao hơn.

Để biết thông tin chi tiết về lingering_time, xem tại đây lingering_time

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.