Nginx, .php dosyalarını yürütmek yerine indirmeler olarak sunar


162

Damlacığa (Dijital Okyanus) bir web sitesi kuruyorum. NGINX'i PHP ile düzgün bir şekilde kurmakla ilgili bir sorun yaşıyorum. Bir öğretici yaptım https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04 ama bazılarını çalıştırmayı denediğimde .php dosyası sadece indiriyor ... örneğin ... http://5.101.99.123/info.phpçalışıyor ama ... Ana sayfaya gidersem http://5.101.99.123index.php'mi indiriyor: /

Herhangi bir fikir?

-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

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

...

Diğerleri "konum" yorumlanır ...

.


5
Evet ... PHP-FPM'yi Nginx ile doğru şekilde kurmadınız. Hepsi bu siz bizi göstermedi çünkü gerçi söyleyebilirim herhangi senin config.
Brad

hangi dosyayı görmek istiyorsun Teşekkürler @Brad
Apeiron

Yapılandırmanızı hangi dosya (veya dosyalar) koyarsanız koyun. İlgili kısım ... Nginx yapılandırmanızda PHP-FPM'yi kurduğunuz yerdir.
Brad

2
Bir saat kadar googling bunu bulduktan sonra askubuntu.com/a/601996/89455 - önbelleği temizlemeyi denemeden önce kötü bir yapılandırmanız varsa - burada çalıştı!
tm_lv

Yanıtlar:


138

Bunu dene:

  1. Düzenle /etc/nginx/sites-available/default

  2. Nginx'in 80 IPv4 ve IPv6 bağlantı noktasını dinlemesi için her iki dinleme hattının açıklamasını kaldırın.

    listen   80; ## listen for ipv4; this line is default and implied
    listen   [::]:80 default_server ipv6only=on; ## listen for ipv6
    
  3. server_nameYalnız bırak

    # Make site accessible (...)
    server_name localhost;
    
  4. Ekle index.phpiçin indexhat

    root /usr/share/nginx/www;
    index index.php index.html index.htm;
    
  5. Açıklamayı iptal et 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. Düzenleyin /etc/php5/fpm/php.inive cgi.fix_pathinfoayarlandığından emin olun0

  7. Nginx ve php5-fpm'yi yeniden başlatın sudo service nginx restart && sudo service php5-fpm restart


Linux kullanmaya bir hafta önce başladım, bu yüzden size gerçekten yardımcı olmayı umuyorum. Dosyaları düzenlemek için nano metin düzenleyici kullanıyorum. yoksa apt-get install nano'yu çalıştırın. Daha fazlasını öğrenmek için Google'da.


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

8
nginx -s reload
Duke

2
PHP7-fpm ile: service php7.0-fpm yeniden başlatma
Alex

1
@ Joy, önerinizi denedi ama işe yaramadı. Fastcgi_pass unix kullanmak zorundaydı: /run/php/php7.0-fpm.sock;
jdstaerk

1
Php7.2 için: unix:/var/run/php5-fpm.sock;dönüştür unix:/var/run/php/php7.2-fpm.sock;(bir tane daha yuvalama /php)
Oleg Reym

51

Nginx Sunucusunda php dosyalarını yürütmek için bunu / etc / nginx / sites-enabled / default'a eklemeniz gerekir:

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

SCRIPT_FILENAME nedir?
mp3por

2
PHP 7.0 kullanıyorsanız, bu doğrudur:fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Andrew Fox

1
@ AndrewFox- benim dosya adı php7.0-fpm.piddeğil php7.0-fpm.sockde /var/run/php/ o demek ne?
vsync

@vsync deneyin. sudo service php7.0-fpm restart. çorap eksikse, php işleminin çalışmakta olduğunu gösterir.
zhisme

1
@Pathros - wordpress'in (benim durumumda) başka bir klasörde Sunucu yapılandırma dosyalarına sahip olduğunu ve bunların düzenlenmesi gerekenler olduğunu buldum/etc/nginx/conf.d/wordpress_https.conf
vsync

46

Tarayıcı önbelleğini boşaltarak çözülen benzer bir sorun yaşadım (farklı tarayıcılarla da iyi çalıştı).


5
Yeniden başlatma ve gizli modun bana yardımcı olduğunu düşünüyorum. Yapabildiğimiz suskunluk için çok teşekkür ederim.
Swapnil Mhaske

4
Çok teşekkürler. Günümü kurtardınız) Gizli mod için de +1!
Eddie

3
Bu benim için yaptı, ayrıca saatler sonra birçok başka çözüm önerdi.
Kleag

1
Mozilla'da sitemin IE ve chrome üzerinde çalışması bana tuhaf geldi, siteyi yürütmek zorunda kalmadı. Mozilla'nın önbellek hatasıydı.
Viktor Joras

3
Zamanımı kurtardın kardeşim.
Amir Kaftari

12

Nginx config / etc / nginx / sites-available / default veya config dosyanızı güncelleyin

php7 kullanıyorsanız bunu kullanın

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

php5 kullanıyorsanız bunu kullanın

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

Ayrıntıların tamamı için burayı ziyaret edin.


Bunu denedim benim için işe yaramadı, ubuntu 14.04 ve php 7.0 kullanıyorum, bu sorunu nasıl düzeltebilirim?
Kishore

paylaşılan bağlantının üstünde "tüm ayrıntılar" bozuk
Kishore

Ne anlama geliyor include snippets/fastcgi-php.conf;?
Timo

10

Yukarıda birçok çözüm görüyorum ve çoğu benim için doğru çalıştı, ancak ne yaptıklarını anlamadım ve sadece kodu kopyalayıp yapıştırmaktan, özellikle de fastcgi'den endişeliydim . İşte benim 2 sentim,

  1. nginx bir web sunucusudur (bir uygulama sunucusu değildir ) ve bu nedenle yalnızca statik sayfalara hizmet edebilir.
  2. Ne zaman, bir .php dosyasını oluşturmayı / döndürmeyi denediğimizde, örneğin index.php, nginx ne yapacağını bilemez, çünkü sadece bir .php dosyasını (veya bu nedenle, seçili birkaç dosya dışında herhangi bir uzantıyı anlayamaz) statik dosyalar olan .html, .js vb. gibi )
  3. Bu nedenle, diğer dosya türlerini çalıştırmak için nginx ve uygulama (burada php uygulaması) arasında duran bir şeye ihtiyacımız var. Bu, ortak ağ geçidi arabiriminin (CGI) devreye girdiği yerdir. Bu, bu iletişimi yöneten bir yazılım parçasıdır. CGI'lar olası herhangi bir Python (uWSGI), PHP (FPM) ve hatta C dilinde uygulanabilir. FastCGI temelde CGI'nin CGI'dan çok daha hızlı olan yükseltilmiş bir sürümüdür.

Apache gibi bazı sunucular için, PHP'yi yorumlamak için yerleşik destek vardır ve bu nedenle bir CGI'ye gerek yoktur.

Bu dijital okyanus bağlantısı , FPM'yi kurma adımlarını oldukça iyi açıklıyor ve diğer cevaplar IMHO'ya oldukça iyi olduğundan php dosyalarının render yerine indirilmesi sorununu çözmek için gereken adımları yazmıyorum.


Güzel açıklayıcı. Teşekkürler.
Jon

1
nginx bir web SUNUCUSU , tarayıcı değil, lütfen düzeltin.
Geeocode

8

Aynı sorunu yaşadım ve yanıtların hiçbiri sorunu çözmedi.

Koştum:

sudo nginx -t

yapılandırma dosyasını / etc / nginx / sites-available / default adresinde test etmek için.

Bana şu hataları verdi:

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

Ben de yapılandırma dosyasına girdim ve son satırda

#}

Yorum yapmadım, test komutunu tekrar çalıştırdım ve işe yaradı


Sorunu düzeltmek için bir tavsiyeye ek olarak test komutu sözdizimini eklemek hoş bir dokunuş.
greybeard

7

Bu benim için çalıştı.

1) MyApp dosyası

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

PHP5 kullanıcıları

Değişiklik

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

-e

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

2) cgi.fix_pathinfo'yu yapılandırın

Cgi.fix_pathinfo değerini 0 olarak ayarlayın

Yer:

PHP5 /etc/php5/fpm/php.ini

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


3) Hizmetleri yeniden başlatın

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; yanlış. /Var/run/php/php7.0-fpm.sock olmalıdır; ve belirli php sürümünü kurduğunuz her neyse, güncellemeniz gerekir, örneğin: /var/run/php/php7.2-fpm.sock;
VanAlbert

4

Benim için ?$query_string/index.php'nin sonuna aşağıdaki gibi eklemeye yardımcı oldu :

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

3

Önerilen yanıtlardan herhangi biri işe yaramıyorsa, şunu deneyin:

1. etc / php5 / fpm / pool içinde www.conf dosyasını düzeltin.d:

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

2. usr / local / nginx / conf içindeki nginx.conf dosyasını düzeltin:

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. etc / nginx / site-available içindeki varsayılan dosyayı düzeltin

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

4. nginx hizmetini yeniden başlatın

sudo hizmeti nginx yeniden başlat

5. php hizmetini yeniden başlatın

servis php5-fpm yeniden başlatma

6. keyfini çıkarın

/ Usr / share / nginx / html içinde herhangi bir php dosyası oluşturun ve "server_name / file_name.php" içinde çalıştırın (server_name yapılandırmanıza bağlıdır, normalde localhost'tur, file_name.php / usr / share / nginx içinde oluşturulan dosyanın adıdır. / html).

Ubuntu 14.04 kullanıyorum


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

Yukarıdaki parçacıklar php7.2 durumunda benim için çalıştı


2

Yukarıdaki cevap, ulaştığım çözüm için çok fazla yorum yapıyor gibiydi. Dosyam şöyle görünüyordu:

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

Umarım bu, bir pazar öğleden sonra hayal kırıklığına uğrayan bazı insanlara yardımcı olur (c:


1

PHP 7 ile aynı sorunu yaşayan herkes için, nginx'in php dosyalarını CentOS 7'de düzgün bir şekilde yürütmesini sağlamak için yaptığım şey buydu, burada yayınlanan ve aynı sorunu yaşayan biri olması durumunda:

  • Bu belgeyi Digital Ocean ile ilgili adım adım izleyin .

  • Açın /etc/nginx/conf.d/default.conf(varsayılan olarak, etkin sitelerim veya kullanılabilir sitelerim yok, buna göre düzenleme yapabilirsiniz).

  • locationParametreyi aşağıdaki gibi düzenleyin :

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;
}
  • Nginx ve PHP hizmetlerini yeniden başlatın sudo systemctl restart php-fpmve sudo systemctl restart nginx.

  • Son fakat en önemlisi, açık tarayıcı önbelleği veya çalışan incognito (Chrome)veya Private Browsing (Firefox)vs ...

Umarım bu yararlı ve mutlu kodlama


1

Benim çözümüm eklemek oldu

    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;

örneğin özel konfigürasyon dosyama etc/nginx/sites-available/example.com.conf

Öğesine eklemek /etc/nginx/sites-available/defaultbenim için işe yaramadı.


1

Kullanmadığım durumum /etc/nginx/sites-available/defaultfarklı bir sunucu bloğu yapılandırma dosyası (örneğin, example.com) kullanıyordum ve bu sorunu çözebilmemin tek yolu varsayılan sunucu bloğu yapılandırma dosyası sembolik bağlantısını kaldırmaktı:

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

sonra Nginx yeniden yükleniyor:

$ sudo systemctl reload nginx

1


Nginx yeniden yazma kurallarını aşağıdaki gibi değiştirdiğim suçlu, yeniden yazma kuralları olarak benim durumumda nihayet işe yaradı .

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

olur ...

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

Görünüşe göre son anahtar kelime olmadan istek yeniden başlatılmadı, bu nedenle hiçbir zaman .phpkonum segmentine ulaşmadı ve basitçe bir indirme olarak yorumlandı -


1

Sorunumu şimdi bu kodla çözdüm (IP'nizi değiştirin):

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

Ubuntu 16.04 ile benim için işe yarayan şey ve php7 bu satırı siliyordu

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

Bundan sonra php dosyalarını indirmeyi durdurdu.


0

/ Etc / nginx / sites-available / default içindeki .php konumunu kaldırın.

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

Başka bir şey size yardımcı olmazsa. Ve belki daha önce info.php test dosyasıyla apache2'yi kurmuştunuz. Localhost için Uygulama Verilerini (önbellek, çerez) temizlemeniz yeterlidir.


0

nginx yapılandırma dosya uzantınızın * .conf olduğunu kontrol edin.
örneğin: /etc/nginx/conf.d/myfoo.conf

Ben de aynı duruma sahibim. Yapılandırma dosyamı myfoo'dan myfoo.conf'a yeniden adlandırdıktan sonra düzeltildi. Yeniden adlandırdıktan sonra nginx'i yeniden başlatmayı unutmayın.


0

Önce Remove cachetarayıcınıza girmelisiniz

Ardından terminali açın ve aşağıdaki komutu çalıştırın:

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

Ardından, defaultdosyaya aşağıdaki kodu ekleyin :

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

Herhangi bir uyumsuzluk varsa sadece düzeltme yapın ve aşağıdaki komutla Nginx'i terminalden yeniden başlatın

sudo systemctl yeniden nginx

Ardından tarayıcıya gidin ve keyfini çıkarın ...


0

Benim için şu satırdı: fastcgi_pass unix: /var/run/php5-fpm.sock;

sadece şu olmalıydı: fastcgi_pass unix: /run/php5-fpm.sock;


0

Bunu düzeltmeye çalışırken zihinsel olmak üzereydim, benim için sorun Cloudflare'nin php dosyasını önbelleğe alması ve indirmeye devam etmesiydi.

Benim için düzeltme, Cloudflare'daki önbelleği temizlemekti.


belki bize nasıl olduğunu söylemek istersiniz?
Thorsten Staerk

0

Css yükleme sorunlarınız varsa, bu sunucu bloğunun diğer konum bloklarının üzerinde de bu bloğa sahip olmasıydı. Sitelerime sunulan conf dosyama ekledim.

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

bir kayıt için php-fpm'min çalışmadığını buldum ve bunu düzelttim service php7.2-fpm stop


0

Kontrol edilecek bir şey daha: PHP'yi kurmadan önce HTTPS erişimi ayarladıysanız - certbot kullandım - değişiklikleri / etc / nginx / sites-available / default içinde iki kez yapmanız gerekecek yapmanız gerekecek çünkü iki tane olacak sunucu blokları (biri 80 numaralı bağlantı noktasında dinleme ve 443 numaralı bağlantı noktasında dinleme).

(Bu sunucuyu öncelikle e-posta için kuruyordum ve nginx'i ilk kurduğumda, certbot'u daha kolay çalıştırmanın bir yolu olarak PHP'yi kullanmadım.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.