Я нашел здесь похожий вопрос: Nginx обслуживает файлы .php как загрузки, а не выполняет их Но, к сожалению, ответ мне не помогает. Итак, вот моя история.
Что работает
Когда я перехожу к 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
RC-статус
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
Файлы конфигурации
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
Я установил curl на свой компьютер и попытался сделать это:
lab-1:/etc/php7# curl http://10.11.11.1111/widgets/info.php
<?php
phpinfo();
?>
против этого:
lab-1:/etc/php7# curl http://widgets/index.html
curl: (6) Could not resolve host: widgets
Но я не совсем знаю, как это исправить. Я хочу, чтобы система всегда требовала, чтобы был указан IP-адрес, а затем имя папки / приложения.
Ok. какой лучше подходит? Я переставлю ...
Прочтите каждое из описаний и решайте сами. superuser.com/help/on-topic и serverfault.com/help/on-topic
Посмотрите документацию по название сервера. server_name widgets;
создает виртуальный сервер, называемый виджетами, поэтому он будет ожидать HTTP-запрос, адресованный на этом сервере.
С myipaddress/widgets/info.php
вы отправите запрос на сервер, помеченный как «default_server» (поскольку он адресован через его IP-адрес, а не через имя), в вашем случае это значение по умолчанию, которое не поддерживает php.
Вы можете обойти это, поместив поддержку php в блок по умолчанию, но, на мой взгляд, это просто маскирует сомнительную конфигурацию.
Итак, на основе вашего редактирования, я предполагаю, что вы хотите, чтобы сервер обслуживал php-страницы на IP-адресе, вы захотите добавить блок местоположения из своих виджетов. conf в блок конфигурации сервера по умолчанию (выше location /
, иначе он перехватит все запросы для файлов php, как он определен первым)
location ~* \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi.conf;
include /etc/nginx/fastcgi_params;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
}
а файлы для виджетов положить в /var/www/localhost/widgets
. Таким образом, они будут обслуживаться как http://ipaddress/widgets/filename.php
.
Однако обратите внимание, что этот следует рассматривать как временное решение. Обслуживание IP-адреса чрезвычайно ограничено и, среди прочего, не позволит вам правильно настроить веб-сайт https. Но, чтобы начать работать в dev, это должно помочь.
Я попытался поиграть с именем сервера, но не смог понять / увидеть проблему. Я обновлю свой пост, чтобы показать вам. Но если я хотел получить доступ к сайту, как это делалось в примерах, которые я привел, как мне нужно изменить значение server_name? Также можете ли вы объяснить, почему система правильно возвращает правильный index.html, если имя сервера неправильное?
см. РЕДАКТИРОВАТЬ 1. Я думаю, это демонстрирует то, что вы пытаетесь объяснить? Я могу воссоздать проблему, но не знаю, как ее исправить. Я уже пробовал несколько разных вещей
Основываясь на подсказке о том, что widgets.conf, возможно, вообще не читается), я просто добавил еще один раздел местоположения в default.conf. И это решило проблему с интерпретацией файлов php.
Мне нужно будет прочитать, как решить эту проблему в будущих случаях. В идеале я хотел бы иметь отдельные файлы conf для каждого приложения на лабораторных серверах ... без привязки DNS-имени к IP-адресу, потому что на самом деле этого не произойдет в лаборатории.
default 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;
}
}
Это был бы лучший вопрос для superuser.com или serverfault.com