Failed disk + proxy_intercept_errors

chocholo3 nginx-forum at forum.nginx.org
Wed Feb 12 15:36:54 UTC 2020


Hi,
In our deployment we do have configuration of proxy cache with multiple hard
drives. Because of performance we don't have any RAID on these devices. That
means we have to handle even a situation when drive dies, sometime.

After disk failure of proxy_cache_path device nginx usually starts serving
users with http500. So I've had an idea we may use proxy_intercept_errors
but I end up with inconsistent state: ~60 files are handled as expected, but
after that every connection is terminated prematurely without a single byte
sent. In access.log there is http 200.

I broke just ext4 FS (dd if=/dev/zero of=/dev/sdc bs=1k count=$((1024*100)))
and I'm using nginx 1.17.7 on Linux

Relevant snippet from my configuration:
```
location ~ ^/mylocation/ {
        set  $spindle_bucket  cache_01;
        include "snippets/spindle_cache_locations_uspinclude";
        proxy_cache             DISK_$spindle_bucket;
             
        proxy_pass              $backend;
        proxy_cache_key         $uri;
        proxy_cache_revalidate  on;
        proxy_cache_use_stale   off;

        recursive_error_pages on;
        proxy_intercept_errors  on;
        error_page 400 401 402 403 405 406 407 408 409 410 411 412 413 414
415 416 417 418 420 422 423 424 426 428 429 431 444 449 450 451 =
@myotherlocation;
        error_page 500 501 502 503 504 505 506 507 508 510 511 =
@myotherlocation;
}

# same as ^/mylocation/ but without proxy_intercept_errors and with a single
spare drive only
location @myotherlocation {
        include "snippets/spindle_cache_locations_uspinclude";
        set                     $spindle_bucket "spare_01";
        proxy_cache             DISK_$spindle_bucket;

        proxy_pass              $backend;
        proxy_cache_key         $uri;
        proxy_cache_revalidate  on;
        proxy_cache_use_stale   error timeout invalid_header updating
http_500 http_502 http_503 http_504;
}
```

In snippets/spindle_cache_locations_uspinclude I do have:
```
        proxy_buffers           64 8k;

        proxy_set_header        Host            our.akamaized.net;

        proxy_cache_valid       200 720d;
        proxy_cache_valid       206 720d;
        #proxy_cache_valid       301 1d;
        #proxy_cache_valid       302 10m;
        #proxy_cache_valid       any 1s;
        proxy_http_version      1.1;
        proxy_set_header        Connection "";
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

```
```
$ curl -v
http://myserver/mylocation/66666666-1111-1111-0000-01234567/2ab5355f-5508-438d-acfc-686469877fb3.ism/2ab5355f-5508-438d-acfc-686469877fb3-video_2=1481000-177.m4s
*   Trying myipv6...
* TCP_NODELAY set
* Connected to myserver (myipv6) port 80 (#0)
> GET
/mylocation/66666666-1111-1111-0000-01234567/2ab5355f-5508-438d-acfc-686469877fb3.ism/2ab5355f-55$
8-438d-acfc-686469877fb3-video_2=1481000-177.m4s HTTP/1.1
> Host: myserver
> User-Agent: curl/7.52.1
> Accept: */*
>
* Curl_http_done: called premature == 0
* Empty reply from server
* Connection #0 to host myserver left intact
curl: (52) Empty reply from server
```

Am I doing something wrong or is this a bug? Because of the inconsistency I
tend to the 2nd. But I'm not sure at all :-)

Posted at Nginx Forum: https://forum.nginx.org/read.php?2,287005,287005#msg-287005



More information about the nginx mailing list