SSD Nodes Learn
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-07-24

cara pasang LAMP stack Ubuntu 24.04 PHP-FPM

Panduan lengkap pasang Apache, MariaDB, dan PHP 8.3 dengan PHP-FPM di Ubuntu 24.04. Pelajari cara elak ralat halaman kosong dan cara guna Certbot untuk HTTPS.

Apa yang anda bina

Stack LAMP terdiri daripada empat komponen pada satu pelayan Ubuntu 24.04: Linux sebagai sistem asas, Apache untuk melayan HTTP, MariaDB untuk menyimpan data, dan PHP 8.3 untuk menjalankan kod. Pada akhir tutorial ini, anda akan mempunyai virtual host berasaskan nama yang melayan direktori aplikasi sebenar, pangkalan data dengan pengguna hak istimewa terendah yang khusus, PHP yang disambungkan ke Apache melalui PHP-FPM, dan sijil Let's Encrypt percuma.

Proses pemasangan hanya melibatkan empat arahan apt. Hampir keseluruhan panduan ini adalah mengenai penyambungan antara komponen tersebut, serta ralat kecil yang menyebabkan stack baharu memaparkan halaman kosong, memuat turun kod sumber ke pelayar, atau menghalang akses ke pangkalan data yang baru dipasang. Setiap ralat tersebut mempunyai tanda unik yang boleh dikenali, dan setiap satunya disenaraikan di bawah dengan teks tepat yang akan anda lihat.

Prasyarat dan perkara penting yang perlu diperhatikan

Anggap anda menggunakan VPS Ubuntu 24.04 KVM yang baru dengan pengguna sudo atau root, dan alamat IPv4 awam. Stak minimal boleh berjalan dalam 1 GB RAM; berikan 2 GB sebelum anda memasang aplikasi dengan pangkalan data sebenar, kerana buffer lalai MariaDB dan beberapa pekerja PHP-FPM akan menggunakan 1 GB pertama dengan cepat.

Dua perkara mesti dipenuhi sebelum Certbot boleh berfungsi di akhir tutorial ini, jadi sediakan perkara berikut sekarang. Anda memerlukan nama domain dengan rekod A yang menghala ke IP awam VPS — Let's Encrypt melakukan pengesahan melalui HTTP ke nama tersebut, dan alamat IP sahaja tidak boleh mendapatkan sijil. Selain itu, port 80 dan 443 mesti boleh dicapai dari internet, yang mana bagi banyak penyedia bermaksud anda perlu membukanya dalam firewall rangkaian di panel kawalan serta dalam ufw pada pelayan. Perubahan DNS boleh mengambil masa sehingga satu jam untuk tersebar, jadi tetapkan rekod A terlebih dahulu dan ia akan aktif menjelang waktu anda memerlukannya.

Langkah 1 - Pasang Apache dan sahkan halaman lalai

sudo apt update
sudo apt install -y apache2

apt memulakan dan mengaktifkan perkhidmatan tersebut untuk anda. Semak statusnya:

systemctl status apache2

Anda perlu melihat baris active (running). Sekarang buka http://YOUR_SERVER_IP/ dalam pelayar web. Apache2 Ubuntu Default Page dengan banner besar "It works!" adalah hasil yang betul — ini membuktikan Apache sedang berfungsi, bukan satu ralat. Halaman tersebut berada di /var/www/html/index.html dan disajikan oleh virtual host lalai 000-default.conf. Anda akan menyahaktifkan kedua-duanya kemudian; buat masa ini, kewujudan halaman tersebut adalah apa yang anda perlukan.

Jika halaman tidak dapat dimuatkan langsung tetapi systemctl menyatakan proses sedang berjalan, firewall menghalang sambungan tersebut. Itu adalah langkah seterusnya.

Langkah 2 - Buka firewall untuk HTTP dan HTTPS

Pakej apache2 mendaftarkan tiga profil aplikasi ufw. Senaraikannya:

sudo ufw app list

Anda akan melihat Apache, Apache Full, dan Apache Secure. Apache adalah untuk port 80 sahaja, Apache Secure adalah untuk port 443 sahaja, dan Apache Full adalah untuk kedua-duanya — itulah yang anda perlukan kerana anda akan menambah TLS kemudian.

sudo ufw allow OpenSSH
sudo ufw allow "Apache Full"
sudo ufw enable

Benarkan OpenSSH sebelum anda menjalankan ufw enable. ufw secara lalai akan menyekat semua trafik masuk, dan mengaktifkannya tanpa peraturan SSH akan memutuskan sambungan anda sendiri sebaik sahaja ia diaktifkan — sesi semasa masih kekal tetapi anda tidak boleh menyambung semula. Sahkan dengan sudo ufw status; anda memerlukan OpenSSH, Apache Full, dan setara v6 mereka semuanya menunjukkan ALLOW.

Step 3 - Pasang MariaDB dan amankan ia

sudo apt install -y mariadb-server
systemctl status mariadb

Ubuntu 24.04 menyertakan MariaDB 10.11, iaitu versi sokongan jangka panjang (LTS), jadi anda tidak memerlukan repositori luaran. Apabila perkhidmatan sedang berjalan, lakukan pengukuhan:

sudo mysql_secure_installation

Sila baca setiap arahan yang muncul dan jangan hanya menekan Enter. Apabila ia meminta current root password, tekan Enter — belum ada kata laluan lagi. Apabila ia bertanya "Switch to unix_socket authentication?", jawapannya tidak mengubah apa-apa kerana ia sudah diaktifkan pada pakej ini, jadi tekan n. Pilih n untuk "Change the root password?" atas sebab yang dinyatakan dalam perenggan seterusnya, kemudian jawab Y untuk selebihnya: buang pengguna tanpa nama (anonymous users), larang log masuk root dari jauh, buang pangkalan data ujian, dan muat semula jadual keistimewaan (privilege tables).

Ini adalah bahagian yang mengelirukan ramai orang. Pada MariaDB Ubuntu, akaun pangkalan data root menggunakan pengesahan unix_socket, bukan kata laluan. Ini bermakna pangkalan data mempercayai pengguna sistem-operasi yang telah anda sahkan sebelum ini. Oleh itu, ia berfungsi dari shell root:

sudo mysql

...dan ia akan membawa anda ke prompt MariaDB [(none)]> tanpa meminta kata laluan. Perintah yang sama jika dijalankan sebagai pengguna biasa akan ditolak, dan itulah tujuannya: akses ke root pangkalan data terikat kepada sudo pada mesin tersebut, dan tiada kata laluan untuk dicuri, difish, atau diserang secara brute-force. Ini lebih selamat daripada kata laluan, jadi biarkan sahaja. Peraturan yang terhasil daripadanya: jangan sesekali halakan aplikasi ke akaun root. Cipta pengguna khas untuk setiap aplikasi (Step 7), kerana aplikasi yang menyambung melalui TCP dengan nama pengguna dan kata laluan tidak boleh menggunakan pengesahan socket, dan anda mahu setiap aplikasi dihadkan kepada pangkalan datanya sendiri.

Langkah 4 - Pasang PHP 8.3 dengan PHP-FPM

PHP lalai bagi Ubuntu 24.04 ialah 8.3. Pasang pengurus proses FPM dan sambungan (extensions) yang diperlukan oleh aplikasi tipikal:

sudo apt install -y php8.3-fpm php8.3-mysql php8.3-cli \
  php8.3-curl php8.3-xml php8.3-mbstring php8.3-zip

Perhatikan apa yang tidak ada dalam senarai tersebut: libapache2-mod-php. Pakej lama itu memasukkan interpreter PHP ke dalam setiap proses Apache. Ia ringkas, tetapi setiap worker membawa salinan PHP sama ada ia melayani skrip atau imej statik, kedua-duanya berkongsi kitaran hayat, dan ia hanya berfungsi dengan MPM prefork Apache — yang paling tidak cekap. Sebaliknya, PHP-FPM menjalankan PHP sebagai kumpulan proses sendiri yang berkomunikasi dengan Apache melalui socket. Apache kemudian boleh menggunakan MPM event yang berasaskan thread untuk fail statik dan hanya menghantar permintaan PHP sahaja, kumpulan tersebut ditala secara bebas daripada pelayan web, dan tetapan FPM yang sama boleh digunakan jika anda meletakkan nginx di hadapan kemudian. Ia adalah tetapan lalai semasa atas sebab yang kukuh.

Apache menghubungi FPM melalui modul proxy_fcgi. Aktifkan modul tersebut, aktifkan konfigurasi yang disertakan oleh pakej FPM, dan mulakan semula:

sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.3-fpm
sudo systemctl restart apache2

a2enconf php8.3-fpm mengaktifkan /etc/apache2/conf-available/php8.3-fpm.conf, yang mengandungi peraturan untuk menghalakan fail PHP ke socket FPM. Inti utamanya memadankan mana-mana fail .php dan menghantarnya ke socket di /run/php/php8.3-fpm.sock:

<FilesMatch ".+\.ph(ar|p|tml)$">
    SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>

Anda tidak perlu menyunting fail tersebut; ia sudah dikonfigurasi dengan betul. Namun, mengetahui laluan socket tersebut membolehkan anda mendiagnosis kegagalan "PHP dimuat turun dan bukannya dijalankan" serta "Primary script unknown" kemudian — kedua-duanya berpunca daripada ketidaksetujuan antara Apache dan FPM mengenai socket ini atau fail di belakangnya.

Langkah 5 - Virtual host berasaskan nama untuk aplikasi anda

Virtual hosting berasaskan nama membolehkan satu IP melayani banyak laman web; Apache memilih laman web berdasarkan pengepala Host: dalam permintaan. Buat satu direktori untuk aplikasi, jauh daripada /var/www/html lalai:

sudo mkdir -p /var/www/testapp
sudo chown -R www-data:www-data /var/www/testapp
sudo chmod -R 755 /var/www/testapp

Pemilikan adalah penting. Apache dan PHP-FPM kedua-duanya berjalan sebagai pengguna www-data pada Ubuntu, jadi fail yang perlu dibaca oleh pelayan web — dan direktori yang perlu ditulis oleh aplikasi, seperti folder muat naik — harus dimiliki oleh www-data. Jika anda juga akan menyunting fail sebagai pengguna log masuk anda, corak biasa adalah dengan memiliki fail tersebut sendiri dan menambah pengguna anda ke kumpulan www-data; untuk penggunaan biasa, www-data:www-data adalah pilihan yang paling stabil.

Cipta virtual host di /etc/apache2/sites-available/testapp.conf:

<VirtualHost *:80>
    ServerName app.example.com
    DocumentRoot /var/www/testapp

    <Directory /var/www/testapp>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/testapp-error.log
    CustomLog ${APACHE_LOG_DIR}/testapp-access.log combined
</VirtualHost>

Tetapkan ServerName kepada domain sebenar anda. Options -Indexes menghalang Apache daripada menyenaraikan direktori apabila tiada fail index — jika tidak, pelawat boleh melayari struktur sumber anda. AllowOverride All membolehkan fail .htaccess berfungsi, yang diperlukan oleh kebanyakan aplikasi PHP untuk URL yang kemas; buang fail tersebut ke None untuk peningkatan kelajuan jika aplikasi anda tidak memerlukannya. Aktifkan laman ini, nyahaktifkan yang lalai, semak konfigurasi, dan muat semula:

sudo a2ensite testapp
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2

apache2ctl configtest sepatutnya memaparkan Syntax OK. Baris a2dissite 000-default adalah baris yang sering dilupakan, dan itulah sebabnya halaman lalai kelihatan tersangkut kemudian — dibincangkan dalam bahagian kegagalan.

Langkah 6 - Buktikan PHP berjalan, kemudian padam bukti tersebut

Letakkan fail PHP satu baris ke dalam root aplikasi:

echo "<?php phpinfo();" | sudo tee /var/www/testapp/info.php

Layari http://app.example.com/info.php. Hasil yang betul ialah jadual PHP Version 8.3.x berwarna ungu dan kelabu yang menyenaraikan modul yang dimuatkan, dengan baris Server API menunjukkan FPM/FastCGI. Baris terakhir itu mengesahkan permintaan dihantar melalui PHP-FPM, bukan mod_php.

Sekarang padam fail tersebut dengan segera:

sudo rm /var/www/testapp/info.php

phpinfo() mendedahkan versi PHP tepat anda, setiap sambungan yang dimuatkan, laluan fail, dan butiran persekitaran — ini memudahkan sesiapa sahaja yang menyiasat pelayan untuk mencari versi dengan kerentanan diketahui. Ini adalah ujian, bukan ciri fungsi. Padam fail tersebut sebaik sahaja anda melihat halaman tersebut. Jika pelayar anda menawarkan untuk muat turun info.php dan bukannya memaparkan jadual, PHP tidak disambungkan ke Apache; rujuk bahagian kegagalan sebelum melakukan perkara lain.

Step 7 - Cipta pangkalan data aplikasi dan pengguna dengan hak akses minimum

Buka pangkalan data sebagai root yang diautentikasi melalui socket:

sudo mysql

Kemudian cipta satu pangkalan data dan satu pengguna yang dihadkan hanya kepada pangkalan data tersebut:

CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Terdapat tiga pilihan sengaja di sini. utf8mb4 adalah UTF-8 empat-bait yang sebenar — alias utf8 yang lama akan memotong emoji dan beberapa aksara CJK secara senyap, jadi sentiasa gunakan utf8mb4. Pemberian hak adalah pada appdb.*, bukan *.*: pengguna ini hanya boleh mengakses pangkalan datanya sendiri dan tiada yang lain, supaya lubang SQL-injection pada aplikasi tidak boleh membaca jadual laman web lain. Dan 'appuser'@'localhost' mengehadkan akaun kepada sambungan yang berasal dari mesin itu sendiri.

Uji sebagai pengguna tersebut:

mysql -u appuser -p appdb

Ia akan meminta kata laluan dan membawa anda ke prompt MariaDB [appdb]>. Perhatikan bahawa tiada flag -h — biarkan ia kosong dan klien akan menyambung melalui Unix socket tempatan, yang mana MariaDB menganggapnya sebagai localhost. Satu perkara penting untuk diketahui: bagi MySQL dan MariaDB, localhost bermaksud Unix socket dan 127.0.0.1 bermaksud sambungan TCP. Pada MariaDB Ubuntu 24.04 standard, pelayan masih menyelesaikan sambungan TCP daripada 127.0.0.1 kembali ke localhost, jadi kedua-duanya sepadan dengan akaun tersebut — tetapi pada pelayan dengan skip-name-resolve diaktifkan (pelarasan prestasi biasa, dan norma dalam banyak imej kontena), kedua-duanya dipadankan sebagai hos yang berbeza, dan aplikasi yang memanggil 127.0.0.1 akan ditolak dengan ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1' (using password: YES) walaupun kata laluan adalah betul.

Jadi tetapkan aplikasi anda pada hos localhost, pengguna appuser, pangkalan data appdb — jangan sesekali gunakan root. mysqli PHP dan PDO kedua-duanya bertukar ke Unix socket apabila hos adalah rentetan literal localhost, yang sepadan dengan akaun yang baru anda cipta. Jika sesuatu rangka kerja (framework) memerlukan hos TCP bernombor, cipta pengguna mengikut cara ia menyambung — 'appuser'@'127.0.0.1', atau @'%' (bersama dengan peraturan firewall) hanya jika ia perlu mencapai pangkalan data dari mesin lain.

Langkah 8 - Tambah HTTPS dengan Certbot

Menghantar borang log masuk melalui HTTP biasa menghantar kata laluan dalam teks biasa, dan setiap pelayar moden akan menandakan halaman tersebut sebagai "Not secure". Certbot menyelesaikan masalah ini dengan satu arahan. Pasang Certbot dengan plugin Apache:

sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache

Certbot menggunakan dua plugin di sini. apache authenticator membuktikan anda mengawal domain tersebut dengan menghantar fail cabaran secara ringkas melalui Apache yang sedang berjalan, manakala apache installer akan menulis semula virtual host anda untuk menambah blok 443, menghalakan ia ke sijil baharu, dan mengalihkan semua trafik HTTP ke HTTPS secara lalai — sejak Certbot 2.0, tiada lagi soalan pengalihan; gunakan --no-redirect jika anda perlu terus menghantar HTTP biasa. Oleh sebab anda telah menetapkan ServerName yang sebenar dalam Langkah 5, Certbot akan mengesan domain secara automatik. Sijil sah selama 90 hari dan pakej ini memasang timer systemd untuk memperbaharuinya; sahkan timer tersebut dengan sudo certbot renew --dry-run, yang sepatutnya berakhir dengan Congratulations, all simulated renewals succeeded.

Untuk panduan lengkap mengenai cabaran, timer pembaharuan, serta keperluan DNS dan firewall, lihat panduan sampingan pada mengeluarkan sijil TLS Let's Encrypt percuma dengan Certbot pada Apache.

Backups, upgrades, and hardening

Sandarkan dua perkara yang menyimpan keadaan sistem anda: pangkalan data dan web root. Melakukan logical dump setiap malam adalah pendekatan paling mudah dan boleh dipercayai — sudo sh -c 'mysqldump --all-databases --single-transaction | gzip > /root/db-$(date +%F).sql.gz', kemudian salin keluar dari pelayan. Menggunakan sudo sh -c untuk keseluruhan saluran paip adalah penting: tanpa ia, shell akan menjalankan > /root/... redirect sebagai pengguna anda sendiri dan gagal dengan Permission denied, kerana hanya mysqldump yang mewarisi sudo. --single-transaction memberikan snapshot konsisten bagi jadual InnoDB tanpa mengunci jadual tersebut. Padankan ia dengan tar bagi /var/www dan /etc/apache2/sites-available, dan anda boleh membina semula keseluruhan stack pada VPS baharu menggunakan fail tersebut.

Naik taraf adalah sudo apt update && sudo apt upgrade yang biasa. Masalah utama ialah peningkatan versi PHP — apabila Ubuntu masa hadapan menukar tetapan lalai kepada PHP 8.4, apt mungkin memasang php8.4-fpm bersama 8.3, soket menjadi /run/php/php8.4-fpm.sock, manakala konfigurasi Apache anda masih merujuk kepada soket 8.3. Aktifkan conf baharu (sudo a2enconf php8.4-fpm) dan nyahaktifkan yang lama, atau laman web anda akan mula memulangkan Primary script unknown selepas proses naik taraf rutin. Oleh sebab versi PHP berubah lebih pantas daripada distro LTS, semak nota keluaran PHP semasa daripada menetapkan versi patch secara tetap.

Dua langkah pengukuhan (hardening) perlu dilakukan pada hari pertama. Pertama, pasang Fail2Ban untuk memantau SSH pada pelayan — VPS awam akan menerima percubaan log masuk automatik dalam masa beberapa minit, dan jail yang kecil akan menukarkan ribuan percubaan kepada hanya beberapa sahaja sebelum sekatan (ban) dikenakan. Kedua, jika anda lebih suka mengurus Apache virtual hosts, pangkalan data MariaDB, dan pengguna melalui pelayar berbanding menyunting fail secara manual, panel kawalan berasaskan web Webmin berfungsi di atas stack yang sama dan mengendalikan fail konfigurasi yang sama yang anda tulis. Kedua-duanya tidak menggantikan pemahaman tentang komponen sistem, tetapi kedua-duanya mengurangkan beban kerja harian.

Mod kegagalan, dengan rentetan teks yang akan anda lihat

Halaman lalai tidak hilang. Anda telah menyunting virtual host, melakukan reload, tetapi pelayar masih memaparkan "Apache2 Ubuntu Default Page" dan banner "It works!". Apache melayani virtual host pertama yang sepadan, dan apabila tiada ServerName sepadan dengan permintaan, konfigurasi pertama mengikut urutan abjad akan menang — 000-default.conf disusun sebelum testapp.conf. Sama ada nama hos permintaan tidak sepadan dengan ServerName anda, atau anda tidak menjalankan sudo a2dissite 000-default. Matikan mod lalai, sudo systemctl reload apache2, dan sahkan dengan apache2ctl -S, yang memaparkan peta vhost dan menunjukkan konfigurasi mana yang memiliki mod lalai tersebut. Kosongkan cache pelayar juga; status 200 yang tersimpan daripada halaman lama akan kekal muncul.

Fail .php dimuat turun dan bukannya dijalankan. Anda membuka info.php dan pelayar memuat turun fail yang mengandungi kod sumber <?php mentah, atau memaparkannya sebagai teks biasa, dan bukannya menjalankan fail tersebut. Apache melayani fail itu sebagai aset statik kerana pemproses (handler) PHP tidak disambungkan — anda telah melangkau sudo a2enmod proxy_fcgi, atau sudo a2enconf php8.3-fpm, atau tidak memulakan semula Apache selepas itu. Jalankan ketiga-tiga langkah tersebut (Langkah 4) dan muat semula. Sahkan modul telah dimuat dengan apache2ctl -M | grep fcgi, yang sepatutnya menyenaraikan proxy_fcgi_module. Ini adalah kebocoran kod sumber, bukan pepijat kosmetik, jadi perbaikinya sebelum meletakkan sebarang data sebenar pada pelayan.

ERROR 1698 (28000): Access denied for user 'root'@'localhost'. Anda menjalankan mysql -u root atau mariadb -u root tanpa sudo. Akaun root menggunakan pengesahan unix_socket, jadi ia hanya menerima anda apabila pengguna OS anda adalah root. Penyelesaiannya ialah sudo mysql — tiada -u root, tiada kata laluan. Mesej ini adalah tingkah laku yang dijangka bagi pengesahan socket yang berfungsi dengan betul, bukannya pemasangan yang rosak.

ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1' daripada aplikasi, dengan kata laluan yang betul. Akaun wujud sebagai 'appuser'@'localhost', tetapi aplikasi anda menyambung melalui TCP ke 127.0.0.1 pada pelayan di mana resolusi nama hos telah dimatikan (skip-name-resolve), jadi MariaDB menganggap kedua-duanya sebagai hos yang berbeza — localhost adalah socket Unix, 127.0.0.1 adalah TCP. Halakan aplikasi ke hos localhost supaya ia menggunakan socket dan sepadan dengan akaun tersebut, atau cipta akaun kedua 'appuser'@'127.0.0.1' jika rangka kerja (framework) hanya menyokong TCP.

AH01071: Got error 'Primary script unknown' dalam /var/log/apache2/testapp-error.log, dengan pelayar memaparkan File not found.. Apache menyerahkan permintaan kepada PHP-FPM, tetapi FPM tidak dapat menemui skrip pada laluan yang diberikan oleh Apache. Dua punca biasa: socket FPM dalam konfigurasi anda merujuk kepada versi PHP yang tidak dipasang (socket php8.4 selepas naik taraf sedangkan hanya 8.3 yang berjalan), atau fail tersebut memang tiada kerana DocumentRoot dan direktori sebenar tidak sepadan. Semak sama ada socket wujud dengan ls -l /run/php/, sahkan DocumentRoot sepadan dengan lokasi fail, dan mulakan semula php8.3-fpm dan apache2.

AH00558: apache2: Could not reliably determine the server's fully qualified domain name pada setiap permulaan semula. Ini adalah amaran yang tidak berbahaya, bukan ralat — Apache memberitahu anda bahawa tiada ServerName global yang ditetapkan. Senyapkan amaran ini dengan menulis ServerName your.domain ke dalam /etc/apache2/conf-available/servername.conf dan menjalankan sudo a2enconf servername.

(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80 apabila Apache bermula. Web server lain sudah menggunakan port 80 — selalunya nginx yang tertinggal daripada eksperimen sebelum ini. Cari ia dengan sudo ss -ltnp | grep :80, kemudian hentikan dan matikan servis lain tersebut sebelum memulakan Apache.

FAQ

mod_php atau PHP-FPM - yang mana patut saya gunakan?

Gunakan PHP-FPM. mod_php memasukkan interpreter ke dalam setiap proses Apache dan memaksa penggunaan MPM prefork yang perlahan, jadi Apache menanggung beban PHP walaupun semasa menghantar imej statik. PHP-FPM menjalankan PHP sebagai kolam (pool) berasingan yang ditala secara bebas yang diakses oleh Apache melalui soket, berfungsi dengan MPM event yang lebih pantas, dan boleh dipindahkan ke nginx kemudian tanpa perubahan. Ia adalah tetapan lalai moden; mod_php hanya sesuai untuk aplikasi warisan yang bergantung pada tingkah laku dalam proses (in-process).

Mengapa pelayar saya memuat turun fail PHP dan bukannya menjalankannya?

Apache melayan fail .php sebagai muat turun statik kerana tiada pemegang (handler) PHP yang disambungkan kepadanya. Pada Ubuntu 24.04 dengan FPM, ini bermakna anda terlepas salah satu daripada sudo a2enmod proxy_fcgi, sudo a2enconf php8.3-fpm, atau memulakan semula Apache selepas itu. Jalankan ketiga-tiganya dan muat semula, kemudian sahkan dengan apache2ctl -M | grep fcgi bahawa proxy_fcgi_module disenaraikan. Selagi ia tidak dibaiki, pelayan sedang membocorkan kod sumber, jadi selesaikan dengan segera.

Mengapa akses root ditolak dalam MariaDB walaupun dengan kata laluan yang betul?

Kerana tiada kata laluan — MariaDB pada Ubuntu mengesahkan akaun root melalui unix_socket, yang menghubungkannya dengan pengguna root sistem operasi. mysql -u root daripada shell biasa akan mengembalikan ERROR 1698 (28000): Access denied for user 'root'@'localhost' mengikut reka bentuk asal. Gunakan sudo mysql sebagai ganti, dan cipta pengguna dengan pengesahan kata laluan berasingan untuk mana-mana aplikasi daripada menggunakan semula root.

Bagaimanakah saya menambah HTTPS pada laman LAMP saya?

Pasang certbot dan python3-certbot-apache, halakan rekod A domain ke pelayan, kemudian jalankan sudo certbot --apache. Pengesah Apache membuktikan kawalan domain melalui Apache yang sedang berjalan dan pemasang akan menulis semula virtual host untuk port 443 serta menetapkan pembaharuan automatik. Panduan lengkap Certbot dan Apache merangkumi cabaran tersebut, pemasa pembaharuan, dan mod kegagalan biasa.

#lamp#apache#mariadb#php-fpm#ubuntu