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;
}

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;
}

É 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!