Menyiapkan server web yang produktif di NGINX + PHP-FPM

PHP-FPM (Manajer Proses Cepat) - Ini adalah implementasi terpisah dari penangan FastCGI untuk mengeksekusi skrip PHP. Berdasarkan pada bundel server web NGINX (yang menangani statika) dan PHP-FPM, Anda dapat membangun server web yang lebih cepat dan lebih cepat untuk proyek web Anda dibandingkan dengan menggunakan bundel NGINX klasik, Apache dan modul mod_php (stack LAMP).

Lemp - Seperangkat perangkat lunak open source yang biasanya diinstal bersama untuk dijalankan di server untuk meng-host situs web dan aplikasi web. Singkatan ini mengacu pada satu set OS Linux dengan server web Nginx (dia menggantikan Apache dalam tumpukan yang lebih umum Lampu), dengan database MySQL (MariaDB) dan c php untuk memproses data dinamis.

Pada artikel ini, kami akan mempertimbangkan untuk menginstal dan mengoptimalkan tumpukan LEMP untuk menjadi tuan rumah proyek web yang dimuat pada server dengan CentOS 7 berdasarkan bundel NGINX + PHP-FPM + MariaDB / MySQL + dan menginstal Mari Enkripsi sertifikat untuk situs SSL .

Konten:

  • Koneksi repositori, pembaruan server
  • Menginstal dan Mengkonfigurasi Server Web Nginx
  • Instal php-fpm dan modul php tambahan
  • Instal Let's Encrypt dan hubungkan sertifikat
  • Instal MySQL / MariaDB di server web
  • Mengkonfigurasi Nginx dan PHP-FPM untuk proyek beban tinggi

Koneksi repositori, pembaruan server

Karena instalasi dilakukan pada server yang baru diinstal dengan CentOS, Anda perlu menghubungkan repositori EPEL yang populer dan memperbarui semua paket di server.

# yum install epel-release -y
# yum perbarui -y

Repositori diinstal, tetapi tidak ada paket pembaruan yang ditemukan, karena gambar CentOS baru diinstal.

Menginstal dan Mengkonfigurasi Server Web Nginx

Untuk menginstal versi terbaru Nginx, hubungkan repositori pengembang dengan menjalankan perintah:

# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

Atau dengan membuat file konfigurasi repositori /etc/yum.repos.d/nginx.repo dengan konten berikut:

[nginx] name = nginx repo baseurl = http: //nginx.org/packages/centos/7/$basearch/ gpgcheck = 0 diaktifkan = 1 

Jika Anda menggunakan CentOS 8, ubah versi di URL.

Instal paket server web Nginx menggunakan pengelola paket yum (atau dnf):

# yum instal nginx -y

Sekarang kamu bisa lari nginx dan menambahkannya ke startup menggunakan systemctl:

# systemctl mulai nginx
# systemctl aktifkan nginx

Dibuat symlink dari /etc/systemd/system/multi-user.target.wants/nginx.service ke /usr/lib/systemd/system/nginx.service.

Untuk memverifikasi bahwa server web berfungsi, buka alamat IP server di browser.

Jika halaman pengujian Anda tidak terbuka, periksa pengaturan untuk layanan yang diizinkan, port, zona di firewalld di server Anda.

Siapkan file konfigurasi untuk build-centos.info domain yang terpisah. Buat direktori terpisah untuk situs dan file konfigurasi itu sendiri:

# mkdir -p /var/www/build-centos.info && mkdir -p /var/www/build-centos.info/log

Buka file konfigurasi:

# nano /etc/nginx/conf.d/build-centos.info.conf

Dan tambahkan konten berikut ke dalamnya:

server dengarkan 80; server_name build-centos.info; root /var/www/build-centos.info; index index.php index.html index.htm; access_log /var/www/build-centos.info/log/access.log utama; error_log /var/www/build-centos.info/log/error.log; location / return 301 https: //build-centos.info$request_uri;  lokasi ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $ return 301 https: //build-centos.info$request_uri;  lokasi ~ \ .php $ return 301 https: //build-centos.info$request_uri;  location = /favicon.ico log_not_found off; access_log off;  location = /robots.txt rewrite ^ /robots.txt break; izinkan semua; log_not_found off; access_log off;  lokasi ~ / \.ht tolak semua;  server listen 80; server_name www.build-centos.info; menulis ulang ^ https: //build-centos.info$request_uri? permanen;  server dengarkan 443 ssl http2; server_name build-centos.info; root /var/www/build-centos.info; index index.php index.html index.htm; access_log /var/www/build-centos.info/log/ssl-access.log utama; error_log /var/www/build-centos.info/log/ssl-error.log; keepalive_timeout 60; ssl_certificate /etc/letsencrypt/live/build-centos.info/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/build-centos.info/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256: ECDHE-ECDSA-AES128-GCM-SHA256: ECDHE-RSA-AES256-GCM-SHA384: ECDHE-ECDSA-AES256-GCM-838-SHM25 SHA256: DHE-DSS-AES128-GCM-SHA256: kEDH + AESGCM: ECDHE-RSA-AES128-SHA256: ECDHE-ECDSA-AES128-SHA256: ECDHE-RSA-AES128-SHA: ECDHE-ECDA-ECDA-ECDA-ECDA RSA-AES256-SHA384: ECDHE-ECDSA-AES256-SHA384: ECDHE-RSA-AES256-SHA: ECDHE-ECDSA-AES256-SHA: DHE-RSA-AES128-SHA256: DHE-RSA-AES128-SHA- AES128-SHA256: DHE-RSA-AES256-SHA256: DHE-DSS-AES256-SHA: DHE-RSA-AES256-SHA: AES128-GCM-SHA256: AES256-GCM-SHA384: AES128-SHA384: AES128-SHA386: AES128-SHA386: AES128-SHA386: AES SHA: AES256-SHA: AES: CAMELLIA: DES-CBC3-SHA :! ANULL :! ENULL :! EKSPOR:! DES:! RC4:! MD5:! PSK :! AECDH:! EDH-DSS-DES-CBC3-SHA :! EDH-RSA-DES-CBC3-SHA :! KRB5-DES-CBC3-SHA '; add_header Strict-Transport-Security 'max-age = 604800'; location / try_files $ uri $ uri / /index.php?$args;  lokasi ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $ access_log off; kedaluwarsa maks;  lokasi ~ \ .php $ try_files $ uri = 404; fastcgi_pass unix: /var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param DOCUMENT_ROOT /var/www/build-centos.info; fastcgi_param SCRIPT_FILENAME /var/www/build-centos.info/$fastcgi_script_name; fastcgi_param PATH_TRANSLATED /var/www/build-centos.info/$fastcgi_script_name; termasuk fastcgi_params; fastcgi_param QUERY_STRING $ query_string; fastcgi_param REQUEST_METHOD $ request_method; fastcgi_param CONTENT_TYPE $ content_type; fastcgi_param CONTENT_LENGTH $ content_length; fastcgi_param HTTPS aktif; fastcgi_intercept_errors aktif; fastcgi_ignore_client_abort off; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k;  location = /favicon.ico log_not_found off; access_log off;  location = /robots.txt allow all; log_not_found off; access_log off;  lokasi ~ / \.ht tolak semua;  server dengarkan 443 ssl http2; server_name www.build-centos.info; menulis ulang ^ https: //build-centos.info$request_uri? permanen;  

File konfigurasi berisi pengaturan untuk akses melalui protokol https aman, karena banyak CMS populer saat ini bekerja secara default melaluinya. Di masa mendatang, kami akan menginstal dan mengonfigurasi sertifikat SSL Enkripsi Let's Encrypt gratis (mirip dengan menginstal sertifikat Enkripsi Let's) di situs IIS di Windows Server).

Instal php-fpm dan modul php tambahan

Nginx tidak memiliki handler PHP bawaan, jadi kita harus menginstal php-fpm dan sejumlah modul php yang akan digunakan untuk memproses skrip PHP.

Php-fpm Ini adalah pengelola proses PHP yang sangat mudah dan cepat. Itu tidak menggunakan protokol HTTP (seperti apache), dan bekerja dengan protokol FastCGI khusus. Karena ringan dan sederhana, FPM memungkinkan Anda untuk memproses permintaan PHP lebih cepat. Dalam hal ini, dibandingkan dengan konfigurasi yang mirip dengan apache, lebih sedikit memori yang akan digunakan.

Nginx, pada gilirannya, memberikan keuntungan yang signifikan dalam statika pengembalian. Dalam konfigurasi kami, ngnix akan bertindak sebagai server proxy (caching dan server front-end), dan php-fpm akan bertindak sebagai backend.

Untuk menginstal versi terbaru dari php, gunakan repositori REMI:

# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

Setelah instalasi, edit file /etc/yum.repos.d/remi-php74.repo:

Mulai instalasi php-fpm dan modul php populer:

# yum instal php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-opcache php-pear php-xml

Mulai layanan php-fpm dan tambahkan ke startup:

# systemctl mulai php-fpm
# systemctl aktifkan php-fpm

Dibuat symlink dari /etc/systemd/system/multi-user.target.wants/php-fpm.service ke /usr/lib/systemd/system/php-fpm.service.

Untuk memeriksa apakah layanan telah dimulai, Anda dapat menjalankan perintah:

# lsof -i: 9000

PERINTAH PID PENGGUNA FD TYPE DEVICE SIZE / OFF NODE NAME php-fpm 1551 root 7u IPv4 2078435 0t0 TCP localhost: cslistener (LISTEN) php-fpm 1552 apache 9u IPv4 2078435 0t0 TCP localhost: cslistener (LISTEN) php-fpvpm 15 2078435 0t0 TCP localhost: cslistener (DENGARKAN) php-fpm 1554 apache 9u IPv4 2078435 0t0 TCP localhost: cslistener (LISTEN) php-fpm 1555 apache 9u IPv4 2078435 0t0 TCP localhost: cslistener (LISTEN) php-fpm 1556 apache TCP localhost: cslistener (LISTEN)

Layanan php-fpm perlu dijalankan melalui soket unix. Dalam file konfigurasi /etc/php-fpm.d/www.conf hapus baris dengarkan = 127.0.0.1:9000 dan tambahkan:

listen = /var/run/php-fpm/php-fpm.sock listen.mode = 0660 listen.owner = nginx listen.group = nginx

Untuk menjalankan php-fpm bukan dari pengguna apache (secara default), tentukan parameter berikut dalam file konfigurasi:

user = nginx group = nginx

Setelah mengubah konfigurasi php-fpm, Anda perlu memulai ulang layanan:

# systemctl restart php-fpm

Instal Let's Encrypt dan hubungkan sertifikat

Untuk mengeluarkan sertifikat Let's Encrypt gratis, Anda perlu menginstal certbot yang diperlukan.

# yum instal certbot

Lalu lakukan:

# certbot certonly

Setelah menjalankan perintah, Anda harus mengisi semua data, menentukan kotak surat, domain, dan sebagainya:

# certbot certonly

Menyimpan log debug ke /var/log/letsencrypt/letsencrypt.log Bagaimana Anda ingin mengautentikasi dengan ACME CA? -------------------------------------------------- ----------------------------- 1: Putar server web sementara (mandiri) 2: Tempatkan file di direktori webroot (webroot) - -------------------------------------------------- ---------------------------- Pilih nomor yang sesuai [1-2] lalu [masukkan] (tekan 'c' untuk membatalkan): 1 Plugin yang dipilih: Authenticator standalone, Installer None Masukkan alamat email (digunakan untuk pembaruan mendesak dan pemberitahuan keamanan) (Masukkan 'c' untuk membatalkan): [email protected] Memulai koneksi HTTPS baru (1): acme-v01.api.letsencrypt .org ------------------------------------------------ ------------------------------- Silakan baca Ketentuan Layanan di https://letsencrypt.org/documents/LE- SA-v1.1.1-Agustus-1-2016.pdf. Anda harus setuju untuk mendaftar dengan server ACME di https://acme-v01.api.letsencrypt.org/directory ----------------------- -------------------------------------------------- ------ (A) gree / (C) ancel: A --------------------------------- ---------------------------------------------- Apakah Anda bersedia untuk membagikan alamat email Anda dengan Electronic Frontier Foundation, mitra pendiri proyek Let's Encrypt dan organisasi nirlaba yang mengembangkan Certbot? Kami ingin mengirimi Anda email tentang EFF dan pekerjaan kami untuk mengenkripsi web, melindungi penggunanya, dan mempertahankan hak digital. -------------------------------------------------- ----------------------------- (Y) es / (N) o: N Silakan masukkan nama domain Anda (s) dipisahkan koma dan / atau spasi) (Masukkan 'c' untuk membatalkan): build-centos.info Memperoleh sertifikat baru Melakukan tantangan berikut: tls-sni-01 tantangan untuk build-centos.info Menunggu verifikasi ... Membersihkan tantangan PENTING CATATAN: - Selamat! Sertifikat dan rantai Anda telah disimpan di: /etc/letsencrypt/live/build-centos.info/fullchain.pem File kunci Anda telah disimpan di: /etc/letsencrypt/live/build-centos.info/privkey.pem Your cert akan kedaluwarsa pada 2018-01-24. Untuk mendapatkan versi baru atau tweak sertifikat ini di masa mendatang, jalankan saja certbot. Untuk memperbarui * semua * sertifikat Anda secara non-interaktif, jalankan "pembaruan certbot" - Kredensial akun Anda telah disimpan di direktori konfigurasi Certbot Anda di / etc / letsencrypt. Anda harus membuat cadangan yang aman dari folder ini sekarang. Direktori konfigurasi ini juga akan berisi sertifikat dan kunci pribadi yang diperoleh oleh Certbot sehingga membuat cadangan rutin folder ini sangat ideal. 

Agar sertifikat dikeluarkan dengan benar, domain Anda harus ada dan diarahkan ke server web yang sesuai.

Setelah mengeluarkan sertifikat, reboot server web nginx dan periksa hasilnya.

# systemctl restart nginx

Koneksi di browser aman.!

Untuk memperbarui sertifikat secara otomatis, ubah file konfigurasi /etc/letsencrypt/renewal/build-centos.info.conf sebagai berikut:

# renew_before_expiry = 30 hari
versi = 0.18.1
archive_dir = / etc / letsencrypt / archive / build-centos.info
cert = /etc/letsencrypt/live/build-centos.info/cert.pem
privkey = /etc/letsencrypt/live/build-centos.info/privkey.pem
chain = /etc/letsencrypt/live/build-centos.info/chain.pem
fullchain = /etc/letsencrypt/live/build-centos.info/fullchain.pem

# Opsi yang digunakan dalam proses pembaruan
[renewalparams]
authenticator = webroot
installer = Tidak Ada
akun = e9c86e6aa57b45f9614bc7c0015927a5
post_hook = nginx -s reload
[[webroot_map]]
www.build-centos.info = /var/www/build-centos.info
build-centos.info = /var/www/build-centos.info

Setelah mengubah file, tambahkan tugas ke mahkota:

30 2 * * * root / usr / bin / certbot renew --post-hook "nginx -s reload"

Untuk memverifikasi bahwa nginx berfungsi dengan php, saya membuat file index.php dan menambahkannya:

Instal MySQL / MariaDB di server web

Kami akan melewati langkah ini sepenuhnya, karena situs tersebut sudah memiliki artikel tentang pemasangan dan penyetelan MariaDB. Manfaatkan dia.

Mengkonfigurasi Nginx dan PHP-FPM untuk proyek beban tinggi

Agar server web Anda berfungsi dengan kinerja tinggi dan dapat memproses sejumlah besar permintaan dari klien, satu perangkat keras tidak cukup. Penting untuk mengkonfigurasi operasi dengan benar nginx dan php-fpm.

Pengaturan nginx

Buka file /etc/nginx/nginx.conf dan ubah konfigurasi Nginx sebagai berikut:

  • proses pekerja_ 2; - mengatur jumlah proses kerja sama dengan jumlah core di server.
  • koneksi pekerja_1024; - menentukan jumlah koneksi dalam satu alur kerja. Tetapkan nilai dari 1024 hingga 4096.
  • gunakan epoll; - metode koneksi optimal untuk Linux.
  • multi_menerima pada; - nginx akan menerima jumlah koneksi maksimum.

Blok Http:

  • tcp_nodelay aktif; - mengirim header dan memulai file dalam satu batch.
  • tcp_nopush aktif;

Untuk proyek yang berisi banyak file statis, pastikan untuk mengaktifkan kompresi gzip:

gzip aktif;

Tambahkan sejumlah besar tipe file sehingga semua pemeriksaan googlespeed lulus:
gzip_types application / atom + xml application / javascript text / javascript application / json application / ld + json application / manifest + json application / rss + xml application / vnd.geo + json font / ttf application / x-font-ttf application / vnd .ms-fontobject application / font-woff application / font-woff2 application / x-web-app-manifest + json application / xhtml + xml application / xml font / opentype image / bmp image / svg + xml image / x-icon text / cache-manifest text / css text / plain text / vcard text / vnd.rim.location.xloc text / vnd.wap.wml text / vtt text / teks x-komponen / x-cross-domain-policy;

Pengaturan kompresi akan mempercepat proyek Anda.

  • keepalive_timeout 30; - server web akan menunggu 30 detik sebelum menutup koneksi keepalive
  • keepalive_requests 100; - jumlah maksimum permintaan keepalive dari satu klien
  • reset_timedout_connection on; - aktifkan opsi ini jika Anda tidak ingin koneksi dari klien yang berhenti merespons diatur ulang.
  • client_body_timeout 10; - server web akan menunggu 10 detik untuk konfirmasi permintaan dari klien, setelah waktu ini, koneksi akan diatur ulang.
  • send_timeout 2; - jika klien berhenti membaca respons dari server web, nginx akan mengatur ulang koneksi dengannya.

Jika situs Anda tidak menyediakan untuk mengunduh file besar, batasi ini untuk nginx:

  • client_max_body_size 2m; - server tidak akan menerima permintaan lebih dari 2 MB.

Jika konten pada proyek Anda tidak sering berubah, Anda dapat menggunakan caching "kedaluwarsa maks;"Atau tambahkan opsi yang sesuai ke file konfigurasi host Anda untuk jenis file yang diinginkan, misalnya:

lokasi ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $
kedaluwarsa 7d;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Cache untuk jenis file yang ditentukan akan disimpan selama 7 hari. Anda dapat mengontrol cache menggunakan fungsi ini. Setelah semua modifikasi, jangan lupa untuk me-restart nginx:

# systemctl restart nginx

Pengaturan php-fpm

Saat memasang php-fpm, Anda segera mentransfernya ke soket unix. Ini memberikan peningkatan signifikan dalam produktivitas. Menurut perkiraan, produktivitas tumbuh 2-3 kali lipat. Parameter php-fpm lainnya perlu dikonfigurasikan untuk setiap proyek secara terpisah, pertimbangkan contoh pengaturan untuk server dengan memori 1024 MB.

Untuk php-fpm kita dapat mengalokasikan sekitar 512 mb, meninggalkan sisanya di bawah basis data dan nginx.

Untuk file konfigurasi /etc/php-fpm/www.conf, tambahkan:

  • pm.max_children = 18 - jumlah maksimum proses anak
  • pm.start_servers = 6 - jumlah proses anak yang dibuat saat startup
  • pm.min_spare_servers = 4 - jumlah minimum proses server tidak aktif
  • pm.max_spare_servers = 16 - jumlah maksimum proses server tidak aktif
  • pm.max_requests = 400 - jumlah permintaan proses anak setelah proses akan dimulai kembali.

Semua parameter harus diubah ketika menganalisis beban pada proyek Anda, nilai-nilai ini bersifat teoritis.

Di server saat ini, saya segera menginstal CMS Bitrix versi terbaru, untuk menguji kinerja. Menurut pendapat saya, ini adalah CMS yang paling intensif sumber daya dan hasilnya tidak buruk, mengingat ini adalah mesin virtual pada KVM dengan satu inti (vCPU) dan 1024 RAM:

Saya tidak mengecat optimasi pengaturan MariaDB, karena ada artikel yang sesuai di situs. Saya membentuk parameter untuk my.cnf menurut artikel dan database menunjukkan hasil yang sangat baik.

Ketika Anda memulai situs, Anda akan melihat dengan mata telanjang bahwa nginx + php-fpm akan memproses permintaan Anda dan mengembalikan halaman lebih cepat daripada apache2 + mod_php. Jika Anda memiliki kesempatan untuk melakukan tes stres selama pengaturan server, maka ini tidak diragukan lagi akan menjadi nilai tambah, tetapi jika ini tidak mungkin, Anda dapat mengubah pengaturan untuk sumber daya Anda berdasarkan manual kami.