Nginx подає файли .php як завантаження, а не їх виконання


151

Я встановлюю веб-сайт у краплі (Digital Ocean). У мене є проблема з належним встановленням NGINX з PHP. Я зробив підручник https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04, але коли я намагаюся запустити деякі .php-файл, він просто завантажує його ... наприклад ... http://5.101.99.123/info.phpпрацює, але ... Якщо я перейду до основного http://5.101.99.123, завантажую свій index.php: /

Будь-яка ідея?

-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 / доступний / за замовчуванням сайтів

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
            }

... Коментуються інші "місцезнаходження" (#)


4
Так ... ви правильно не налаштували PHP-FPM з Nginx. Це все, що ми можемо вам сказати, хоча ви не показали нам жодної своєї конфігурації.
Бред

який файл ви хочете побачити? Дякуємо @Brad
Apeiron

У який би файл (або файли) ви не вставили конфігурацію. Відповідною частиною є ... де ви налаштовуєте PHP-FPM у своєму конфігурації Nginx.
Бред

2
приблизно через годину googling знайшов це askubuntu.com/a/601996/89455 - якщо у вас була погана конфігурація, перш ніж спробувати очистити кеш - тут працювали!
tm_lv

1
Див аналогічне питання / відповідь для PHP7 на stackoverflow.com/q/42664080/287948
Пітер Krauss

Відповіді:


131

Спробуйте це:

  1. Редагувати /etc/nginx/sites-available/default

  2. Відкоментуйте обидві лінії прослуховування, щоб змусити nginx прослуховувати порт 80 IPv4 та IPv6.

    listen   80; ## listen for ipv4; this line is default and implied
    listen   [::]:80 default_server ipv6only=on; ## listen for ipv6
    
  3. Залиште в server_nameспокої

    # Make site accessible (...)
    server_name localhost;
    
  4. Додайте index.phpдо indexрядка

    root /usr/share/nginx/www;
    index index.php index.html index.htm;
    
  5. Відмінність 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. Відредагуйте /etc/php5/fpm/php.iniта переконайтеся, що cgi.fix_pathinfoвстановлено значення0

  7. Перезавантажте nginx та php5-fpm sudo service nginx restart && sudo service php5-fpm restart


Я щойно почав використовувати Linux тиждень тому, тому дуже сподіваюся допомогти вам у цьому. Я використовую наноредактор тексту для редагування файлів. запустіть apt-get install nano, якщо у вас його немає. Google про це, щоб знати більше.


14
service nginx restart && service php5-fpm restart
Герцог

8
nginx -s reload
Герцог

2
з PHP7-fpm є: сервіс php7.0-fpm перезапуск
Алекс

1
@Joy, спробував вашу пропозицію, але це не вийшло. Довелося використовувати fastcgi_pass unix: /run/php/php7.0-fpm.sock;
jdstaerk

1
Для php7.2: unix:/var/run/php5-fpm.sock;конвертувати в unix:/var/run/php/php7.2-fpm.sock;(ще одне гніздування /php)
Олег Рейм

50

Вам потрібно додати це до / etc / nginx / sites-enable / default для виконання файлів php на сервері 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;
    }
}

Що таке SCRIPT_FILENAME?
mp3por

2
Якщо ви використовуєте PHP 7.0, то це правильно:fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Ендрю Фокс

1
@ AndrewFox - моє ім'я файлу є, php7.0-fpm.pidа не php7.0-fpm.sockв /var/run/php/ тому, що це означає?
vsync

@vsync спробуйте. sudo service php7.0-fpm restart. якщо шкарпетка відсутня, це вказує на те, що запускається процес php.
zhisme

1
@Pathros - Я виявив, що wordpress (у моєму випадку) має файли конфігурації сервера в іншій папці, і це були ті, які потрібно було відредагувати/etc/nginx/conf.d/wordpress_https.conf
vsync

43

У мене була подібна проблема, яку було вирішено випорожненням кешу браузера (також добре працював з різним браузером).


5
Я думаю, що перезапуск та анонімний режим допомогли мені. Подякуємо тону за ноббі, що ми можемо зробити.
Swapnil Mhaske

4
Дуже дякую. Ви врятували мій день) Також +1 для анонімного!
Едді

3
Це зробило це для мене, а також через години, які намагалися запропонувати багато інших рішень.
Kleag

1
Мені було дивно, що мій сайт працював над IE та chrome, тоді як у Мозіллі він знижував сайт його виконання. Це була помилка кеша Мозілла.
Віктор Джорас

3
Ти врятував мій час брате.
Амір Кафтарі

12

Оновіть nginx config / etc / nginx / sites-available / default або ваш конфігураційний файл

якщо ви використовуєте php7, використовуйте це

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

якщо ви використовуєте php5, використовуйте це

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

Відвідайте тут, щоб отримати детальну деталь тут


Я спробував, що це не спрацювало для мене, я використовую ubuntu 14.04 та php 7.0, як я можу виправити цю проблему?
Кішор

вище спільного посилання "повна деталь" порушена
Kishore

Що означає include snippets/fastcgi-php.conf;?
Тимо

9

Я бачу багато рішень вище, і багато працювали правильно для мене, але я не розумів, що вони роблять, і хвилювався просто скопіювати вставлення коду, зокрема, fastcgi . Отже, ось мої 2 копійки,

  1. nginx - це веб-сервер (а не сервер додатків ), тому він може обслуговувати лише статичні сторінки.
  2. щоразу, ми намагаємося рендерировать / повернути .php-файл, наприклад, index.php, nginx не знає, що робити, оскільки він просто не може зрозуміти .php- файл (або для цього будь-яке розширення, крім кількох вибраних наприклад, .html, .js тощо, які є статичними файлами)
  3. Таким чином, для запуску інших видів файлів нам потрібно щось, що сидить між nginx та програмою (тут програма php). Тут використовується загальний інтерфейс шлюзу (CGI). Це програмне забезпечення, яке керує цим зв’язком. CGI можуть бути реалізовані на будь-якій можливій мові Python (uWSGI), PHP (FPM) і навіть C. FastCGI - це в основному оновлена ​​версія CGI, що набагато набагато швидше, ніж CGI.

Для деяких серверів, таких як Apache, існує вбудована підтримка для інтерпретації PHP, і тому CGI не потребує.

Це цифрове посилання на океан пояснює кроки, щоб досить добре встановити FPM, і я не пишу кроків, необхідних для вирішення проблеми завантаження файлів PHP, а не для надання, оскільки інші відповіді IMHO досить добре.


Гарний пояснювач. Дякую.
Джон

1
Nginx є веб - SERVER НЕ браузер, будь ласка , виправити її.
Geeocode

8

У мене було те саме питання, і жодна з відповідей не вирішила проблему.

Я побіг:

sudo nginx -t

перевірити конфігураційний файл за адресою / etc / nginx / sites-available / default.

Це дало мені ці помилки:

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

Тож я зайшов у конфігураційний файл і в останньому рядку був

#}

Я зауважив, знову запустив тестову команду, і вона спрацювала


Приємний дотик, щоб включити синтаксис тесту-команди на додаток до поради щодо вирішення проблеми.
сіра борода

7

Це спрацювало для мене.

1) Файл MyApp

vi / тощо / nginx / доступні сайти / 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

Зміна

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

до

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

2) Налаштуйте cgi.fix_pathinfo

Встановіть cgi.fix_pathinfo на 0

Розташування:

PHP5 /etc/php5/fpm/php.ini

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


3) Перезапустити послуги

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; невірно. Це має бути /var/run/php/php7.0-fpm.sock; і вам потрібно оновити вказану версію php за допомогою будь-якої інстальованої програми, наприклад: /var/run/php/php7.2-fpm.sock;
VanAlbert

4

Для мене це допомогло додати ?$query_stringв кінці /index.php, як нижче:

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

3

Якщо будь-який із запропонованих відповідей не працює, спробуйте:

1. виправлення www.conf в etc / php5 / fpm / pool.d:

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

2. виправити nginx.conf у 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. виправити файл за замовчуванням у etc / nginx / site-available

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

4.перезапустити сервіс nginx

sudo service nginx перезапуск

5.перезапустити сервіс php

перезапуск служби php5-fpm

6.насолоджуйтесь

Створіть будь-який файл php у / usr / share / nginx / html та запустіть у "server_name / file_name.php" (ім'я сервера залежить від вашого конфігурації, нормально - localhost, file_name.php - це ім'я файлу, створеного в / usr / share / nginx / html).

Я використовую Ubuntu 14.04


2

Відповідь вище, здавалося, занадто сильно коментує рішення, до якого я дійшов. Ось так виглядав мій файл:

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

Сподіваюся, це допомагає деяким людям, які розчаруються в неділю вдень (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;
    }
}

Наведені вище фрагменти працювали для мене у випадку php7.2


1

Для тих, хто має таку ж проблему з PHP 7, це я зробив, щоб nginx належним чином виконав файли php у CentOS 7, розміщені тут, щоб у когось була така ж проблема:

  • Дотримуйтесь покрокового цього документа в Digital Ocean .

  • Відкрийте /etc/nginx/conf.d/default.conf(за замовчуванням у мене немає сайтів, які не ввімкнуті і не доступні, ви можете редагувати їх відповідно).

  • Відредагуйте locationпараметр, як показано нижче:

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 та PHP sudo systemctl restart php-fpmта sudo systemctl restart nginx.

  • Останнє, але найважливіше, чіткий кеш браузера або запуск у incognito (Chrome)або Private Browsing (Firefox)тощо.

Сподіваюся, що це корисне та щасливе кодування


1

Моє рішення було додати

    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;

наприклад, у мій спеціальний файл конфігурації etc/nginx/sites-available/example.com.conf

Додавання до /etc/nginx/sites-available/defaultмене не працювало.


1

У моєму випадку я не використовував, /etc/nginx/sites-available/defaultя використовував інший файл конфігурації блоку сервера (наприклад, example.com), і єдиний спосіб мені вдалося виправити цю проблему - видалення символьного посилання файлу конфігураційного блоку сервера за замовчуванням:

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

потім перезавантажте Nginx:

$ sudo systemctl reload nginx

1

Тепер я вирішив свою проблему з цим кодом (змінити 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

Що працювало для мене з Ubuntu 16.04, а php7 видаляв цей рядок

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

Завантаження файлів PHP припинено після цього.


0

Не коментуйте розташування .php у / etc / nginx / sites-available / default

sudo vi / etc / nginx / доступні сайти / за замовчуванням:

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

Якщо щось інше вам не допоможе. І, можливо, раніше ви встановили apache2 з тестовим файлом info.php. Просто очистіть дані додатків (кеш, cookie) для localhost.


0

перевірте розширення файлу nginx config * .conf.
наприклад: /etc/nginx/conf.d/myfoo.conf

У мене така ж ситуація. Після того як я перейменував свій конфігураційний файл з myfoo на myfoo.conf, він виправлений. Не забудьте перезапустити nginx після перейменування.


0

Спочатку потрібно Remove cacheу своєму браузері

Потім відкрийте термінал і запустіть таку команду:

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

Потім додайте у defaultфайл такий код :

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

Якщо будь-яка невідповідність, просто виправте і перезапустіть Nginx з терміналу за допомогою наступної команди

sudo systemctl перезапустити nginx

Потім перейдіть до браузера і насолоджуйтесь ...


0

Для мене це був рядок: fastcgi_pass unix: /var/run/php5-fpm.sock;

який повинен був бути просто: fastcgi_pass unix: /run/php5-fpm.sock;


0

Я збирався задуматися, намагаючись виправити це, для мене проблема полягала в тому, що Cloudflare кешував файл php і продовжував змушувати його завантажувати.

Виправленням для мене було очищення кеша на Cloudflare.


можливо, ви хочете сказати нам, як?
Торстен Стаерк

0

У мене була така ж проблема, що і вирішено, це цей серверний блок також має цей блок над іншими блоками розташування, якщо у вас CSS не завантажує проблеми. Що я додав у доступний для моїх сайтів конф-файл.

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

Тож ось що, нарешті, спрацювало в моєму випадку як переписати правила, де винуватцем
я змінив правила перезапису в nginx наступним чином.

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

стає ...

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

Мабуть, без останнього ключового слова запит не було перезапущено, тому він ніколи не потрапляв у .phpсегмент локації, а просто інтерпретувався як завантаження -


0

для запису я виявив, що мій php-fpm не працює, і я його виправив service php7.2-fpm stop


0

Ще одна річ, щоб перевірити: якщо ви налаштували доступ HTTPS перед налаштуванням PHP - я використовував certbot - вам потрібно буде внести зміни в / etc / nginx / sites-available / default за два рази, тому що буде два серверні блоки (одне прослуховування на порту 80 і одне прослуховування на порту 443).

(Я налаштовував цей сервер в основному для електронної пошти і не використовував PHP, коли я вперше встановив nginx просто як спосіб легше запустити certbot.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.