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

Home ติดตั้ง Nginx, PHP-FPM และ MariaDB (LEMP) บน Ubuntu

ติดตั้ง Nginx, PHP-FPM และ MariaDB (LEMP) บน Ubuntu

LEMP คือชุดซอฟต์แวร์สำหรับรันเว็บไซต์ภาษา PHP ประกอบด้วย Linux, Nginx (อ่านว่า Engine-X), MariaDB หรือ MySQL และ PHP ที่ทำงานผ่าน PHP-FPM ชุดนี้เหมาะกับเว็บไซต์อย่าง WordPress, Laravel หรือระบบหลังบ้านที่เขียนด้วย PHP โดย Nginx รับคำขอจากผู้ใช้และส่งต่อไฟล์ PHP ให้ PHP-FPM ประมวลผล ส่วน MariaDB เก็บข้อมูลของเว็บไซต์

คู่มือนี้อธิบายการติดตั้งบน Ubuntu 22.04 และ 24.04 ตั้งแต่ติดตั้งแพ็กเกจ ตั้งค่า Server Block สำหรับโดเมนของคุณ ไปจนถึงทดสอบว่า PHP ทำงานได้จริง เหมาะสำหรับเซิร์ฟเวอร์ที่เพิ่งสร้างใหม่และยังไม่มี Web Server ตัวอื่นติดตั้งอยู่

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

  • เซิร์ฟเวอร์ Ubuntu 22.04 หรือ 24.04 ที่เข้าถึงผ่าน SSH ได้
  • ผู้ใช้ที่มีสิทธิ์ sudo (ดูวิธีสร้างได้ที่ สร้างผู้ใช้ใหม่และให้สิทธิ์ sudo บน Linux)
  • โดเมนที่ชี้ A Record มายัง IP ของเซิร์ฟเวอร์แล้ว (ถ้ายังไม่มี ใช้ IP ทดสอบไปก่อนได้)
  • พอร์ต 80 และ 443 เปิดให้เข้าถึงได้

ในตัวอย่างจะใช้โดเมน example.com ให้เปลี่ยนเป็นโดเมนจริงของคุณทุกจุด

ขั้นตอนที่ 1: อัปเดตแพ็กเกจและติดตั้ง Nginx

เริ่มจากอัปเดตรายการแพ็กเกจ แล้วติดตั้ง Nginx

sudo apt update
sudo apt install -y nginx

เมื่อติดตั้งเสร็จ Nginx จะเริ่มทำงานและตั้งให้เปิดอัตโนมัติเมื่อบูตเครื่อง ตรวจสอบสถานะได้ด้วยคำสั่ง

systemctl status nginx

ผลลัพธ์ควรแสดง Active: active (running) กด q เพื่อออก

หากเปิด UFW Firewall ไว้ ให้อนุญาตพอร์ต HTTP และ HTTPS

sudo ufw allow 'Nginx Full'
sudo ufw status

หากเซิร์ฟเวอร์มี Security Group หรือ Firewall ภายนอกจากฝั่งผู้ให้บริการ ให้เปิดพอร์ตนั้นเพิ่มด้วย จากนั้นเปิดเบราว์เซอร์ไปที่ http://IP-ของเซิร์ฟเวอร์ จะเห็นหน้า "Welcome to nginx!"

ขั้นตอนที่ 2: ติดตั้ง MariaDB และตั้งค่าความปลอดภัยเบื้องต้น

sudo apt install -y mariadb-server
sudo systemctl status mariadb

Ubuntu 22.04 จะได้ MariaDB 10.6 ส่วน Ubuntu 24.04 จะได้ MariaDB 10.11 จากนั้นรันสคริปต์ตั้งค่าความปลอดภัย

sudo mysql_secure_installation

คำตอบที่แนะนำสำหรับเซิร์ฟเวอร์ใหม่มีดังนี้

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

ทดสอบเข้าใช้งานด้วย

sudo mysql

จะเห็นพรอมต์ MariaDB [(none)]> พิมพ์ exit เพื่อออก สำหรับการสร้างฐานข้อมูลและผู้ใช้ให้เว็บไซต์ ดูต่อได้ที่ สร้างฐานข้อมูลและผู้ใช้ MySQL/MariaDB พร้อมกำหนดสิทธิ์

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

sudo apt install -y php-fpm php-mysql php-mbstring php-xml php-curl php-zip php-gd php-intl

แพ็กเกจ php-fpm จะติดตั้ง PHP เวอร์ชันมาตรฐานของ Ubuntu รุ่นนั้น คือ PHP 8.1 บน Ubuntu 22.04 และ PHP 8.3 บน Ubuntu 24.04 ตรวจสอบเวอร์ชันและชื่อ Socket ที่ต้องใช้ในขั้นตอนถัดไป

php -v
ls /run/php/

ผลลัพธ์ของ ls จะเป็นชื่อไฟล์ เช่น php8.3-fpm.sock ให้จดไว้ และตรวจว่า Service ทำงานอยู่

systemctl status php8.3-fpm

หากใช้ Ubuntu 22.04 ให้เปลี่ยน 8.3 เป็น 8.1 ทุกจุดในคู่มือนี้

หมายเหตุ: ไม่ต้องติดตั้งแพ็กเกจ php เปล่า ๆ เพราะบางกรณีจะดึง Apache ติดตั้งมาด้วยและแย่งพอร์ต 80 กับ Nginx การติดตั้ง php-fpm ตามคำสั่งข้างต้นเพียงพอแล้ว

ขั้นตอนที่ 4: สร้างโฟลเดอร์เว็บไซต์และ Server Block

สร้างโฟลเดอร์สำหรับเก็บไฟล์เว็บไซต์ และกำหนดเจ้าของเป็น www-data ซึ่งเป็นผู้ใช้ที่ Nginx และ PHP-FPM ใช้ทำงาน

sudo mkdir -p /var/www/example.com
sudo chown -R www-data:www-data /var/www/example.com

สร้างไฟล์ตั้งค่า Server Block

sudo nano /etc/nginx/sites-available/example.com

ใส่เนื้อหาต่อไปนี้ แล้วบันทึกด้วย Ctrl+O และออกด้วย Ctrl+X

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

บรรทัด try_files ส่งคำขอที่ไม่ตรงกับไฟล์จริงไปที่ index.php ซึ่งเป็นรูปแบบที่ WordPress และ Framework ส่วนใหญ่ต้องการ ส่วน fastcgi_pass ต้องตรงกับชื่อ Socket ที่ได้จากขั้นตอนที่ 3

เปิดใช้งาน Server Block ปิด Server Block ตัวอย่างของ Nginx แล้วทดสอบไวยากรณ์ก่อนโหลดใหม่

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo unlink /etc/nginx/sites-enabled/default
sudo nginx -t

ผลลัพธ์ที่ถูกต้องคือ

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

จากนั้นโหลดค่าใหม่

sudo systemctl reload nginx

ขั้นตอนที่ 5: ทดสอบการทำงานของ PHP

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

echo '<?php phpinfo();' | sudo tee /var/www/example.com/info.php

เปิด http://example.com/info.php ในเบราว์เซอร์ หากเห็นหน้าตารางข้อมูล PHP และบรรทัด Server API แสดงค่า FPM/FastCGI แปลว่าระบบทำงานครบแล้ว

ลบไฟล์นี้ทันทีหลังทดสอบ เพราะเปิดเผยข้อมูลการตั้งค่าของเซิร์ฟเวอร์ให้ทุกคนเห็น

sudo rm /var/www/example.com/info.php

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

  • systemctl is-active nginx mariadb php8.3-fpm ต้องแสดง active ทั้งสามบรรทัด
  • sudo ss -tlnp | grep -E ':80|:3306' ควรเห็น Nginx ฟังพอร์ต 80 และ MariaDB ฟังพอร์ต 3306 ที่ 127.0.0.1 เท่านั้น ซึ่งเป็นค่าเริ่มต้นที่ปลอดภัย
  • curl -I http://example.com ควรได้ HTTP/1.1 200 OK หรือ 403 ถ้าโฟลเดอร์ยังไม่มีไฟล์ index

ขั้นตอนต่อไปที่แนะนำคือติดตั้ง SSL ตามคู่มือ ติดตั้ง SSL ฟรีจาก Let's Encrypt ด้วย Certbot บน Nginx

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

502 Bad Gateway

Nginx ติดต่อ PHP-FPM ไม่ได้ สาเหตุที่พบบ่อยที่สุดคือชื่อ Socket ใน fastcgi_pass ไม่ตรงกับเวอร์ชัน PHP ที่ติดตั้งจริง ตรวจด้วย ls /run/php/ แก้ไฟล์ Server Block ให้ตรง แล้วรัน sudo nginx -t และ sudo systemctl reload nginx ดู Error ละเอียดได้ที่ /var/log/nginx/error.log

เบราว์เซอร์ดาวน์โหลดไฟล์ .php แทนการแสดงผล

แปลว่าบล็อก location ~ \.php$ ไม่ทำงาน อาจพิมพ์ผิดหรือแก้ไฟล์แล้วไม่ได้ reload ให้ตรวจไฟล์อีกครั้ง และล้าง Cache ของเบราว์เซอร์ก่อนทดสอบใหม่

Nginx เริ่มทำงานไม่ได้ เพราะพอร์ต 80 ถูกใช้งานอยู่

มักเกิดจากมี Apache ติดตั้งอยู่ ตรวจด้วย sudo ss -tlnp | grep ':80' หากเป็น apache2 และไม่ได้ใช้งาน ให้หยุดและปิดด้วย sudo systemctl disable --now apache2 แล้ว sudo systemctl start nginx

403 Forbidden

โฟลเดอร์ยังไม่มีไฟล์ index.php หรือ index.html หรือสิทธิ์ไฟล์ไม่ถูกต้อง ตรวจว่าไฟล์เป็นของ www-data และโฟลเดอร์มีสิทธิ์อย่างน้อย 755 ไฟล์ 644

หากทำตามขั้นตอนแล้วยังติดปัญหา สามารถติดต่อทีมงาน Support ของ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/ โดยแจ้งชื่อเซิร์ฟเวอร์ ระบบปฏิบัติการ ขั้นตอนที่ทำไปแล้ว และข้อความ Error ที่พบ เพื่อให้ตรวจสอบได้รวดเร็วขึ้น

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

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