Nginx serve file .php come download, invece di eseguirli


151

Sto installando un sito Web in una gocciolina (Digital Ocean). Ho un problema con l'installazione corretta di NGINX con PHP. Ho fatto un tutorial https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04 ma quando provo a eseguire alcuni File .php lo sta solo scaricando ... per esempio ... http://5.101.99.123/info.phpfunziona ma ... Se vado al main http://5.101.99.123sta scaricando il mio index.php: /

Qualche 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

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

... Altri "location" sono commentati (#)


4
Sì ... non hai configurato correttamente PHP-FPM con Nginx. Questo è tutto ciò che possiamo dirti, dal momento che non ci hai mostrato nessuna delle tue configurazioni.
Brad

quale file vuoi vedere? Grazie @Brad
Apeiron,

Qualunque file (o file) in cui hai inserito la tua configurazione. La parte rilevante è ... dove hai impostato PHP-FPM nella tua configurazione di Nginx.
Brad

2
dopo circa un'ora di ricerca su Google ho trovato questo askubuntu.com/a/601996/89455 - se avevi una configurazione errata prima di provare a svuotare la cache - ha funzionato qui!
tm_lv,

1
Vedi simile domanda / risposta per PHP7 a stackoverflow.com/q/42664080/287948
Peter Krauss

Risposte:


131

Prova questo:

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

  2. Scollega entrambe le linee di ascolto per far sì che nginx ascolti sulla 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. Lascia server_namestare

    # Make site accessible (...)
    server_name localhost;
  4. Aggiungi index.phpalla indexriga

    root /usr/share/nginx/www;
    index index.php index.html index.htm;
  5. Rimuovere il commento 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. Modifica /etc/php5/fpm/php.inie assicurati che cgi.fix_pathinfosia impostato su0

  7. Riavvia nginx e php5-fpm sudo service nginx restart && sudo service php5-fpm restart


Ho appena iniziato ad usare Linux una settimana fa, quindi spero davvero di aiutarti in questo. Sto usando l'editor di testo nano per modificare i file. eseguire apt-get install nano se non lo si possiede. Google su di esso per saperne di più.


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

8
nginx -s reload
Duca

2
con PHP7-fpm è: riavvio del servizio php7.0-fpm
Alex

1
@Joy, ho provato il tuo suggerimento ma non ha funzionato. Ho dovuto usare fastcgi_pass unix: /run/php/php7.0-fpm.sock;
jdstaerk

1
Per php7.2: unix:/var/run/php5-fpm.sock;converti in unix:/var/run/php/php7.2-fpm.sock;(un altro annidamento /php)
Oleg Reym,

50

È necessario aggiungere questo a / etc / nginx / siti-enabled / default per eseguire i file php sul server 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;
    }
}

Che cos'è SCRIPT_FILENAME?
mp3por

2
Se stai usando PHP 7.0, allora questo è corretto:fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Andrew Fox,

1
@ AndrewFox- il mio nome file è php7.0-fpm.pide non php7.0-fpm.sockin /var/run/php/ cosa significa?
vsync

@vsync provalo. sudo service php7.0-fpm restart. se manca calzino indica che è in esecuzione il processo php.
Zhisme,

1
@Pathros - Ho scoperto che wordpress (nel mio caso) ha i file di configurazione del server in un'altra cartella, e quelli erano quelli che dovevano essere modificati/etc/nginx/conf.d/wordpress_https.conf
vsync il

43

Ho avuto un problema simile che è stato risolto svuotando la cache del browser (funzionava bene anche con browser diversi).


5
Penso che il riavvio e la modalità di navigazione in incognito mi abbiano aiutato. Grazie mille per la noobness che possiamo fare.
Swapnil Mhaske

4
Molte grazie. Mi hai salvato la giornata) Anche +1 per l'incognito!
Eddie,

3
Questo lo ha fatto per me, anche dopo ore provando molte altre soluzioni suggerite.
Kleag,

1
Era strano per me che il mio sito funzionasse su IE e Chrome mentre in Mozilla scaricava il sito invece di eseguirlo. Era colpa della cache di Mozilla.
Viktor Joras,

3
Mi hai risparmiato tempo fratello.
Amir Kaftari,

12

Aggiorna nginx config / etc / nginx / sites-available / default o il tuo file di configurazione

se stai usando php7 usa questo

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

se stai usando php5 usa questo

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

Visita qui per i dettagli completi. Dettagli qui


Ho provato che questo non ha funzionato per me, sto usando Ubuntu 14.04 e PHP 7.0 Come posso risolvere questo problema?
Kishore,

sopra il link condiviso "dettaglio completo" è rotto
Kishore

Cosa significa include snippets/fastcgi-php.conf;?
Timo,

9

Vedo molte soluzioni sopra e molte hanno funzionato correttamente per me, ma non capivo cosa stessero facendo ed ero preoccupata di copiare semplicemente il codice, in particolare fastcgi . Quindi ecco i miei 2 centesimi,

  1. nginx è un web server (e non un application server ) e quindi può servire solo pagine statiche.
  2. ogni volta, proviamo a eseguire il rendering / restituzione di un file .php, ad esempio index.php, nginx non sa cosa fare, dal momento che non riesce a capire un file .php (o del resto qualsiasi estensione a parte alcuni selezionati come .html, .js ecc. che sono file statici)
  3. Quindi per eseguire altri tipi di file abbiamo bisogno di qualcosa che si trova tra nginx e l'applicazione (qui l'applicazione php). È qui che entra in gioco Common Gateway Interface (CGI). È un software che gestisce questa comunicazione. I CGI possono essere implementati in qualsiasi linguaggio Python (uWSGI), PHP (FPM) e persino C. FastCGI è fondamentalmente una versione aggiornata di CGI che è molto più veloce di CGI.

Per alcuni server come Apache, esiste un supporto integrato per interpretare PHP e quindi non è necessario un CGI.

Questo collegamento oceanico digitale , spiega abbastanza bene i passaggi per installare FPM e non sto scrivendo i passaggi necessari per risolvere il problema dei file php che vengono scaricati anziché renderizzati poiché gli altri rispondono abbastanza bene a IMHO.


Bella spiegazione. Grazie.
Jon,

1
nginx è un SERVER web non un browser, per favore correggilo.
Geeocode

8

Ho avuto lo stesso problema e nessuna delle risposte ha risolto il problema.

Ho corso:

sudo nginx -t

per testare il file di configurazione in / etc / nginx / sites-available / default.

Mi ha dato questi errori:

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

Quindi sono andato nel file di configurazione e nell'ultima riga c'era

#}

Ho commentato, ho eseguito nuovamente il comando test e ha funzionato


Bel tocco per includere la sintassi test-comando oltre a un consiglio per risolvere il problema.
greybeard

7

Questo ha funzionato per me.

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

Utenti PHP5

Modificare

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

per

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

2) Configurare cgi.fix_pathinfo

Impostare cgi.fix_pathinfo su 0

Posizione:

PHP5 /etc/php5/fpm/php.ini

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


3) Riavvia i servizi

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; non è corretto. Dovrebbe essere /var/run/php/php7.0-fpm.sock; e devi aggiornare la versione php specificata con qualunque cosa tu abbia installato, ad esempio: /var/run/php/php7.2-fpm.sock;
VanAlbert,

4

Per me ha aiutato ad aggiungere ?$query_stringalla fine di /index.php, come di seguito:

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

3

Se una delle risposte proposte non funziona, prova questo:

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

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

2.fix nginx.conf in 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. correggere il file predefinito in etc / nginx / site-available

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

4. avviare il servizio nginx

servizio sudo riavvio nginx

5. avviare il servizio php

servizio riavvio php5-fpm

6.enjoy

Crea qualsiasi file php in / usr / share / nginx / html ed eseguilo in "nome_server / nome_file.php" (nome_server dipende dalla tua configurazione, normalmente è localhost, nome_file.php è il nome del file creato in / usr / share / nginx / html).

Sto usando Ubuntu 14.04


2

La risposta sopra sembrava commentare troppo per la soluzione che ho raggiunto. Ecco come appariva il mio file:

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

Spero che questo aiuti alcune persone frustrate di domenica pomeriggio (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;
    }
}

I frammenti di cui sopra hanno funzionato per me in caso di php7.2


1

Per chiunque abbia lo stesso problema con PHP 7, questo è quello che ho fatto per fare in modo che nginx eseguisse correttamente i file php in CentOS 7, pubblicati qui, quindi nel caso in cui qualcuno avesse lo stesso problema:

  • Segui passo dopo passo questo documento su Digital Ocean .

  • Apri il /etc/nginx/conf.d/default.conf(per impostazione predefinita non ho siti abilitati né siti disponibili, puoi modificarli di conseguenza).

  • Modifica il locationparametro come di seguito:

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;
}
  • Riavvia i servizi Nginx e PHP sudo systemctl restart php-fpme sudo systemctl restart nginx.

  • Ultima ma più importante, svuota la cache del browser o esegui incognito (Chrome)o Private Browsing (Firefox)ecc ...

Spero che questo utile e felice codice


1

La mia soluzione era aggiungere

    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;

nel mio file di configurazione personalizzato, ad esempio etc/nginx/sites-available/example.com.conf

L'aggiunta a /etc/nginx/sites-available/defaultnon ha funzionato per me.


1

Nel mio caso, non /etc/nginx/sites-available/defaultstavo usando un altro file di configurazione del blocco server (ad esempio esempio.com) e l'unico modo per risolvere questo problema è rimuovere il collegamento simbolico del file di configurazione del blocco server predefinito:

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

quindi ricaricare Nginx:

$ sudo systemctl reload nginx

1

Ho risolto il mio problema ora con questo codice (cambia il tuo 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

Ciò che ha funzionato per me con Ubuntu 16.04 e php7 è stato eliminare questa riga

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

In seguito ha smesso di scaricare file php.


0

Decommenta la posizione .php in / 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

Se qualcos'altro non ti aiuta. E forse prima hai installato apache2 con il file di test info.php. Cancella solo i dati dell'app (cache, cookie) per localhost.


0

controlla che l'estensione del file di configurazione di nginx sia * .conf.
ad esempio: /etc/nginx/conf.d/myfoo.conf

Ho la stessa situazione. Dopo aver rinominato il mio file di configurazione da myfoo a myfoo.conf, è stato corretto. Non dimenticare di riavviare nginx dopo averlo rinominato.


0

Per prima cosa devi Remove cachenel tuo browser

Quindi aprire il terminale ed eseguire il comando seguente:

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

Quindi aggiungere il seguente codice in default file:

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

In caso di mancata corrispondenza basta correggere e riavviare Nginx dal terminale con il comando seguente

sudo systemctl restart nginx

Quindi vai al browser e divertiti ...


0

Per me era la linea: fastcgi_pass unix: /var/run/php5-fpm.sock;

che doveva essere solo: fastcgi_pass unix: /run/php5-fpm.sock;


0

Stavo per andare mentalmente cercando di risolvere questo problema, per me il problema era che Cloudflare aveva memorizzato nella cache il file php e continuava a farmi scaricare.

La soluzione per me era eliminare la cache su Cloudflare.


forse vuoi dirci come?
Thorsten Staerk,

0

Avevo avuto lo stesso problema, quello che ha risolto era che questo blocco server ha anche questo blocco sopra altri blocchi posizione se hai problemi di caricamento CSS. Che ho aggiunto al mio file conf disponibile nei siti.

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

Quindi questo è ciò che alla fine ha funzionato nel mio caso come regole di riscrittura in cui il colpevole
ho cambiato le regole di riscrittura di nginx come segue.

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

diventa ...

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

Apparentemente senza l' ultima parola chiave, la richiesta non è stata riavviata, quindi non ha mai raggiunto il .phpsegmento di posizione ed è stata semplicemente interpretata come un download -


0

per la cronaca, ho scoperto che il mio php-fpm non era in esecuzione e l'ho risolto con service php7.2-fpm stop


0

Una cosa da verificare: se hai impostato l'accesso HTTPS prima di impostare PHP - ho usato certbot - è necessario apportare le modifiche in / etc / nginx / sites-available / default due volte perché ci saranno due blocchi server (uno in ascolto sulla porta 80 e uno in ascolto sulla porta 443).

(Stavo configurando questo server principalmente per la posta elettronica e non avevo alcuna utilità per PHP quando ho installato nginx per la prima volta come un modo per eseguire certbot più facilmente.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.