Конфигурация Nginx для Sylius

Недавно мы начали использовать набирающую популярность платформу Sylius для одного из наших проектов электронной коммерции. Sylius основан на Symfony2, ведущем PHP-фреймворке, с которым мы работали на нашем сайте фотографий . Несмотря на то, что мы используем WooCommerce для небольших проектов, Sylius предлагает более современное и мощное решение, которое, по нашему мнению, определенно лучше подходит для более амбициозных веб-сайтов электронной коммерции.

Проблема, с которой мы изначально боролись, заключалась в том, чтобы заставить Sylius правильно работать на нашем веб-сервере Nginx + PHP-FPM + Ubuntu 14.04. Мы начали состандартного файла конфигурации Symfony2 плюс некоторые оптимизации, но не смогли заставить работать эскизы продуктов. Оказывается, LiipImagineBundle используется для генерации миниатюр на лету, и это мешает нашему набору правил истечения срока действия кеша, в результате чего для любых миниатюр изображений, которые мы пытались отобразить, приходилось 404 с.

Вот что мы неправильно использовали, чтобы установить срок годности 1 год в будущем для статических файлов:

location ~ \.(js|css|png|jpeg|jpg|gif|ico|swf|flv|pdf|zip)$ { # Set expiry date to 1 year in the future. expires 365d ; }
Язык кода: Nginx ( nginx )

Хотя обычно это работает без проблем, это также означает, что любой URL-адрес, заканчивающийся одним из этих расширений, будет полностью обходить файл app.php независимо от того, существует ли фактический файл изображения. Поскольку миниатюры в Sylius создаются «на лету» по запросу URL, это полностью нарушает создание миниатюр.

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

server { server_name example.com; root /var/www/example.com/web; location / { try_files $uri @rewriteapp ; # Redirect to app.php if the requested file does not exist. } # Development rule-set. # This rule should only be placed on your development environment. # In production, don't include this and don't deploy app_dev.php or config.php. location ~ ^/(app_dev|config)\.php(/|$) { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$ ; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name ; fastcgi_param HTTPS off ; } # Production rule-set. location ~ ^/app\.php(/|$) { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$ ; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name ; fastcgi_param HTTPS off ; # Prevents URIs that include the front controller. This will 404: # http://domain.tld/app.php/some-path # Remove the internal directive to allow URIs like this. internal; } # Static files rule-set. location ~ \.(js|css|png|jpeg|jpg|gif|ico|swf|flv|pdf|zip)$ { # Set rules only if the file actually exists. if (-f $request_filename ) { # Set expiry date to 1 year in the future. expires 365d ; # Further optimize by not logging access to these files. access_log off ; } # Rewrite to app.php if the requested file does not exist. try_files $uri @rewriteapp ; } # Rewrite rule for PHP files. location @rewriteapp { rewrite ^(.*)$ /app.php/ $1 last ; } error_log /var/log/nginx/example.com_error.log; access_log /var/log/nginx/example.com_access.log; }
Язык кода: Nginx ( nginx )

Вот и все. Миниатюры теперь правильно создаются на лету, в то время как существующие изображения также используют правильные заголовки истечения срока действия. Сообщите нам, сработало ли это для вас или вы использовали другой подход. Удачного кодирования!