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:
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
ProxyPassMatch ^/[.*\.php[/.*]?]$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1
Ini berfungsi, misalnya jika saya memanggil //localhost/info.php
Saya mendapatkan phpinfo[]
yang benar [ini hanya file tes].
Jika saya memanggil direktori, saya mendapatkan 404 dengan tubuh 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:
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]
Tetapi masalahnya adalah: itu selalu mengarahkan, karena pada //localhost/
Secara otomatis //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:
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]
Sekarang penulisan ulang lengkap tidak berfungsi lagi ...
Perbarui 3
Sekarang saya punya solusi ini:
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]
Pertama periksa, bahwa ada file untuk diteruskan ke PHP-FPM [dengan penuh dan absolut jalan] dan kemudian melakukan penulisan ulang.
Ini tidak berfungsi saat menggunakan penulisan ulang URL di dalam subdirektori, juga gagal untuk URL seperti //localhost/index.php/test/
Jadi kembalilah ke titik awal.
Ada ide?
Setelah berjam-jam mencari dan membaca dokumentasi Apache, saya telah menemukan solusi yang memungkinkan untuk menggunakan kumpulan ini, dan juga memungkinkan direktif Menulis ulang di .htaccess untuk bekerja bahkan ketika url berisi file .php.
...
# This is to forward all PHP to php-fpm.
SetHandler "proxy:unix:/path/to/socket.sock|fcgi://unique-domain-name-string/"
# Set some proxy properties [the string "unique-domain-name-string" should match
# the one set in the FilesMatch directive.
ProxySet connectiontimeout=5 timeout=240
# If the php file doesn't exist, disable the proxy handler.
# This will allow .htaccess rewrite rules to work and
# the client will see the default 404 page of Apache
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
RewriteRule [.*] - [H=text/html]
Sesuai dokumentasi Apache, parameter proxy SetHandler memerlukan Apache HTTP Server 2.4.10.
Saya harap solusi ini akan membantu Anda juga.
Saya mengalami masalah ini kemarin - Apache 2.4 pindah dari Debian/eksperimental ke Debian/tidak stabil memaksa saya untuk berurusan dengan barang 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, ada belum ada dukungan untuk FPM dengan soket , belum. Konfigurasi Debian default telah menggunakan soket untuk beberapa waktu sekarang, jadi 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.
Memperhatikan 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 yang dapat diuraikan. Akan sangat senang untuk menyingkirkan itu juga, tetapi tidak sepenting sekarang.
ServerName site.localhost
DocumentRoot /your/site/webroot
Options FollowSymlinks
DirectoryIndex index.php
AllowOverride All
Require all granted
ProxyPass fcgi://127.0.0.1:9000/your/site/webroot
LogLevel debug
ErrorLog /your/site/logs/error.log
CustomLog /your/site/logs/access.log combined
Vhost di atas berfungsi dengan baik dengan .htaccess di root seperti ini:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^[.*]$ index.php [QSA,L]
Saya tidak mengerti apa yang Anda maksud dengan URL rewriting inside a subdirectory
meskipun [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.]
Yang perlu Anda lakukan adalah mengatur:
ProxyErrorOverride on
Dan jangan lupa untuk mengatur halaman pelanggan dengan:
ErrorDocument 404 /path/to/error_page_file
Solusi lain [membutuhkan Apache> = 2.4.10] - Di dalam vhost:
# define worker
ProxySet connectiontimeout=5 timeout=7200
SetEnvIfNoCase ^Authorization$ "[.+]" HTTP_AUTHORIZATION=$1
SetHandler proxy:fcgi://domain.tld
Jadi di sini, fcgi handler untuk PHP akan ditetapkan hanya jika file ada dan jika namanya cocok dengan PHP ekstensi file.
BTW: Bagi mereka yang memiliki ide untuk mengatur ProxyErrorOverride ke Aktif, perlu diketahui bahwa ini benar-benar ide yang buruk. Penggunaan arahan ini bukan tanpa menyebabkan masalah. Misalnya, setiap aplikasi PHP mengirimkan kode HTTP seperti 503 akan menghasilkan hasil yang tidak terduga. Penangan kesalahan default akan terlibat dalam kasus apa pun dan untuk aplikasi PHP aplikasi yang menyediakan API, itu benar-benar perilaku yang buruk.
Ini yang saya punya. Tampaknya bekerja dengan baik. Saya meletakkan Drupal dalam subdirektori dan penulisan ulangnya berfungsi, indeks direktori berfungsi, dan PATH_INFO berfungsi.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} ^/[[.*\.php][/.*]?]$
RewriteCond %2 -f
RewriteRule . fcgi://127.0.0.1:9000/%1 [L,P]
RewriteOptions Inherit
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 PHP skrip ke proxy fcgi sewenang-wenang. Jika Anda memiliki kumpulan terpisah untuk setiap pengguna, itu akan memungkinkan untuk peningkatan serangan privilege.
Cara terbaik untuk mengatasi ini adalah dengan mengaktifkan log debugging untuk mod_proxy dan mod_rewrite dan php-fpm. Di Apache 2.4 sekarang Anda dapat mengaktifkan debugging log hanya untuk modul tertentu. //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:
ProxyPass fcgi://127.0.0.1:9000/home/DOMAINUSER/public_html$1
Satu hal yang saya temui dalam berurusan dengan masalah ini, adalah jika Anda menggunakan kombinasi:
chroot = /path/to/site
chdir = /
Dalam konfigurasi kumpulan fpm Anda, jangan teruskan path lengkap ke arahan ProxyPass
.
ProxyPass fcgi://127.0.0.1:9020/$1
Tapi -HANYA- jika pool di port itu di-chroot.
Saya tidak yakin apakah masalahnya terkait, tetapi saya telah menemukan solusi yang berfungsi sebagian di sini:
//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:
RewriteRule ^[.*]$ index.php?/$1 [L,NS]
dari pada:
RewriteRule ^[.*]$ index.php/$1 [L,NS]
Sumber masalahnya tampaknya adalah perubahan mod_rewrite dari Apache 2.4.25. Saya telah menggunakan tingkat log trace1 Apache untuk mengamati "loop" yang melewati $ 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.
Versi yang sedikit dimodifikasi dari jawaban @ FrancescoA yang tidak memerlukan mod_rewrite
SetHandler "proxy:unix:/path/to/socket.sock|fcgi://unique-domain-name-string/"
ProxySet connectiontimeout=5 timeout=240
Saya menghadapi masalah yang sama di 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"
lalu, 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
Ini bekerja dengan Wordpress 5.1.1 dan yang lebih baru bersama-sama dengan PHP 7.3, FastCGI, proxy, juga MariaDB/MySQL. Memeriksa dua kali di server saya. Bekerja seperti pesona.
Pertama di CentOS/Fedora/Red Hat
Sudo yum remove php*
Sudo yum --enablerepo=extras install epel-release
Sudo yum install php-fpm php-mysql php-Gd php-imap php-mbstring
Sudo grep -E '[proxy.so|fcgi]' /etc/httpd/conf.modules.d/00-proxy.conf
Sudo mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf_bak
Edit file ini:
Sudo nano /etc/php-fpm.d/www.conf
Tempel ini:
[www]
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on
; a specific port;
; 'port' - to listen on a TCP socket to all addresses on a
; specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 127.0.0.1:9000
listen = /run/php-fcgi.sock
Sudo ll /run/php-fcgi.sock
Harus memberikan srw-rw-rw-.
Atau cara mengatur di Debian/Ubuntu
Tutorial:
sumber: //emi.is/?page=articles&article=php-7-installation-and-configuration-for-Apache-2.4-using-php-fpm- [debian, -repository]
Sudo apt purge 'php*' or Sudo apt-get purge 'php*'
Sudo add-apt-repository ppa:ondrej/php
Sudo apt-get update
Sudo apt install php7.3 php7.3-fpm php-mysql php-mbstring php-Gd php-imap libapache2-mod-security2 modsecurity-crs
systemctl status php7.3-fpm
systemctl stop php7.3-fpm.service
Sudo a2dismod php7.0 php7.1 php7.2 mpm_event mpm_worker
Sudo a2enmod mpm_prefork
Sudo a2enmod php7.3
Sudo systemctl restart Apache2 [httpd in CentOS]
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:
Sudo apt --assume-yes install php7.3-fpm
Sudo systemctl stop php7.3-fpm.service
Sudo rm /var/log/php7.0-fpm.log
Sudo mkdir /var/log/php7.3-fpm/
Sudo touch /var/log/php7.3-fpm/error.log
Sudo mkdir /var/log/php7.3/
Sudo touch /var/log/php7.3/error.log
Sudo mkdir /var/tmp/php7.3/
Sudo > /etc/php/7.3/fpm/php.ini
Sudo > /etc/php/7.3/fpm/php-fpm.conf
Sudo rm /etc/php/7.3/fpm/pool.d/www.conf
Sudo touch /etc/php/7.3/fpm/pool.d/example.com.conf
Sudo useradd --comment "PHP" --Shell "/usr/sbin/nologin" --system --user-group php
Sudo nano /etc/php/7.3/fpm/php.ini
tempel
[PHP]
date.timezone = Europe/Prague
display_errors = Off
error_log = /var/log/php7.3/error.log
error_reporting = 32767
log_errors = On
register_argc_argv = Off
session.gc_probability = 0
short_open_tag = Off
upload_tmp_dir = /var/tmp/php7.3/
Sudo nano /etc/php/7.3/fpm/php-fpm.conf
tempel
[global]
error_log = /var/log/php7.3-fpm/error.log
include = /etc/php/7.3/fpm/pool.d/*.conf
Sudo nano /etc/php/7.3/fpm/pool.d/example.com.conf
tempel
[example.com]
group = php
listen = 127.0.0.1:9000
pm = ondemand
pm.max_children = 5
pm.max_requests = 200
pm.process_idle_timeout = 10s
user = php
Sudo nano /etc/logrotate.d/php7.3-fpm
salin ini ke file txt:
/var/log/php7.3-fpm.log {
rotate 12
weekly
missingok
notifempty
compress
delaycompress
postrotate
/usr/lib/php/php7.3-fpm-reopenlogs
endscript
}
hapus dan tempel ini alih-alih di atas:
/var/log/php7.3/*.log /var/log/php7.3-fpm/*.log
{
copytruncate
maxage 365
missingok
monthly
notifempty
rotate 12
}
Tambahkan arahan
Sudo nano /etc/Apache2/sites-available/example.com.conf
ServerName www.example.com
ServerAlias example.com
ServerAdmin [email protected]
DocumentRoot /var/www/html/example.com/public_html
DirectoryIndex index.php index.htm index.html index.xht index.xhtml
LogLevel info warn
ErrorLog ${Apache_LOG_DIR}/error.log
CustomLog ${Apache_LOG_DIR}/access.log combined
Require all denied
order allow,deny
deny from all
RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ //%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
ProxyPassMatch ^/[.*\.php[/.*]?]$ fcgi://127.0.0.1:9000/var/www/html/example.com/public_html
Options Indexes FollowSymLinks Includes IncludesNOEXEC SymLinksIfOwnerMatch
AllowOverride None
Kemudian aktifkan situs:
Sudo a2ensite /etc/Apache2/sites-available/example.com.conf
Edit situs SSL berikutnya [Dalam hal ini certbot dari Let's Encrypt telah diinstal dan dikonfigurasi sebelumnya pada awal konfigurasi sertifikat SSL].
Sudo nano /etc/Apache2/sites-available/example.com-le-ssl.conf
#headers for security man in the middle attack find how to enable this mod in Google
LoadModule headers_module modules/mod_headers.so
Header always set Strict-Transport-Security "max-age=15768000"
SSLEngine On
ServerName example.com
ServerAdmin [email protected]
DocumentRoot /var/www/html/example.com/public_html
Options Indexes FollowSymLinks Includes IncludesNOEXEC SymLinksIfOwnerMatch
AllowOverride All
Require all granted
DirectoryIndex index.php
RewriteEngine On
SetHandler "fcgi://example.com:9000/var/www/html/example.com/public_html"
# Log file locations
#LogLevel info ssl:warn
LogLevel debug
ErrorLog ${Apache_LOG_DIR}/error.log
CustomLog ${Apache_LOG_DIR}/access.log combined
# modern configuration
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-Apache.conf
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
#SSLCipherSuite HIGH:!aNULL:!MD5
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM$
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off
Require all denied
order allow,deny
deny from all
#Stapling OCSP for Let's Encrypt certs.
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/var/run/ocsp[128000]
Sudo a2enmod proxy proxy_fcgi setenvif
Sudo systemctl reload Apache2.service
Sudo chown --recursive root:adm /etc/php/
Sudo chmod --recursive 0770 /etc/php/
Sudo chown --recursive php:adm /var/log/php7.3/
Sudo chown --recursive php:adm /var/log/php7.3-fpm/
Sudo chmod --recursive 0770 /var/log/php7.3/
Sudo chmod --recursive 0770 /var/log/php7.3-fpm/
Sudo chown --recursive php:php /var/tmp/php7.3/
Sudo chmod --recursive 0770 /var/tmp/php7.3/
Sudo a2enconf php7.3-fpm
Sudo systemctl enable php7.3-fpm.service
Sudo systemctl start php7.3-fpm.service
Ingatlah untuk menambahkan port 9000 ke firewall di Debian/Ubuntu
Sudo ufw allow 9000/tcp
Sudo ufw status
Pada CentoOS/Fedora/Red Hat
Sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent
Sudo firewall-cmd --reload
Sudo firewall-cmd --list-all
Sudo firewall-cmd --state
saya memiliki kesalahan juga setelah beralih ke php-fpm + Apache 2.4.6 untuk drupal
tapi saya menggunakan mod acara mpm
cukup masukkan
DirectoryIndex index.php
bekerja untuk saya
maka pengaturan Vhost saya terlihat seperti di bawah ini
ServerAdmin [email protected]
ServerName sever.com
DocumentRoot /var/www/html/webroot
ErrorLog logs/web-error_log
CustomLog logs/web-access_log common
ProxyPassMatch ^/[.*\.php[/.*]?]$ fcgi://127.0.0.1:9000/var/www/html/webroot/$1
Options FollowSymlinks
DirectoryIndex index.php
AllowOverride All
Require all granted
terima kasih
tidak perlu merevisi file .htaccess default drupal