Uma configuração complicada de chroot nginx / php-fpm

5

Estou executando o nginx e o php-fpm e quero configurar jails para cada host. Minha configuração é um pouco complicada, então seguir os tutoriais na web não me leva a lugar nenhum.

Cada site tem um diretório /var/www/domain.name /

Dentro desse diretório, haverá um diretório / public que será a raiz do site, um diretório / logs que armazenará especificamente os logs nginx para aquele site, e o sistema de arquivos chroot (etc /, usr /, etc.)

O primeiro problema com que me deparo é que no modo como eu o configuro, o PHP-FPM não consegue encontrar os arquivos que são passados para ele via nginx. Eles resultam em um erro "Primary script unknown", e para piorar, as mensagens de erro do PHP-FPM não são mais detalhadas do que isso, então não consigo descobrir qual caminho está sendo passado pelo nginx.

Uma configuração do pool php-fpm para um host se parece com isso:

[host]
user = host
group = www-data
chroot = /var/www/domain.name
chdir = /public
listen = 127.0.0.1:900x

'x' é incrementado para cada pool.

A configuração do nginx para este host é assim:

server
{
    listen  80;

    server_name     domain.name *.domain.name;

    root            /var/www/domain.name/public;
    index           index.php index.html index.html;

    location ~ \.php$
    {
            expires epoch;

            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            include fastcgi_params;
            fastcgi_index index.php;

            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

            fastcgi_pass 127.0.0.1:9001;
    }
}

Eu estou supondo que o problema é o parâmetro SCRIPT_FILENAME, mas eu mudei para apenas $ fastcgi_script_name, e várias outras combinações, mas sem sucesso.

Alguém pode ajudar?

    
por Rsaesha 07.01.2013 / 14:33

2 respostas

3

O problema está aqui:

            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Seu PHP é executado em um chroot em /var/www/domain.name , mas sua raiz do documento é /var/www/domain.name/public . Portanto, quando você carregar /index.php , o SCRIPT_FILENAME se tornará /var/www/domain.name/public/index.php . Mas, no chroot isso não existe! Ele está em /public/index.php .

O que você pode fazer é mudar o diretório aqui para que ele corresponda à visão do chroot:

            fastcgi_param SCRIPT_FILENAME /public$fastcgi_script_name;
    
por 07.01.2013 / 15:55
2

O que funcionaria é definir no conf nginx:

root            /public;

Eu tentei isso e funciona, mas no caso de você ter o mysql db para se conectar, não funcionará. Esta é a minha limitação também, fez funcionar, mas não conseguiu se conectar ao banco de dados mysql devido ao soquete.

    
por 23.09.2014 / 10:22

Tags