chrooting php-fpm com nginx

3

Estou configurando um novo servidor com PHP 5.3.9 e nginx, então eu compilei o PHP com as opções SAPI do php-fpm. Por si só funciona muito bem usando a seguinte entrada do servidor no nginx:

server {
    listen 80;
    server_name domain.com www.domain.com;

    root /var/www/clients/domain.com/www/public;
    index index.php;

    log_format gzip '$remote_addr - $remote_user [$time_local] "$request" $status $bytes_sent "$http_referer" "$http_user_agent" "$gzip_ratio"';
    access_log /var/www/clients/domain.com/logs/www-access.log;
    error_log /var/www/clients/domain.com/logs/www-error.log error;

    location ~\.php$ {
            fastcgi_pass 127.0.0.1:9001;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /var/www/clients/domain.com/www/public$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            include /etc/nginx/fastcgi_params;
    }
}

Ele armazena meus arquivos PHP muito bem. Para maior segurança, quis chroot minha instância do FPM, então adicionei as seguintes linhas ao meu arquivo conf para essa instância do FPM:

# FPM config
chroot = /var/www/clients/domain.com

e alterou a configuração do nginx:

#nginx config for chroot
location ~\.php$ {
            fastcgi_pass 127.0.0.1:9001;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME www/public$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            include /etc/nginx/fastcgi_params;
    }

Com essas alterações, o nginx me fornece uma mensagem File not found para quaisquer scripts PHP. Olhando no log de erros, posso ver que está colocando o root caminho para minha variável DOCUMENT_ROOT que passou para o fastcgi, então tentei substituí-lo no bloco de localização da seguinte forma:

fastcgi_param DOCUMENT_ROOT /www/public/;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;

mas ainda recebo o mesmo erro, e o log de depuração mostra o caminho completo e não-criptografado sendo enviado para o PHP-FPM.

O que estou perdendo para que isso funcione?

    
por dragonmantank 02.02.2012 / 08:29

3 respostas

4

Parece que você esqueceu um / .

fastcgi_param SCRIPT_FILENAME www/public$fastcgi_script_name;

Deverá ler:

fastcgi_param SCRIPT_FILENAME /www/public$fastcgi_script_name;
    
por 04.08.2012 / 22:07
3

Eu tenho a mesma situação e esta é minha solição:

config fpm:

prefix = /var/www/example.com
chroot = $prefix
chdir = /
listen = tmp/php5-fpm.sock
slowlog = log/$pool.log.slow

configuração nginx:

 location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass unix:/var/www/example.com/tmp/php5-fpm.sock;
    fastcgi_param SCRIPT_FILENAME /htdocs$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT /htdocs;
 }

estrutura de pastas de /var/www/example.com

drwxr-x---  6 www-data www-data 4096 May 22 10:57 .
drwxr-xr-x 10 root     root     4096 May 22 08:52 ..
drwxr-x---  2 www-data www-data 4096 May 22 10:57 htdocs
drwxr-x---  2 www-data www-data 4096 May 22 10:34 log
drwxr-x---  2 www-data www-data 4096 May 22 10:56 tmp
    
por 23.05.2012 / 09:54
0

O Nginx não sabe se você configurou o chroot no seu PHP-FPM. Então, você ainda precisa fornecer o caminho completo em fastcgi_param. Basicamente, sua configuração inicial é o que você precisava.

    
por 02.02.2012 / 18:00