ติดตั้ง LAMP Stack บน VPS Ubuntu อย่างถูกต้อง
LAMP Stack คือชุดซอฟต์แวร์โอเพนซอร์สที่นิยมใช้สำหรับโฮสต์เว็บแอปพลิเคชัน ประกอบด้วย Linux, Apache, MySQL และ PHP ซึ่งทำงานร่วมกันได้อย่างลงตัว บทความนี้จะพาคุณติดตั้งครบทุกส่วนบน VPS Ubuntu 22.04 LTS ตั้งแต่ต้นจนเปิดเว็บได้จริง พร้อม Virtual Host และ SSL Let's Encrypt
สิ่งที่ต้องเตรียมก่อนเริ่ม
- VPS Ubuntu 22.04 LTS (RAM อย่างน้อย 1 GB แนะนำ 2 GB ขึ้นไป)
- IP สาธารณะของ VPS และโดเมนที่ชี้ A Record มาที่ IP นั้นแล้ว
- SSH เข้าถึง VPS ได้ในฐานะ
rootหรือ user ที่มีสิทธิ์sudo - พอร์ต 80 และ 443 เปิดอยู่ใน Firewall
sudo นำหน้าคำสั่งทุกบรรทัดที่ต้องการสิทธิ์ระดับระบบขั้นตอนที่ 1 — อัปเดตระบบให้เป็นปัจจุบัน
ก่อนติดตั้งซอฟต์แวร์ใหม่ควรอัปเดต package list และอัปเกรดแพ็กเกจที่มีอยู่เสมอ
apt update && apt upgrade -y
รอจนกระบวนการเสร็จสมบูรณ์ หากระบบแจ้งให้ reboot ให้รันคำสั่งด้านล่างแล้วเชื่อมต่อใหม่
reboot
ขั้นตอนที่ 2 — ติดตั้ง Apache
Apache คือ Web Server ที่รับ HTTP request และส่งไฟล์ไปยังผู้เข้าชม
apt install apache2 -y
เปิดใช้งานและตั้งค่าให้ Apache เริ่มต้นอัตโนมัติเมื่อบูตเครื่อง
systemctl enable apache2
systemctl start apache2
ตรวจสอบสถานะ
systemctl status apache2
จากนั้นเปิดไฟร์วอลล์ให้ HTTP และ HTTPS ผ่านได้
ufw allow "Apache Full"
ufw enable
ufw status
ขั้นตอนที่ 3 — ติดตั้ง MySQL
MySQL คือระบบจัดการฐานข้อมูลที่รองรับเว็บแอปพลิเคชันส่วนใหญ่ เช่น WordPress, Laravel และอื่น ๆ
apt install mysql-server -y
เริ่มต้นและเปิดใช้งาน MySQL
systemctl enable mysql
systemctl start mysql
รัน script เสริมความปลอดภัย (แนะนำอย่างยิ่ง)
mysql_secure_installation
Script จะถามหลายคำถาม ให้ตอบดังนี้เพื่อความปลอดภัยสูงสุด
- VALIDATE PASSWORD component — พิมพ์
Yแล้วเลือกระดับ 2 (STRONG) - Change root password — พิมพ์
Yแล้วตั้งรหัสผ่านที่ซับซ้อน - Remove anonymous users —
Y - Disallow root login remotely —
Y - Remove test database —
Y - Reload privilege tables —
Y
สร้างฐานข้อมูลและ user สำหรับเว็บไซต์ของคุณ (แทน mydb, myuser และ StrongPass!1 ด้วยค่าจริงของคุณ)
mysql -u root -p
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'StrongPass!1';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
ขั้นตอนที่ 4 — ติดตั้ง PHP
PHP 8.2 เป็น version ที่แนะนำสำหรับเว็บแอปยุคใหม่ พร้อม extension ที่จำเป็น
apt install php8.2 php8.2-cli php8.2-fpm php8.2-mysql php8.2-xml \
php8.2-curl php8.2-mbstring php8.2-zip php8.2-gd php8.2-intl -y
ตรวจสอบ version PHP
php -v
เปิดใช้งาน PHP-FPM module ใน Apache และ module ที่จำเป็น
a2enmod proxy_fcgi setenvif
a2enconf php8.2-fpm
systemctl restart apache2
ทดสอบว่า PHP ทำงานได้กับ Apache โดยสร้างไฟล์ทดสอบ
echo "<?php phpinfo(); ?>" > /var/www/html/info.php
rm /var/www/html/info.phpขั้นตอนที่ 5 — ตั้งค่า Virtual Host
Virtual Host ช่วยให้ Apache โฮสต์หลายโดเมนบน VPS เดียวกันได้ โดยแยก directory และ config ของแต่ละเว็บออกจากกัน
สร้าง directory สำหรับโดเมนของคุณ (แทน example.com ด้วยโดเมนจริง)
mkdir -p /var/www/example.com/public_html
chown -R www-data:www-data /var/www/example.com
chmod -R 755 /var/www/example.com
สร้างไฟล์ index.php ทดสอบ
cat <<EOF > /var/www/example.com/public_html/index.php
<?php echo "<h1>ยินดีต้อนรับสู่ example.com</h1>";
EOF
สร้างไฟล์ Virtual Host config
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>
เปิดใช้งาน Virtual Host และ mod_rewrite จากนั้น restart Apache
a2ensite example.com.conf
a2enmod rewrite
a2dissite 000-default.conf
systemctl reload apache2
ขั้นตอนที่ 6 — ติดตั้ง SSL ด้วย Let's Encrypt (Certbot)
SSL ทำให้เว็บไซต์ของคุณใช้ HTTPS ซึ่งจำเป็นทั้งด้านความปลอดภัยและ SEO
apt install certbot python3-certbot-apache -y
ขอ certificate สำหรับโดเมน (Certbot จะแก้ไข Virtual Host ให้อัตโนมัติ)
certbot --apache -d example.com -d www.example.com
ทำตามขั้นตอนที่ Certbot แสดง ใส่อีเมล ยอมรับข้อตกลง แล้วเลือก redirect HTTP ไป HTTPS อัตโนมัติ
ตรวจสอบว่า Auto-Renewal ทำงานอยู่
systemctl status certbot.timer
certbot renew --dry-run
ขั้นตอนที่ 7 — ปรับแต่ง PHP สำหรับ Production
แก้ไขค่า PHP สำคัญใน php.ini เพื่อประสิทธิภาพและความปลอดภัย
nano /etc/php/8.2/fpm/php.ini
ค้นหาและแก้ไขค่าเหล่านี้
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 120
memory_limit = 256M
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
Restart PHP-FPM เพื่อให้ค่าใหม่มีผล
systemctl restart php8.2-fpm
systemctl reload apache2
ขั้นตอนที่ 8 — ปรับแต่ง MySQL เบื้องต้น
สำหรับ VPS RAM 2 GB ให้แก้ไขค่า MySQL ใน /etc/mysql/mysql.conf.d/mysqld.cnf
nano /etc/mysql/mysql.conf.d/mysqld.cnf
เพิ่มหรือแก้ไขส่วน [mysqld]
[mysqld]
innodb_buffer_pool_size = 512M
innodb_log_file_size = 128M
max_connections = 100
query_cache_type = 0
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
systemctl restart mysql
สรุปและ Checklist
หากทำครบทุกขั้นตอน LAMP Stack บน VPS Ubuntu 22.04 ของคุณควรพร้อมใช้งานแล้ว ตรวจสอบด้วย Checklist ด้านล่าง
- Apache ทำงานและเข้าถึงได้ที่
http://IPหรือhttps://example.com - MySQL ติดตั้งแล้ว รัน
mysql_secure_installationเรียบร้อย - PHP 8.2 พร้อม extension ที่จำเป็นครบ
- Virtual Host ตั้งค่าแยกจาก default site แล้ว
- SSL Let's Encrypt ติดตั้งแล้ว HTTPS ทำงานปกติ
- Auto-Renewal ของ Certbot ทำงานอยู่
- ลบ
info.phpออกแล้ว - Firewall (ufw) เปิดเฉพาะ port ที่จำเป็น (22, 80, 443)
ขั้นตอนถัดไปที่แนะนำ
- ติดตั้ง phpMyAdmin เพื่อจัดการฐานข้อมูลผ่านหน้าเว็บ (ควรตั้งค่า auth เพิ่ม)
- ติดตั้ง Redis เพื่อใช้เป็น caching layer เพิ่มความเร็วเว็บ
- ตั้งค่า fail2ban เพื่อป้องกัน brute-force SSH และ Apache
- ติดตั้ง WordPress หรือ framework PHP อื่น ๆ บน Virtual Host ที่สร้างไว้
- ตั้งค่า automatic backup ฐานข้อมูลและไฟล์เว็บเป็นประจำ
ตรวจสอบว่า LAMP Stack ทำงานถูกต้อง
# ตรวจสอบ service ทั้งหมด
systemctl status apache2
systemctl status mysql
systemctl status php8.2-fpm
# ทดสอบ Apache + PHP ทำงานร่วมกัน
echo "" > /var/www/html/test.php
curl -s http://localhost/test.php | grep "PHP Version"
rm /var/www/html/test.php
# ตรวจสอบ SSL certificate
certbot certificates
# ทดสอบ Virtual Host
curl -H "Host: example.com" http://localhost/
phpinfo() เปิดเผยข้อมูลระบบทั้งหมดให้ผู้ไม่หวังดีเห็น ลบทันทีหลังทดสอบเสร็จ: rm /var/www/html/test.php
แก้ปัญหาที่พบบ่อย
Error: "403 Forbidden" เมื่อเข้าถึงเว็บ
มักเกิดจาก DocumentRoot ไม่มี index file หรือ permission ของ directory ไม่ถูกต้อง:
# ตรวจสอบว่ามีไฟล์ index ในโฟลเดอร์
ls /var/www/example.com/public_html/
# ตรวจสอบ ownership
ls -la /var/www/example.com/
# ควรเป็น www-data:www-data
# แก้ไข permission
chown -R www-data:www-data /var/www/example.com
chmod -R 755 /var/www/example.com
Error: PHP ไม่ทำงาน แสดงโค้ด PHP ดิบแทน
Apache ยังไม่ได้ connect กับ PHP-FPM หรือ mod ไม่ได้ enable ให้:
# ตรวจสอบ mod ที่ enable
apache2ctl -M | grep -E "php|proxy_fcgi"
# เปิด mod ที่จำเป็น
a2enmod proxy_fcgi setenvif
a2enconf php8.2-fpm
systemctl restart apache2
Error: "AH00558: apache2: Could not reliably determine the server's fully qualified domain name"
เป็น warning ไม่ใช่ error ที่ทำให้เว็บล้ม แต่ fix ได้ง่ายด้วย:
echo "ServerName localhost" >> /etc/apache2/apache2.conf
systemctl restart apache2
Error: Certbot ล้มเหลว "Error: Challenge failed for domain"
A Record ของโดเมนต้องชี้ไปที่ IP ของ VPS แล้ว และ port 80 ต้องเข้าถึงได้จากภายนอก:
# ตรวจสอบ DNS
dig +short example.com
# ต้องแสดง IP ของ VPS
# ตรวจสอบ port 80 จากภายนอก
curl -s http://example.com/ | head -5
Error: MySQL "ERROR 1045 (28000): Access denied for user 'root'"
Ubuntu 20.04+ ใช้ unix_socket authentication สำหรับ root ต้องใช้ sudo:
# วิธีที่ถูกต้อง
sudo mysql
# หรือสร้าง user ใหม่สำหรับใช้งาน
sudo mysql -e "CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password';"
sudo mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';"
คำถามที่พบบ่อย
ต้องการโฮสต์หลายเว็บบน VPS เดียวกัน ทำได้ไหม?
ได้เลย Apache Virtual Host ออกแบบมาสำหรับสิ่งนี้ สร้างไฟล์ .conf แยกสำหรับแต่ละโดเมนใน /etc/apache2/sites-available/ แล้ว a2ensite เปิดใช้งาน ทุกโดเมนสามารถมี DocumentRoot, SSL certificate และ PHP pool แยกกันได้
LAMP กับ LEMP ต่างกันอย่างไร? เลือกตัวไหนดีกว่า?
LAMP ใช้ Apache เป็น web server ส่วน LEMP ใช้ Nginx Nginx เร็วกว่าสำหรับ static files และ concurrent connections มาก ส่วน Apache flexible กว่าตรง .htaccess support ถ้าเริ่มต้นใหม่แนะนำ LEMP (Nginx) แต่ถ้า app ต้องการ .htaccess สำหรับ WordPress หรือ CodeIgniter เลือก LAMP ได้
SSL Let's Encrypt หมดอายุทุก 90 วัน จะต้อง renew เองไหม?
Certbot ตั้ง systemd timer หรือ cron auto-renewal ให้อัตโนมัติตอนติดตั้ง ตรวจสอบด้วย systemctl status certbot.timer และทดสอบ renewal ด้วย certbot renew --dry-run ถ้า timer ทำงาน ไม่ต้อง renew เองเลย