Saya baru-baru ini menginstal Apache 2.4 pada mesin lokal saya, bersama dengan PHP 5.4.8 menggunakan PHP-FPM.
Semuanya berjalan cukup lancar (setelah beberapa saat ...) tetapi masih ada kesalahan aneh:
Saya mengkonfigurasi Apache untuk PHP-FPM seperti ini:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1
</VirtualHost>
Ini berfungsi, misalnya jika saya memanggil http://localhost/info.php
saya mendapatkan yang benar phpinfo()
(itu hanya file uji).
Jika saya memanggil direktori, saya mendapatkan 404 dengan isi File not found.
dan di log kesalahan:
[Tue Nov 20 21:27:25.191625 2012] [proxy_fcgi:error] [pid 28997] [client ::1:57204] AH01071: Got error 'Primary script unknown\n'
Memperbarui
Saya sekarang mencoba melakukan proxy dengan 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>
Tetapi masalahnya adalah: itu selalu mengarahkan, karena http://localhost/
secara otomatis http://localhost/index.php
diminta, karena
DirectoryIndex index.php index.html
Perbarui 2
Ok, jadi saya pikir "mungkin memeriksa apakah ada file untuk diberikan kepada proxy terlebih dahulu:
<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>
Sekarang penulisan ulang lengkap tidak berfungsi lagi ...
Perbarui 3
Sekarang saya punya solusi ini:
<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>
Pertama periksa, bahwa ada file untuk diteruskan ke PHP-FPM (dengan path lengkap dan absolut ) dan kemudian lakukan penulisan ulang.
Ini tidak berfungsi saat menggunakan penulisan ulang URL di dalam subdirektori, juga gagal untuk URL seperti http://localhost/index.php/test/
So back to square.
Ada ide?
sumber
config.php
file di dataran jika mereka berada di dalam direktori Aliased dan karenanya tidak ada di% {DOCUMENT_ROOT} /% {REQUEST_URI}.Saya mengalami masalah ini kemarin - Apache 2.4 pindah dari Debian / eksperimental ke Debian / tidak stabil memaksa saya untuk berurusan dengan hal-hal baru ini; bukan pada server produksi kami tentu saja;).
Setelah membaca apa yang terasa seperti jutaan situs, dokumentasi Apache, laporan bug dan hasil debug pada log kesalahan, akhirnya saya berhasil. Tidak, belum ada dukungan untuk FPM dengan soket . Konfigurasi Debian default telah menggunakan soket untuk beberapa waktu sekarang, sehingga pengguna Debian harus mengubahnya juga.
Inilah yang berfungsi untuk situs CakePHP dan PHPMyAdmin (yang terakhir membutuhkan konfigurasi jika Anda menggunakan paket Debian), jadi saya dapat mengonfirmasi bahwa
mod_rewrite
masih berfungsi seperti yang diharapkan untuk melakukan penulisan ulang URL mewah.Perhatikan
DirectoryIndex index.php
, yang mungkin menjadi alasan tidak ada konfigurasi Anda yang berfungsi untuk "folder" (setidaknya itulah yang tidak berfungsi di sini).Saya masih mendapatkan
File not found.
untuk direktori, tetapi hanya jika tidak ada file indeks itu dapat diuraikan. Akan senang untuk menyingkirkan itu juga, tapi itu tidak sepenting sekarang.Vhost di atas berfungsi dengan baik dengan .htaccess di root seperti ini:
Saya tidak mengerti maksud Anda
URL rewriting inside a subdirectory
(saya hanya menulis ulang ke index.php root).(Oh, dan Anda harus memastikan Xdebug tidak bertentangan dengan FPM di sistem Anda, di luar kotak mereka ingin menggunakan port yang sama.)
sumber
DirectoryIndex index.html
di vhost yang dimaksud memperbaikinya. Jika saya punyaDirectoryIndex index.php
, maka sepertinya file PHP lainnya akhirnya memberikan kesalahan 'File tidak ditemukan' dan 'Skrip primer tidak diketahui'. Dalam kasus saya, saya punyaindex.html
tapi file phptest.php
.Yang perlu Anda lakukan adalah mengatur:
Dan jangan lupa untuk mengatur halaman pelanggan dengan:
sumber
Ini yang saya punya. Tampaknya bekerja dengan baik. Saya menempatkan Drupal di subdirektori dan penulisan ulang berfungsi, indeks direktori berfungsi, dan PATH_INFO berfungsi.
Saya sudah mencoba melakukan hal seperti ini tanpa penulisan ulang ("Jika" dan semacamnya), tetapi saya tidak dapat mengerjakan apa pun.
EDIT: Perhatikan bahwa jika Anda menerapkan ini sebagai penyedia hosting bersama, ini bisa menjadi masalah keamanan. Itu akan memungkinkan pengguna untuk melewatkan skrip PHP ke proxy fcgi sewenang-wenang. Jika Anda memiliki kumpulan terpisah untuk setiap pengguna, itu akan memungkinkan peningkatan serangan privilege.
sumber
Namun solusi lain (membutuhkan Apache> = 2.4.10) - Di dalam vhost:
Jadi di sini, fcgi handler untuk PHP akan ditetapkan hanya jika file itu ada dan jika namanya cocok dengan ekstensi file PHP.
BTW: Bagi mereka yang memiliki ide untuk mengatur ProxyErrorOverride ke Aktif , ketahuilah bahwa ini benar-benar ide yang buruk. Penggunaan arahan ini bukan tanpa menyebabkan masalah. Misalnya, aplikasi PHP yang mengirim kode HTTP seperti 503 akan menghasilkan hasil yang tidak terduga. Penangan kesalahan default akan terlibat dalam kasus apa pun dan untuk aplikasi PHP yang menyediakan API, itu benar-benar perilaku yang buruk.
sumber
Cara terbaik untuk mengatasi ini adalah dengan mengaktifkan log debugging untuk mod_proxy dan mod_rewrite dan php-fpm. Di apache 2.4 Anda sekarang dapat mengaktifkan debugging log hanya untuk modul tertentu. http://httpd.apache.org/docs/current/mod/core.html#loglevel Per-modul dan konfigurasi per-direktori tersedia di Apache HTTP Server 2.3.6 dan yang lebih baru
Mungkin Anda mendapat tebasan ganda pada direktori?
Inilah yang saya gunakan dan berfungsi dengan baik:
sumber
Satu hal yang saya temui dalam berurusan dengan masalah ini, adalah jika Anda menggunakan kombinasi:
Dalam konfigurasi kumpulan fpm Anda, jangan teruskan path lengkap ke
ProxyPass
arahan.Tapi -HANYA- jika pool di port itu di-chroot.
sumber
Saya tidak yakin apakah masalahnya terkait, tetapi saya telah menemukan solusi yang berfungsi sebagian di sini:
https://stackoverflow.com/questions/44054617/mod-rewrite-in-2-4-25-triggering-fcgi-primary-script-unknown-error-in-php-fpm
Triknya sepertinya menambahkan? char di .htaccess RewriteRule, mis. menggunakan:
dari pada:
Sumber masalahnya tampaknya adalah perubahan mod_rewrite dari Apache 2.4.25. Saya telah menggunakan tingkat log trace1 Apache untuk mengamati "loop" yang lulus $ 1 ke php-fpm setelah index.php / $ 1 telah berlalu. $ 1 menghasilkan kesalahan "AH01071: Got error 'Script primer tidak dikenal \ n'".
Semoga berita gembira kecil ini membantu seseorang untuk menyelesaikan masalah mereka.
sumber
Linode memiliki tutorial yang bagus tentang hal ini
Pada dasarnya Anda mengatur handler untuk seluruh server yang akan menangkap skrip php dan meneruskannya ke cgi cepat.
sumber
saya memiliki kesalahan juga setelah beralih ke php-fpm + apache 2.4.6 untuk contoh drupal
tapi saya menggunakan mod acara mpm
cukup masukkan
DirectoryIndex index.php
bekerja untukkumaka pengaturan Vhost saya terlihat seperti di bawah ini
Terima kasih
tidak perlu merevisi file .htaccess default drupal
sumber
Saya menghadapi masalah yang sama pada server saya (centos 7.3.16 buruh pelabuhan). Setelah melacak log php-fpm, saya menemukan miss a sys lib.
WARNING: [pool www] child 15081 said into stderr: "php-fpm: pool www: symbol lookup error: /lib64/libnsssysinit.so: undefined symbol: PR_GetEnvSecure"
kemudian, saya Restall nspr, itu berfungsi. Jika Anda tidak dapat menemukan solusi setelah mencoba metode apa pun, Anda dapat mencoba ini.yum -y install/reinstall nspr
sumber
Ini bekerja dengan Wordpress 5.1.1 dan yang lebih baru bersama dengan PHP 7.3, FastCGI, proksi, juga MariaDB / MySQL. Diperiksa dua kali di server saya. Bekerja seperti pesona.
Pertama di CentOS / Fedora / Red Hat
Edit file ini:
Tempel ini:
Harus memberikan srw-rw-rw-.
Atau cara mengatur di Debian / Ubuntu
Tutorial:
sumber: https://emi.is/?page=articles&article=php-7-installation-and-configuration-for-apache-2.4-using-php-fpm-(debian ,-- repository)
Masalahnya adalah bahwa php 7.3 dari repo Ondrej hanya bekerja dengan mode mpm_prefork. Ia memiliki git repo, jadi Anda dapat menemukannya di internet dan bertanya kepadanya, apakah ia akan membuat php 7.3 untuk mpm_worker dan mpm_event. Konfigurasi lainnya untuk distro keluarga Debian adalah di bawah ini:
pasta
pasta
pasta
salin ini ke file txt:
hapus dan tempel ini alih-alih di atas:
Tambahkan arahan
Kemudian aktifkan situs:
Edit situs SSL berikutnya (Dalam hal ini certbot dari Let's Encrypt telah diinstal dan dikonfigurasi sebelumnya pada awal konfigurasi sertifikat SSL).
Ingatlah untuk menambahkan port 9000 ke firewall di Debian / Ubuntu
Pada CentoOS / Fedora / Red Hat
sumber