Назад | Перейти на главную страницу

Почему не работает модуль предварительного сжатия Nginx Gzip?

В настоящее время я пытаюсь настроить Nginx для обслуживания всех моих статических файлов. Поскольку они вообще не будут меняться очень часто, я хочу, чтобы мы использовали модуль gzip_static, чтобы я мог предварительно сжимать копии моих файлов, чтобы сэкономить время процессора и улучшить сжатие.

Я скомпилировал Nginx с --with-http_gzip_static_module и настройте его так, чтобы он обслуживал мои статические файлы, пока никаких проблем. Я хотел проверить и убедиться, что статическое сжатие действительно работает, поэтому я сделал два файла, test.txt и test.txt.gz. В первой строке каждого файла говорится, были ли они сжаты с помощью gzip, а затем идет новая строка и 256 случайных символов (разные между двумя файлами).

Я читал, что время модификации файла и его gzip-копии должно быть одинаковым, и я пробовал оба из следующих вариантов:

touch test.*
touch -r test.txt test.txt.gx

На моем локальном компьютере я тестирую с помощью curl:

curl $URL/test.txt

Это нормально работает, я возвращаю версию, которую не сжимал предварительно, но когда я сделаю это:

curl -H "Accept-Encoding: gzip" $URL/test.txt | gunzip

я также вернуть версию, которую я не сжимал. Я пробовал установить gzip off в моем nginx.conf, но это не имеет значения. Я также перекомпилировал Nginx с --without-http_gzip_module и это тоже не имеет значения, Nginx по-прежнему gzip сам на лету.

Я новичок в Nginx, но я действительно в растерянности.

Вот результат ./nginx -V

built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) 
configure arguments: --sbin-path=$SOMEPATH/nginx --prefix=$SOMEPATH --user=$ME --group=$MYGROUP --with-http_gzip_static_module --without-http_gzip_module

И вот мой nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
error_log  logs/error.log;
pid        logs/nginx.pid;
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"';
    gzip_static on;
    sendfile        on;
    keepalive_timeout  65;
    access_log  logs/access.log;
    server {
        listen       XXXX;
        server_name  foo.bar.com;
        location / {
            root   html;
        }
        error_page  404 404.html;
        error_page   500 502 503 504 50x.html;
    }
}

Любая помощь очень ценится!

Вы не упомянули об этом в своем вопросе, но у меня есть достоверные сведения, что вы используете прокси-сервер Nginx за другим Nginx на общем хосте. ;)

На момент написания этой статьи модули gzip Nginx по умолчанию используют HTTP 1.1, но Nginx может использовать HTTP 1.0 только при взаимодействии с внутренними серверами, поэтому решение состоит в том, чтобы установить gzip_http_version в твоем nginx.conf, вот так:

gzip_http_version 1.0;

После внесения этого изменения перезапустите Nginx, и все будет в порядке.