Я недавно установил Apache 2.4 на свою локальную машину вместе с PHP 5.4.8, используя PHP-FPM.
Все прошло довольно гладко (через некоторое время ...), но все еще есть странная ошибка:
Я настроил Apache для PHP-FPM следующим образом:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1
</VirtualHost>
Это работает, например, если я звоню, http://localhost/info.php
я получаю правильный phpinfo()
(это просто тестовый файл).
Однако, если я вызываю каталог, я получаю 404 с телом File not found.
и в журнале ошибок:
[Tue Nov 20 21:27:25.191625 2012] [proxy_fcgi:error] [pid 28997] [client ::1:57204] AH01071: Got error 'Primary script unknown\n'
Обновить
Теперь я попытался сделать проксирование с помощью mod_rewrite:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>
Но проблема в том, что он всегда перенаправляет, потому что http://localhost/
автоматически http://localhost/index.php
запрашивается, потому что
DirectoryIndex index.php index.html
Обновление 2
Хорошо, я думаю, что «возможно, сначала проверьте, есть ли файл, который нужно передать прокси-серверу:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>
Теперь полное переписывание больше не работает ...
Обновление 3
Теперь у меня есть это решение:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
RewriteEngine on
RewriteCond /Users/apfelbox/WebServer/%{REQUEST_FILENAME} -f
RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>
Сначала проверьте, есть ли файл для передачи в PHP-FPM (с полным и абсолютным путем), а затем выполните перезапись.
Это не работает при использовании перезаписи URL внутри подкаталога, а также не работает для таких URL, как http://localhost/index.php/test/
So обратно на квадрат.
Любые идеи?
источник
config.php
файлы в обычном виде, если они находятся в каталогах с псевдонимами и, следовательно, не существуют в% {DOCUMENT_ROOT} /% {REQUEST_URI}.Я столкнулся и с этой проблемой вчера - Apache 2.4 перешел из Debian / экспериментальный в Debian / нестабильный, заставив меня заняться этим новым делом; не на наших производственных серверах конечно;).
После прочтения того, что кажется миллионами сайтов, документов Apache, отчетов об ошибках и отладочных выводов в журнале ошибок, я наконец-то начал работать. Нет, пока нет поддержки FPM с сокетами . Конфигурация Debian по умолчанию уже давно использует сокеты, поэтому пользователям Debian это тоже придется изменить.
Вот что работает для сайта CakePHP и PHPMyAdmin (последний нуждается в некоторой настройке, если вы используете пакеты Debian), поэтому я могу подтвердить, что
mod_rewrite
все еще работает, как и ожидалось, для фантастической перезаписи URL.Обратите внимание
DirectoryIndex index.php
, что это может быть причиной того, что ни один из ваших конфигов не работал для «папок» (по крайней мере, это то, что здесь не работает).Я все еще получаю
File not found.
каталоги, но только если нет индексного файла, он может разобрать. Хотелось бы избавиться и от этого, но это не так критично, как сейчас.Вышеупомянутый vhost прекрасно работает с .htaccess в корне следующим образом:
Я не совсем понимаю, что вы подразумеваете под
URL rewriting inside a subdirectory
(я переписываю только в index.php рута).(О, и вам нужно убедиться, что Xdebug не конфликтует с FPM в вашей системе, из коробки они хотят использовать те же порты.)
источник
DirectoryIndex index.html
в рассматриваемом vhost исправило это. Если даDirectoryIndex index.php
, то, похоже, другие PHP-файлы в итоге выдают ошибку «Файл не найден» и «Основной сценарий неизвестен». В моем случае у меня есть,index.html
но файл phptest.php
.Все, что вам нужно сделать, это установить:
И не забудьте установить страницу клиента с помощью:
источник
Это то, что у меня есть. Кажется, работает нормально. Я поместил Drupal в подкаталог, и он переписывает работу, индексы каталогов работают, и PATH_INFO работает.
Я пытался сделать что-то подобное без переписывания («Если» и тому подобное), но я не мог заставить что-либо работать.
РЕДАКТИРОВАТЬ: Обратите внимание, что если вы собираетесь реализовать это в качестве поставщика общего хостинга, это может быть проблемой безопасности. Это позволит пользователям передавать PHP-скрипты произвольному fcgi-прокси. Если бы у вас был отдельный пул для каждого пользователя, это позволило бы атаковать с повышением привилегий.
источник
Еще одно решение (требуется Apache> = 2.4.10) - внутри vhost:
Поэтому здесь, обработчик fcgi для PHP будет установлен, только если файл существует и если его имя совпадает с расширением файла PHP.
Кстати: для тех, кто хотел бы установить ProxyErrorOverride на On , имейте в виду , что это действительно плохая идея. Использование этой директивы не без каких-либо проблем. Например, любое приложение PHP, отправляющее код HTTP, такой как 503, может привести к неожиданному результату. Обработчик ошибок по умолчанию будет задействован в любых случаях и для приложений PHP, которые предоставляют API, это действительно плохое поведение.
источник
Лучший способ решить эту проблему - включить журналы отладки для mod_proxy, mod_rewrite и php-fpm. В apache 2.4 теперь вы можете включить журналы отладки только для определенных модулей. http://httpd.apache.org/docs/current/mod/core.html#loglevel Конфигурация для каждого модуля и для каждого каталога доступна в Apache HTTP Server 2.3.6 и более поздних версиях.
Может быть, вы получаете двойной удар по каталогам?
Вот что я использую, и это прекрасно работает:
источник
Одна вещь, с которой я столкнулся при решении этой проблемы, заключается в том, что если вы используете комбинацию:
В конфигурации пула fpm не указывайте полный путь к
ProxyPass
директиве.Но, ТОЛЬКО, если пул на этом порте хромирован.
источник
Я не уверен, что проблема связана, но я нашел частично работающее решение здесь:
/programming/44054617/mod-rewrite-in-2-4-25-triggering-fcgi-primary-script-unknown-error-in-php-fpm
Уловка, кажется, добавляет? char в .htaccess RewriteRule, например, используя:
вместо того:
Похоже, источником проблемы является изменение в mod_rewrite в Apache 2.4.25. Я использовал уровень журнала Apache trace1 для наблюдения за «циклом», который передает $ 1 в php-fpm после того, как index.php / $ 1 был пройден. $ 1 генерирует ошибку «AH01071: Ошибка получена:« Основной сценарий неизвестен \ n »».
Надеюсь, этот маленький кусочек поможет кому-то решить свои проблемы.
источник
Линоде имеет большой учебник на эту тему
В основном вы устанавливаете обработчик для всего сервера, который будет перехватывать любые php-скрипты и передавать их в fast-cgi.
источник
у меня ошибка также после перехода на php-fpm + apache 2.4.6 для экземпляров drupal
но я использую мод события mpm
просто вставьте
DirectoryIndex index.php
работает для менятогда мои настройки Vhost выглядят как ниже
Благодарность
нет необходимости пересматривать файл .htaccess по умолчанию для drupal
источник
Я сталкиваюсь с такими же проблемами на моем сервере (Centos 7.3.16 Docker). После отслеживания журнала php-fpm я обнаружил пропущенную системную библиотеку.
WARNING: [pool www] child 15081 said into stderr: "php-fpm: pool www: symbol lookup error: /lib64/libnsssysinit.so: undefined symbol: PR_GetEnvSecure"
затем я перезагружаю nspr, он работает. Если вы не можете найти решения после попытки каких-либо методов, вы можете попробовать это.yum -y install/reinstall nspr
источник
Это работает с Wordpress 5.1.1 и новее вместе с PHP 7.3, FastCGI, прокси, а также MariaDB / MySQL. Проверено дважды на моих серверах. Работает как шарм.
Сначала на CentOS / Fedora / Red Hat
Отредактируйте этот файл:
Вставьте это:
Должен дать srw-rw-rw-.
Или как настроить на Debian / Ubuntu
Руководство:
источник: https://emi.is/?page=articles&article=php-7-installation-and-configuration-for-apache-2.4-using-php-fpm-(debian,-repository)
Проблема в том, что php 7.3 из репозитория Ondrej работает только в режиме mpm_prefork. У него есть git repo, так что вы можете найти его в сети и спросить его, сделает ли он php 7.3 для mpm_worker и mpm_event. Остальная конфигурация для дистрибутивов семейства Debian приведена ниже:
вставить
вставить
вставить
скопируйте это в текстовый файл:
удалите его, а затем вставьте вместо этого:
Добавить директиву
Затем включите сайт:
Затем отредактируйте сайт SSL (в данном случае certbot из Let's Encrypt был установлен и настроен ранее в начале настройки SSL-сертификата).
Не забудьте добавить порт 9000 в брандмауэр в Debian / Ubuntu
On CentoOS / Fedora / Red Hat
источник