Niedawno zainstalowałem Apache 2.4 na moim komputerze lokalnym, wraz z PHP 5.4.8, używając PHP-FPM.
Wszystko poszło dość płynnie (po chwili ...), ale nadal występuje dziwny błąd:
Skonfigurowałem Apache dla PHP-FPM w następujący sposób:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1
</VirtualHost>
Działa, na przykład, jeśli zadzwonię http://localhost/info.php
, otrzymam prawidłowy phpinfo()
(to tylko plik testowy).
Jeśli jednak wywołam katalog, otrzymam 404 z treścią File not found.
i dziennikiem błędów:
[Tue Nov 20 21:27:25.191625 2012] [proxy_fcgi:error] [pid 28997] [client ::1:57204] AH01071: Got error 'Primary script unknown\n'
Aktualizacja
Próbowałem teraz wykonać proxy z 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>
Ale problem polega na tym, że zawsze przekierowuje, ponieważ http://localhost/
automatycznie http://localhost/index.php
jest wymagane, z powodu
DirectoryIndex index.php index.html
Aktualizacja 2
Ok, więc myślę, że „może najpierw sprawdź, czy jest plik, który należy przekazać proxy:
<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>
Teraz kompletne przepisywanie już nie działa ...
Aktualizacja 3
Teraz mam to rozwiązanie:
<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>
Najpierw sprawdź, czy istnieje plik do przekazania do PHP-FPM (z pełną i bezwzględną ścieżką), a następnie przeredaguj.
To nie działa, gdy używasz przepisywania adresów URL w podkatalogu, a także nie działa w przypadku adresów URL typu http://localhost/index.php/test/
So z powrotem do kwadratu.
Jakieś pomysły?
źródło
config.php
pliki w zwykły sposób, jeśli znajdują się one w katalogach Alias, a zatem nie istnieją w% {DOCUMENT_ROOT} /% {REQUEST_URI}.Wczoraj również natknąłem się na ten problem - Apache 2.4 przeniósł się z Debiana / eksperymentalnego do Debiana / niestabilnego, zmuszając mnie do radzenia sobie z tymi nowymi sprawami; oczywiście nie na naszych serwerach produkcyjnych;).
Po przeczytaniu czegoś, co wydaje się być milionami witryn, dokumentów Apache, raportów o błędach i wyników debugowania w dzienniku błędów, w końcu udało mi się go uruchomić. Nie, jeszcze nie ma wsparcia dla FPM z gniazdami . Domyślna konfiguracja Debiana używa już gniazd, więc użytkownicy Debiana również będą musieli to zmienić.
Oto, co działa dla strony CakePHP i PHPMyAdmin (ten drugi wymaga trochę konfiguracji, jeśli używasz pakietów Debiana), więc mogę potwierdzić, że
mod_rewrite
nadal działa zgodnie z oczekiwaniami, aby zrobić fantazyjne przepisywanie adresów URL.Zauważ
DirectoryIndex index.php
, że może to być powód, dla którego żadna z twoich konfiguracji nie działała dla „folderów” (przynajmniej to tutaj nie działało).Nadal dostaję
File not found.
katalogi, ale tylko wtedy, gdy nie ma pliku indeksu, można go przeanalizować. Chciałbym się tego także pozbyć, ale na razie nie jest to tak ważne.Powyższy vhost działa doskonale z .htaccess w katalogu głównym w następujący sposób:
Nie do końca rozumiem, co masz na myśli
URL rewriting inside a subdirectory
(przepisuję tylko do pliku root.php roota).(Och, musisz się upewnić, że Xdebug nie będzie w konflikcie z FPM w twoim systemie, po wyjęciu z pudełka chcą używać tych samych portów).
źródło
DirectoryIndex index.html
w vhostie, o którym mowa, naprawiło to. Jeśli takDirectoryIndex index.php
, wydaje się, że inne pliki PHP kończą się błędem „Nie znaleziono pliku” i „Podstawowy skrypt nieznany”. W moim przypadku mamindex.html
plik phptest.php
.Wszystko, co musisz zrobić, to ustawić:
I nie zapomnij ustawić strony klienta przez:
źródło
Oto co mam. Wygląda na to, że działa OK. Umieszczam Drupala w podkatalogu, a jego przepisywanie działa, indeksy katalogów i PATH_INFO.
Próbowałem zrobić coś takiego bez przepisywania („Jeśli” i tak dalej), ale nie mogłem nic zrobić.
EDYCJA: Pamiętaj, że jeśli zaimplementujesz to jako dostawca hostingu współdzielonego, może to być problem z bezpieczeństwem. Pozwoliłoby to użytkownikom przekazywać skrypty PHP do dowolnego serwera proxy fcgi. Jeśli miałbyś oddzielną pulę dla każdego użytkownika, pozwoliłoby to na podniesienie uprawnień do ataków.
źródło
Jeszcze inne rozwiązanie (wymaga Apache> = 2.4.10) - Wewnątrz vhosta:
Zatem tutaj program obsługi fcgi dla PHP zostanie ustawiony tylko wtedy, gdy plik istnieje i jeśli jego nazwa jest zgodna z rozszerzeniem PHP.
BTW: Dla tych, którzy mieliby pomysł ustawić ProxyErrorOverride na On , pamiętaj, że to naprawdę zły pomysł. Stosowanie tej dyrektywy nie jest pozbawione jakichkolwiek problemów. Na przykład, każda aplikacja PHP wysyłająca kod HTTP, taka jak 503, doprowadziłaby do nieoczekiwanego wyniku. Domyślna obsługa błędów byłaby zaangażowana w każdym przypadku, a dla aplikacji PHP, które zapewniają API, jest to naprawdę złe zachowanie.
źródło
Najlepszym sposobem na rozwiązanie tego problemu jest włączenie dzienników debugowania dla mod_proxy i mod_rewrite i php-fpm. W Apache 2.4 możesz teraz włączać dzienniki debugowania tylko dla określonych modułów. http://httpd.apache.org/docs/current/mod/core.html#loglevel Konfiguracja na moduł i na katalog jest dostępna w serwerze Apache HTTP Server 2.3.6 i nowszych
Może masz podwójne cięcie na katalogi?
Oto, czego używam i działa dobrze:
źródło
Jedną z rzeczy, na które natrafiłem podczas rozwiązywania tego problemu, jest to, że jeśli użyjesz kombinacji:
W konfiguracji puli fpm nie podawaj pełnej ścieżki do
ProxyPass
dyrektywy.Ale-TYLKO- jeśli pula w tym porcie jest chrootowana.
źródło
Nie jestem pewien, czy problem jest związany, ale znalazłem tu częściowo działające rozwiązanie:
https://stackoverflow.com/questions/44054617/mod-rewrite-in-2-4-25-triggering-fcgi-primary-script-unknown-error-in-php-fpm
Sztuką wydaje się być dodanie? char w .htaccess RewriteRule, np. używając:
zamiast:
Źródłem problemu wydaje się być zmiana w mod_rewrite Apache 2.4.25. Użyłem poziomu śledzenia Apache trace1, aby zaobserwować „pętlę”, która przekazuje 1 $ do php-fpm po przejściu index.php / 1 $. 1 USD generuje błąd „AH01071: Wystąpił błąd„ Podstawowy skrypt nieznany \ n ””.
Mam nadzieję, że ten mały smakołyk pomoże komuś rozwiązać jego problemy.
źródło
Linode ma świetny samouczek na ten temat
Zasadniczo konfigurujesz moduł obsługi dla całego serwera, który będzie przechwytywał wszelkie skrypty php i przekazywał je do fast-cgi.
źródło
mam błąd również po przejściu na php-fpm + apache 2.4.6 dla instancji drupal
ale używam mod zdarzenia mpm
po prostu włóż
DirectoryIndex index.php
pracuje dla mniewtedy moje ustawienia Vhosta wyglądają jak poniżej
dzięki
nie ma potrzeby zmiany domyślnego pliku .htaccess drupala
źródło
Te same problemy występują na moim serwerze (doker Centos 7.3.16). Po śledzeniu dziennika php-fpm znalazłem brak sys lib.
WARNING: [pool www] child 15081 said into stderr: "php-fpm: pool www: symbol lookup error: /lib64/libnsssysinit.so: undefined symbol: PR_GetEnvSecure"
następnie ponownie uruchamiam nspr, działa. Jeśli nie możesz znaleźć rozwiązań po wypróbowaniu jakichkolwiek metod, możesz spróbować.yum -y install/reinstall nspr
źródło
Działa to z Wordpress 5.1.1 i nowszymi wraz z PHP 7.3, FastCGI, proxy, a także MariaDB / MySQL. Sprawdzone dwukrotnie na moich serwerach. Działa jak marzenie.
Najpierw na CentOS / Fedora / Red Hat
Edytuj ten plik:
Wklej to:
Powinien dać srw-rw-rw-.
Lub jak skonfigurować na Debian / Ubuntu
Seminarium:
źródło: https://emi.is/?page=articles&article=php-7-installation-and-configuration-for-apache-2.4-using-php-fpm-(debian,-repository)
Problem polega na tym, że php 7.3 z repozytorium Ondrej działa tylko w trybie mpm_prefork. Ma git repo, więc możesz go znaleźć w sieci i zapytać, czy zrobi php 7.3 dla mpm_worker i mpm_event. Pozostała część konfiguracji dystrybucji rodziny Debiana znajduje się poniżej:
pasta
pasta
pasta
skopiuj to do pliku txt:
usuń go, a następnie wklej to zamiast wyżej:
Dodaj dyrektywę
Następnie włącz witrynę:
Następna edycja strony SSL (W tym przypadku certbot z Let's Encrypt został zainstalowany i skonfigurowany wcześniej na początku konfiguracji certyfikatu SSL).
Pamiętaj, aby dodać port 9000 do zapory ogniowej w Debian / Ubuntu
Na CentoOS / Fedora / Red Hat
źródło