nginx, gzip_static и gzip файлов директории

 

nginx - отличный веб-сервер, который особенно удобно использовать в качестве фронтенда к большому апачу, кроме того, им очень удобно отдавать статику, и в нем много фишечек, которые могут сильно пригодиться при высокой нагрузке.

Вот одна из них:

"Модуль ngx_http_gzip_static_module позволяет отдавать вместо обычного файла предварительно сжатый файл с таким же именем и с суффиксом ".gz"."

Включается очень легко: gzip_static on; в контексте http, server или location.

Чуть сложнее оказалось сжать файлы требуемых типов, набросал вот такое решение на python:

#!/usr/bin/env python
 
DIR = "/home/users/vladimir/tmp/ligtblue"
EXTS = ["css", "js", "py"]
 
import os
import os.path
 
import gzip
 
def gz_compr(arg, dir, files):
    for file in files:
        try:
            f = file.split('.')
            if f[1] in EXTS:
                mygzip(dir + "/" + file)
        except:
            pass
 
def mygzip(file):
    '''Gzip the given file.'''
    r_file = open(file, 'r')
    w_file = gzip.GzipFile(file + '.gz', 'w', 9)
    w_file.write(r_file.read())
    w_file.flush()
    w_file.close()
    r_file.close()
    #os.unlink(file) #We don't need the file now
 
os.path.walk(DIR, gz_compr, 0)

Конечно, оно не проверяет того, существует ли уже .gz, и не изменился ли оригинальный файл, однако поскольку js и css меняются нечасто, разработчики могут вручную выполнить его.