ติดตั้ง LEMP Stack บน VPS Ubuntu: Nginx + MySQL + PHP-FPM
LEMP Stack คือชุดซอฟต์แวร์สำหรับรัน Web Application ที่ประกอบด้วย Linux, ENginx (อ่านว่า "engine-x"), MySQL และ PHP-FPM ความแตกต่างหลักจาก LAMP Stack คือการใช้ Nginx แทน Apache ซึ่งให้ประสิทธิภาพสูงกว่าอย่างมีนัยสำคัญ โดยเฉพาะในสภาวะ Traffic สูงและการจัดการ Static Files
บทความนี้จะพาคุณติดตั้ง LEMP Stack บน VPS Ubuntu 22.04 LTS ตั้งแต่ต้นจนจบ พร้อมการตั้งค่าความปลอดภัยเบื้องต้น
ทำไมต้องเลือก LEMP แทน LAMP?
Nginx มีสถาปัตยกรรมแบบ Event-Driven, Non-Blocking I/O ซึ่งรองรับ Concurrent Connections ได้มากกว่า Apache ที่ใช้ Thread-Based Model อย่างเห็นได้ชัด นอกจากนี้:
- ใช้ RAM น้อยกว่า Apache โดยเฉลี่ย 30–50%
- เหมาะกับ VPS ขนาดเล็ก (1–2 GB RAM) มากกว่า
- เป็น Reverse Proxy ชั้นเลิศสำหรับ Node.js, Python และอื่น ๆ
- รองรับ HTTP/2 และ HTTP/3 ได้อย่างราบรื่น
สิ่งที่ต้องเตรียมก่อนเริ่ม
- VPS Ubuntu 22.04 LTS (แนะนำ RAM อย่างน้อย 1 GB)
- สิทธิ์
sudoหรือ root access - โดเมนที่ชี้ A Record มายัง IP ของ VPS แล้ว (สำหรับขั้นตอน Virtual Host)
- SSH Client เช่น Terminal บน macOS/Linux หรือ PuTTY บน Windows
ขั้นตอนที่ 1: อัพเดทระบบ
หลังจาก SSH เข้า VPS แล้ว ให้อัพเดท Package List และ Upgrade ระบบก่อนเสมอ:
sudo apt update && sudo apt upgrade -y
รอจนกระบวนการเสร็จสิ้น จากนั้น Reboot หากมี Kernel Update:
sudo reboot
ขั้นตอนที่ 2: ติดตั้ง Nginx
ติดตั้ง Nginx จาก Official Ubuntu Repository:
sudo apt install nginx -y
เปิดใช้งานและสั่งให้เริ่มต้นพร้อม Boot:
sudo systemctl enable nginx
sudo systemctl start nginx
ตรวจสอบสถานะว่า Nginx ทำงานปกติ:
sudo systemctl status nginx
ควรเห็นข้อความ active (running) สีเขียว จากนั้นเปิด Port 80 และ 443 ใน Firewall:
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status
ขั้นตอนที่ 3: ติดตั้ง MySQL
ติดตั้ง MySQL Server:
sudo apt install mysql-server -y
รัน Secure Installation Script เพื่อตั้งรหัสผ่าน root และลบการตั้งค่าที่ไม่ปลอดภัย:
sudo mysql_secure_installation
ระบบจะถามชุดคำถาม แนะนำให้ตอบดังนี้:
- VALIDATE PASSWORD component — กด
Yแนะนำให้เปิดใช้ - Password strength — เลือก
2(STRONG) สำหรับ Production - Remove anonymous users —
Y - Disallow root login remotely —
Y - Remove test database —
Y - Reload privilege tables —
Y
เข้า MySQL เพื่อสร้าง Database และ User สำหรับเว็บไซต์:
sudo mysql -u root -p
-- สร้าง database
CREATE DATABASE mywebsite CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- สร้าง user
CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
-- ให้สิทธิ์
GRANT ALL PRIVILEGES ON mywebsite.* TO 'webuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
ขั้นตอนที่ 4: ติดตั้ง PHP-FPM
PHP-FPM (FastCGI Process Manager) เป็นวิธีที่ Nginx ใช้รัน PHP โดยส่งคำขอผ่าน Unix Socket แทนการโหลด PHP Module เหมือน Apache:
sudo apt install php8.1-fpm php8.1-mysql php8.1-curl php8.1-gd \
php8.1-mbstring php8.1-xml php8.1-zip php8.1-bcmath -y
ตรวจสอบว่า PHP-FPM ทำงาน:
sudo systemctl status php8.1-fpm
ดูเวอร์ชัน PHP:
php -v
ขั้นตอนที่ 5: ตั้งค่า Nginx Virtual Host
สร้างไฟล์ Configuration สำหรับโดเมนของคุณ:
sudo nano /etc/nginx/sites-available/example.com
วางเนื้อหาต่อไปนี้ (เปลี่ยน example.com เป็นโดเมนของคุณ):
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
# Cache Static Files
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
สร้าง Web Root Directory และไฟล์ทดสอบ:
sudo mkdir -p /var/www/example.com/html
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com
Enable Site และทดสอบ Configuration:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
หากขึ้น syntax is ok และ test is successful ให้ Reload Nginx:
sudo systemctl reload nginx
ขั้นตอนที่ 6: ทดสอบ PHP ทำงานได้
สร้างไฟล์ info.php เพื่อทดสอบ:
sudo nano /var/www/example.com/html/info.php
<?php
phpinfo();
?>
เปิดเบราว์เซอร์ไปที่ http://example.com/info.php จะเห็นหน้า PHP Info แสดงข้อมูลการตั้งค่าทั้งหมด
info.php ออกหลังทดสอบเสร็จ เพราะไฟล์นี้เปิดเผยข้อมูลระบบที่อาจเป็นช่องโหว่ด้านความปลอดภัย: sudo rm /var/www/example.com/html/info.phpขั้นตอนที่ 7: ติดตั้ง SSL ด้วย Let's Encrypt (แนะนำ)
ติดตั้ง Certbot:
sudo apt install certbot python3-certbot-nginx -y
ออก Certificate และตั้งค่า HTTPS อัตโนมัติ:
sudo certbot --nginx -d example.com -d www.example.com
Certbot จะถามอีเมลและข้อตกลง Terms of Service แล้วแก้ไข Nginx Config ให้รองรับ HTTPS โดยอัตโนมัติ Certificate จะต่ออายุอัตโนมัติทุก 90 วัน ตรวจสอบด้วย:
sudo certbot renew --dry-run
การปรับแต่ง PHP-FPM เพิ่มเติม
แก้ไข PHP Configuration สำหรับ Production:
sudo nano /etc/php/8.1/fpm/php.ini
ค้นหาและแก้ไขค่าเหล่านี้:
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
memory_limit = 256M
expose_php = Off
Restart PHP-FPM หลังแก้ไข:
sudo systemctl restart php8.1-fpm
การปรับแต่ง Nginx เพิ่มเติม
แก้ไขไฟล์ /etc/nginx/nginx.conf เพื่อเพิ่มประสิทธิภาพ:
sudo nano /etc/nginx/nginx.conf
ค่าสำคัญที่ควรปรับตาม CPU ของ VPS:
worker_processes auto; # ใช้ทุก CPU Core อัตโนมัติ
worker_connections 1024; # Connection ต่อ Worker
keepalive_timeout 65;
gzip on; # เปิด Gzip Compression
gzip_types text/plain text/css application/json application/javascript;
สรุป: Checklist หลังติดตั้ง LEMP Stack
เมื่อทำครบทุกขั้นตอนแล้ว ให้ตรวจสอบรายการต่อไปนี้เพื่อให้แน่ใจว่าระบบพร้อมใช้งาน:
- Nginx ทำงานและแสดงหน้าเว็บได้ที่ HTTP และ HTTPS
- MySQL ใช้งานได้และมี User แยกต่างหากสำหรับแต่ละ Database
- PHP-FPM ประมวลผลสคริปต์ PHP ได้ถูกต้อง
- ลบไฟล์
info.phpออกแล้ว - SSL Certificate ติดตั้งและ Auto-Renew ทำงาน
- Firewall (ufw) เปิดแค่ Port 22, 80, 443 เท่านั้น
- ปิด
expose_php = Offใน php.ini แล้ว
/var/www/example.com/html/ ได้เลย หากต้องการติดตั้ง WordPress บน LEMP Stack โดยเฉพาะ สามารถติดตามบทความถัดไปได้ที่ 29vps.comตรวจสอบว่า LEMP Stack ทำงานถูกต้อง
# ตรวจสอบ Nginx config ไม่มี syntax error
sudo nginx -t
# ตรวจสอบสถานะทุก service
sudo systemctl status nginx php8.1-fpm mysql
# ทดสอบ PHP ทำงานผ่าน Nginx ได้
echo "<?php echo phpversion(); ?>" | sudo tee /var/www/example.com/html/test.php
curl -s http://localhost/test.php
sudo rm /var/www/example.com/html/test.php
# ตรวจสอบ MySQL เชื่อมต่อด้วย user ที่สร้าง
mysql -u webuser -p -e "SHOW DATABASES;" mywebsite
nginx -t ขึ้น syntax is ok และ test is successful พร้อมกัน แปลว่า config ถูกต้องแน่นอน ไม่ต้อง guessแก้ปัญหาที่พบบ่อย
Error: 502 Bad Gateway หลังตั้งค่า PHP-FPM
เกิดจาก path ของ PHP-FPM socket ใน Nginx config ไม่ตรงกับไฟล์จริง
# ดูว่า socket file อยู่ที่ไหนจริงๆ
ls /var/run/php/
# ถ้าเห็น php8.3-fpm.sock แต่ config ใช้ php8.1 ให้แก้
sudo nano /etc/nginx/sites-available/example.com
# เปลี่ยน fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
# เป็นเวอร์ชันที่ ls บอก
sudo systemctl reload nginx
Error: 403 Forbidden เมื่อเข้าเว็บครั้งแรก
ไม่มีไฟล์ index.php / index.html ใน Web Root หรือ permission ไม่ถูกต้อง
# ตรวจสอบ permission ของ web root
ls -la /var/www/example.com/html/
# แก้ permission
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com
# สร้างไฟล์ index.html ทดสอบ
echo "<h1>Hello LEMP</h1>" | sudo tee /var/www/example.com/html/index.html
PHP ไม่ถูก parse — เห็น code PHP ดิบในเบราว์เซอร์
Nginx ไม่ได้ส่ง .php ไปให้ PHP-FPM ตรวจสอบ location block ใน config
# ตรวจสอบว่ามี location ~ \.php$ ใน config
grep -n "\.php" /etc/nginx/sites-available/example.com
# ตรวจสอบว่า PHP-FPM ทำงานอยู่
sudo systemctl status php8.1-fpm
# ถ้าหยุดอยู่
sudo systemctl start php8.1-fpm
Certbot ขอ Certificate ไม่ได้ — Challenge failed
โดยมากเกิดจาก DNS ของโดเมนยังไม่ชี้มายัง VPS หรือ Firewall บล็อก port 80
# ตรวจสอบว่า A record ชี้ถูก
dig +short A example.com
# ตรวจสอบว่า port 80 เปิดอยู่
curl -I http://example.com
sudo ufw status | grep 80
MySQL: ERROR 1045 (28000): Access denied for user
รหัสผ่านไม่ถูกต้องหรือ user ไม่มีสิทธิ์ใน database นั้น
# ล็อกอินเป็น root แล้วตรวจสอบ user
sudo mysql -u root
SELECT user, host FROM mysql.user WHERE user='webuser';
SHOW GRANTS FOR 'webuser'@'localhost';
-- ถ้าต้องการ reset password
ALTER USER 'webuser'@'localhost' IDENTIFIED BY 'NewPassword456!';
FLUSH PRIVILEGES;
คำถามที่พบบ่อย
LEMP กับ LAMP ใช้ WordPress ได้เหมือนกันไหม?
ได้เหมือนกัน WordPress รองรับทั้ง Apache และ Nginx เต็มรูปแบบ ความแตกต่างหลักคือต้องตั้งค่า try_files ใน Nginx แทน .htaccess ที่ WordPress ใช้กับ Apache โดย Nginx ไม่ read .htaccess เลย ต้องแปลง rewrite rule มาใส่ใน nginx.conf แทน
จะเปลี่ยนจาก PHP 8.1 เป็น PHP 8.3 ทำอย่างไร?
ติดตั้ง PHP เวอร์ชันใหม่ทับได้โดยไม่ต้องลบเวอร์ชันเก่า แล้วเปลี่ยน path ใน Nginx config
sudo apt install php8.3-fpm php8.3-mysql php8.3-curl php8.3-mbstring -y
# แก้ Nginx config เปลี่ยน php8.1-fpm.sock → php8.3-fpm.sock
sudo systemctl reload nginx
ติดตั้ง LEMP แล้วรัน Node.js หรือ Python ควบคู่ได้ไหม?
ได้ เพราะ Nginx ทำหน้าที่เป็น reverse proxy ได้ในตัว ใช้ location แยก path สำหรับส่ง traffic ไป PHP-FPM, Node.js หรือ Python app ในไฟล์ config ไฟล์เดียวกัน โดยแต่ละ backend รันคนละ port/socket