ข้ามไปยังเนื้อหาหลัก

ตั้งค่า 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

สำหรับกรณีใช้งานขั้นสูง อาจต้องติดตั้งส่วนขยาย 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;
}
}
เวอร์ชัน PHP

สำคัญมากที่ต้องเปลี่ยน [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

important

ต้องเปลี่ยน [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 และทำตามขั้นตอนโต้ตอบเพื่อสร้างใบรับรองสำหรับโดเมนที่เลือกได้อย่างรวดเร็วและง่ายดาย

ถ้ามีคำถามหรือต้องการความช่วยเหลือ ติดต่อทีมซัพพอร์ตของเราได้เลย พร้อมให้บริการทุกวัน! 🙂