Как настроить обработку статики в Nginx правильно?

Как настроить проверку наличия статики с помощью Nginx перед передачей запроса обработчику на Node.js?

У меня на сайте тысячи картинок, и каждую из них приходится изменять размер на лету. Я написал обработчик на Node.js, который проверяет, существует ли уменьшенная копия картинки. Если такой копии нет, он создает ее.

Сейчас я хочу настроить проверку наличия статики с помощью Nginx, чтобы при обращении к картинкам Node.js активировался только в случае отсутствия копии. Я пытаюсь это реализовать, но из-за ограниченных знаний пока не получается.

Процесс выглядит следующим образом:
Оригиналы картинок хранятся в папке /var/www/SITE/original/01/pic.webp
Копии сохраняются в папке /var/www/SITE/tmp/100/01/pic.webp

Запрос на создание копии выглядит так: SITE/original/01/pic.webp?fit=resize&w=100&display=true
Этот запрос обрабатывается на сервере с помощью обработчика /image/

Я пытаюсь достичь следующего:
```
location ~* /o/(.*)\.(webp|jpg)\?fit=resize&w=100&display=true {
     # Проверить наличие файла /var/www/SITE/tmp/100/01/pic.webp
     # В случае его отсутствия, выполнить location @image
     try_files $uri @image;
}
```

Я пробовал хотя бы отобразить картинку, используя следующую инструкцию:
```
rewrite ^/original/(.*)$ /tmp/100/$1? last;
```
но ничего не получилось. Из логов вижу ошибку следующего типа:
2023/10/14 11:39:45 [error] 1120289#1120289: *9825858 open() "/etc/nginx/html/original/01/pic.webp" failed (2: No such file or directory), client: IP, server: SITE, request: "GET /original/01/pic.webp?fit=resize&w=100&display=true HTTP/2.0", host: "SITE"
  • 14 октября 2023 г. 11:48
Ответы на вопрос 1
Для настройки обработки статики в Nginx и проверки наличия файлов с помощью Nginx перед передачей запроса обработчику на Node.js можно использовать следующий конфигурационный файл:

```
server {
    ...
    
    location /original/ {
        # Проверка наличия файлов в папке /var/www/SITE/tmp/100/01/
        try_files $uri @image;
    }
    
    location @image {
        # Перенаправление запроса на обработчик Node.js
        proxy_pass http://localhost:3000/image/;
    }
    
    ...
}
```

В этом конфигурационном файле мы используем директиву `try_files`, чтобы проверить наличие файлов в папке `/var/www/SITE/tmp/100/01/`. Если файл существует, он будет возвращен статически из Nginx, без дополнительного обращения к Node.js. Если файл отсутствует, Nginx выполнит перенаправление запроса на обработчик Node.js с помощью директивы `proxy_pass`.

Таким образом, в случае отсутствия копии картинки, запрос будет передан обработчику на Node.js для создания и сохранения копии.

Обратите внимание, что вам также нужно настроить проксирование запросов на Node.js, чтобы они обрабатывались правильно. В нашем примере, предполагается, что обработчик Node.js находится на `http://localhost:3000/image/`.

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