nginxnginx-confignginx-locationnginx-module

Nginx limit upload speed


I use Nginx as the reverse proxy.
How to limit the upload speed in Nginx?


Solution

  • I would like to share how to limit the upload speed of reverse proxy in Nginx.
    Limiting download speed is easy as a piece of cake, but not for upload.

    Here is the configuration to limit upload speed

    user www-data;
    worker_processes auto;
    pid /run/nginx.pid;
    
    events {
        worker_connections 1;
    }
    
    # 1)
    # Add a stream
    # This stream is used to limit upload speed
    stream {
    
        upstream site {
            server your.upload-api.domain1:8080;
            server your.upload-api.domain1:8080;
        }
    
        server {
    
            listen    12345;
    
            # 19 MiB/min = ~332k/s
            proxy_upload_rate 332k;
    
            proxy_pass site;
    
            # you can use directly without upstream
            # your.upload-api.domain1:8080;
        }
    }
    
    http {
    
      server {
        
        # 2)
        # Proxy to the stream that limits upload speed
        location = /upload {
            
            # It will proxy the data immediately if off
            proxy_request_buffering off;
            
            # It will pass to the stream
            # Then the stream passes to your.api.domain1:8080/upload?$args
            proxy_pass http://127.0.0.1:12345/upload?$args;
       
        }
    
        # You see? limit the download speed is easy, no stream
        location /download {
            keepalive_timeout  28800s;
            proxy_read_timeout 28800s;
            proxy_buffering off;
    
            # 75MiB/min = ~1300kilobytes/s
            proxy_limit_rate 1300k;
    
            proxy_pass your.api.domain1:8080;
        }
    
      }
    
    }
    

    If your Nginx doesn't support the stream.
    You may need to add a module.

    static:

    dynamic

    Note: If you have a client such as HAProxy, and Nginx as a server.
    You may face 504 timeout in HAProxy and 499 client is close in the Nginx while uploading large files with limiting the low upload speed.
    You should increase or add timeout server: 605s or over in HAProxy because we want HAProxy not to close the connection while Nginx is busy uploading to your server. https://stackoverflow.com/a/44028228/10258377

    Some references:


    You will find some other ways by adding third-party modules to limit the upload speed, but it's complex and not working fine


    Thank me later ;)