O Nginx serve arquivos .php como downloads, em vez de executá-los


151

Estou instalando um site em uma gota (Digital Ocean). Tenho um problema para instalar o NGINX com PHP corretamente. Eu fiz um tutorial https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04, mas quando tento executar alguns O arquivo .php está apenas baixando ... por exemplo ... http://5.101.99.123/info.phpestá funcionando, mas ... Se eu for o principal http://5.101.99.123, está baixando o meu index.php: /

Qualquer ideia?

-rw-r--r--  1 agitar_user www-data   418 Jul 31 18:27 index.php
-rw-r--r--  1 agitar_user www-data    21 Aug 31 11:20 info.php

Meu / etc / nginx / sites-available / default

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /var/www/html;
        index index.html index.htm index.php;

        # Make site accessible from http://localhost/
        server_name agitarycompartir.com;

               location ~ \.php$ {
                    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    #               # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    #
    #               # With php5-cgi alone:
    #               fastcgi_pass 127.0.0.1:9000;
    #               # With php5-fpm:
                    fastcgi_pass unix:/var/run/php5-fpm.sock;
                    fastcgi_index index.php;
                    include fastcgi_params;
            }


              location / {

                    try_files $uri $uri/ =404;
                    # Uncomment to enable naxsi on this location
                    # include /etc/nginx/naxsi.rules
            }

... Outros "local" são comentados (#)


4
Sim ... você não configurou o PHP-FPM com Nginx corretamente. É tudo o que podemos dizer, já que você não nos mostrou nenhuma das suas configurações.
Brad

qual arquivo você quer ver? Obrigado @Brad
Apeiron

Qualquer arquivo (ou arquivos) em que você colocar sua configuração. A parte relevante é ... onde você configura o PHP-FPM na sua configuração do Nginx.
Brad

2
depois de uma hora pesquisando no google, encontrei isso askubuntu.com/a/601996/89455 - se você tinha uma configuração ruim antes de tentar limpar o cache - funcionou aqui!
tm_lv

1
Veja a pergunta / resposta semelhante para o PHP7 em stackoverflow.com/q/42664080/287948
Peter Krauss

Respostas:


131

Tente o seguinte:

  1. Editar /etc/nginx/sites-available/default

  2. Remova o comentário das duas linhas de escuta para que o nginx escute na porta 80 IPv4 e IPv6.

    listen   80; ## listen for ipv4; this line is default and implied
    listen   [::]:80 default_server ipv6only=on; ## listen for ipv6
    
  3. Deixe em server_namepaz

    # Make site accessible (...)
    server_name localhost;
    
  4. Adicionar index.phpà indexlinha

    root /usr/share/nginx/www;
    index index.php index.html index.htm;
    
  5. Descomentar location ~ \.php$ {}

    # pass the PHP scripts to FastCGI server listening on (...)
    #
    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    
            # With php5-cgi alone:
            #fastcgi_pass 127.0.0.1:9000;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    }
    
  6. Edite /etc/php5/fpm/php.inie verifique se cgi.fix_pathinfoestá definido como0

  7. Reinicie o nginx e o php5-fpm sudo service nginx restart && sudo service php5-fpm restart


Acabei de começar a usar o Linux há uma semana, por isso realmente espero ajudá-lo nisso. Estou usando o editor de texto nano para editar os arquivos. execute o apt-get install nano se você não o tiver. Google para saber mais.


14
service nginx restart && service php5-fpm restart
Duke

8
nginx -s reload
Duke

2
com PHP7-fpm é: service php7.0-fpm restart
Alex

1
@Joy, tentei sua sugestão, mas não funcionou. Teve que usar o fastcgi_pass unix: /run/php/php7.0-fpm.sock;
jdstaerk

1
Para php7.2: unix:/var/run/php5-fpm.sock;converter para unix:/var/run/php/php7.2-fpm.sock;(mais uma nidificação /php)
Oleg Reym

50

Você precisa adicionar isso a / etc / nginx / sites-enabled / default para executar arquivos php no Nginx Server:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

O que é SCRIPT_FILENAME?
mp3por

2
Se você estiver usando o PHP 7.0, então isso está correto:fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Andrew Fox

1
@ AndrewFox- meu nome de arquivo está php7.0-fpm.pide não está php7.0-fpm.sockno /var/run/php/ que isso significa?
vsync 29/04

@vsync experimentá-lo. sudo service php7.0-fpm restart. se faltar meia, indica que o processo php está sendo executado.
Zhisme

1
@Pathros - Descobri que wordpress (no meu caso) tem arquivos de configuração de servidor em outra pasta, e aqueles eram os necessários para ser editado/etc/nginx/conf.d/wordpress_https.conf
vsync

43

Eu tive um problema semelhante que foi resolvido esvaziando o cache do navegador (também funcionou bem com outro navegador).


5
Acho que o modo de reinicialização e de navegação anônima me ajudou. Agradeço muito pela noobness que podemos fazer.
Swapnil Mhaske

4
Muito obrigado. Você salvou meu dia) Também marcou +1 em modo anônimo!
Eddie

3
Isso fez para mim, também depois de horas tentando várias outras soluções sugeridas.
Kleag

1
Era estranho para mim que meu site funcionasse no IE e no chrome, enquanto no mozilla ele desclassificava o site em vez de executá-lo. Foi uma falha de cache do mozilla.
Viktor Joras

3
Você economizou meu tempo, mano.
Amir Kaftari

12

Atualize nginx config / etc / nginx / sites-available / default ou seu arquivo de configuração

Se você estiver usando o php7, use este

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

Se você estiver usando o php5, use este

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    }

Visite aqui para detalhes completos Detalhe aqui


Eu tentei isso não funcionou para mim, estou usando o ubuntu 14.04 e o php 7.0 como posso corrigir esse problema?
Kishore #

acima do link compartilhado "detalhe completo" está quebrado
Kishore

O que significa include snippets/fastcgi-php.conf;?
Timo

9

Vejo muitas soluções acima e muitas funcionaram corretamente para mim, mas não entendi o que estavam fazendo e estava preocupado em apenas copiar e colar o código, especificamente, fastcgi . Então, aqui estão meus 2 centavos,

  1. O nginx é um servidor da Web (e não um servidor de aplicativos ) e, portanto, pode servir apenas páginas estáticas.
  2. sempre que tentamos renderizar / retornar um arquivo .php, por exemplo index.php, o nginx não sabe o que fazer, pois simplesmente não consegue entender um arquivo .php (ou, nesse caso, qualquer extensão além de algumas poucas selecionadas como .html, .js etc., que são arquivos estáticos)
  3. Portanto, para executar outros tipos de arquivos, precisamos de algo que fique entre o nginx e o aplicativo (aqui o aplicativo php). É aqui que entra a interface comum do gateway (CGI). É um software que gerencia essa comunicação. Os CGIs podem ser implementados em qualquer linguagem possível Python (uWSGI), PHP (FPM) e até C. O FastCGI é basicamente uma versão atualizada do CGI, que é muito mais rápida que o CGI.

Para alguns servidores como o Apache, existe suporte embutido para interpretar o PHP e, portanto, não é necessário um CGI.

Este link digital do oceano explica as etapas para instalar o FPM muito bem e não estou escrevendo as etapas necessárias para resolver o problema de arquivos php sendo baixados em vez de renderizados, pois as outras respostas são muito boas.


Bom explicador. Obrigado.
24519 Jon

1
nginx é um web SERVIDOR não navegador, por favor corrigi-lo.
Geeocode

8

Eu tive o mesmo problema e nenhuma das respostas resolveu o problema.

Eu corri:

sudo nginx -t

para testar o arquivo de configuração em / etc / nginx / sites-available / default.

Isso me deu os seguintes erros:

nginx: [emerg] unexpected end of file, expecting "}" in /etc/nginx/sites-enabled/default:115
nginx: configuration file /etc/nginx/nginx.conf test failed

Então eu entrei no arquivo de configuração e na última linha havia

#}

Descomentei, executei o comando test novamente e funcionou


Toque agradável para incluir a sintaxe do comando de teste, além de um conselho para corrigir o problema.
greybeard

7

Isso funcionou para mim.

1) arquivo MyApp

vi / etc / nginx / sites-available / myApp

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

  root /var/www/myApp;
  index index.php index.html index.htm;

  location ~ \.php$ {
      try_files $uri =404;
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      fastcgi_pass unix:/run/php/php7.0-fpm.sock;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
      }
}

Usuários PHP5

mudança

fastcgi_pass unix:/run/php/php7.0-fpm.sock;

para

fastcgi_pass unix:/var/run/php5-fpm.sock;

2) Configure cgi.fix_pathinfo

Defina cgi.fix_pathinfo como 0

Localização:

PHP5 /etc/php5/fpm/php.ini

PHP7 /etc/php/7.0/fpm/php.ini


3) Reiniciar serviços

FPM

php5 sudo service php5-fpm restart

php7 sudo service php7.0-fpm restart

NGINX

sudo service nginx restart

fastcgi_pass unix: /run/php/php7.0-fpm.sock; está incorreto. Deve ser /var/run/php/php7.0-fpm.sock; e você precisa atualizar a versão php especificada com o que você instalou, por exemplo: /var/run/php/php7.2-fpm.sock;
VanAlbert

4

Para mim, ajudou a adicionar ?$query_stringno final do /index.php, como abaixo:

location / {
        try_files $uri $uri/ /index.php?$query_string;
}

3

Se alguma das respostas propostas não estiver funcionando, tente o seguinte:

1.fix www.conf em etc / php5 / fpm / pool.d:

listen = 127.0.0.1:9000;(delete all line contain listen= )

2.fix nginx.conf em usr / local / nginx / conf:

remove server block server{} (if exist) in block html{} because we use server{} in default (config file in etc/nginx/site-available) which was included in nginx.conf.

3. corrija o arquivo padrão em etc / nginx / site-available

location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; }

4.restart serviço nginx

serviço sudo nginx restart

5.restart serviço php

reiniciar o serviço php5-fpm

6.enjoy

Crie qualquer arquivo php em / usr / share / nginx / html e execute "server_name / file_name.php" (server_name depende da sua configuração, normalmente é localhost, file_name.php é o nome do arquivo criado em / usr / share / nginx / html).

Estou usando o Ubuntu 14.04


2

A resposta acima parecia comentar demais a solução que cheguei. É assim que meu arquivo era:

/ etc / nginx / sites-available / default

location ~ \.php$ {
# fastcgi_split_path_info ^(.+\.php)(/.+)$;
# # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
#
# # With php5-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# With php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}

Espero que isso ajude algumas pessoas frustradas em uma tarde de domingo (c:


2
server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www/html;
    index index.php index.html index.htm;

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }
}

Os trechos acima funcionaram para mim no caso do php7.2


1

Para qualquer um que tenha o mesmo problema com o PHP 7, foi o que fiz para fazer o nginx executar arquivos php corretamente no CentOS 7, publicados aqui.

  • Siga passo a passo este documento no Digital Ocean .

  • Abra o /etc/nginx/conf.d/default.conf(por padrão, não tenho sites ativados nem sites disponíveis, você pode editar em conformidade).

  • Edite o locationparâmetro como abaixo:

default.conf :

location ~ \.php$ {
    try_files $uri =404;
    #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;

    #instruct nginx execute php7 files instead download them :D
    fastcgi_pass unix:/var/run/php-fpm/www.sock;

    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
  • Reinicie os serviços Nginx e PHP sudo systemctl restart php-fpme sudo systemctl restart nginx.

  • Por último, mas mais importante, limpe o cache do navegador ou execute incognito (Chrome)ou Private Browsing (Firefox)etc ...

Espero que esta codificação útil e feliz


1

Minha solução foi adicionar

    location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;

ao meu arquivo de configuração personalizado, por exemplo etc/nginx/sites-available/example.com.conf

Adicionando a /etc/nginx/sites-available/defaultnão funcionou para mim.


1

No meu caso, não estava usando /etc/nginx/sites-available/default, estava usando um arquivo de configuração de bloco de servidor diferente (por exemplo, example.com), e a única maneira de solucionar esse problema é removendo o link simbólico do arquivo de configuração de bloco de servidor padrão:

$ rm /etc/nginx/sites-enabled/default

recarregando o Nginx:

$ sudo systemctl reload nginx

1

Resolvi meu problema agora com este código (altere seu IP):

location / {
access_log off;
    log_not_found  off;
    client_max_body_size    2000m;
    client_body_buffer_size 512k;
    proxy_buffering on;
    proxy_send_timeout 300s;
    proxy_read_timeout 300s;
    proxy_buffer_size 64k;
    proxy_buffers 32 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;
    proxy_connect_timeout 300s;
    proxy_http_version 1.1;
    proxy_set_header Range "";
    proxy_pass   https://123.123.123.123:444;
    proxy_set_header   Host   $host;
    proxy_set_header   X-Real-IP  $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_redirect     off;
}

0

O que funcionou para mim no Ubuntu 16.04 e o php7 estava excluindo esta linha

fastcgi_split_path_info ^(.+\.php)(/.+)$;

Parou de baixar arquivos php depois disso.


0

Remova o comentário da localização .php em / etc / nginx / sites-available / default

sudo vi / etc / nginx / sites-available / padrão:

location ~ \.php$ {
            include snippets/fastcgi-php.conf;

            # With php5-cgi alone:
    #       fastcgi_pass 127.0.0.1:9000;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
    }

0

Se algo mais não ajudar você. E talvez antes você tenha instalado o apache2 com o arquivo de teste info.php. Limpe os dados do aplicativo (cache, cookie) para o host local.


0

verifique se a extensão do seu arquivo nginx config é * .conf.
por exemplo: /etc/nginx/conf.d/myfoo.conf

Eu tenho a mesma situação. Depois de renomear o meu arquivo de configuração de myfoo para myfoo.conf, ele foi corrigido. Não se esqueça de reiniciar o nginx após renomeá-lo.


0

Primeiro você precisa Remove cacheno seu navegador

Em seguida, abra o terminal e execute o seguinte comando:

sudo apt-get install php-gettext
sudo nano /etc/nginx/sites-available/default

Em seguida, adicione o seguinte código no defaultarquivo:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    server_name localhost;

    location / {
        try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Se houver alguma incompatibilidade, basta corrigir e reiniciar o Nginx a partir do terminal, usando o seguinte comando

sudo systemctl restart nginx

Em seguida, vá ao navegador e aproveite ...


0

Para mim, era a linha: fastcgi_pass unix: /var/run/php5-fpm.sock;

que tinha que ser apenas: fastcgi_pass unix: /run/php5-fpm.sock;


0

Eu estava prestes a enlouquecer tentando corrigir isso, para mim o problema era que o Cloudflare havia armazenado em cache o arquivo php e continuava me fazendo fazer o download.

A solução para mim foi limpar o cache no Cloudflare.


talvez você queira nos dizer como?
Thorsten Staerk

0

Eu estava tendo o mesmo problema que resolveu esse bloco de servidor e também esse bloco acima de outros blocos de localização, se você tiver problemas de carregamento de css. Que eu adicionei ao meu arquivo conf disponível nos sites.

location ~ [^/]\.php(/|$) {
fastcgi_split_path_info  ^(.+\.php)(/.+)$;
fastcgi_index            index.php;
fastcgi_pass             unix:/var/run/php/php7.3-fpm.sock;
include                  fastcgi_params;
fastcgi_param   PATH_INFO       $fastcgi_path_info;
fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

0

Então é isso que finalmente funcionou no meu caso como reescrever regras em que o culpado que
eu mudei as regras de reescrita nginx da seguinte maneira ..

   location /vendors { rewrite ^/vendors/?$ /vendors.php break; } 

torna-se...

  location /vendors { rewrite ^/vendors/?$ /vendors.php last; }

Aparentemente, sem a última palavra-chave, a solicitação não foi reiniciada, por isso nunca atingiu o .phpsegmento de local e foi simplesmente interpretada como um download -


0

para um registro, descobri que meu php-fpm não estava em execução e o corrigi com service php7.2-fpm stop


0

Mais uma coisa a verificar: se você configurou o acesso HTTPS antes de configurar o PHP - usei o certbot - será necessário fazer as alterações em / etc / nginx / sites-available / default duas vezes, pois haverá duas blocos de servidor (um atendendo na porta 80 e outro atendendo na porta 443).

(Eu estava configurando este servidor principalmente para email e não tinha uso do PHP quando instalei o nginx pela primeira vez, como uma maneira de executar o certbot com mais facilidade.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.