@cat_crash

Как в NGINX проверить есть ли файл и отдать его если есть?

Архитектура приложения такова что при запросе условно картинки
/uploads/cache/100x100/bla-bla.jpg
отрабатывает php скрипт, и если файла нет то "ресайзит" его до нужного размера и кладет в соответствующую папку

Сейчас посещалка возросла и я хотел бы при помощи Nginx проверять есть ли файл и если есть - то сразу отдавать без запросов к php-fcgi
Гугл нашел мне такой пример:

location ^~ /uploads/cache/{

    if (-f $request_filename) {
        break;
    }
    include fastcgi_params;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_NAME  /resize.php;
    fastcgi_param DOCUMENT_URI /resize.php;
    fastcgi_param SCRIPT_FILENAME  /home/site/www/resize.php;
    fastcgi_param HTTPS off;
    fastcgi_pass  php5;
 }


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

Собственно вопрос - как написать правильно ?
  • Вопрос задан
  • 4465 просмотров
Пригласить эксперта
Ответы на вопрос 2
opium
@opium
Просто люблю качественно работать
В нгинкс давно есть трайфайлес для этого
примерно так
location / {
gzip on;
index index.php; ## Allow a static html file to be shown first
try_files $uri $uri/ @handler; ## If missing pass the URI to Magento's front handler
}

location @handler { ## Magento uses a common front handler
rewrite / /index.php;
}

location ~ .php$ { ## Execute PHP scripts
if (!-e $request_filename) { rewrite / /index.php last; } ## Catch 404s that try_files miss

expires off; ## Do not cache dynamic content
fastcgi_pass 127.0.0.1:9000;
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 3000s;
fastcgi_read_timeout 3000s;
fastcgi_send_timeout 3000s;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param MAGE_RUN_CODE default; ## Store code is defined in administration > Configuration > Manage Stores
fastcgi_param MAGE_RUN_TYPE store;
include fastcgi_params; ## See /etc/nginx/fastcgi_params
}

Не самый лучший пример но думаю хватит разобраться
Ответ написан
kompi
@kompi
nullstack devoops
Зачем оборачивать в if? Масло масленное получается. Достаточно одной конструкции try.
#проверка на файлы
try $uri handler;
#проверка на файлы и директории
try $uri $uri/ handler;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы