alihkan apache dari prefork ke acara di Ubuntu 16, buat php 7 berfungsi

11

Apache berjalan lambat dalam produksi. Setelah mencari jawaban untuk beberapa waktu, saya akhirnya pergi ke saluran #apache IRC dan pro meminta saya memeriksa mode apache dengan perintah ini:

sudo apachectl -V

dan terkejut menemukan bahwa Server MPM adalah prefork . Mereka dengan tegas mengatakan JANGAN GUNAKAN PREFORK PADA SERVER PRODUKSI. Ternyata, paket Ubuntu (mungkin diwarisi dari Debian?) Bersikeras menjalankan apache dalam mode prefork terlepas dari kenyataan bahwa metode yang direkomendasikan untuk menjalankan PHP dengan Apache dengan jelas merekomendasikan proxy_fcgi dan php-fpm, kemudian fcgid dan akhirnya mengatakan Anda tidak boleh gunakan prefork:

Mengapa Anda tidak harus menggunakan mod_php dengan prefork mpm lagi

  • mod_php dimuat ke dalam setiap proses httpd sepanjang waktu. Bahkan ketika httpd menyajikan konten statis / non-php, memori itu sedang digunakan.
  • mod_php bukan thread aman dan memaksa Anda untuk tetap dengan prefork mpm (multi-proses, tidak ada thread), yang merupakan konfigurasi paling lambat yang mungkin

Halaman itu juga berisi beberapa perincian tentang PHP-FPM tetapi ini tampaknya agak rumit dan tidak jelas dan tampaknya melibatkan banyak konfigurasi manual. Saya kecewa dan terkejut Ubuntu 16 tidak memiliki opsi paket untuk mode fastCGI atau sesuatu.

Saya mencoba mengalihkan apache ke mode acara menggunakan a2enmod dan ketika saya mencoba mem-apache kembali, saya mendapat kesalahan:

Apache menjalankan MPM berulir, tetapi Modul PHP Anda tidak dikompilasi untuk menjadi threadsafe. Anda perlu mengkompilasi ulang PHP

Bagaimanapun, saya bertanya-tanya apakah ada yang minimal, petunjuk langkah-demi-langkah untuk menjalankan mode fastCGI di Ubuntu 16 dengan PHP 7.0 dengan mengandalkan penginstal paket sebanyak mungkin. Saat ini saya sedang melihat banyak instruksi yang tidak jelas dan tidak jelas dan saya khawatir tentang memperbaiki lingkungan produksi saya dengan keputusan yang buruk.

Juga, seseorang harus menambahkan mpm-event sebagai opsi tag. Itulah yang direkomendasikan #apache IRC guys.

S. Imp
sumber
Kesalahan terakhir itu karena Anda beralih ke acara, tetapi masih menggunakan mod_php. Nonaktifkan mod_php dan beralih ke php-fpm dan itu akan hilang. Dan bolehkah saya merekomendasikan nginx?
Michael Hampton
@MichaelHampton judulnya harus menyebutkan PHP. Tidak sulit untuk mengalihkan apache ke acara. Sulit untuk mengalihkan apache ke acara DAN membuat php 7 berfungsi.
S. Imp
1
@MichaelHampton pasti Anda menyadari bahwa saya bingung tentang cara "menonaktifkan mod_php dan beralih ke php-fpm." Bukankah itu pertanyaan yang sangat saya tanyakan di posting saya? Juga, pertanyaannya bukan tentang nginx, yang menghadirkan bidang pembelajaran lain. Beralih ke nginx tidak praktis untuk proyek ini karena saya bekerja dengan tim.
S. Imp
Saya tidak menyebutkan cara menonaktifkan modul Apache karena Anda menunjukkan bahwa Anda sudah tahu cara melakukan ini. Sedangkan untuk mengaktifkan php-fpm, lihat jawaban untuk pertanyaan ini, tutorial online, dll.
Michael Hampton

Jawaban:

15

ezra-s menyarankan pendekatan yang baik tetapi tidak menyertakan beberapa detail yang mungkin membingungkan bagi orang-orang yang mengandalkan manajer paket. CATATAN : Saya tidak yakin apakah langkah-langkah ini tepat. Jika ada yang mengalami masalah atau melihat masalah, beri tahu saya dan saya akan memperbarui pos ini.

Pertama, pada tulisan ini, paket apache2 Ubuntu bersikeras pada prefork jika Anda ingin menginstal PHP. Namun, jangan putus asa, karena Anda masih dapat menggunakan installer paket untuk menginstal dan memperbarui PHP dan apache2 dan masih membuat konfigurasi Anda bekerja dengan Apache dalam mode acara menggunakan PHP-FPM seperti yang direkomendasikan oleh wiki Apache dan dijelaskan secara lebih rinci dalam High- kinerja PHP di apache httpd 2.4.x menggunakan mod_proxy_fcgi dan php-fpm . Ide dasarnya adalah bahwa apache2 dan PHP-FPM berkomunikasi melalui soket daripada PHP yang berjalan sebagai modul Apache.

1) Hapus atau nonaktifkan modul Apache PHP

Karena paket Ubuntu bersikeras pada Apache prefork ketika menginstal PHP, kita harus memisahkannya. Saya melakukan ini dengan menggunakan apt untuk menghapus libapache2-mod-php7.0 karena saya tidak lagi memerlukan paket:

sudo apt-get remove libapache2-mod-php7.0

Sebagai alternatif, Anda mungkin menonaktifkan modul Apache php7.0 sebagai gantinya, tetapi ini tidak akan menghapus paket apt dari sistem Anda, yang meninggalkan kekesalan sistem yang mengganggu.

sudo a2dismod php7.0

2) Alihkan Apache ke mode acara dan aktifkan fcgid

Saya percaya perintah ini harus melakukan trik:

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

3) Instal PHP-FPM

Saya sudah menginstal PHP 7 dengan berbagai modulnya, jadi saya hanya menginstal PHP-FPM dengan perintah ini:

sudo apt-get install php7.0-fpm

4) Edit konfigurasi VirtualHost Anda untuk menangani file PHP dengan PHP-FPM:

Dalam kasus saya, saya mengedit host SSL default, /etc/apache2/sites-available/default-ssl.conf , dan menambahkan baris ini tepat di dekat bagian atas:

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm.sock|fcgi://localhost/var/www/html/

PENTING ini memerintahkan Apache untuk menangani permintaan file PHP dengan PHP-FPRM dan jalan di direktif ini ( /run/php/php7.0-fpm.sock ) harus sesuai dengan jalur yang ditetapkan oleh mendengarkan direktif di file / etc / php /7.0/fpm/pool.d/www.conf

5) Mulai ulang Apache

sudo service apache2 restart

Untuk memeriksa apakah mode acara diaktifkan, gunakan perintah ini:

sudo apachectl -V

Dalam output, Anda akan melihat ini:

Server MPM:     event

Cobalah membuat halaman phpinfo dan mengaksesnya di browser Anda. Anda akan melihat Server API: FPM/FastCGIdi output.

S. Imp
sumber
5
Saya sarankan jangan menggunakan ProxyPassMatch, karena tidak akan mengizinkan untuk menggunakan .htaccess di direktori. Gunakan ini sebagai gantinya: <FilesMatch \ .php $> SetHandler "proksi: unix: /run/php/php7.0-fpm.sock | fcgi: // localhost /" </FilesMatch>
waza123
Apa yang akan terjadi jika saya tidak menyentuh file ini seperti yang Anda perintahkan: /etc/apache2/sites-available/default-ssl.conf,? Tambang https & http keduanya berfungsi dengan baik
user5858
Saya mengikuti jawaban kecuali untuk ProxyPassMatch, menambahkan baris Filesmatch dari komentar @ waza123 ke atas 000-default.conf dan me-restart apache2 dan semuanya bekerja dengan sempurna. Terima kasih untuk Anda berdua, VPS kecil saya menghemat satu TON memori dan CPU lebih dari mpm_prefork 🥳
dw1
Saya tidak perlu melakukan ProxyPass atau mengedit file dengan Ubuntu Server 19.10. Setelah langkah 3 (menginstal PHP-FPM), saya baru saja melakukannya a2enconf /etc/apache2/conf-available/php7.3-fpm.conf; systemctl reload apachedan ketika saya membuat file phpinfo.php dengan <?php phpinfo();di dalamnya, baris Server API mengatakan FPM / FastCGI. BTW, saya menginstal php7.3 karena pada saat menulis posting ini, orang harus setidaknya berada di versi itu, jika tidak lebih tinggi, dan repositori apt untuk Ubuntu Server 19.10 Ubuntu naik ke php7.3 saat ini.
ServerChecker
6

Distro menawarkan metode "mod_php" untuk kenyamanan.

Sedangkan cara yang paling performan adalah apache dengan acara + mod_proxy_fcgi -> php-fpm.

Mungkin mereka harus memperbarui dengan waktu tetapi sulit bagi mereka ketika begitu banyak kerangka kerja datang dengan konfigurasi .htaccess mod_php dalam semacam mode "plug & play". Pada akhirnya, hanya admin yang bertanggung jawab untuk mengelola dan mengkonfigurasi situs mereka dengan benar.

Jika Anda dalam produksi, saya sarankan Anda menggunakan server uji untuk mempraktikkan peningkatan dan perubahan.

Tentang wiki yang saya sukai atau sarankan Anda metode "penangan". https://wiki.apache.org/httpd/PHP-FPM#Proxy_via_handler .

Yaitu, konfigurasikan php-fpm untuk memiliki soket yang siap dan dengan izin yang cukup bagi pengguna Apache untuk mengirim permintaan kepadanya dan konfigurasikan Apache untuk menggunakannya.

Contoh cepat:

# needed modules for reverse proxying to php-fpm
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so


<Virtualhost *:443>
    ServerName whatever.example.com
    #other typical directives here
    <Directory /var/www/php-app>
        <FilesMatch \.php>
            SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/"
        <FilesMatch>
    </Directory>
</VirtualHost>

Edit:

Dengan cara ini tidak masalah versi PHP yang Anda gunakan karena Apache tidak peduli, itu hanya akan membalikkan proxy permintaan yang sesuai ke php-fpm.

Juga, jangan lupa untuk membongkar mod_php agar dapat menggunakan mpm_event.

Edit 2:

Sesuai permintaan, Anda tidak perlu menghapus paket mod_php dari debian / ubuntu, Apache hanya peduli dengan konfigurasinya, jadi membongkar modul akan dilakukan.

ezra-s
sumber
Terimakasih atas tanggapan Anda. Saya telah melakukan banyak percobaan dan kesalahan dan ini adalah pendekatan yang tampaknya berfungsi saat ini. Proses sebenarnya sedikit lebih terlibat karena Anda harus mendapatkan apache dari prefork ke acara, uninstall libapache2-mod-php7.0 dll. Saya berharap untuk merumuskan jawaban yang lebih lengkap di sini dalam sedikit.
S. Imp
tidak perlu "uninstall" dari sudut pandang apache httpd, cukup bongkar modul. Sama dengan event / prefork, mpm's juga modul di 2.4, jadi satu membongkar prefork dan memuat event.
ezra-s
ok jadi mungkin Anda tidak perlu menghapus paket, tetapi Anda harus menonaktifkan modul php untuk apache setidaknya - dan saya khawatir tentang upgrade apt-get yang melanggar pengaturan. Detail ini hilang dari jawaban Anda. Saya akan senang jika Anda menambahkannya karena saya tidak terlalu yakin dengan kemampuan saya untuk meluruskan apa yang sebenarnya saya lakukan.
S. Imp
Mungkin saya berasumsi mereka, Apache juga tidak peduli tentang paket debian, hanya konfigurasi fungsionalnya.
ezra-s
Apache akan peduli jika pembaruan paket apt mengubah konfigurasinya, yang merupakan masalah yang saya temui pada satu titik. Dalam semangat posting asli saya, saya ingin memberikan petunjuk terperinci untuk orang lain yang mengandalkan penginstal paket (dan pembaruan) seperti yang saya lakukan.
S. Imp