Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Missing Content-Length header when using Nginx + Gzip + Unicorn

I don't know why http response is missed "Content-Length header" when I use gzip in nginx, i'm really getting stuck,please somebody help me, thank you so much! this is my config file,

nginx.conf

user nobody nobody ; worker_processes 8;

events {
    worker_connections  1024;
    accept_mutex on; # "on" if nginx worker_processes > 1
    use epoll; # enable for Linux 2.6+
}

http {
    include       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"';
    upstream backend-unicorn {
        server unix:/tmp/unicorn_app.sock fail_timeout=0;
        #server localhost:5000;
    }
    #access_log  logs/access.log  main;
    sendfile        on;
    keepalive_timeout  100;
    gzip on;
    gzip_static on;
    gzip_proxied any;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_min_length  1100;
    gzip_buffers 16 8k;
    gzip_types text/plain application/zip text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript image$

    server {
        listen       8080;
        server_name  misago;
        access_log  /var/log/nginx/unicorn.access.log  main;
        client_max_body_size 64M;
        location /uploads/ {
            root /usr/local/rails_apps/me_management_tool/current/public/uploads;
            break;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}
like image 973
nguyenngoc101 Avatar asked Nov 04 '22 03:11

nguyenngoc101


2 Answers

I don't know why http response is missed "Content-Length header" when I use gzip in nginx

Because in this case the length of content is unknown at the moment of sending headers. Nginx cannot know how well the content will be compressed.

like image 166
VBart Avatar answered Nov 09 '22 14:11

VBart


Below is a performant Nginx solution to add x-file-size header to Gzip responses. Full discussion here: https://github.com/AnthumChris/fetch-progress-indicators/issues/13

location / {
  ## Nginx Lua module must be installed https://docs.nginx.com/nginx/admin-guide/dynamic-modules/lua/
  ## https://github.com/openresty/lua-nginx-module#header_filter_by_lua
  header_filter_by_lua_block {
    function file_len(file_name)
      local file = io.open(file_name, "r")

      if (file == nil) then return -1 end

      local size = file:seek("end")
      file:close()
      return size
    end

    ngx.header["X-File-Size"] = file_len(ngx.var.request_filename);
  }
}
like image 31
AnthumChris Avatar answered Nov 09 '22 12:11

AnthumChris