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

... Другие "местоположение" прокомментированы (#)


4
Да ... вы неправильно настроили PHP-FPM с Nginx. Это все , что мы можем сказать вам , хотя , так как вы не показываете нам любые из вашей конфигурации.
Брэд

какой файл вы хотите увидеть? Спасибо @Brad
Apeiron

К какому файлу (или файлам) вы добавляете свою конфигурацию. Соответствующая часть ... где вы устанавливаете PHP-FPM в вашей конфигурации Nginx.
Брэд

2
Примерно через час поиска в Google нашел этот askubuntu.com/a/601996/89455 - если у вас была плохая конфигурация, прежде чем пытаться очистить кеш - сработало здесь!
tm_lv

1
Смотрите аналогичный вопрос / ответ для PHP7 на stackoverflow.com/q/42664080/287948
Питер Краусс

Ответы:


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 неделю назад, поэтому я очень надеюсь помочь вам в этом. Я использую текстовый редактор Nano для редактирования файлов. запустите 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-enabled / default для запуска файлов php на 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;
    }
}

Что такое 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, если sock отсутствует, это означает, что процесс php запущен.
Жизме

1
@Pathros - Я обнаружил, что WordPress (в моем случае) имеет файлы конфигурации сервера в другой папке, и это были те, которые нужно было отредактировать/etc/nginx/conf.d/wordpress_https.conf
vsync

43

У меня была похожая проблема, которая была решена путем очистки кэша браузера (также отлично работал с другим браузером).


5
Я думаю, что перезагрузка и режим инкогнито помогли мне. Спасибо за тонну, что мы можем сделать.
Swapnil Mhaske

4
Большое спасибо. Вы спасли мой день) Также +1 за инкогнито!
Эдди

3
Это сделало это для меня, также после нескольких часов, пробуя много других предложенных решений.
Kleag

1
Мне было странно, что мой сайт работал на IE и Chrome, в то время как в Mozilla он загружал сайт из-за его выполнения. Это была ошибка в кеше Mozilla.
Виктор Жорас

3
Ты сэкономил мое время, братан.
Амир Кафтари

12

Обновите конфигурацию nginx / 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, как я могу решить эту проблему?
Кишор

Выше общая ссылка "полная деталь" не работает
Кишор

Что значит 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-файлов вместо рендеринга, так как остальные ответы ИМХО довольно хороши.


Хороший объяснитель. Спасибо.
Джон

1
nginx - это веб- сервер, а не браузер, пожалуйста, исправьте это.
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

Итак, я вошел в файл конфигурации и в последней строке было

#}

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


Приятно было бы добавить синтаксис команды test в дополнение к совету по устранению проблемы.
глиняный кувшин

7

Это сработало для меня.

1) файл 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;
      }
}

Пользователи 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;
ВанАльберт

4

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

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

3

Если какой-либо из предложенных ответов не работает, попробуйте это:

1.fix 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 restart

5.рестарт php сервис

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

6.Enjoy

Создайте любой php-файл в / usr / share / nginx / html и запустите в «имя_сервера / имя_файла.php» (имя_сервера зависит от вашей конфигурации, обычно это localhost, имя_файла.php - это имя файла, созданного в / usr / share / nginx / html).

Я использую Ubuntu 14.04


2

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

/ И т.д. / Nginx / сайты доступное / по умолчанию

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

Если что-то еще не поможет вам. А может быть, раньше вы установили apache2 с тестовым файлом info.php. Просто очистите данные приложения (кеш, cookie) для localhost.


0

проверьте расширение вашего файла конфигурации nginx * .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.