ตั้งค่า LEMP Stack บนเซิร์ฟเวอร์ Linux - ดีพลอยเว็บแอปประสิทธิภาพสูง
ผลิตภัณฑ์ที่เหมาะสำหรับคู่มือนี้
เริ่มต้นทันที — สั่งซื้อผลิตภัณฑ์ที่เหมาะสมและทำตามคู่มือนี้ทีละขั้นตอน
บทนำ
LEMP stack คือชุดซอฟต์แวร์โอเพนซอร์สยอดนิยมที่ติดตั้งร่วมกันเพื่อให้โฮสต์เว็บไซต์ไดนามิกได้ง่าย โดยเน้นไปที่เว็บไซต์และแอป PHP ชื่อย่อมาจาก: Linux เป็นระบบปฏิบัติการ, "Engine x" (nginx) เป็นเว็บเซิร์ฟเวอร์, MySQL เป็นฐานข้อมูล และสุดท้าย PHP สำหรับประมวลผล ในคู่มือนี้เราจะครอบคลุมขั้นตอนการตั้งค่า LEMP stack บน VPS Linux พร้อมตัวอย่างการตั้งค่าเว็บไซต์รายการสิ่งที่ต้องทำ (to-do list)
การเตรียมตัว
เริ่มต้นด้วยการเชื่อมต่อกับเซิร์ฟเวอร์ของคุณผ่าน SSH หากไม่รู้วิธีทำ โปรดดูที่ การเข้าถึงเบื้องต้น (SSH) คู่มือของเรา
ในคู่มือนี้ เราจะใช้ Ubuntu เป็นดิสโทร Linux คำสั่งเหมือนกันกับ Debian และน่าจะคล้ายกับดิสโทรอื่น ๆ แต่ไวยากรณ์คำสั่งอาจแตกต่างเล็กน้อย ตรวจสอบให้แน่ใจว่าคุณติดตั้งระบบปฏิบัติการแล้วและเชื่อมต่อกับเซิร์ฟเวอร์ผ่าน SSH
เหมือนเดิม ก่อนติดตั้ง ให้แน่ใจว่าแพ็กเกจทั้งหมดอัปเดตแล้วด้วยคำสั่งนี้:
// Ubuntu & Debian
sudo apt update
// CentOS
sudo yum update
// OpenSUSE
sudo zypper up
// Fedora
sudo dnf upgrade --refresh
การติดตั้ง
การติดตั้งแบ่งออกเป็นแต่ละส่วนประกอบหลักของ LEMP เริ่มจากเว็บเซิร์ฟเวอร์ Nginx ตามด้วยฐานข้อมูล MySQL และสุดท้าย PHP ตลอดการติดตั้ง เราจะตั้งค่าเว็บไซต์ทดสอบที่เขียนด้วย PHP และเข้าถึงฐานข้อมูล MySQL สุดท้ายแต่ละคำขอเว็บจะถูกประมวลผลและให้บริการผ่านเว็บเซิร์ฟเวอร์ Nginx
การตั้งค่า Nginx
Nginx คือเว็บเซิร์ฟเวอร์ที่จะใช้ประมวลผลคำขอเว็บที่เข้ามาและส่งคำตอบ ติดตั้งด้วยคำสั่งนี้
sudo apt install nginx
เมื่อติดตั้งเสร็จ ให้แน่ใจว่าสร้างกฎไฟร์วอลล์ที่เหมาะสมเพื่อให้เว็บเซิร์ฟเวอร์เข้าถึงได้จากอินเทอร์เน็ต ในตัวอย่างนี้ เราจะใช้ UFW Firewall เพราะ Nginx มีแอปพลิเคชันที่ลงทะเบียนไว้สำหรับนี้
ถ้าใช้ไฟร์วอลล์อื่น ให้แน่ใจว่าอนุญาตพอร์ต 80 (HTTP) ผ่านไฟร์วอลล์ คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับไฟร์วอลล์ใน Linux ได้จากคู่มือ จัดการไฟร์วอลล์
ตรวจสอบว่าเปิดใช้งาน UFW firewall แล้ว และสร้างกฎสำหรับ SSH ด้วย
# สร้างกฎอนุญาต SSH
sudo ufw allow OpenSSH
# เปิดใช้งาน UFW Firewall
sudo ufw enable
ต้องมีการตั้งกฎสำหรับ SSH ถ้าใช้ UFW Firewall! ถ้าไม่มี คุณจะ ไม่ สามารถ SSH เข้าเซิร์ฟเวอร์ได้อีกถ้าการเชื่อมต่อปัจจุบันหลุด!
ตอนนี้สร้างกฎอนุญาต Nginx แล้วตรวจสอบว่ากฎถูกสร้างเรียบร้อย
# สร้างกฎอนุญาต Nginx
sudo ufw allow in "Nginx Full"
# ตรวจสอบกฎไฟร์วอลล์ UFW
sudo ufw status
คุณสามารถดูโปรไฟล์ที่มีได้โดยรันคำสั่ง ufw app list ในตัวอย่างนี้ การใช้ Nginx Full หมายความว่าสร้างกฎทั้ง HTTP (พอร์ต 80) และ HTTPS (พอร์ต 443)
คุณควรเห็นกฎ Nginx และ Nginx (v6) พร้อมสถานะ ALLOW ซึ่งยืนยันว่าไฟร์วอลล์พร้อมใช้งานแล้ว และควรเห็นกฎอื่น ๆ ที่ตั้งไว้ก่อนหน้านี้ รวมถึงกฎ SSH ด้วย
เมื่อเปิดไฟร์วอลล์สำหรับ Nginx แล้ว ให้ตรวจสอบว่า Nginx ทำงานได้โดยลองเข้าถึงที่อยู่ IP ของคุณผ่านเบราว์เซอร์ เช่น: http://[your_ipaddress]
ถ้าทำงาน คุณจะเห็นหน้าเว็บต้อนรับเริ่มต้น ถ้าไม่ ให้ตรวจสอบสถานะบริการด้วยคำสั่ง: systemctl status nginx
การตั้งค่า MySQL
ตอนนี้ติดตั้งและตั้งค่าเซิร์ฟเวอร์ MySQL ซึ่งจะทำหน้าที่เป็นฐานข้อมูลสำหรับเก็บข้อมูลแบบสัมพันธ์ ติดตั้งด้วยคำสั่งนี้
sudo apt install mysql-server
หลังติดตั้งเสร็จ แนะนำให้รันสคริปต์ติดตั้งแบบปลอดภัยเพื่อให้เซิร์ฟเวอร์ MySQL ของคุณปลอดภัยขึ้น เป็นทางเลือกแต่แนะนำมาก รันด้วยคำสั่ง sudo mysql_secure_installation
จะมีขั้นตอนโต้ตอบให้ตั้งค่าความปลอดภัย เริ่มจากถามเรื่องการตรวจสอบรหัสผ่าน แนะนำเลือก Y เพื่ออนุญาตเฉพาะรหัสผ่านที่ปลอดภัย จากนั้นเลือก MEDIUM โดยกด 1 หรือ STRONG โดยกด 2
ถัดไปจะถามเรื่องลบผู้ใช้ anonymous และปิดการล็อกอิน root จากระยะไกล แนะนำตอบ Y ทั้งสองข้อเพื่อความปลอดภัย ซึ่งจะลบผู้ใช้ทดสอบและจำกัดให้ root ใช้ได้เฉพาะในเครื่องผ่าน SSH เท่านั้น ลดความเสี่ยง
สุดท้ายจะถามเรื่องลบฐานข้อมูล test และโหลดตารางสิทธิ์ใหม่ แนะนำตอบ Y เพราะฐานข้อมูลทดสอบไม่จำเป็นและต้องโหลดตารางสิทธิ์ใหม่เพื่อให้การตั้งค่ามีผล
ตรวจสอบว่า MySQL ทำงานโดยลองล็อกอินด้วยคำสั่ง: sudo mysql -u root ถ้าสำเร็จจะเห็นข้อความต้อนรับ ออกจากระบบด้วยคำสั่ง quit เมื่อพร้อม
การตั้งค่า PHP
ส่วนสุดท้ายของ LEMP คือ PHP สำหรับ nginx ต้องใช้โปรแกรมเสริมชื่อ php-fpm (PHP fastCGI process manager) ซึ่ง Nginx จะส่งคำขอไปให้ php-fpm ประมวลผลก่อนตอบกลับเมื่อใช้ server blocks
ติดตั้ง php-fpm เวอร์ชันล่าสุดพร้อมปลั๊กอิน PHP สำหรับ MySQL ด้วยคำสั่งนี้
sudo apt install php-fpm php-mysql
ตรวจสอบการติดตั้งโดยดูเวอร์ชัน ถ้าแสดงเวอร์ชันแปลว่า PHP ทำงานถูกต้อง
php -v
สำหรับกรณีใช้งานขั้นสูง อาจต้องติดตั้งส่วนขยาย PHP เพิ่มเติม ดูรายการได้โดยรันคำสั่ง apt search php- | less
ใช้ปุ่มลูกศรเลื่อนดู และกด Q เพื่อออก เมื่อต้องการติดตั้งส่วนขยาย ให้ใช้คำสั่ง apt install ตามนี้ สามารถใส่หลายส่วนขยายพร้อมกันโดยเว้นวรรคเพื่อความรวดเร็ว
sudo apt install [php_extension] [...]
สร้างเว็บไซต์ทดสอบ
เมื่อติดตั้ง LEMP ครบแล้ว เราจะสร้างเว็บไซต์ทดสอบเพื่อแสดงว่า LEMP stack ทำงานร่วมกันอย่างไร นี่เป็นทางเลือกแต่ช่วยให้เข้าใจวิธีใช้เครื่องมือเหล่านี้ตั้งเว็บไซต์ของคุณเอง
ในตัวอย่างนี้ เราจะสร้างเว็บไซต์รายการสิ่งที่ต้องทำ (to-do list) ด้วย PHP ซึ่งดึงข้อมูลรายการจากฐานข้อมูล MySQL และให้บริการผ่าน Nginx
เราจะใช้โดเมนทดสอบ zapdocs.example.com ตลอดคู่มือ เพราะในโลกจริงคุณน่าจะใช้โดเมน คุณ ต้อง ตั้งระเบียน DNS ประเภท A สำหรับโดเมนที่ชี้ไปยังที่อยู่ IP ของเซิร์ฟเวอร์ ถ้าต้องการความช่วยเหลือ ดูคู่มือ ระเบียนโดเมน
คุณสามารถไม่ใช้โดเมนและแทนที่ [your_domain] ด้วยชื่อธรรมดาได้ จากนั้นเข้าถึงเว็บไซต์ผ่านที่อยู่ IP แทน แต่เมื่อสร้างไฟล์ server block ให้ลบพารามิเตอร์ server_name ออก
ตั้งค่า Nginx
โดยทั่วไป เว็บเซิร์ฟเวอร์จะเก็บไฟล์และข้อมูลเว็บไซต์ไว้ที่ไดเรกทอรี /var/www โดยปกติ Nginx จะมีไดเรกทอรี html ที่มีหน้าเริ่มต้น เพื่อจัดระเบียบโดยเฉพาะเมื่อโฮสต์หลายเว็บไซต์บน Nginx ตัวเดียว แนะนำให้ตั้งแต่ละเว็บไซต์ในโฟลเดอร์แยกต่างหาก
สร้างโฟลเดอร์ใหม่ใน /var/www/[your_domain] สำหรับแต่ละโดเมนเว็บไซต์ ในตัวอย่างนี้คือ /var/www/zapdocs.example.com
sudo mkdir /var/www/[your_domain]
สร้างไฟล์คอนฟิก server block ใหม่ในไดเรกทอรี sites-available สำหรับโดเมนนี้
sudo nano /etc/nginx/sites-available/[your_domain].conf
ใช้เทมเพลตด้านล่างนี้ คัดลอกลงใน nano editor แล้วแทนที่ [your_domain] ด้วยโดเมนของคุณ
server {
listen 80;
server_name [your_domain] www.[your_domain];
root /var/www/[your_domain];
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php[your_phpversion]-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
สำคัญมากที่ต้องเปลี่ยน [your_phpversion] เป็นเวอร์ชัน PHP ที่ติดตั้งอยู่ ตรวจสอบด้วยคำสั่ง php -v ซึ่งจะแสดงเวอร์ชัน เช่น: PHP 8.3.6 (cli) (built: Mar 19 2025 10:08:38) (NTS)
ในตัวอย่างนี้ ให้ใส่ 8.3 เป็นเวอร์ชันหลัก เช่น: fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
ไฟล์ server block นี้จัดการคำขอพอร์ต 80 (HTTP) และตรวจสอบว่าคำขอตรงกับ server_name ที่ระบุ (โดเมนของคุณ) และชี้ไปยังโฟลเดอร์ /var/www/[your_domain] ที่สร้างไว้เพื่อให้บริการไฟล์
บันทึกไฟล์และออกจาก nano โดยกด CTRL + X ตามด้วย Y เพื่อยืนยัน แล้วกด ENTER
ขั้นตอนสุดท้ายของการตั้งค่า Nginx คือเปิดใช้งานคอนฟิกโดยลิงก์ไฟล์จากไดเรกทอรี sites-enabled
sudo ln -s /etc/nginx/sites-available/[your_domain].conf /etc/nginx/sites-enabled/
ถ้า ไม่ ใช้โดเมน ให้ลบหรือคอมเมนต์บรรทัด server_name โดยใส่ # นำหน้า และปิดการใช้งาน server block เริ่มต้นด้วยคำสั่ง sudo unlink /etc/nginx/sites-enabled/default
แนะนำให้ใช้คำสั่ง sudo nginx -t เพื่อตรวจสอบว่าไฟล์ไม่มีไวยากรณ์ผิดพลาด
สุดท้าย รีสตาร์ท Nginx เพื่อให้การตั้งค่า virtual host ใหม่มีผลด้วยคำสั่ง: sudo systemctl reload nginx
สร้างเว็บไซต์
เมื่อคอนฟิก Nginx เสร็จและสร้างโฟลเดอร์เว็บไซต์แล้ว ถึงเวลาสร้างเว็บไซต์จริง ตอนนี้โฟลเดอร์ยังว่างเปล่า เราจะสร้างเว็บไซต์รายการสิ่งที่ต้องทำเล็ก ๆ สำหรับโดเมนนี้
เตรียมฐานข้อมูล
เริ่มจากสร้างฐานข้อมูลและตารางเก็บรายการ เข้าสู่ระบบ MySQL
sudo mysql -u root
สร้างฐานข้อมูล todowebsite และตาราง todoitems ภายใน
# สร้างฐานข้อมูล
CREATE DATABASE todowebsite;
# ใช้ฐานข้อมูลใหม่
USE todowebsite;
# สร้างตารางรายการในฐานข้อมูล
CREATE TABLE todoitems (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
is_completed BOOLEAN DEFAULT FALSE,
creation_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
สร้างรายการตัวอย่างบางรายการ
INSERT INTO todoitems (name, is_completed) VALUES ('Create ZAP-Docs Guide', 0);
INSERT INTO todoitems (name, is_completed) VALUES ('Buy a ZAP-Hosting Server', 1);
INSERT INTO todoitems (name, is_completed) VALUES ('Join ZAP-Hosting Discord', 0);
INSERT INTO todoitems (name, is_completed) VALUES ('Have a great day!', 0);
สร้างผู้ใช้เฉพาะ todo สำหรับเว็บไซต์นี้
# สร้างผู้ใช้เฉพาะ
# แทนที่ [your_password] ด้วยรหัสผ่านของคุณ
CREATE USER todo@localhost IDENTIFIED BY '[your_password]';
# กำหนดสิทธิ์ให้ผู้ใช้ (คัดลอกเป็นบรรทัดเดียว)
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER
ON todowebsite.*
TO todo@localhost;
# โหลดสิทธิ์ใหม่
FLUSH PRIVILEGES;
ฐานข้อมูลพร้อมและผู้ใช้ตั้งค่าเรียบร้อย ออกจาก MySQL ด้วยคำสั่ง quit เมื่อพร้อม
ไฟล์เว็บไซต์ PHP
ส่วนสุดท้ายคือสร้างไฟล์เว็บไซต์ PHP สำหรับหน้า to-do สร้างไฟล์ index.php ในไดเรกทอรี /var/www/[your_domain] ที่สร้างไว้ เปิด nano editor
sudo nano /var/www/[your_domain]/index.php
ด้านล่างนี้เป็นโค้ดตัวอย่างง่าย ๆ สำหรับหน้า to-do ที่ดึงรายการจากฐานข้อมูล ส่วน PHP แรกเชื่อมต่อ MySQL
ต้องเปลี่ยน [your_password] เป็นรหัสผ่านที่ตั้งไว้สำหรับผู้ใช้ todo ก่อนหน้านี้
ส่วน HTML สร้างหน้าเว็บหลักโดยแสดงรายการแบบลูปผ่านผลลัพธ์
<?php
// เตรียมการเชื่อมต่อ MySQL
$servername = "localhost";
$username = "todo";
$password = "[your_password]";
$dbname = "todowebsite";
// สร้างการเชื่อมต่อ
$conn = new mysqli($servername, $username, $password, $dbname);
// ตรวจสอบการเชื่อมต่อ ถ้าไม่สำเร็จแสดงข้อผิดพลาด
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// รันคำสั่ง SQL เพื่อดึงข้อมูลจากตารางและเก็บในตัวแปรผลลัพธ์
$sql = "SELECT id, name, is_completed, creation_date FROM todoitems ORDER BY creation_date DESC";
$result = $conn->query($sql);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF--8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>To-Do List</title>
</head>
<body>
<h1>Awesome To-Do List :D</h1>
<p>สำหรับคู่มือเจ๋ง ๆ ของ ZAP-Hosting: <a href="https://zap-hosting.com/guides/docs/vserver-linux-lemp-stack">https://zap-hosting.com/guides/docs/vserver-linux-lemp-stack</a></p>
<ul>
<?php
// ตรวจสอบว่ามีผลลัพธ์หรือไม่
if ($result->num_rows > 0) {
// ลูปผ่านแต่ละรายการที่ได้จากคำสั่ง SQL
foreach ($result as $entry) {
echo "<li>";
// แสดงชื่อและใช้ htmlspecialchars ป้องกัน XSS (cross-site scripting)
echo htmlspecialchars($entry["name"]);
// แสดงสถานะการทำเสร็จ
if ($entry["is_completed"]) {
echo " <strong>(Completed)</strong>";
} else {
echo " <strong>(Incomplete)</strong>";
}
// แสดงวันที่สร้าง
echo " - Creation Date: " . htmlspecialchars($entry['creation_date']);
echo "</li>";
}
} else {
// ถ้าไม่มีรายการ แสดงข้อความเริ่มต้น
echo "<li>No to-do items found.</li>";
}
?>
</ul>
</body>
</html>
<?php
// ปิดการเชื่อมต่อฐานข้อมูล
$conn->close();
?>
คัดลอกโค้ดนี้ลงใน nano editor แล้วบันทึกและออกด้วย CTRL + X ตามด้วย Y และ ENTER
ทดสอบเว็บไซต์
คุณตั้งค่าเว็บไซต์ทดสอบรายการสิ่งที่ต้องทำที่ใช้ LEMP stack สำเร็จแล้ว!
ตอนนี้คุณควรเข้าถึงเว็บไซต์ผ่านโดเมน (ใช้ http/พอร์ต 80) ที่ตั้งไว้ในไฟล์ server block เช่น zapdocs.example.com ในตัวอย่าง ผลลัพธ์ควรเป็นแบบนี้:
สรุป
ยินดีด้วย คุณติดตั้งและตั้งค่า LEMP stack สำเร็จแล้ว! ขั้นตอนต่อไป เรา แนะนำอย่างยิ่ง ให้ตั้งค่าโดเมนและ ใบรับรอง SSL เพื่อให้ข้อมูลส่งผ่านเว็บไซต์ของคุณอย่างปลอดภัย โปรดดูคู่มือ Certbot โดยเน้นที่ ปลั๊กอิน Nginx และทำตามขั้นตอนโต้ตอบเพื่อสร้างใบรับรองสำหรับโดเมนที่เลือกได้อย่างรวดเร็วและง่ายดาย
ถ้ามีคำถามหรือต้องการความช่วยเหลือ ติดต่อทีมซัพพอร์ตของเราได้เลย พร้อมให้บริการทุกวัน! 🙂