Nginx web server terminal configuration

ติดตั้ง LEMP Stack บน VPS Ubuntu: Nginx + MySQL + PHP-FPM

มิถุนายน 2026 · อ่าน 7 นาที

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 อย่างเห็นได้ชัด นอกจากนี้:

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

หากยังไม่มี VPS ให้เลือกแพ็กเกจที่เหมาะสมได้ที่ 29vps.com โดยแนะนำ Plan ที่มี RAM ตั้งแต่ 1 GB ขึ้นไปสำหรับการรัน LEMP Stack

ขั้นตอนที่ 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
ลองเปิดเบราว์เซอร์แล้วพิมพ์ IP Address ของ VPS จะเห็นหน้า "Welcome to nginx!" ซึ่งยืนยันว่าการติดตั้งสำเร็จ

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

ติดตั้ง MySQL Server:

sudo apt install mysql-server -y

รัน Secure Installation Script เพื่อตั้งรหัสผ่าน root และลบการตั้งค่าที่ไม่ปลอดภัย:

sudo mysql_secure_installation

ระบบจะถามชุดคำถาม แนะนำให้ตอบดังนี้:

  1. VALIDATE PASSWORD component — กด Y แนะนำให้เปิดใช้
  2. Password strength — เลือก 2 (STRONG) สำหรับ Production
  3. Remove anonymous users — Y
  4. Disallow root login remotely — Y
  5. Remove test database — Y
  6. 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

เมื่อทำครบทุกขั้นตอนแล้ว ให้ตรวจสอบรายการต่อไปนี้เพื่อให้แน่ใจว่าระบบพร้อมใช้งาน:

LEMP Stack พร้อมใช้งานแล้ว! ขั้นตอนถัดไปคือการติดตั้ง CMS เช่น WordPress หรือ Deploy PHP Application ของคุณลงในโฟลเดอร์ /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
Tip: ถ้า 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