SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-08-07

Cara Pasang LAMP Stack di Ubuntu 24.04 dengan PHP-FPM

Panduan lengkap memasang Apache, MariaDB, dan PHP 8.3 di Ubuntu 24.04. Ketahui cara mengkonfigurasi PHP-FPM, virtual host, serta penyediaan sijil SSL percuma melalui Certbot.

Apa yang anda sedang bina

LAMP stack terdiri daripada empat komponen yang berfungsi pada satu pelayan Ubuntu 24.04: Linux sebagai asas, Apache untuk menjawab permintaan HTTP, MariaDB untuk menyimpan data, dan PHP 8.3 untuk menjalankan kod. Menjelang akhir panduan ini, anda akan mempunyai virtual host berasaskan nama yang melayani direktori aplikasi sebenar, pangkalan data dengan pengguna khusus yang mempunyai keistimewaan minimum, PHP yang disambungkan ke Apache melalui PHP-FPM, serta sijil Let's Encrypt percuma yang melindunginya.

Proses pemasangan itu sendiri hanya memerlukan empat arahan apt. Hampir semua perkara dalam panduan ini adalah mengenai penyambungan antara komponen tersebut, serta kesilapan kecil yang sering menyebabkan stack baharu memaparkan halaman kosong, menghantar kod sumber anda ke pelayar sebagai muat turun, atau menghalang anda daripada mengakses pangkalan data yang baru dipasang. Setiap masalah tersebut mempunyai tanda yang boleh anda kenali, dan setiap satunya dinamakan di bawah dengan teks tepat yang akan anda lihat.

Prasyarat dan perkara penting yang perlu diketahui

Andaikan anda menggunakan VPS KVM Ubuntu 24.04 yang baharu dengan pengguna sudo atau root, serta alamat IPv4 awam. Tindanan minimum boleh berjalan dengan 1 GB RAM; sediakan 2 GB sebelum anda menjalankan aplikasi berasaskan pangkalan data yang sebenar, kerana penimbal lalai MariaDB serta beberapa pekerja PHP-FPM akan menghabiskan 1 GB pertama dengan cepat.

Dua perkara perlu dipenuhi sebelum Certbot boleh berfungsi pada akhir proses, jadi pastikan ia tersedia sekarang. Anda memerlukan nama domain dengan rekod A yang menghala ke IP awam VPS tersebut. Let's Encrypt melakukan pengesahan melalui HTTP ke nama tersebut, dan alamat IP sahaja tidak boleh mendapatkan sijil. Selain itu, port 80 dan 443 mestilah boleh dicapai dari internet. Bagi kebanyakan penyedia, ini bermakna anda perlu membukanya dalam firewall rangkaian di panel kawalan serta dalam ufw pada pelayan tersebut. Perubahan DNS boleh mengambil masa sehingga satu jam untuk disebarkan, jadi tetapkan rekod A terlebih dahulu supaya ia sudah aktif apabila anda memerlukannya.

Langkah 1 - Pasang Apache dan sahkan halaman lalai

sudo apt update
sudo apt install -y apache2

apt memulakan dan mendayakan servis tersebut untuk anda. Semaknya:

systemctl status apache2

Anda mahukan baris yang menyatakan active (running). Sekarang, buka http://YOUR_SERVER_IP/ dalam pelayar web. Apache2 Ubuntu Default Page dengan sepanduk besar "It works!" adalah hasil yang betul; ia merupakan bukti bahawa Apache sedang beroperasi dan bukannya satu ralat. Halaman tersebut terletak di /var/www/html/index.html dan dihidangkan oleh hos maya lalai yang disertakan, iaitu 000-default.conf. Anda akan menyahdayakan kedua-duanya kemudian; buat masa ini, kehadirannya adalah perkara yang anda ingin lihat.

Jika halaman tersebut tidak dimuatkan langsung tetapi systemctl menyatakan proses tersebut sedang berjalan, bermakna firewall sedang menghalangnya. 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 hanya untuk port 80, Apache Secure hanya untuk 443, dan Apache Full adalah kedua-duanya. Ini adalah pilihan yang anda perlukan kerana anda akan menambah TLS pada penghujungnya.

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

Benarkan OpenSSH sebelum anda menjalankan ufw enable. ufw secara lalai menolak semua trafik masuk. Mengaktifkannya tanpa peraturan SSH akan memutuskan sambungan anda sebaik sahaja ia diaktifkan; anda mungkin mengekalkan sesi semasa tetapi tidak akan dapat menyambung semula. Sahkan dengan sudo ufw status; anda mahu OpenSSH, Apache Full, dan setara v6 masing-masing menunjukkan ALLOW.

Langkah 3 - Pasang MariaDB dan jadikannya selamat

sudo apt install -y mariadb-server
systemctl status mariadb

Ubuntu 24.04 membekalkan MariaDB 10.11, iaitu keluaran sokongan jangka panjang (LTS), jadi anda tidak memerlukan repositori luaran. Setelah servis berjalan, perketatkan keselamatannya:

sudo mysql_secure_installation

Arahan yang dipaparkan perlu dibaca dan bukannya sekadar menekan Enter berulang kali. Apabila ia meminta current root password, tekan Enter kerana belum ada kata laluan ditetapkan. Apabila ia bertanya "Switch to unix_socket authentication?", jawapannya tidak mengubah apa-apa kerana ia sudah didayakan pada pakej ini, jadi tekan n. Pilih n untuk "Change the root password?" atas sebab yang dinyatakan dalam perenggan seterusnya, kemudian jawab Y untuk soalan selebihnya: buang pengguna tanpa nama, larang log masuk root dari jauh, hapuskan pangkalan data ujian, dan muat semula jadual keistimewaan (privilege tables).

Ini adalah bahagian yang mengelirukan ramai orang. Pada MariaDB di Ubuntu, akaun pangkalan data root menggunakan pengesahan unix_socket, bukannya kata laluan. Ini bermakna pangkalan data mempercayai pengguna sistem pengendalian yang telah anda gunakan untuk log masuk. Oleh itu, arahan ini berfungsi daripada shell root:

sudo mysql

...dan ia akan membawa anda ke prompt MariaDB [(none)]> tanpa meminta kata laluan. Arahan yang sama jika dijalankan oleh pengguna biasa akan ditolak, dan itulah tujuan sebenarnya: akses kepada root pangkalan data terikat dengan sudo pada pelayan, dan tiada kata laluan yang boleh dicuri, dipancing (phish), atau diserang secara brute-force. Ini lebih selamat daripada kata laluan, jadi jangan ubah tetapan ini. Peraturan yang terhasil daripadanya ialah: jangan sekali-kali menggunakan akaun root untuk aplikasi. Cipta pengguna khusus bagi setiap aplikasi (Langkah 7), kerana aplikasi yang menyambung melalui TCP dengan nama pengguna dan kata laluan tidak boleh menggunakan pengesahan soket, dan anda perlu mengehadkan setiap aplikasi kepada pangkalan datanya sendiri sahaja.

Langkah 4 - Memasang PHP 8.3 dengan PHP-FPM

PHP lalai bagi Ubuntu 24.04 ialah 8.3. Pasang pengurus proses FPM dan sambungan yang biasanya diperlukan oleh aplikasi:

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 perkara yang tiada dalam senarai tersebut: libapache2-mod-php. Pakej lama itu membenamkan penterjemah PHP di dalam setiap proses Apache. Ia ringkas, tetapi setiap pekerja membawa salinan PHP sama ada ia melayan skrip atau imej statik, kedua-duanya berkongsi kitaran hayat yang sama, dan ia hanya berfungsi dengan MPM prefork Apache, iaitu yang paling kurang cekap. PHP-FPM sebaliknya menjalankan PHP sebagai kumpulan prosesnya sendiri yang berhubung dengan Apache melalui soket. Apache kemudian boleh menggunakan MPM event yang berbenang untuk fail statik dan hanya menyerahkan permintaan PHP, kumpulan tersebut ditala secara bebas daripada pelayan web, dan tetapan FPM yang sama berfungsi kemudian jika anda meletakkan nginx di hadapan. Ia merupakan lalai semasa atas sebab yang kukuh.

Apache mencapai FPM melalui modul proxy_fcgi. Dayakan modul tersebut, dayakan 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 soket FPM. Terasnya memadankan mana-mana fail .php dan memajukannya ke soket 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 dibekalkan dengan tetapan yang betul. Namun, mengetahui laluan soket membolehkan anda mendiagnosis kegagalan "PHP dimuat turun dan bukannya dijalankan" serta "Primary script unknown" kemudian hari, kerana kedua-duanya berpunca daripada Apache dan FPM yang tidak sepadan mengenai soket ini atau fail di sebaliknya.

Langkah 5 - Virtual host berasaskan nama untuk aplikasi anda

Virtual hosting berasaskan nama membolehkan satu alamat IP melayani banyak tapak web; Apache memilih tapak berdasarkan header Host: dalam permintaan tersebut. Cipta direktori untuk aplikasi tersebut, 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 dalam kumpulan www-data; untuk penggunaan biasa, www-data:www-data adalah pilihan yang paling mudah.

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 indeks, jika tidak, pelawat boleh melayari struktur sumber anda. AllowOverride All membolehkan fail .htaccess berfungsi, yang diperlukan oleh kebanyakan aplikasi PHP untuk URL yang kemas; tukar kepada None untuk sedikit peningkatan kelajuan jika aplikasi anda tidak memerlukannya. Aktifkan tapak ini, nyahaktifkan tapak 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 perkara yang sering dilupakan oleh pengguna, dan itulah sebabnya halaman lalai kelihatan tersekat kemudiannya, seperti yang dibincangkan dalam bahagian kegagalan.

Langkah 6 - Sahkan PHP berjalan, kemudian padamkan bukti tersebut

Letakkan fail PHP satu baris ke dalam direktori akar 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 panjang, yang menyenaraikan modul anda yang dimuatkan, dengan baris Server API memaparkan FPM/FastCGI. Baris terakhir itu mengesahkan bahawa permintaan sedang melalui PHP-FPM, bukan mod_php.

Sekarang, padamkannya dengan segera:

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

phpinfo() mendedahkan versi PHP anda yang tepat, setiap sambungan yang dimuatkan, laluan fail, dan butiran persekitaran; ini merupakan maklumat berharga kepada sesiapa sahaja yang mengimbas pelayan untuk mencari versi dengan kelemahan yang diketahui. Ia adalah ujian, bukan ciri. Padamkannya sebaik sahaja anda melihat halaman tersebut. Jika pelayar anda menawarkan untuk memuat turun info.php dan bukannya memaparkan jadual, bermakna PHP tidak disambungkan kepada Apache; beralih ke bahagian kegagalan sebelum melakukan apa-apa perkara lain.

Langkah 7 - Cipta pangkalan data aplikasi dan pengguna dengan keistimewaan minimum

Buka pangkalan data sebagai root yang disahkan melalui soket:

sudo mysql

Kemudian, cipta satu pangkalan data dan satu pengguna yang dikhususkan hanya untuk 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 ialah UTF-8 empat bait yang sebenar, alias utf8 lama akan memotong emoji dan beberapa aksara CJK secara senyap, jadi sentiasa gunakan utf8mb4. Pemberian kebenaran (grant) adalah pada appdb.*, bukan *.*: pengguna ini hanya boleh mengakses pangkalan datanya sendiri dan tiada yang lain, jadi kelemahan SQL-injection dalam aplikasi tidak boleh membaca jadual tapak lain. Dan 'appuser'@'localhost' mengehadkan akaun tersebut kepada sambungan yang datang dari pelayan itu sendiri.

Uji akaun tersebut sebagai pengguna berkenaan:

mysql -u appuser -p appdb

Ia akan meminta kata laluan dan membawa anda ke prompt MariaDB [appdb]>. Perhatikan bahawa tiada flag -h; jangan sertakannya supaya klien bersambung melalui soket Unix tempatan, yang merupakan perkara yang dianggap oleh MariaDB sebagai localhost. Satu perkara penting yang perlu diketahui: bagi MySQL dan MariaDB, localhost bermaksud soket Unix 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 kepada localhost, jadi kedua-duanya sepadan dengan akaun tersebut. Walau bagaimanapun, pada pelayan yang mempunyai skip-name-resolve diaktifkan (satu pelarasan prestasi biasa, dan norma dalam banyak imej kontena), kedua-duanya dianggap sebagai hos yang berbeza, dan aplikasi yang mendail 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.

Oleh itu, halakan aplikasi anda ke hos localhost, pengguna appuser, pangkalan data appdb, dan jangan sekali-kali ke root. mysqli dan PDO dalam PHP kedua-duanya bertukar kepada soket Unix apabila hos adalah rentetan literal localhost, yang sepadan dengan akaun yang baru anda cipta. Jika sesuatu rangka kerja (framework) memerlukan hos TCP berangka, cipta pengguna untuk sepadan dengan cara ia bersambung, iaitu 'appuser'@'127.0.0.1', atau @'%' (dipasangkan dengan peraturan firewall) hanya jika ia perlu mencapai pangkalan data dari mesin lain.

Langkah 8 - Tambah HTTPS dengan Certbot

Menghidangkan borang log masuk melalui HTTP biasa akan menghantar kata laluan dalam teks jelas, dan setiap pelayar moden akan melabelkan halaman tersebut sebagai "Not secure". Certbot menyelesaikan masalah ini dengan satu arahan. Pasang ia bersama pemalam Apache:

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

Certbot menggunakan dua pemalam di sini. apache authenticator membuktikan anda mengawal domain tersebut dengan menghidangkan fail cabaran secara ringkas melalui Apache yang sedang berjalan, dan apache installer kemudian menulis semula virtual host anda untuk menambah blok 443, menghalakannya ke sijil baharu, dan mengubah hala semua trafik HTTP ke HTTPS secara lalai. Sejak Certbot 2.0, tiada soalan mengenai ubah hala; gunakan --no-redirect jika anda perlu terus menghidangkan HTTP biasa. Kerana anda telah menetapkan ServerName yang sebenar dalam Langkah 5, Certbot mengesan domain tersebut secara automatik. Sijil bertahan selama 90 hari dan pakej ini memasang pemasa systemd yang memperbaharuinya; sahkan pemasa tersebut dengan sudo certbot renew --dry-run, yang sepatutnya berakhir dengan Congratulations, all simulated renewals succeeded.

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

Sandaran, naik taraf, dan pengukuhan

Lakukan sandaran bagi dua perkara yang menyimpan keadaan sistem anda: pangkalan data dan web root. Logical dump setiap malam merupakan pendekatan paling ringkas dan boleh dipercayai, sudo sh -c 'mysqldump --all-databases --single-transaction | gzip > /root/db-$(date +%F).sql.gz', yang kemudiannya disalin keluar dari pelayan. Membungkus keseluruhan talian paip dalam sudo sh -c adalah penting: tanpanya, shell akan menjalankan ubah hala > /root/... sebagai pengguna anda sendiri dan gagal dengan Permission denied, kerana hanya mysqldump yang mewarisi sudo. --single-transaction memberikan snapshot yang konsisten bagi jadual InnoDB tanpa menguncinya. Gandingkan ia dengan tar bagi /var/www dan /etc/apache2/sites-available, dan anda boleh membina semula keseluruhan tindanan pada VPS baharu daripada fail-fail tersebut.

Naik taraf adalah proses sudo apt update && sudo apt upgrade yang biasa. Perkara yang sering menimbulkan masalah ialah peningkatan versi PHP, apabila versi Ubuntu masa hadapan menukar lalai kepada PHP 8.4, apt mungkin memasang php8.4-fpm bersama-sama 8.3, soket menjadi /run/php/php8.4-fpm.sock, dan konfigurasi Apache anda masih menghala ke soket 8.3. Aktifkan konfigurasi baharu (sudo a2enconf php8.4-fpm) dan nyahaktifkan yang lama, jika tidak tapak anda akan mula memaparkan Primary script unknown selepas naik taraf yang sepatutnya rutin. Oleh kerana keluaran PHP bergerak lebih pantas daripada distro LTS, semak nota keluaran PHP semasa dan bukannya menetapkan versi patch secara statik.

Dua langkah pengukuhan wajar 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 mengurangkan ribuan percubaan kepada hanya beberapa sahaja sebelum sekatan dikenakan. Kedua, jika anda lebih gemar mengurus virtual host Apache, pangkalan data MariaDB, dan pengguna melalui pelayar berbanding menyunting fail secara manual, panel kawalan berasaskan web Webmin boleh diletakkan di atas tindanan yang sama ini dan mengurus fail konfigurasi yang baru anda tulis. Kedua-duanya tidak menggantikan keperluan untuk memahami komponen sistem, tetapi kedua-duanya mengurangkan beban kerja harian.

Mod kegagalan, berserta rentetan yang akan anda lihat

Halaman lalai tidak hilang. Anda telah menyunting virtual host anda, memuat semula, namun pelayar masih memaparkan "Apache2 Ubuntu Default Page" dan sepanduk "It works!". Apache menghidangkan virtual host padanan pertama, dan apabila tiada ServerName yang sepadan dengan permintaan tersebut, konfigurasi yang mengikut susunan abjad paling awal akan dipilih; 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. Lumpuhkan konfigurasi lalai dengan sudo systemctl reload apache2, dan sahkan dengan apache2ctl -S, yang mencetak peta vhost dan menunjukkan konfigurasi mana yang mengawal halaman lalai. Kosongkan juga cache pelayar; status 200 yang dicache daripada halaman lama akan terus kekal.

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 menjalankannya. Apache menghidangkan fail tersebut sebagai aset statik kerana pengendali PHP tidak dilampirkan, anda melangkau sudo a2enmod proxy_fcgi, atau sudo a2enconf php8.3-fpm, atau tidak memulakan semula Apache selepas itu. Jalankan ketiga-tiganya (Langkah 4) dan muat semula. Sahkan modul dimuatkan dengan apache2ctl -M | grep fcgi, yang sepatutnya menyenaraikan proxy_fcgi_module. Ini adalah kebocoran kod sumber, bukan pepijat kosmetik, jadi selesaikan perkara ini 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 sebenarnya adalah root. Penyelesaiannya ialah sudo mysql, tanpa -u root, dan tanpa kata laluan. Mesej ini adalah tingkah laku yang dijangkakan bagi pengesahan soket 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 dilumpuhkan (skip-name-resolve), jadi MariaDB memadankan kedua-duanya sebagai hos yang berbeza; localhost ialah soket Unix, 127.0.0.1 ialah TCP. Halakan aplikasi ke hos localhost supaya ia menggunakan soket dan memadankan akaun tersebut, atau cipta akaun kedua 'appuser'@'127.0.0.1' jika rangka kerja 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 mencari skrip pada laluan yang diberikan oleh Apache. Dua punca biasa: soket FPM dalam konfigurasi anda menghala ke versi PHP yang tidak dipasang (soket php8.4 selepas naik taraf sedangkan hanya 8.3 yang berjalan), atau fail tersebut memang tiada di sana kerana DocumentRoot dan direktori sebenar tidak sepadan. Periksa sama ada soket wujud dengan ls -l /run/php/, sahkan DocumentRoot sepadan dengan lokasi fail tersebut, dan mulakan semula kedua-dua php8.3-fpm dan apache2.

AH00558: apache2: Could not reliably determine the server's fully qualified domain name pada setiap kali dimulakan semula. Ini adalah amaran yang tidak berbahaya, bukan ralat; Apache memberitahu anda bahawa tiada ServerName global 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. Pelayan web lain sudah menggunakan port 80, selalunya nginx yang tertinggal daripada percubaan terdahulu. Cari proses tersebut dengan sudo ss -ltnp | grep :80, kemudian hentikan dan lumpuhkan perkhidmatan tersebut sebelum memulakan Apache.

FAQ

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

Gunakan PHP-FPM. mod_php membenamkan penterjemah dalam setiap proses Apache dan memaksa penggunaan MPM prefork yang perlahan, menyebabkan Apache menanggung beban PHP walaupun semasa menghidangkan imej statik. PHP-FPM menjalankan PHP sebagai pool berasingan yang ditala secara bebas, yang dicapai oleh Apache melalui soket. Ia berfungsi dengan MPM event yang lebih pantas dan boleh dipindahkan ke nginx tanpa perubahan pada masa hadapan. Ia adalah tetapan lalai moden; mod_php hanya relevan untuk aplikasi legasi yang bergantung pada gelagat dalam proses (in-process).

Mengapa pelayar saya memuat turun fail PHP dan bukannya menjalankannya?

Apache melayan fail .php sebagai muat turun statik kerana tiada pengendali PHP yang dilampirkan padanya. Pada Ubuntu 24.04 dengan FPM, ini bermakna anda terlepas salah satu daripada sudo a2enmod proxy_fcgi, sudo a2enconf php8.3-fpm, atau langkah memulakan semula Apache selepas itu. Jalankan ketiga-tiganya dan muat semula, kemudian sahkan dengan apache2ctl -M | grep fcgi bahawa proxy_fcgi_module disenaraikan. Selagi anda tidak membaikinya, pelayan akan mendedahkan kod sumber, jadi anggap ia sebagai perkara yang mendesak.

Mengapa akses root dinafikan dalam MariaDB walaupun kata laluan betul?

Kerana tiada kata laluan, MariaDB pada Ubuntu mengesahkan akaun root melalui unix_socket, yang mengikatnya kepada pengguna root sistem pengendalian. mysql -u root daripada shell biasa akan memaparkan ERROR 1698 (28000): Access denied for user 'root'@'localhost' mengikut reka bentuknya. Sambung menggunakan sudo mysql sebaliknya, dan cipta pengguna berasingan yang disahkan dengan kata laluan untuk sebarang aplikasi dan bukannya menggunakan semula root.

Bagaimanakah cara menambah HTTPS pada tapak LAMP saya?

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

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