Cara menggunakan apache php-fpm

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

Bài mới nhất

Chủ Đề