Não é possível configurar o Nginx para manipular o PHP junto com o proxy_pass

6

Eu tenho três requisitos da minha configuração Nginx:

  1. Encaminhar todas as solicitações no / para meu servidor Java em execução na porta 9001
  2. Intercepte todas as URLs de arquivos estáticos e exiba-as por meio do próprio Nginx.
  3. Sirva um URL base específico de uma pasta que contém scripts PHP.

Destas, posso alcançar as duas primeiras, mas quando visito http://localhost/ecwid_fu_scripts/ através do meu navegador da Web, a solicitação é interceptada pelo servidor Java em execução na porta 9001 e não é roteada para a index.php em /home/ankush/ecwid_fu_scripts/ . Aqui está minha configuração do Nginx:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;

    location /assets/images/ {
        root /home/ankush/fu_main_files/;
        autoindex off;
        sendfile on; 
        tcp_nopush on; 
        tcp_nodelay on; 
        keepalive_timeout 100;
    }   

    location /ecwid_fu_scripts/ {
        index index.php;
        root /home/ankush/ecwid_fu_scripts/;
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }   

    location / { 
        proxy_pass http://localhost:9001;
    }   

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}
    
por dotslash 29.12.2016 / 10:48

1 resposta

5

Seu problema está na diretiva root e no escopo deste root .

location /ecwid_fu_scripts/ {
    root /home/ankush/ecwid_fu_scripts/;

Nesse caso, quando alguém solicita example.com/ecwid_fu_scripts/, o nginx está procurando os arquivos no root definido, mais o local. Isso se torna / home / ankush / ecwid_fu_scripts / ecwid_fu_scripts /, que não é onde seu index.php está localizado.

Para resolver isso, você tem duas opções (com o # 2 sendo a opção preferida, se você tiver liberdade sobre o seu projeto):

  1. Altere o root desse bloco de localização para / home / ankush / em vez disso.
  2. Ou reestruture a estrutura do seu projeto para que tudo esteja em uma pasta de projeto relativa. Agora, defina o global root - a diretiva fora de qualquer bloco de localização - para o novo nome da pasta do projeto (digamos root /home/ankush/ecwid_files/; , após a diretiva server_name ).

Agora, ainda precisamos adicionar o conteúdo do bloco location ~ \.php$ dentro do bloco location /ecwid_fu_scripts/ , porque quando o root é alterado, as coisas relacionadas a essa nova raiz precisam ser usadas no mesmo bloco. Isso se deve a esse tipo de armadilha : o bloco de localização para ecwid_fu_scripts está dizendo que é um arquivo .php, ele faz try_files e, em seguida, termina com este bloco e é enviado para o próximo bloco relacionado: o global location ~ \.php$ . O problema é que ele não sabe mais o que é o root , já que ele não é definido globalmente. Assim, fastcgi_pass neste bloco não está obtendo o caminho completo.

Então, no final, sua configuração ficará assim com a opção nº 1:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;

    location /assets/images/ {
        root /home/ankush/fu_main_files/;
        autoindex off;
        sendfile on; 
        tcp_nopush on; 
        tcp_nodelay on; 
        keepalive_timeout 100;
    }   

    location /ecwid_fu_scripts/ {
        index index.php;
        root /home/ankush/;

        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }   

    location / { 
        proxy_pass http://localhost:9001;
    }   

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
}
    
por 29.12.2016 / 11:09

Tags