nginx загружает php файлы вместо их рендеринга

Я нашел подобный вопрос здесь: https://stackoverflow.com/questions/25591040/nginx-serves-php-files-as-downloads-instead-of-executing-them Но, к сожалению, ответ там не помогает мне. Итак, моя история.

Что работает

Когда я перехожу к myipaddress / index.html, страница приветствия nginx отображается правильно. Когда я перехожу к myipaddress / widgets / index.html, страница приветствия nginx отображается правильно. NB. Я немного изменил этот index.html из приведенного выше, поэтому приветственное сообщение отличается. Таким образом, я докажу себе, что он действительно находит две разные структуры файла / папки index.html.

Что не работает

Когда я перехожу к myipaddress / widgets / info.php, вместо того, чтобы показывать детали команды phpinfo(), она загружает файл php.

Установленные пакеты

Я бегу alpinelinux. Установлены следующие пакеты:

lab-1:/var/www/localhost/htdocs# cat /etc/apk/world
curl
nginx
php7-common
php7-fpm

Версия Nginx

lab-1:/etc/php7# nginx -v
nginx version: nginx/1.14.0

гс-статус

lab-1:/var/www/localhost/htdocs# rc-status
Dynamic Runlevel: manual
 nginx        [  started  ]
 php-fpm7     [  started  ]

Структура папок

lab-1:/var/www/localhost/htdocs# ls -lah
total 16
drwxr-xr-x    3 www      www         4.0K Sep 13 14:22 .
drwxr-xr-x    3 www      www         4.0K Sep 13 13:17 ..
-rw-r--r--    1 www      www          624 Sep 12 20:35 index.html
drwxr-xr-x    2 www      www         4.0K Sep 13 17:40 widgets


lab-1:/var/www/localhost/htdocs# ls -lah widgets/
total 16
drwxr-xr-x    2 www      www         4.0K Sep 13 17:40 .
drwxr-xr-x    3 www      www         4.0K Sep 13 14:22 ..
-rw-r--r--    1 root     root         632 Sep 13 14:23 index.html
-rwxr-xr-x    1 www      www           27 Sep 13 15:45 info.php

Конфигурационные файлы

ПРИМЕЧАНИЕ: установка nginx помещает и fastcgi.conf, и fastcgi_params в папку... они выглядят довольно похоже. Я играл вокруг и включал оба.

netstat, чтобы доказать, что php fpm работает

lab-1:/etc/php7# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      4268/php-fpm.conf)
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      4323/nginx.conf
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      346/sshd
tcp        0      0 :::80                   :::*                    LISTEN      4323/nginx.conf
tcp        0      0 :::22                   :::*                    LISTEN      346/sshd

пс -А

4268 root      0:00 {php-fpm7} php-fpm: master process (/etc/php7/php-fpm.conf)
4275 nginx     0:00 {php-fpm7} php-fpm: pool www
4276 nginx     0:00 {php-fpm7} php-fpm: pool www
4323 root      0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
4324 nginx     0:00 nginx: worker process
4325 nginx     0:00 nginx: worker process
4326 nginx     0:00 nginx: worker process
4328 nginx     0:00 nginx: worker process
4329 nginx     0:00 nginx: worker process
4330 nginx     0:00 nginx: worker process
4331 nginx     0:00 nginx: worker process
4332 nginx     0:00 nginx: worker process

Комментарии

Я попытался убедиться, что владельцем прослушивания и группой прослушивания является тот же пользователь, с которым работает nginx, то есть "nginx". Также я знаю, что использование "127.0.0.1:9000" не так хорошо, как использование сокета Unix. Но сейчас я пытаюсь использовать параметры установки по умолчанию для php7-fpm. (По правде говоря, я тоже не знаю, как это изменить)

Вопросы

  1. ты видишь, где я ошибся?
  2. Доказывает ли тот факт, что он загружает php-файл, что он находит директиву location в нужном conf-файле? Итак, проблема ограничена содержимым моей директивы location{} в файле widgets.conf?
  3. Как только я исправлю проблему с php, если в моем наборе есть действительно огромные ошибки, которые вы можете увидеть, можете ли вы указать на них? Благодарю.

3 ответа

Решение

Основываясь на подсказке из комментариев Романа Спиака (о том, что widgets.conf, возможно, вообще не читается), я просто добавил еще одну локацию в default.conf. И это решило проблему с интерпретацией файлов php.

Я должен прочитать о том, как решить эту проблему для будущих случаев. В идеале я хотел бы иметь возможность иметь отдельные файлы conf для каждого приложения на лабораторных серверах... без привязки DNS-имени к IP-адресу, потому что реально этого не произойдет для лаборатории.

conf по умолчанию теперь выглядит следующим образом: (без изменений в базовой структуре папок)

location / {
    root /var/www/localhost/htdocs;
    location ~* \.php$ {
        if (!-f $document_root$fastcgi_script_name) { return 404; }
        include /etc/nginx/fastcgi.conf;
        include /etc/nginx/fastcgi_params;
        fastcgi_index index.php;
        fastcgi_pass 127.0.0.1:9000;
       }
}

Я не использовал "alpine linux", поэтому, пожалуйста, проверьте, загружены ли оба ваших файла cofig.

Например, поместите синтаксическую ошибку в конфигурацию и запустите nginx -t если это ловит

Старайтесь избегать размещения корневого каталога в одной конфигурации в подкаталоге другой конфигурации.

Попробуйте разместить их:

  • root /var/www/localhost; за /etc/nginx/conf.d/default.conf
  • root /var/www/widgets; за /etc/nginx/conf.d/widgets.conf

Пожалуйста, знайте, что server_name директива должна быть разрешаемой записью DNS или хостов (в /etc/hosts), чтобы серверный блок обслуживался должным образом.

Для вашей второй части вопроса попробуйте посмотреть на https://linuxconfig.org/basic-php-7-and-nginx-configuration-on-ubuntu-16-04-linux

Мой совет - попытаться прочитать директивы конфигурации nginx, чтобы понять, что они значат.

По ссылке alexus замените try_files на

if (!-f $document_root$fastcgi_script_name) { return 404; }
Другие вопросы по тегам