Nginx sirve archivos .php como descargas, en lugar de ejecutarlos


151

Estoy instalando un sitio web en una gota (Océano Digital). Tengo un problema para instalar NGINX con PHP correctamente. Hice un tutorial https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04 pero cuando intento ejecutar algunos .php solo lo está descargando ... por ejemplo ... http://5.101.99.123/info.phpestá funcionando pero ... Si voy a la página principal http://5.101.99.123, está descargando mi index.php: /

¿Alguna idea?

-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

Mi / 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
            }

... Otros "ubicación" están comentados (#)


44
Sí ... no configuró PHP-FPM con Nginx correctamente. Sin embargo, eso es todo lo que podemos decirle, ya que no nos mostró ninguna de sus configuraciones.
Brad

¿Qué archivo quieres ver? Gracias @Brad
Apeiron

Cualquiera que sea el archivo (o archivos) en el que ponga su configuración. La parte relevante es ... donde configura PHP-FPM en su configuración Nginx.
Brad

2
después de que como una hora de google encontrara este askubuntu.com/a/601996/89455 , si tenía una configuración incorrecta antes de intentar borrar el caché, ¡funcionó aquí!
tm_lv

1
Consulte preguntas / respuestas similares para PHP7 en stackoverflow.com/q/42664080/287948
Peter Krauss

Respuestas:


131

Prueba esto:

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

  2. Elimine el comentario de ambas líneas de escucha para que nginx escuche en el puerto 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. Dejar server_namesolo

    # Make site accessible (...)
    server_name localhost;
  4. Agregar index.phpa la indexlínea

    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.iniy asegúrese de que cgi.fix_pathinfoesté configurado en0

  7. Reinicie nginx y php5-fpm sudo service nginx restart && sudo service php5-fpm restart


Acabo de comenzar a usar Linux hace una semana, así que realmente espero ayudarte en esto. Estoy usando el editor de texto nano para editar los archivos. ejecute apt-get install nano si no lo tiene. Google en él para saber más.


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

8
nginx -s reload
Duque

2
con PHP7-fpm es: reinicio del servicio php7.0-fpm
Alex

1
@Joy, probé tu sugerencia pero no funcionó. Tuve que usar fastcgi_pass unix: /run/php/php7.0-fpm.sock;
jdstaerk

1
Para php7.2: unix:/var/run/php5-fpm.sock;convertir a unix:/var/run/php/php7.2-fpm.sock;(una anidación más /php)
Oleg Reym

50

Debe agregar esto a / etc / nginx / sites-enabled / default para ejecutar archivos php en el servidor Nginx:

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

¿Qué es SCRIPT_FILENAME?
mp3por

2
Si está utilizando PHP 7.0, entonces esto es correcto:fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Andrew Fox

1
@ AndrewFox- mi nombre de archivo está php7.0-fpm.pidy no php7.0-fpm.socken /var/run/php/ qué significa eso?
vsync

@vsync pruébalo. sudo service php7.0-fpm restart. Si falta un calcetín, indica que se está ejecutando el proceso php.
zhisme

1
@Pathros: descubrí que wordpress (en mi caso) tiene archivos de configuración del servidor en otra carpeta, y esos eran los que debían editarse/etc/nginx/conf.d/wordpress_https.conf
vsync

43

Tuve un problema similar que se resolvió vaciando la memoria caché del navegador (también funcionó bien con un navegador diferente).


55
Creo que el reinicio y el modo de incógnito me ayudaron. Gracias a una tonelada por el noobness que podemos hacer.
Swapnil Mhaske

44
Muchas gracias. Me salvaste el día) ¡También +1 por incógnito!
Eddie

3
Esto lo hizo para mí, también después de horas probando muchas otras soluciones sugeridas.
Kleag

1
Me resultó extraño que mi sitio funcionara en IE y Chrome mientras que en mozilla descargaba el sitio en lugar de ejecutarlo. Fue un error de caché de Mozilla.
Viktor Joras

3
Me salvaste el tiempo hermano.
Amir Kaftari

12

Actualice nginx config / etc / nginx / sites-available / default o su archivo de configuración

si estás usando php7 usa esto

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

si estás usando php5 usa esto

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

Visite aquí para obtener detalles completos Detalle aquí


Intenté que esto no funcionara para mí, estoy usando ubuntu 14.04 y php 7.0 ¿cómo puedo solucionar este problema?
Kishore

enlace compartido anterior "detalle completo" está roto
Kishore

¿Qué significa include snippets/fastcgi-php.conf;?
Timo

9

Veo muchas soluciones arriba y muchas funcionaron correctamente para mí, pero no entendí lo que estaban haciendo y me preocupaba simplemente copiar y pegar el código, específicamente fastcgi . Así que aquí están mis 2 centavos,

  1. nginx es un servidor web (y no un servidor de aplicaciones ) y, por lo tanto, solo puede servir páginas estáticas.
  2. cada vez que intentemos renderizar / devolver un archivo .php, por ejemplo index.php, nginx no sabe qué hacer, ya que simplemente no puede entender un archivo .php (o para el caso, cualquier extensión aparte de unos pocos seleccionados como .html, .js, etc., que son archivos estáticos)
  3. Por lo tanto, para ejecutar otros tipos de archivos, necesitamos algo que se encuentre entre nginx y la aplicación (aquí la aplicación php). Aquí es donde entra en juego la interfaz de puerta de enlace común (CGI). Es un software que gestiona esta comunicación. Los CGI se pueden implementar en cualquier lenguaje posible Python (uWSGI), PHP (FPM) e incluso C. FastCGI es básicamente una versión mejorada de CGI que es mucho más rápido que CGI.

Para algunos, servidores como Apache, hay soporte incorporado para interpretar PHP y, por lo tanto, no es necesario un CGI.

Este enlace digital del océano explica los pasos para instalar FPM bastante bien y no estoy escribiendo los pasos necesarios para resolver el problema de la descarga de archivos php en lugar de renderizar, ya que el otro responde en mi humilde opinión bastante bien.


Buen explicador. Gracias.
Jon

1
Nginx es una web SERVIDOR no navegador, por favor solucionarlo.
Geeocode

8

Tuve el mismo problema y ninguna de las respuestas resolvió el problema.

Corrí:

sudo nginx -t

para probar el archivo de configuración en / etc / nginx / sites-available / default.

Me dio estos errores:

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

Así que entré en el archivo de configuración y en la última línea había

#}

Descomenté, ejecuté el comando de prueba nuevamente y funcionó


Un buen toque para incluir la sintaxis de comando de prueba además de un consejo para solucionar el problema.
greybeard

7

Esto funcionó para mí.

1) archivo 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;
      }
}

Usuarios PHP5

Cambio

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

a

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

2) Configurar cgi.fix_pathinfo

Establezca cgi.fix_pathinfo en 0

Ubicación:

PHP5 /etc/php5/fpm/php.ini

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


3) Reiniciar servicios

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; Es incorrecto. Debe ser /var/run/php/php7.0-fpm.sock; y necesita actualizar la versión de php especificada con lo que haya instalado, por ejemplo: /var/run/php/php7.2-fpm.sock;
VanAlbert

4

Para mí, ayudó agregar ?$query_stringal final de /index.php, como a continuación:

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

3

Si alguna de las respuestas propuestas no funciona, intente esto:

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

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

2.fix nginx.conf en 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. arregle el archivo predeterminado en etc / nginx / site-available

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

4. reinicie el servicio nginx

sudo service nginx restart

5. reiniciar el servicio de php

servicio php5-fpm reiniciar

6 disfruta

Cree cualquier archivo php en / usr / share / nginx / html y ejecútelo en "server_name / file_name.php" (server_name depende de su configuración, normalmente es localhost, file_name.php es el nombre del archivo que se creó en / usr / share / nginx / html).

Estoy usando Ubuntu 14.04


2

La respuesta anterior parecía comentar demasiado para la solución a la que llegué. Así es como se veía mi archivo:

/ 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 esto ayude a algunas personas que están frustradas un domingo por la tarde (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;
    }
}

Los fragmentos anteriores funcionaron para mí en caso de php7.2


1

Para cualquiera que tenga el mismo problema con PHP 7, esto es lo que hice para que nginx ejecute los archivos php correctamente en CentOS 7, publicado aquí, así que en caso de que alguien tenga el mismo problema:

  • Siga paso a paso este documento sobre Digital Ocean .

  • Abra el /etc/nginx/conf.d/default.conf(por defecto no tengo sitios habilitados ni sitios disponibles, puede editar en consecuencia).

  • Edite el locationparámetro de la siguiente manera:

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 los servicios de Nginx y PHP sudo systemctl restart php-fpmy sudo systemctl restart nginx.

  • Por último, pero lo más importante, borrar la memoria caché del navegador o ejecutar incognito (Chrome)o Private Browsing (Firefox)etc.

Espero que esta codificación útil y feliz


1

Mi solución fue agregar

    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;

a mi archivo de configuración personalizado, por ejemplo etc/nginx/sites-available/example.com.conf

Agregar a /etc/nginx/sites-available/defaultno funcionó para mí.


1

En mi caso, no estaba usando /etc/nginx/sites-available/default, estaba usando un archivo de configuración de bloque de servidor diferente (por ejemplo, ejemplo.com), y la única forma en que pude solucionar este problema fue eliminando el enlace simbólico del archivo de configuración de bloque de servidor predeterminado:

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

luego recarga Nginx:

$ sudo systemctl reload nginx

1

Resolví mi problema ahora con este código (cambie su 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

Lo que funcionó para mí con Ubuntu 16.04, y php7 fue eliminar esta línea

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

Dejó de descargar archivos php después de eso.


0

Descomente la ubicación .php en / etc / nginx / sites-available / default

sudo vi / etc / nginx / sites-available / default:

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

Si algo más no te ayuda. Y tal vez antes instaló apache2 con el archivo de prueba info.php. Simplemente borre los Datos de la aplicación (caché, cookie) para localhost.


0

compruebe que su extensión de archivo de configuración nginx es * .conf.
por ejemplo: /etc/nginx/conf.d/myfoo.conf

Tengo la misma situación. Después de cambiar el nombre de mi archivo de configuración de myfoo a myfoo.conf, se solucionó. No olvide reiniciar nginx después de cambiarle el nombre.


0

Primero tienes que hacerlo Remove cacheen tu navegador

Luego abra la terminal y ejecute el siguiente comando:

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

Luego agregue el siguiente código en el defaultarchivo:

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

Si no coincide, solo corrija y reinicie Nginx desde la terminal con el siguiente comando

sudo systemctl restart nginx

Luego ve al navegador y disfruta ...


0

Para mí fue la línea: fastcgi_pass unix: /var/run/php5-fpm.sock;

que tenía que ser solo: fastcgi_pass unix: /run/php5-fpm.sock;


0

Estaba a punto de volverme loco tratando de arreglar esto, para mí el problema era que Cloudflare había almacenado en caché el archivo php y seguía haciéndome descargarlo.

La solución para mí fue purgar el caché en Cloudflare.


tal vez quieres decirnos cómo?
Thorsten Staerk

0

Había tenido el mismo problema, lo que resolvió fue que este bloque de servidor también tiene este bloque por encima de otros bloques de ubicación si tiene problemas de carga de CSS. Lo que agregué a mi archivo de conf de sitios disponibles.

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

Así que esto es lo que finalmente funcionó en mi caso como reglas de reescritura donde el culpable
cambié las reglas de reescritura de nginx de la siguiente manera ...

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

se convierte en ...

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

Aparentemente, sin la última palabra clave, la solicitud no se reinició, por lo que nunca llegó al .phpsegmento de ubicación y simplemente se interpretó como una descarga:


0

para un registro, descubrí que mi php-fpm no se estaba ejecutando y lo arreglé con service php7.2-fpm stop


0

Una cosa más para verificar: si configuró el acceso HTTPS antes de configurar PHP (usé certbot), deberá realizar los cambios en / etc / nginx / sites-available / default dos veces porque habrá dos bloques de servidor (uno escucha en el puerto 80 y otro escucha en el puerto 443).

(Estaba configurando este servidor principalmente para correo electrónico y no tenía ningún uso para PHP cuando instalé nginx por primera vez solo como una forma de ejecutar certbot más fácilmente).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.