ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home ติดตั้ง Apache และ PHP (LAMP) บน Ubuntu

ติดตั้ง Apache และ PHP (LAMP) บน Ubuntu

LAMP คือชุดซอฟต์แวร์สำหรับรันเว็บไซต์ที่ประกอบด้วย Linux, Apache, MySQL หรือ MariaDB และ PHP เป็นชุดที่เว็บ PHP ส่วนใหญ่ เช่น WordPress, Joomla หรือระบบที่เขียนด้วย Laravel รองรับโดยตรง ข้อดีของ Apache คือรองรับไฟล์ .htaccess ทำให้ปลั๊กอินและระบบสำเร็จรูปจำนวนมากทำงานได้ทันทีโดยไม่ต้องแปลงกฎ Rewrite

บทความนี้ติดตั้ง LAMP บน Ubuntu 22.04 หรือ 24.04 จากแพ็กเกจมาตรฐานของ Ubuntu สร้าง VirtualHost สำหรับโดเมนของคุณ และทดสอบว่า PHP เชื่อมต่อฐานข้อมูลได้ หากคุณต้องการใช้ Nginx แทน Apache ให้ดู ติดตั้ง Nginx, PHP-FPM และ MariaDB (LEMP) บน Ubuntu

สิ่งที่ต้องเตรียม

  • เซิร์ฟเวอร์ Ubuntu 22.04 หรือ 24.04 ที่ติดตั้งใหม่ และผู้ใช้ที่มีสิทธิ์ sudo
  • โดเมนที่ชี้ A Record มายัง IP ของเซิร์ฟเวอร์แล้ว (ดู ชี้โดเมนไปยังเซิร์ฟเวอร์ด้วย A Record หรือเปลี่ยน Name Server) ในบทความนี้ใช้ example.com และ IP 203.0.113.10 เป็นตัวอย่าง
  • ยังไม่มี Nginx หรือเว็บเซิร์ฟเวอร์อื่นใช้พอร์ต 80 และ 443 อยู่

เวอร์ชันที่จะได้จากแพ็กเกจมาตรฐาน:

ซอฟต์แวร์Ubuntu 22.04Ubuntu 24.04
Apache2.4.522.4.58
PHP8.18.3
MariaDB10.610.11

เลขรุ่นย่อยจะขยับขึ้นตามการอัปเดตความปลอดภัย หากแอปของคุณต้องการ PHP รุ่นอื่น ดู ติดตั้ง PHP หลายเวอร์ชันบน Ubuntu

ขั้นตอนที่ 1: อัปเดตระบบและติดตั้ง Apache

sudo apt update
sudo apt upgrade -y
sudo apt install -y apache2

Apache จะเริ่มทำงานและตั้งให้เริ่มอัตโนมัติเมื่อบูตทันที ตรวจสถานะด้วย:

systemctl status apache2 --no-pager

ควรเห็น Active: active (running)

ขั้นตอนที่ 2: เปิด Firewall

ถ้าใช้ UFW แพ็กเกจ Apache จะเพิ่ม Application Profile ให้สามแบบ คือ Apache (พอร์ต 80), Apache Secure (443) และ Apache Full (80 และ 443) ให้เปิดแบบ Full:

sudo ufw allow OpenSSH
sudo ufw allow 'Apache Full'
sudo ufw status

ต้องแน่ใจว่าอนุญาต SSH แล้วก่อนเปิดใช้ UFW ครั้งแรก ไม่เช่นนั้นจะถูกตัดออกจากเซิร์ฟเวอร์ หากยังไม่เคยเปิดใช้ UFW ให้อ่าน ตั้งค่า Firewall ด้วย UFW บน Ubuntu ก่อน และหากเซิร์ฟเวอร์มี Security Group หรือ Firewall ภายนอกจากฝั่งผู้ให้บริการ ให้เปิดพอร์ต 80 และ 443 เพิ่มด้วย

ทดสอบโดยเปิด http://203.0.113.10 ในเบราว์เซอร์ ควรเห็นหน้า "Apache2 Default Page"

ขั้นตอนที่ 3: ติดตั้ง MariaDB

sudo apt install -y mariadb-server
sudo mariadb-secure-installation

คำถามใน mariadb-secure-installation ที่แนะนำ:

  • Enter current password for root: กด Enter (ยังไม่มีรหัสผ่าน)
  • Switch to unix_socket authentication: ตอบ n ได้ เพราะบน Ubuntu root ของ MariaDB ใช้ unix_socket อยู่แล้ว หมายถึงเข้าได้ด้วย sudo mariadb โดยไม่ต้องใช้รหัสผ่าน
  • Change the root password: ตอบ n หากต้องการคงการเข้าผ่าน sudo อย่างเดียว
  • Remove anonymous users, Disallow root login remotely, Remove test database, Reload privilege tables: ตอบ Y ทั้งหมด

จากนั้นสร้างฐานข้อมูลและผู้ใช้สำหรับเว็บไซต์ โดยห้ามให้เว็บใช้ผู้ใช้ root ของฐานข้อมูล วิธีสร้างและกำหนดสิทธิ์อธิบายไว้ใน สร้างฐานข้อมูลและผู้ใช้ MySQL/MariaDB พร้อมกำหนดสิทธิ์ ตัวอย่างสั้น ๆ:

sudo mariadb -e "CREATE DATABASE exampledb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'ตั้งรหัสผ่านที่แข็งแรง';
GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'localhost';"

ขั้นตอนที่ 4: ติดตั้ง PHP และส่วนขยายที่ใช้บ่อย

sudo apt install -y php libapache2-mod-php php-mysql php-cli php-curl \
  php-gd php-mbstring php-xml php-zip php-intl php-bcmath

แพ็กเกจ libapache2-mod-php ทำให้ Apache รัน PHP ภายในตัวเอง (mod_php) ซึ่งตั้งค่าง่ายที่สุดสำหรับเว็บเดียว ตรวจเวอร์ชันด้วย:

php -v

ผลลัพธ์บน Ubuntu 24.04 จะขึ้นต้นด้วย PHP 8.3.x (cli) ส่วน 22.04 จะเป็น PHP 8.1.x

หมายเหตุ: mod_php ต้องใช้ Apache MPM แบบ prefork ซึ่งแพ็กเกจจะสลับให้อัตโนมัติ หากเซิร์ฟเวอร์ต้องรองรับผู้ใช้พร้อมกันจำนวนมาก หรือต้องการรัน PHP หลายเวอร์ชัน แนะนำให้ใช้ PHP-FPM ร่วมกับ MPM event แทน ซึ่งอธิบายไว้ในบทความ PHP หลายเวอร์ชันที่ลิงก์ไว้ข้างต้น

ขั้นตอนที่ 5: สร้าง VirtualHost สำหรับโดเมน

สร้างโฟลเดอร์เว็บและกำหนดเจ้าของ ในตัวอย่างนี้ให้ผู้ใช้ที่คุณล็อกอินอยู่เป็นเจ้าของไฟล์ และให้กลุ่ม www-data ของ Apache อ่านได้:

sudo mkdir -p /var/www/example.com/public_html
sudo chown -R $USER:www-data /var/www/example.com
sudo chmod 750 /var/www/example.com /var/www/example.com/public_html

เรื่องสิทธิ์ไฟล์อย่างละเอียดดูได้ที่ ทำความเข้าใจสิทธิ์ไฟล์บน Linux ด้วย chmod และ chown

สร้างไฟล์ VirtualHost:

sudo nano /etc/apache2/sites-available/example.com.conf

ใส่เนื้อหา:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/public_html

    <Directory /var/www/example.com/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

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

AllowOverride All ทำให้ไฟล์ .htaccess ทำงาน ซึ่ง WordPress และระบบอื่นต้องใช้สำหรับ Permalink ส่วน -Indexes ปิดการแสดงรายชื่อไฟล์เมื่อโฟลเดอร์ไม่มีไฟล์ index

เปิดใช้ไซต์ใหม่ เปิดโมดูล Rewrite ปิดไซต์ตัวอย่าง แล้วตรวจไวยากรณ์ก่อนโหลดค่าใหม่:

sudo a2ensite example.com.conf
sudo a2enmod rewrite
sudo a2dissite 000-default.conf
sudo apache2ctl configtest
sudo systemctl restart apache2

apache2ctl configtest ต้องตอบ Syntax OK ก่อน reload เสมอ ถ้าไฟล์มีข้อผิดพลาด การ reload จะล้มเหลวและเว็บทุกเว็บในเครื่องอาจหยุดทำงาน ครั้งนี้ใช้ restart เพราะเพิ่งเปิดโมดูลใหม่ ส่วนการแก้ไข VirtualHost ครั้งต่อไปใช้ sudo systemctl reload apache2 ก็เพียงพอ

ขั้นตอนที่ 6: ทดสอบ PHP และการเชื่อมต่อฐานข้อมูล

สร้างไฟล์ทดสอบชั่วคราว:

cat > /var/www/example.com/public_html/dbtest.php <<'EOF'
<?php
mysqli_report(MYSQLI_REPORT_OFF);
echo 'PHP ' . PHP_VERSION . "<br>";
$db = new mysqli('localhost', 'exampleuser', 'รหัสผ่านที่ตั้งไว้', 'exampledb');
echo $db->connect_errno ? 'DB error: ' . $db->connect_error : 'DB connected';
EOF

เปิด http://example.com/dbtest.php ควรเห็นเวอร์ชัน PHP และข้อความ DB connected เมื่อทดสอบเสร็จ ให้ลบไฟล์นี้ทันที เพราะมีรหัสผ่านฐานข้อมูลอยู่:

rm /var/www/example.com/public_html/dbtest.php

ขั้นตอนที่ 7: ติดตั้ง SSL

เมื่อโดเมนชี้มาที่เซิร์ฟเวอร์แล้ว ติดตั้ง SSL ฟรีจาก Let's Encrypt ด้วย Certbot ปลั๊กอินสำหรับ Apache:

sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d example.com -d www.example.com

Certbot จะสร้างไฟล์ example.com-le-ssl.conf สำหรับพอร์ต 443 และเพิ่มการ Redirect จาก HTTP ไป HTTPS ให้ การต่ออายุทำงานอัตโนมัติผ่าน systemd timer ทดสอบได้ด้วย sudo certbot renew --dry-run หลักการเดียวกับบทความ ติดตั้ง SSL ฟรีจาก Let's Encrypt ด้วย Certbot บน Nginx ต่างกันเพียงปลั๊กอินที่ใช้

ตรวจสอบผลลัพธ์

  • sudo apache2ctl -S แสดงรายการ VirtualHost และควรเห็น example.com ทั้งพอร์ต 80 และ 443
  • curl -I https://example.com ควรได้ HTTP/1.1 200 OK หรือ 403 ถ้าโฟลเดอร์ยังว่าง
  • sudo ss -tlnp ควรเห็น apache2 ที่พอร์ต 80 และ 443 และ mariadbd ที่ 127.0.0.1:3306 เท่านั้น

ปัญหาที่พบบ่อย

เปิดเว็บแล้วเห็นโค้ด PHP หรือเบราว์เซอร์ดาวน์โหลดไฟล์ .php

แปลว่า Apache ไม่ได้ส่งไฟล์ให้ PHP ประมวลผล ตรวจว่าติดตั้ง libapache2-mod-php แล้ว และโมดูลเปิดอยู่ด้วย apache2ctl -M | grep php ถ้าไม่เห็น ให้รัน sudo a2enmod php8.3 (เปลี่ยนเลขตามเวอร์ชันของคุณ) แล้ว restart Apache

Apache เริ่มไม่ได้ แจ้ง Address already in use

มีโปรแกรมอื่น มักเป็น Nginx ใช้พอร์ต 80 อยู่ ตรวจด้วย sudo ss -ltnp 'sport = :80' ดูวิธีเพิ่มเติมที่ ตรวจสอบพอร์ตที่เปิดอยู่บน Linux ด้วย ss และ lsof

Permalink ของ WordPress เปิดแล้วได้ 404

มักเกิดจากไม่ได้ตั้ง AllowOverride All หรือยังไม่ได้เปิด a2enmod rewrite ดูรายละเอียดที่ แก้ปัญหาหน้าเว็บ 404 หลังตั้ง Permalink ใน WordPress

ได้ 403 Forbidden

Apache อ่านโฟลเดอร์ไม่ได้ ตรวจว่าทุกโฟลเดอร์ในเส้นทางมีสิทธิ์ให้ www-data เข้าถึง (อย่างน้อย x สำหรับกลุ่มหรือผู้อื่น) ด้วย namei -l /var/www/example.com/public_html และดูสาเหตุจริงใน /var/log/apache2/example.com-error.log

หากติดตั้งแล้วเว็บยังไม่ทำงานตามที่ควร ติดต่อทีมซัพพอร์ต THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security