Configuração Nginx para Sylius

Recentemente, começamos a usar a plataforma Sylius cada vez mais popular para um de nossos projetos de comércio eletrônico. Sylius é baseado no Symfony2, o framework PHP líder com o qual trabalhamos em nosso site de fotografia . Embora usemos WooCommerce para projetos menores, Sylius oferece uma solução mais moderna e poderosa que acreditamos ser definitivamente mais adequada para sites de comércio eletrônico mais ambiciosos.

Um problema com o qual lutamos inicialmente foi fazer com que o Sylius funcionasse corretamente em nosso servidor da web Nginx + PHP-FPM + Ubuntu 14.04. Começamos com umarquivo de configuração padrão do Symfony2 mais algumas otimizações, mas não conseguimos fazer as miniaturas do produto funcionarem. Acontece que o LiipImagineBundle é usado para gerar miniaturas dinamicamente e isso estava interferindo em nosso conjunto de regras de expiração de cache, resultando em 404s para qualquer miniatura de imagem que tentássemos exibir.

Aqui está o que estávamos usando incorretamente para definir uma data de validade de 1 ano no futuro para arquivos estáticos:

location ~ \.(js|css|png|jpeg|jpg|gif|ico|swf|flv|pdf|zip)$ { # Set expiry date to 1 year in the future. expires 365d ; }
Linguagem de código: Nginx ( nginx )

Embora isso normalmente funcione sem problemas, também significa que qualquer URL terminando com uma dessas extensões irá ignorar completamente o arquivo app.php, quer o arquivo de imagem real exista ou não. Como as miniaturas no Sylius são criadas instantaneamente por meio de uma solicitação de URL, isso quebra completamente a criação de miniaturas.

A correção é muito simples: apenas definimos a data de validade para os arquivos solicitados que realmente existem. Caso contrário, nós os reescrevemos no arquivo app.php, como de costume. Aqui está o arquivo de configuração final do Nginx que usamos:

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; }
Linguagem de código: Nginx ( nginx )

É isso aí. As miniaturas agora estão sendo geradas corretamente em tempo real, enquanto as imagens existentes também estão usando cabeçalhos de validade adequados. Deixe-nos saber se isso funcionou para você ou se você usou uma abordagem diferente. Boa codificação!