Dalam artikel ini saya akan memberi tahu Anda bagaimana saya memigrasikan server saya yang menjalankan Apache+PHP ke Nginx+PHP-fpm tanpa mematikan prosesnya.
Skenario
[Lewati Intro]
Pada tahun 2020, selama hari-hari pertama pandemi, kami mengadakan pertemuan untuk persiapan karantina yang akan datang. Rencananya adalah untuk terus memindahkan semua siswa saat ini ke pendidikan jarak jauh penuh. Saya telah bertanya berapa banyak siswa tambahan yang harus saya harapkan dan mereka berkata tentang ganda. Selanjutnya, saran saya hanya menggandakan sumber daya perangkat keras (ram &cpu core) karena:
- untungnya saya punya cukup ruang -dalam hal sumber daya perangkat keras- untuk pertumbuhan seperti itu.
- karantina akan berakhir hanya dalam dua minggu, paling lama sebulan. Kemudian siswa kami akan kembali ke presentasi dan saya akan mendapatkan kembali sumber daya tambahan tersebut.
Selama dua minggu pertama karantina awal saya harus meningkatkan sumber daya perangkat keras lebih dan lebih (tetapi tidak menduplikasinya) dan solusi itu terbukti tidak cukup. Setelah bulan pertama, dengan ujian yang semakin dekat setiap hari, dan krisis covid19 yang mengancam bahkan hingga musim panas, saya harus memikirkan yang nyata larutan. Juga solusi ini perlu dilakukan dengan waktu henti yang lebih sedikit … kita sudah memiliki cukup moodle crash.
Sekali lagi, beruntung saya masih memiliki beberapa GB RAM dan inti CPU yang tersedia. Saya telah menyiapkan VM kecil baru (1 inti dan 1gb RAM) dengan salinan salah satu moodle produksi saya, untuk menguji berbagai hal hingga berhasil. Setelah saya mendapatkan pengaturan yang melakukannya, saya dapat membuat perubahan tanpa downtime. Perubahan terakhir terdiri dari shutdown apache dan mulai nginx
Pemasangan
Nginx
Jika Anda membaca beberapa posting saya sebelumnya di FreeBSD, saya lebih memilih port daripada paket biner, jadi untuk menginstal nginx jalankan:
# cd /usr/ports/www/nginx
# make install clean
Php-fpm
Cara default untuk menjalankan kode php di dalam Apache adalah mengaktifkan modul mod_php. Tidak ada (setidaknya yang saya tahu) modul nginx yang dapat dimuat untuk PHP, jadi Anda harus mengaktifkan FastCGI Process Manager. Jika Anda menginstal PHP dengan opsi default, Anda mungkin sudah memilikinya, tetapi periksa kembali:
[/usr/ports/www/nginx]# cd ../../lang/php74
[/usr/ports/lang/php74]# make config
Jika FPM tidak dipilih, pilih, lalu jalankan:
[/usr/ports/lang/php74]# make install clean
Konfigurasi
PHP-Fpm
Buat, jika tidak ada file /usr/local/etc/php-fpm.d/www.conf saya salin www.conf.default lalu edit:
[/usr/ports/lang/php74]# cd /usr/local/etc/php-fpm.d/
[/usr/local/etc/php-fpm.d/]# cp www.conf.default www.conf
[/usr/local/etc/php-fpm.d/]# ee www.conf
Gulir ke bawah ke opsi yang relevan:
user/group
:harus pengguna dan grup yang sama dengan apache, www untuk saya.listen
:karena saya hanya melayani php secara lokal, saya menggunakan soket unix:/var/run/php-fpm.sock
;pm
:dynamic
baik-baik saja, tetapi Anda mungkin perlu mengubah dan menyetel parameter ini. Lihat komentar di file.
Terakhir, mari aktifkan dan mulai php-fpm:
[/usr/local/etc/php-fpm.d/] /usr/local/etc/rc.d/php-fpm enable
[/usr/local/etc/php-fpm.d/] /usr/local/etc/rc.d/php-fpm start
Nginx
File nginx.conf bisa sebesar (atau dibagi menjadi beberapa bagian) seperti httpd.conf dari apache. Khususnya jika Anda memiliki beberapa VirtualHost, opsi yang relevan adalah (setidaknya bagi saya di mana):
user
:pengguna yang sama dengan proses apache, misalnya www.worker_process
:ini harus sesuai dengan jumlah inti CPUclient_max_body_size
:harus cocok dengan nilaipost_max_size
danupload_max_size
di php.ini.root
:sama denganDocumentRoot
dari VirtualHost Anda di Apache httpd.conf, yaitu /usr/local/www/- Tambahkan bagian berikutnya untuk memberi tahu nginx cara mengirim kode php Anda ke layanan php-fpm:
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 120;
fastcgi_send_timeout 120;
}
Opsi lain dalam file contoh nginx.conf cukup jelas. Tentu saja, ada banyak hal lain yang dapat Anda sesuaikan, tetapi ini akan sangat membantu.
Akhirnya kita dapat mengaktifkan nginx, menghentikan Apache dan memulai nginx (dalam urutan itu atau nginx akan dapat mendengarkan di port http/https):
# /usr/local/etc/rc.d/nginx enable
# /usr/local/etc/rc.d/apache24 stop
# /usr/local/etc/rc.d/nginx start
Jika terjadi kesalahan
Perhatikan bahwa kami belum menonaktifkan Apache. Jika terjadi kesalahan, hentikan nginx dan mulai Apache24 yang Anda tahu sudah berfungsi dengan baik:
# /usr/local/etc/rc.d/apache24 stop ; /usr/local/etc/rc.d/nginx start
Jika Anda yakin semuanya berfungsi seperti yang diharapkan, Anda dapat menonaktifkan apache.