Кешировать статические файлы на сервере с помощью nginx

сервер Nginx

Во-первых, преимущества кэширования nginx

nginx缓存图示

Как показано на рисунке, кеш nginx может в определенной степени снизить нагрузку на исходный сервер при обработке запросов. Потому что многие статические файлы (такие как css, js, картинки) не часто обновляются. nginx использует proxy_cache для кэширования пользовательских запросов в локальный каталог. Следующий такой же запрос может напрямую вызывать кешированный файл, поэтому нет необходимости запрашивать сервер. В конце концов, обработка сервисов с интенсивным вводом-выводом — сильная сторона nginx.

2. Как настроить

Сначала каштан:

http{
    proxy_connect_timeout 10;
    proxy_read_timeout 180;
    proxy_send_timeout 5;
    proxy_buffer_size 16k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 96k;
    proxy_temp_file_write_size 96k;
    proxy_temp_path /tmp/temp_dir;
    proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=10g;


    server {
        listen       80 default_server;
        server_name  localhost;
        root /mnt/blog/;

        location / {

        }

        #要缓存文件的后缀,可以在以下设置。
        location ~ .*\.(gif|jpg|png|css|js)(.*) {
                proxy_pass http://ip地址:90;
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_cache cache_one;
                proxy_cache_valid 200 302 24h;
                proxy_cache_valid 301 30d;
                proxy_cache_valid any 5m;
                expires 90d;
                add_header wall  "hey!guys!give me a star.";
        }
    }

    # 无nginx缓存的blog端口
    server {
        listen  90;
        server_name localhost;
        root /mnt/blog/;

        location / {

        }
    }
}

потому что яПроведите эксперимент на сервере (стучите по клавише, проведите эксперимент), поэтому используются два порта80и90Для имитации взаимодействия между двумя серверами.

80Порт подключен к общему доменному имени (http://wangxiaokai.vip)доступ.
90Ручки порта80Доступ к ресурсам через прокси порта.
эквивалентно90порт - исходный сервер,80Порт — прокси-сервер обратного кэширования nginx.


Далее поговорим об элементах конфигурации:

2.1 настройки http-слоя

    proxy_connect_timeout 10;
    proxy_read_timeout 180;
    proxy_send_timeout 5;
    proxy_buffer_size 16k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 96k;
    proxy_temp_file_write_size 96k;
    proxy_temp_path /tmp/temp_dir;
    proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=10g;
  • proxy_connect_timeout 服务器连接的超时时间
  • proxy_read_timeout 连接成功后,等候后端服务器响应时间
  • proxy_send_timeout 后端服务器数据回传时间
  • proxy_buffer_size 缓冲区的大小
  • proxy_buffers 每个连接设置缓冲区的数量为number,每块缓冲区的大小为size
  • proxy_busy_buffers_size 开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定大小时,nginx一定会向客户端发送响应,直到缓冲小于此值。
  • proxy_temp_file_write_size 设置nginx每次写数据到临时文件的size(大小)限制
  • proxy_temp_path 从后端服务器接收的临时文件的存放路径
  • proxy_cache_path 设置缓存的路径和其他参数。被缓存的数据如果在inactive参数(当前为1天)指定的时间内未被访问,就会被从缓存中移除

2.2 настройки уровня сервера

2.2.1 Прокси-сервер с обратным кэшированием

    server {
        listen       80 default_server;
        server_name  localhost;
        root /mnt/blog/;

        location / {

        }

        #要缓存文件的后缀,可以在以下设置。
        location ~ .*\.(gif|jpg|png|css|js)(.*) {
                proxy_pass http://ip地址:90;
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_cache cache_one;
                proxy_cache_valid 200 302 24h;
                proxy_cache_valid 301 30d;
                proxy_cache_valid any 5m;
                expires 90d;
                add_header wall  "hey!guys!give me a star.";
        }
    }
  • proxy_pass nginx缓存里拿不到资源,向该地址转发请求,拿到新的资源,并进行缓存
  • proxy_redirect 设置后端服务器“Location”响应头和“Refresh”响应头的替换文本
  • proxy_set_header 允许重新定义或者添加发往后端服务器的请求头
  • proxy_cache 指定用于页面缓存的共享内存,对应http层设置的keys_zone
  • proxy_cache_valid 为不同的响应状态码设置不同的缓存时间
  • expires 缓存时间

Здесь я установил图片,css,jsСтатические ресурсы кэшируются. когда пользователь входитhttp://wangxiaokai.vipКогда доменное имя разрешено,ip:portадрес доступа.portПо умолчанию 80. Поэтому запрос страницы будет перехвачен текущим сервером для обработки запроса. Когда статический ресурс, оканчивающийся на указанное выше имя файла, анализируется, статический ресурс будет получен из области кеша. Если соответствующий ресурс получен, данные будут возвращены напрямую. Если нет, перешлите запрос наproxy_passУказанный адрес обрабатывается.

2.2.2 Исходный сервер

    server {
        listen  90;
        server_name localhost;
        root /mnt/blog/;

        location / {

        }
    }

Прямая обработка здесь90Переносить полученные запросы в локальный каталог сервера/mnt/blogЗахватите ресурсы, чтобы ответить.

3. Как проверить, действителен ли кеш

Внимательные читатели должны обнаружить, что я оставил пасхалку в каштане во втором абзаце.add_header wall "hey!guys!give me a star.".add_headerиспользуется для установки пользовательской информации в заголовке. Поэтому, если кеш действителен, заголовок, возвращаемый статическим ресурсом, обязательно будет нести эту информацию.

доступhttp://wangxiaokai.vipРезультат выглядит следующим образом:

nginx缓存结果

4. Ссылка

[1] документация по nginx
[2] Подробное объяснение обратного кеш-прокси nginx
[3] Статические файлы кэш-сервера Nginx

5. Постскриптум

мой репозиторий GitHub
Give me a star,if it's work out for you.Thank you.