Cara Menghubungkan NGINX ke PHP-FPM Menggunakan UNIX atau Socket TCP/IP


Server web NGINX (sebagai proksi terbalik) melayani aplikasi PHP melalui protokol FastCGI (sebagai server aplikasi backend). NGINX menggunakan PHP-FPM (FastCGI Process Manager), sebuah implementasi PHP FastCGI alternatif yang berjalan di latar belakang sebagai daemon, mendengarkan CGI. Muncul dengan fitur tambahan yang dirancang untuk menjalankan situs web atau aplikasi web yang sarat muatan, namun dapat digunakan untuk situs dengan ukuran berapa pun.

PHP-FPM tidak hanya mendukung konfigurasi kumpulan sumber daya FastCGI, namun juga meningkatkan banyak internal FastCGI dan meningkatkan pelaporan kesalahan, skrip penghentian, dan masih banyak lagi. Ini menampilkan demonisasi PHP, manajemen proses, sejumlah proses dinamis dari mana permintaan dapat datang, header kesalahan, dukungan unggahan yang dipercepat, dan banyak lagi.

Untuk menerima permintaan FastCGI dari NGINX, PHP-FPM dapat mendengarkan pada soket TCP/IP atau domain UNIX stopkontak. Alamat mana pun yang Anda pilih untuk digunakan adalah yang digunakan NGINX untuk terhubung (permintaan proxy) ke PHP-FPM, menggunakan direktif fastcgi_pass.

Panduan ini menjelaskan cara mengonfigurasi NGINX ke server aplikasi PHP menggunakan PHP-FPM. Ini menjelaskan kapan harus menggunakan soket TCP/IP atau soket domain UNIX untuk menghubungkan NGINX ke PHP-FPM dan alasannya.

Panduan ini mengasumsikan bahwa Anda telah menginstal NGINX dan PHP-FPM di sistem Linux Anda, jika tidak, lihat:

  • Cara Install LEMP Server di CentOS 8
  • Cara Menginstal LEMP tumpukan PhpMyAdmin di Server Ubuntu 20.04
  • Cara Install NGINX, MySQL/MariaDB, dan PHP di RHEL 8
  • Cara Install LEMP di Server Debian 10

Apa yang Harus Saya Gunakan: Soket Domain UNIX atau Soket TCP/IP?

Soket domain UNIX (atau IPC) adalah sarana komunikasi antar-proses (IPC) yang memungkinkan pertukaran data yang efisien antar proses yang berjalan pada sistem operasi yang sama dengan TCP Soket /IP (atau Domain Internet) memungkinkan proses berkomunikasi melalui jaringan.

Berbeda dengan soket TCP/IP yang mengidentifikasi server berdasarkan alamat IP dan port (misalnya 127.0.0.1:9000), Anda dapat mengikat server ke soket domain UNIX menggunakan nama jalur file (misalnya /run/php-fpm/www.sock), yang terlihat di sistem file.

Soket domain UNIX adalah jenis file khusus – izin file dan direktori berlaku padanya (seperti halnya dengan jenis file UNIX lainnya) dan dapat digunakan untuk membatasi proses mana di host yang dapat membaca dan menulis ke file, (dan dengan demikian berkomunikasi dengan server backend).

Dengan cara ini, soket domain UNIX aman karena hanya proses di host lokal yang dapat menggunakannya. Soket TCP/IP mungkin terekspos ke internet sehingga menimbulkan risiko keamanan kecuali tindakan keamanan tambahan seperti firewall diterapkan.

Yang penting, menggunakan soket domain UNIX tidak sama dengan menggunakan soket TCP/IP dalam hal performa, beberapa pengujian dan tolok ukur telah membuktikan soket domain UNIX lebih cepat. Kelemahan utama soket domain UNIX adalah kurang terukur, hanya mendukung komunikasi antar-proses dalam sistem operasi (OS) yang sama.

Dimana Saya Dapat Mengonfigurasi Alamat Dengar PHP-FPM?

Anda dapat mengonfigurasi alamat yang didengarkan PHP-FPM dalam file konfigurasi kumpulan sumber daya. Perhatikan bahwa dengan PHP-FPM, Anda dapat menjalankan beberapa kumpulan proses dengan pengaturan berbeda. Kumpulan default disebut www.

Lokasi file konfigurasi kumpulan sumber daya bergantung pada cara PHP dan PHP-FPM diinstal pada sistem Linux (apakah itu versi default/tunggal atau beberapa versi secara bersamaan) .

Misalnya, pada CentOS 8, dengan satu versi, semua file konfigurasi PHP terletak di direktori /etc dan PHP-FPM default file konfigurasi kumpulan (www) adalah /etc/php-fpm.d/www.conf:

Untuk membuat daftar semua file konfigurasi PHP, gunakan perintah ls berikut.

ls /etc/php*

Di Ubuntu 20.04, file konfigurasi PHP terletak di direktori /etc/php// dan direktori default PHP-FPM file konfigurasi kumpulan (www) adalah /etc/php//fpm/pool.d/www.conf:

ls /etc/php/7.4/

Mengonfigurasi PHP-FPM untuk Mendengarkan pada Soket Domain UNIX

Untuk mengonfigurasi PHP-FPM agar mendengarkan pada soket domain UNIX, buka file konfigurasi kumpulan PHP-FPM default Anda, menggunakan editor teks favorit Anda.

sudo vim /etc/php/7.4/fpm/pool.d/www.conf	#Ubuntu/Debian
OR
vim /etc/php-fpm.d/www.conf			#CentOS/RHEL/Fedora

Kemudian cari direktif dengar dan setel ke nama jalur file soket domain UNIX sebagai berikut. Perhatikan bahwa sebagian besar instalasi menggunakan soket domain UNIX secara default.

listen = /run/php/php7.4-fpm.sock	#Ubuntu/Debian
OR
listen = /run/php-fpm/www.sock		#CentOS/RHEL/Fedora

Jika Anda menggunakan soket domain UNIX, Anda juga perlu mengatur izin baca/tulis yang sesuai untuk file tersebut, untuk mengizinkan koneksi dari server web NGINX. Secara default, NGINX berjalan sebagai pengguna dan grup nginx di CentOS/RHEL/Fedora dan www-data di Ubuntu dan Debian.

Jadi, temukan parameter listen.owner dan listen.group dan atur sesuai dengan itu. Selain itu, setel mode ke 0660 menggunakan parameter listen.mode.

------------- On Debian and Ubuntu -------------
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

------------- On CentOS/RHEL and Fedora  -------------
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Perhatikan bahwa jika izin pada file soket domain UNIX tidak diatur dengan benar, NGINX mungkin menghasilkan kesalahan gateway yang buruk.

Mengonfigurasi PHP-FPM untuk Mendengarkan pada Soket TCP/IP

Meskipun soket domain UNIX lebih cepat dibandingkan soket TCP/IP, soket domain UNIX kurang dapat diskalakan, karena hanya dapat mendukung komunikasi antar-proses pada OS yang sama. Jika NGINX dan server aplikasi backend (PHP-FPM) berjalan pada sistem yang berbeda, Anda harus mengonfigurasi PHP-FPM untuk mendengarkan soket TCP/IP untuk koneksi.

Dalam file konfigurasi kumpulan PHP-FPM, atur alamat listen sebagai berikut. Pastikan port yang Anda pilih tidak digunakan oleh proses atau layanan lain di sistem yang sama.

listen = 127.0.0.1:3000

Mengonfigurasi NGINX agar Bekerja dengan Server Aplikasi PHP-FPM

Setelah Anda mengonfigurasi alamat yang didengarkan PHP-FPM, Anda perlu mengonfigurasi NGINX untuk mem-proxy permintaan melalui alamat tersebut, menggunakan fastcgi_pass parameter konfigurasi, dalam file konfigurasi blok server virtual.

Misalnya, jika file konfigurasi untuk situs web Anda adalah /etc/nginx/conf.d/example.com.conf, buka file tersebut untuk diedit.

vim /etc/nginx/conf.d/example.com.conf 

Cari blok location untuk memproses file .php dan atur parameter fastcgi_pass sebagai berikut, jika Anda mengonfigurasi PHP-FPM untuk mendengarkan di UNIX soket domain.

fastcgi_pass unix:/run/php/php7.4-fpm.sock	#Ubuntu/Debian
OR
fastcgi_pass unix:/run/php-fpm/www.sock		#CentOS/RHEL/Fedora

Atau gunakan alamat TCP/IP jika Anda mengonfigurasi PHP-FPM untuk mendengarkan pada soket TCP/IP. Jika server aplikasi backend (PHP-FPM) berjalan di server terpisah (ganti 10.42.0.10 dengan alamat IP mesin tempat server FastCGI PHP-FPM sedang berlari).

fastcgi_pass  10.42.0.10:3000;

Penting: Pada CentOS 8, PHP-FPM didefinisikan sebagai server upstream di / File etc/nginx/conf.d/php-fpm.conf, dalam blok upstream, dengan nama php-fpm.

Anda dapat membuat perubahan di sini tergantung pada alamat PHP-FPM yang dikonfigurasi untuk didengarkan, dalam file konfigurasi kumpulan. Konfigurasi default menunjuk ke soket domain UNIX.

upstream php-fpm {
        server unix:/run/php-fpm/www.sock;
}

dan di file blok server situs Anda, cukup atur parameter fastcgi_pass seperti yang ditunjukkan.

fastcgi_pass php-fpm;

Setelah melakukan perubahan pada konfigurasi PHP-FPM dan NGINX, periksa kebenaran sintaks konfigurasinya sebagai berikut.

------------- On Debian and Ubuntu -------------
sudo php-fpm -t
sudo nginx -t

------------- On CentOS/RHEL and Fedora  -------------
php-fpm -t
nginx -t

Meskipun keluaran perintah hanya menampilkan file konfigurasi utama, semua file konfigurasi lainnya juga disertakan dan diperiksa.

Selanjutnya, Anda perlu me-restart kedua layanan untuk menerapkan perubahan, menggunakan perintah systemctl.

------------- On Debian and Ubuntu -------------
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm

------------- On CentOS/RHEL and Fedora  -------------
systemctl restart nginx
systemctl restart php-fpm

Jika Anda mendapatkan kesalahan, Anda dapat memeriksa file log NGINX dan PHP-FPM menggunakan perintah cat.

------------- On Debian and Ubuntu -------------
cat /var/log/nginx/error.log
cat /var/log/php7.4-fpm.log

------------- On CentOS/RHEL and Fedora  -------------
cat /var/log/nginx/error.log
cat /var/log/php-fpm/www-error.log

Hanya itu yang kami punya untuk Anda. Bagian komentar di bawah dapat digunakan untuk mengajukan pertanyaan. Untuk informasi lebih lanjut, lihat dokumentasi NGINX dan dokumentasi PHP-FPM.