How large is a large POST payload?
Are the nginx and upstream systems physical hosts in same data center?
What are approx best case / typical case / worst case latency for the post to 
upstream?

Sent from my iPhone

> On Jun 22, 2018, at 2:40 PM, scott.o...@oracle.com wrote:
> 
> I have an nginx proxy through which clients pass a large POST payload to the 
> upstream server. Sometimes, the upstream server is slow and so writing the 
> POST data will fail with a writev() not ready (EAGAIN) error. But of course, 
> that's a very common situation when dealing with non-blocking I/O, and I'd 
> expect the rest of the data to be written when the socket is again ready for 
> writing.
> 
> In fact, it seems like the basic structure of that is in place; when 
> ngx_writev gets the EAGAIN, it passes that to calling functions, which modify 
> the chain buffers. Yet somewhere along the line (seemingly in 
> ngx_http_upstream_send_request_body) the partially-written buffer is freed, 
> and although the socket later indicates that it is ready to write (and the 
> ngx epoll module does detect that), there is no longer any data to write and 
> so everything fails.
> 
> I realize this is not the dev mailing list so an answer to how that is 
> programmed isn't necessarily what I'm after -- again, the partial write of 
> data to a socket is such a common thing that I can't think I'm the first to 
> encounter it and find a basic bug, so I assume that something else is going 
> on. I have tried this with proxy_request_buffering off and on, and the 
> failure is essentially the same. The http section of my conf looks like this:
> 
> http {
>    max_ranges 1;
>    #map $http_accept $file_extension {
>    #   default   ".html";
>    #    "~*json"  ".json";
>    #}
>    map $http_upgrade $connection_upgrade {
>        default upgrade;
>        '' "";
>    }
>    server_names_hash_bucket_size 512;
>    server_names_hash_max_size 2048;
>    variables_hash_bucket_size 512;
>    variables_hash_max_size 2048;
>    client_header_buffer_size 8k;
>    large_client_header_buffers 4 16k;
>    proxy_buffering off;
>    proxy_request_buffering off; # Tried on, and various sizes
>    #proxy_buffer_size 16k;
>    #proxy_buffers 4 128k;
>    #proxy_busy_buffers_size 256k;
>    #proxy_headers_hash_bucket_size 256;
>    client_max_body_size 0;
>    ssl_session_cache shared:SSL:20m;
>    ssl_session_timeout 60m;
> 
>    include       /u01/data/config/nginx/mime.types;
>    default_type  application/octet-stream;
> 
>    log_format  main  '"$remote_addr" "-" "$remote_user" "[$time_local]" 
> "$request" '
>                      '"$status" "$body_bytes_sent" "$http_referer" '
>                      '"$http_user_agent" "$http_x_forwarded_for"';
> 
>    log_format  opcroutingtier  '"$remote_addr" "-" "$remote_user" 
> [$time_local] "$request" "$status" '
>                                '"$body_bytes_sent" "$http_referer" 
> "$http_user_agent" "$bytes_sent" "$request_length" "-" '
>                                '"$host" "$http_x_forwarded_for" 
> "$server_name" "$server_port" "$request_time" "$upstream_addr" '
>                                '"$upstream_connect_time" 
> "$upstream_header_time" "$upstream_response_time" "$upstream_status" 
> "$ssl_cipher" "$ssl_protocol" '
>                                '"-" "-" "-"';
> 
>    access_log  /u01/data/logs/nginx_logs/access_logs/access.log  
> opcroutingtier;
>    sendfile        off;  # also tried on
>    keepalive_timeout 60s;
>    keepalive_requests 2000000;
>    open_file_cache max=2000 inactive=20s;
>    open_file_cache_valid 60s;
>    open_file_cache_min_uses 5;
>    open_file_cache_errors off;
>    gzip on;
>    gzip_types text/plain text/css text/javascript text/xml 
> application/x-javascript application/xml;
>    gzip_min_length 500;
>    gzip_comp_level 7;
> 
> Everything works fine if the upstream reads data fast enough; it's only when 
> nginx gets a partial write upstream that there is a problem. Am I missing 
> something here?
> 
> -Scott
> 
> _______________________________________________
> nginx mailing list
> nginx@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx
_______________________________________________
nginx mailing list
nginx@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx

Reply via email to