Linux Server ฉบับสมบูรณ์

ตั้งแต่ติดตั้งระบบจนถึงเปิดใช้งาน Server จริง

สถาพสถาปัตยกรรม Docker Engine, libcontainer/LXC, Linux Kernel และ Physical/Virtual Server
Docker Engine ทำงานผ่าน libcontainer หรือ LXC แล้วพึ่ง Namespaces, cgroups และ Capabilities ของ Linux Kernel

Linux Server ฉบับสมบูรณ์: ตั้งแต่ติดตั้งระบบจนถึงเปิดใช้งาน Server จริง

บทความนี้จัดทำขึ้นเป็นคู่มือเรียนรู้ Linux Server ตั้งแต่ระดับพื้นฐานจนถึงการติดตั้งบริการต่าง ๆ ที่ใช้ในองค์กร เช่น Web Server, Database Server, Application Server, DNS Server, File Server, Mail Server, Proxy Server, Container Server และระบบ Monitoring

แนวทางเรื่องลิขสิทธิ์: เนื้อหาจะเรียบเรียงขึ้นใหม่ด้วยภาษาของเราเอง ใช้คำสั่งและตัวอย่างที่สร้างขึ้นเพื่อการเรียนรู้ และอ้างอิงเอกสารทางเทคนิคจากแหล่งต้นฉบับที่ตรวจสอบได้ โดยจะไม่คัดลอกบทความหรือคู่มือของบุคคลอื่นมาทั้งชุด ทั้งนี้ การเป็นเอกสารทางการไม่ได้หมายความว่าเนื้อหาทุกส่วนไม่มีลิขสิทธิ์ จึงควรแยกการอ้างอิงข้อมูลออกจากการนำข้อความ รูปภาพ และเครื่องหมายการค้าของผู้อื่นมาใช้

คู่มือนี้จะใช้ Ubuntu Server LTS และ Rocky Linux/RHEL-compatible Linux เป็นตัวอย่างหลัก โดยแยกคำสั่งของแต่ละตระกูลให้ชัดเจน เพราะคำสั่งติดตั้งแพ็กเกจ การตั้งค่า Firewall และตำแหน่งไฟล์บางส่วนแตกต่างกัน

สารบัญ

ส่วนที่ 1: พื้นฐานและการเตรียม Server

Linux, Distribution, Hardware, IP Address, SSH และการติดตั้ง OS

ส่วนที่ 2: Network และ Web Server

IP, DNS, Firewall, Nginx, Apache, TLS/HTTPS และ Reverse Proxy

ส่วนที่ 3: Database และ Application Server

PostgreSQL, MySQL/MariaDB, Java, Node.js, PHP และ Python

ส่วนที่ 4: Server สำหรับบริการอื่น

SFTP, File Server, Samba, DNS, DHCP, Mail, Proxy และ Docker

ส่วนที่ 5: ดูแลระบบระดับ Production

Security, Log, Monitoring, Backup, Restore, High Availability และ Troubleshooting

1. ทำความเข้าใจ Linux Server ก่อนเริ่มติดตั้ง

Linux Server คือระบบปฏิบัติการ Linux ที่นำมาให้บริการแก่เครื่องหรือโปรแกรมอื่นผ่านเครือข่าย ตัวอย่างเช่น เครื่องหนึ่งให้บริการเว็บไซต์ อีกเครื่องให้บริการฐานข้อมูล และอีกเครื่องเก็บไฟล์สำรองข้อมูล

Clients / Users

Browser · Mobile App · Java Application

Network Layer

IP · Routing · DNS · Firewall · TLS

Web Server

Nginx / Apache

Database

PostgreSQL / MariaDB

Application

Java / Node.js / PHP

Storage

Files / Backup / Logs

1.1 Linux Distribution ที่ควรรู้จัก

Distributionเหมาะกับงานระบบติดตั้งแพ็กเกจ
Ubuntu Server LTSWeb, Database, Application, Cloudapt
DebianServer ทั่วไป เน้นระบบที่เรียบง่ายapt
Rocky LinuxEnterprise Server และระบบที่ต้องการความเข้ากันได้กับ RHELdnf
AlmaLinuxEnterprise Server ที่เข้ากันได้กับ RHELdnf
Red Hat Enterprise Linux (RHEL)ระบบองค์กรที่ต้องการการสนับสนุนจากผู้ผลิตdnf
SUSE Linux Enterprise Serverระบบองค์กรและงาน Data Centerzypper

ไม่จำเป็นต้องติดตั้งทุก Distribution ในเครื่องเดียว ควรเลือกให้ตรงกับมาตรฐานองค์กร ซอฟต์แวร์ที่ต้องใช้ ระยะเวลาสนับสนุน และความสามารถของทีมผู้ดูแล

1.2 โครงสร้างระบบที่ใช้ในบทความนี้

เพื่อให้ตัวอย่างนำไปทดลองได้ง่าย จะกำหนดสภาพแวดล้อมสมมติดังนี้

รายการค่าตัวอย่าง
OSUbuntu Server LTS
Hostnameapp01
IP ภายใน192.168.10.10
Web ServerNginx
ApplicationJava
DatabasePostgreSQL
SSHTCP port 22
HTTPTCP port 80
HTTPSTCP port 443
IP Address และชื่อเครื่องข้างต้นเป็นเพียงตัวอย่าง ต้องเปลี่ยนให้ตรงกับเครือข่ายจริงก่อนนำไปใช้

สำหรับการเรียนรู้ แนะนำให้เริ่มจาก Virtual Machine หรือเครื่องทดสอบที่ไม่มีข้อมูลสำคัญก่อน แล้วจึงนำขั้นตอนที่ผ่านการทดสอบไปใช้กับ Production

2. ติดตั้ง Linux Server และเตรียมระบบ

2.1 ติดตั้ง Ubuntu Server

ดาวน์โหลด ISO จากเว็บไซต์ทางการของ Ubuntu Server และติดตั้งบนเครื่องจริงหรือ Virtual Machine

ลำดับการติดตั้งโดยทั่วไปมีดังนี้:

เลือกภาษาและรูปแบบคีย์บอร์ด

กำหนด Network หรือเลือก DHCP เพื่อรับ IP อัตโนมัติ

กำหนด Storage และพาร์ทิชัน

กำหนด Hostname เช่น app01

สร้างบัญชีผู้ดูแลระบบ

เลือกติดตั้ง OpenSSH Server เพื่อบริหารจากระยะไกล

ติดตั้งระบบให้เสร็จและ Reboot

เอกสารติดตั้งจาก Ubuntu มีภาพและรายละเอียดตามขั้นตอนจริง

Ubuntu Server documentation

+1

2.2 ตรวจสอบระบบหลังติดตั้ง

เข้าสู่ระบบ Terminal แล้วทดลองคำสั่งต่อไปนี้

# ตรวจสอบเวอร์ชัน OS

cat /etc/os-release

# ตรวจสอบ Kernel

uname -r

# ตรวจสอบ Hostname

hostnamectl

# ตรวจสอบ CPU

lscpu

# ตรวจสอบ RAM

free -h

# ตรวจสอบ Disk

lsblk

df -h

# ตรวจสอบ IP Address

ip addr

# ตรวจสอบ Routing Table

ip route

คำสั่งเหล่านี้เป็นเครื่องมือพื้นฐานที่ควรใช้ก่อนติดตั้งบริการใด ๆ เพราะช่วยให้ทราบว่าเครื่องใช้ OS เวอร์ชันใด มีทรัพยากรเท่าใด และเชื่อมต่อเครือข่ายอย่างไร

2.3 อัปเดตแพ็กเกจ

Ubuntu/Debian:

sudo apt update
sudo apt upgrade

Rocky Linux/RHEL:

sudo dnf check-update
sudo dnf upgrade

คำสั่งตรวจสอบการอัปเดตอาจคืน Exit Code ที่แตกต่างกันตามผลลัพธ์ อย่าตีความว่าทุก Exit Code ที่ไม่ใช่ศูนย์หมายถึงระบบเสีย

ใน Production ควรทดสอบแพ็กเกจใหม่ในสภาพแวดล้อมทดสอบก่อน และวางแผน Restart หากมีการอัปเดต Kernel หรือบริการสำคัญ

2.4 ตั้งค่าเวลาและ Hostname

sudo hostnamectl set-hostname app01

timedatectl

หากต้องการกำหนดเขตเวลาไทย:

sudo timedatectl set-timezone Asia/Bangkok

timedatectl

การตั้งเวลาให้ถูกต้องสำคัญต่อ Log, Certificate, การตรวจสอบเหตุการณ์ และการวิเคราะห์ปัญหาข้ามหลาย Server

ส่วนที่ 3: Network, SSH และ Firewall

3. ติดตั้ง SSH Server เพื่อ Remote จากเครื่องอื่น

SSH ช่วยให้ผู้ดูแลระบบเชื่อมต่อ Linux Server จากเครื่องคอมพิวเตอร์เครื่องอื่นได้อย่างเข้ารหัส รวมถึงใช้ส่งไฟล์ด้วย scp และ sftp

Ubuntu Server documentation

ติดตั้งบน Ubuntu:

sudo apt update
sudo apt install openssh-server

ตรวจสอบสถานะ:

sudo systemctl status ssh
sudo systemctl enable --now ssh
sudo ss -lntp | grep ':22'

เชื่อมต่อจากเครื่อง Client:

ssh [email protected]

เปลี่ยน youruser และ IP ให้ตรงกับเครื่องจริง

เพิ่มความปลอดภัยให้ SSH

ใช้บัญชีผู้ใช้ส่วนตัวและสิทธิ์ sudo

ใช้ SSH Key สำหรับการเข้าถึงจากเครื่องที่เชื่อถือได้

จำกัดการเข้าถึง TCP port 22 จากเครือข่ายผู้ดูแล

ตรวจสอบการตั้งค่า SSH ก่อน Reload หรือ Restart

อย่าปิดการเข้าสู่ระบบด้วยรหัสผ่านจนกว่าจะทดสอบ SSH Key จาก Session ใหม่สำเร็จ

ก่อนแก้ไขการตั้งค่า:

sudo sshd -t

คำสั่งนี้ตรวจสอบไวยากรณ์ของการตั้งค่า SSH หากต้องการเปลี่ยนการตั้งค่าการยืนยันตัวตน ให้สำรองไฟล์เดิมและทดสอบใน Session แยกก่อนเสมอ เพื่อป้องกันการล็อกตัวเองออกจากเครื่อง

4. ตั้งค่า Firewall

Firewall ควบคุมว่าเครือข่ายใดสามารถเชื่อมต่อเข้ามายัง Server ได้บ้าง

Ubuntu: ใช้ UFW

ตรวจสอบสถานะก่อน:

sudo ufw status verbose

หากเป็นเครื่องใหม่และยังไม่มี Firewall Policy ให้กำหนดนโยบายอย่างระมัดระวัง โดยอนุญาต SSH ก่อนเปิดใช้งาน Firewall:

sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status numbered

สำหรับเครื่อง Web Server ที่ต้องเปิดเว็บไซต์:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

อย่าเปิดพอร์ตทุกพอร์ตโดยไม่จำเป็น และหาก SSH ใช้พอร์ตอื่นต้องปรับกฎให้ตรงกับค่าจริงก่อนเปิด Firewall

Rocky Linux/RHEL: ใช้ firewalld

sudo systemctl status firewalld
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --list-all

ตัวอย่างเปิดบริการ HTTP และ HTTPS แบบถาวร:

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

ต้องตรวจสอบ Zone ที่ผูกกับ Network Interface จริง และอย่าเปลี่ยน SSH หรือ Firewall จากระยะไกลโดยไม่มีช่องทางกู้คืน

พอร์ต Server ที่พบบ่อย

PortProtocolหน้าที่
22TCPSSH / SFTP
53UDP/TCPDNS
67/68UDPDHCPv4
80TCPHTTP
123UDPNTP
143TCPIMAP
443TCPHTTPS
445TCPSMB / Samba
465, 587TCPSMTP Submission
993TCPIMAPS
5432TCPPostgreSQL ค่าเริ่มต้น
3306TCPMySQL/MariaDB ค่าเริ่มต้น
6379TCPRedis ค่าเริ่มต้น
9100TCPNode Exporter ค่าเริ่มต้น

พอร์ตเหล่านี้เป็นค่าเริ่มต้นที่พบได้ทั่วไป ไม่ได้หมายความว่าทุกบริการควรเปิดให้เข้าถึงจากอินเทอร์เน็ต โดยเฉพาะ Database, Cache และ Monitoring ควรจำกัดให้อยู่ในเครือข่ายที่ได้รับอนุญาต

ส่วนที่ 4: ติดตั้ง Web Server

Web Server ใช้รับ HTTP Request จาก Browser หรือ Application แล้วส่งกลับเป็นหน้าเว็บ ไฟล์ หรือส่งต่อคำขอไปยังโปรแกรมอื่น

5. ติดตั้ง Nginx Server

Nginx สามารถให้บริการไฟล์เว็บไซต์ ทำ Reverse Proxy และส่งคำขอไปยัง Application Server ได้

5.1 ติดตั้ง Nginx บน Ubuntu

sudo apt update
sudo apt install nginx
sudo systemctl enable --now nginx
sudo systemctl status nginx

บน Rocky Linux/RHEL สามารถติดตั้งจาก Repository ที่เหมาะกับเวอร์ชันระบบได้ด้วย:

sudo dnf install nginx
sudo systemctl enable --now nginx

จากนั้นเปิด HTTP ใน Firewall ตามระบบที่ใช้

5.2 ทดสอบ Web Server

curl -I http://127.0.0.1/

หากบริการทำงานอยู่ อาจเห็น HTTP Status เช่น 200 OK หรือ Redirect Status ที่เหมาะสม

ไฟล์เว็บไซต์เริ่มต้นของ Ubuntu มักอยู่ที่:

/var/www/html/

สร้างหน้าเว็บตัวอย่าง:

echo '<h1>Linux Server is Running</h1>' \

| sudo tee /var/www/html/index.html

ทดสอบจากเครื่อง Client:

curl http://192.168.10.10/

หากเรียกจาก Browser ให้ใช้ http://192.168.10.10/ โดยต้องอยู่ในเครือข่ายที่เข้าถึง IP นี้ได้

5.3 ตรวจสอบ Log

บน Ubuntu ที่ติดตั้ง Nginx จากแพ็กเกจมาตรฐาน:

sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

access.log แสดงคำขอที่เข้ามา

error.log แสดงปัญหาการทำงานและรายละเอียดข้อผิดพลาด

หากเปิดเว็บไซต์ไม่ได้ ควรตรวจสอบสถานะ Service, Log, IP Address, Routing และ Firewall ไม่ควรสรุปว่าเป็นปัญหาของ Nginx ทันที

6. ติดตั้ง Apache HTTP Server

Apache เป็น Web Server อีกตัวที่นิยมใช้ในระบบเว็บไซต์และแอปพลิเคชัน

Apache HTTP Server Version 2.4

+1

Ubuntu:

sudo apt update
sudo apt install apache2
sudo systemctl enable --now apache2
sudo systemctl status apache2

Rocky Linux/RHEL:

sudo dnf install httpd
sudo systemctl enable --now httpd
sudo systemctl status httpd

ตรวจสอบการตอบสนอง:

curl -I http://127.0.0.1/

บน Ubuntu ไฟล์การตั้งค่าหลักอยู่ที่ /etc/apache2/ ส่วน Rocky Linux/RHEL โดยทั่วไปอยู่ที่ /etc/httpd/

ควรเลือก Nginx หรือ Apache? ทั้งสองสามารถให้บริการเว็บไซต์ได้ ไม่จำเป็นต้องติดตั้งทั้งคู่ หากใช้พอร์ตเดียวกันบน IP เดียวกันจะเกิดการชนกันได้ เว้นแต่จะออกแบบให้แยกพอร์ตหรือใช้ร่วมกันเป็น Reverse Proxy อย่างตั้งใจ

7. ติดตั้ง HTTPS ด้วย TLS Certificate

HTTPS ช่วยเข้ารหัสการรับส่งข้อมูลระหว่าง Client กับ Server และช่วยตรวจสอบตัวตนของเว็บไซต์

ก่อนออกใบรับรองสำหรับเว็บไซต์จริง ควรมี Domain Name ที่ชี้มายัง Server ถูกต้อง และเตรียมพอร์ตที่จำเป็นตามวิธีการตรวจสอบ Certificate

สำหรับ Nginx สามารถใช้ Certbot ช่วยติดตั้งและจัดการ Certificate จาก Let's Encrypt ได้ โดยวิธีติดตั้งควรเลือกให้ตรงกับ OS และ Web Server

Certbot

+1

หลังติดตั้งตามคำแนะนำทางการของระบบแล้ว ตัวอย่างคำสั่งสำหรับ Nginx คือ:

sudo certbot --nginx -d example.com

เปลี่ยน example.com เป็น Domain ที่คุณควบคุมและตั้ง DNS ไว้ถูกต้อง คำสั่งนี้จะเหมาะเมื่อมี Certbot และ Plugin สำหรับ Nginx ติดตั้งแล้ว

ตรวจสอบการต่ออายุ Certificate ตามวิธีที่ติดตั้ง:

sudo certbot renew --dry-run

อย่าคัดลอก Certificate หรือ Private Key จากเว็บไซต์อื่นมาใช้ และอย่าเปิดเผย Private Key ต่อสาธารณะ

ส่วนที่ 5: ติดตั้ง Database Server

8. PostgreSQL Server

PostgreSQL เป็นฐานข้อมูลเชิงสัมพันธ์ที่ใช้ได้กับระบบธุรกิจ เว็บไซต์ และ Java Application

8.1 ติดตั้งบน Ubuntu

sudo apt update
sudo apt install postgresql
sudo systemctl enable --now postgresql
sudo systemctl status postgresql

ตรวจสอบเวอร์ชัน:

sudo -u postgres psql -c "SELECT version();"

สร้าง Database และ User สำหรับระบบทดลอง:

sudo -u postgres psql

จากนั้นรัน SQL:

CREATE USER appuser WITH PASSWORD 'ChangeThis_TestPassword';

CREATE DATABASE appdb OWNER appuser;

\l

\du

\q

รหัสผ่านในตัวอย่างเป็นค่าทดลองเท่านั้น ต้องเปลี่ยนเป็นรหัสผ่านที่ปลอดภัยก่อนใช้งานจริง และไม่ควรใส่รหัสผ่านจริงในไฟล์ Source Code หรือประวัติคำสั่งที่ผู้อื่นเข้าถึงได้

8.2 ตรวจสอบการทำงาน

sudo -u postgres psql -d appdb

ภายใน psql ทดลอง:

SELECT current_database();

SELECT current_user;

\dt

หากต้องการเชื่อมต่อจากเครื่องอื่น ต้องกำหนด Listen Address, pg_hba.conf, Network ACL และ Firewall อย่างเหมาะสม ไม่ควรเปิด PostgreSQL สู่ Internet โดยตรงหากไม่มีเหตุจำเป็นและมาตรการป้องกันที่เพียงพอ

9. MySQL หรือ MariaDB Server

MySQL และ MariaDB เป็นฐานข้อมูลเชิงสัมพันธ์ที่นิยมใช้กับเว็บแอปพลิเคชัน

9.1 ติดตั้ง MySQL บน Ubuntu

sudo apt update
sudo apt install mysql-server
sudo systemctl enable --now mysql
sudo systemctl status mysql

ตรวจสอบเวอร์ชัน:

sudo mysql -e "SELECT VERSION();"

สร้างฐานข้อมูลและบัญชีสำหรับแอปพลิเคชัน:

CREATE DATABASE appdb;

CREATE USER 'appuser'@'localhost'

IDENTIFIED BY 'ChangeThis_TestPassword';

GRANT SELECT, INSERT, UPDATE, DELETE

ON appdb.*

TO 'appuser'@'localhost';

คำสั่งเหล่านี้ต้องรันผ่าน Client ที่มีสิทธิ์ผู้ดูแลฐานข้อมูล และรหัสผ่านต้องเปลี่ยนก่อนใช้งานจริง

คู่มือ MySQL มีขั้นตอนติดตั้งหลายวิธี รวมถึงการติดตั้งจาก Repository ของระบบและ Repository ของผู้ผลิต จึงควรเลือกวิธีเดียวให้เหมาะกับเวอร์ชันที่ต้องการ

dev.mysql.com

+1

9.2 เลือก PostgreSQL, MySQL หรือ MariaDB

ลักษณะงานแนวทางเลือก
ระบบที่ใช้ PostgreSQL อยู่แล้วใช้ PostgreSQL เวอร์ชันที่รองรับ
แอปพลิเคชันที่ออกแบบมาสำหรับ MySQLใช้ MySQL ที่เข้ากันได้
ระบบเดิมที่ใช้ MariaDBตรวจสอบ Compatibility ก่อนอัปเกรดหรือย้าย
ต้องการย้าย Databaseทดสอบ Schema, SQL, Data Type, Driver และแผนกู้คืน

ไม่ควรติดตั้งฐานข้อมูลหลายชนิดเพียงเพราะคิดว่าต้องมีทุกตัวใน Server เดียวกัน ควรติดตั้งเฉพาะบริการที่แอปพลิเคชันต้องการ

ส่วนที่ 6: ติดตั้ง Application Server

10. Java Application Server

สำหรับระบบที่พัฒนาด้วย Java สามารถรันโปรแกรมเป็น Service บน Linux โดยใช้ systemd เพื่อให้เริ่มทำงานหลัง Boot และสามารถตรวจสอบสถานะได้

ติดตั้ง Java Runtime จาก Repository ของ OS:

Ubuntu:

sudo apt update
sudo apt install openjdk-21-jre-headless

java -version

ตัวอย่างนี้ใช้ Java 21 หากแอปพลิเคชันต้องการ Java 8, 11, 17 หรือเวอร์ชันอื่น ต้องเลือก Runtime ให้ตรงกับระบบงานและนโยบายสนับสนุน

สมมติว่ามีไฟล์ JAR อยู่ที่ /opt/myapp/app.jar และต้องการสร้าง Service

สร้างไฟล์:

sudo nano /etc/systemd/system/myapp.service

ใส่เนื้อหาตัวอย่าง:

[Unit]

Description=My Java Application

After=network.target

[Service]

Type=simple

User=myapp

WorkingDirectory=/opt/myapp

ExecStart=/usr/bin/java -jar /opt/myapp/app.jar

Restart=on-failure

RestartSec=5

[Install]

WantedBy=multi-user.target

ก่อนเปิดใช้งาน ต้องสร้างบัญชี myapp และกำหนดสิทธิ์อ่านไฟล์ JAR และโฟลเดอร์ที่จำเป็นให้เรียบร้อย

sudo systemctl daemon-reload
sudo systemctl enable --now myapp
sudo systemctl status myapp

ตรวจสอบ Log:

sudo journalctl -u myapp -n 100 --no-pager
sudo journalctl -u myapp -f

แนวทางนี้ใช้ได้กับ Java Application แบบทั่วไปที่รันผ่าน java -jar แต่หากเป็น Tomcat, WildFly หรือ Application Server เฉพาะ ควรใช้วิธีติดตั้งและตั้งค่าตามรูปแบบของซอฟต์แวร์นั้น

11. Node.js Server

Node.js เหมาะกับแอปพลิเคชันที่พัฒนาด้วย JavaScript หรือ TypeScript ฝั่ง Server

ควรเลือก Node.js รุ่นที่ยังได้รับการสนับสนุนและเข้ากันได้กับโปรเจกต์ โดยติดตั้งจากแหล่งที่เชื่อถือได้และตรวจสอบเวอร์ชันก่อนนำไปใช้จริง

node --version

npm --version

หากมีโปรเจกต์ที่เตรียมไว้แล้ว:

cd /opt/nodeapp

npm ci

จากนั้นสามารถกำหนด Service ด้วย systemd ตามรูปแบบเดียวกับ Java โดยให้รันด้วยบัญชีผู้ใช้ที่ไม่มีสิทธิ์ผู้ดูแลระบบ และจัดเก็บค่าลับไว้ในระบบจัดการ Secret ที่เหมาะสม

12. PHP Application Server

เว็บไซต์ PHP มักใช้งานร่วมกับ Nginx หรือ Apache และ PHP-FPM

Ubuntu ตัวอย่าง:

sudo apt update
sudo apt install php-fpm php-cli php-pgsql

หากใช้ MySQL ให้พิจารณา Driver ที่ตรงกับแอปพลิเคชัน เช่น php-mysql แทนหรือเพิ่มเติมตามความจำเป็น

ตรวจสอบเวอร์ชัน:

php -v

การตั้งค่า PHP-FPM และการเชื่อมต่อกับ Nginx ต้องอ้างอิง Socket หรือ Port ของ PHP-FPM ที่ติดตั้งจริง เพราะชื่อ Socket แตกต่างกันได้ตามเวอร์ชันและแพ็กเกจ

ส่วนที่ 7: File Server และบริการเครือข่าย

13. SFTP สำหรับส่งไฟล์อย่างปลอดภัย

SFTP เป็นการโอนไฟล์ผ่าน SSH จึงไม่จำเป็นต้องติดตั้ง FTP Server เพิ่ม หากต้องการเพียงให้ผู้ใช้ส่งไฟล์เข้าออกอย่างปลอดภัย

ตรวจสอบว่า SSH Server ทำงานอยู่:

sudo systemctl status ssh

ส่งไฟล์จาก Client:

sftp [email protected]

ภายใน SFTP Client สามารถใช้คำสั่ง เช่น:

ls

pwd

put report.txt

get result.txt

bye

ควรกำหนดสิทธิ์โฟลเดอร์ให้เหมาะสม และหากต้องการให้ผู้ใช้เข้าถึงเฉพาะพื้นที่ของตน ควรออกแบบบัญชีและการตั้งค่า SSH ให้รองรับข้อกำหนดนั้นอย่างรอบคอบ

14. Samba File Server

Samba ช่วยให้ Linux แชร์ไฟล์ผ่าน SMB สำหรับเครื่อง Windows และ Client ที่รองรับ

ติดตั้งบน Ubuntu:

sudo apt update
sudo apt install samba
sudo systemctl enable --now smbd

สร้างโฟลเดอร์ทดลอง:

sudo mkdir -p /srv/share
sudo chown root:root /srv/share
sudo chmod 2770 /srv/share

ตัวอย่างนี้ยังไม่ใช่การตั้งค่าสิทธิ์แชร์ที่สมบูรณ์ ต้องสร้างกลุ่มผู้ใช้ กำหนด ACL และปรับ Samba Configuration ก่อนเปิดใช้งาน

ไฟล์ตั้งค่าทั่วไปคือ:

/etc/samba/smb.conf

ควรจำกัดการเข้าถึง SMB ไว้ในเครือข่ายภายใน และไม่ควรเปิดพอร์ต 445 สู่ Internet โดยตรง

15. DNS Server

DNS Server ทำหน้าที่แปลงชื่อ Domain เป็น IP Address และอาจให้บริการ Reverse Lookup หรือการจัดการ Zone ตามรูปแบบที่ออกแบบไว้

ตัวอย่างซอฟต์แวร์ ได้แก่ BIND และ Unbound โดยมีหน้าที่หลักต่างกัน: BIND สามารถให้บริการ Authoritative DNS และ Recursive DNS ตามการตั้งค่า ส่วน Unbound มักใช้เป็น Recursive Resolver

ก่อนติดตั้ง DNS สำหรับองค์กร ควรออกแบบ:

Forward Zone และ Reverse Zone

Authoritative DNS กับ Recursive Resolver

การกำหนดสิทธิ์ Zone Transfer

การเปิด UDP/TCP port 53 ตามบทบาท

การสำรองไฟล์ Zone และ Configuration

ห้ามเปิด Recursive Resolver ให้บุคคลทั่วไปใช้งานโดยไม่มีการควบคุม เพราะอาจถูกนำไปใช้โจมตีระบบอื่นได้

16. DHCP Server

DHCP Server ใช้แจกจ่าย IP Address, Gateway, DNS และค่าการตั้งค่าเครือข่ายให้ Client

ตัวอย่างซอฟต์แวร์มีหลายชนิด เช่น Kea DHCP และบริการ DHCP ที่มากับอุปกรณ์เครือข่าย

ก่อนติดตั้ง ต้องตรวจสอบว่ามี DHCP Server ตัวอื่นในเครือข่ายอยู่แล้วหรือไม่ การเปิด DHCP Server ซ้ำในเครือข่ายเดียวกันโดยไม่ได้ออกแบบอาจทำให้เครื่อง Client ได้รับ IP หรือ Gateway ที่ไม่ถูกต้อง

สำหรับเครือข่ายองค์กร ควรทำงานร่วมกับผู้ดูแล Network เพื่อกำหนด Subnet, DHCP Range, Reservation และการป้องกัน DHCP Server ที่ไม่ได้รับอนุญาต

17. Mail Server

Mail Server ประกอบด้วยหลายส่วน ไม่ได้มีเพียงโปรแกรมรับส่งอีเมลตัวเดียว

SMTP: รับและส่งข้อความอีเมล

IMAP: ให้ Client เข้าถึงกล่องจดหมาย

Mail Delivery Agent: จัดเก็บหรือส่งต่อข้อความไปยังกล่องจดหมาย

Spam และ Malware Filtering: ช่วยกรองข้อความไม่พึงประสงค์

TLS: ปกป้องการรับส่งข้อมูล

DNS Records: MX, SPF, DKIM และ DMARC ช่วยกำหนดการส่งและตรวจสอบอีเมล

ตัวอย่างซอฟต์แวร์ ได้แก่ Postfix สำหรับ SMTP และ Dovecot สำหรับบริการ Mailbox/IMAP

Mail Server ที่เปิดให้ใช้งานจริงต้องมี Domain ที่ถูกต้อง การจัดการ Certificate การตรวจสอบการส่งอีเมล และการป้องกัน Open Relay หากต้องการเพียงส่งแจ้งเตือนจากระบบภายใน การใช้ SMTP Relay ขององค์กรอาจง่ายและปลอดภัยกว่าการดูแล Mail Server เอง

ส่วนที่ 8: Container Server และระบบ Deployment

18. Docker Server

Docker ใช้รันแอปพลิเคชันใน Container เพื่อแยกสภาพแวดล้อมของโปรแกรมออกจากกัน ช่วยให้การติดตั้งและการย้ายระบบทำได้เป็นมาตรฐานมากขึ้น

เอกสารติดตั้ง Docker Engine บน Linux มีขั้นตอนแยกตาม Distribution โดยตรง

18.1 ติดตั้ง Docker Engine

บน Ubuntu ให้ใช้วิธีติดตั้งจาก Repository ทางการของ Docker ตามเวอร์ชัน OS ที่รองรับ ขั้นตอนโดยทั่วไปประกอบด้วย:

เตรียม Repository และ GPG Key ตามเอกสารทางการ

ติดตั้ง Docker Engine และ Plugin ที่ต้องใช้

เปิดใช้งาน Service

ตรวจสอบการทำงาน

ตรวจสอบ Firewall และนโยบายเครือข่ายของ Container

หลังติดตั้ง:

sudo systemctl enable --now docker
sudo systemctl status docker
sudo docker version

ทดสอบด้วย Container ขนาดเล็ก:

sudo docker run --rm hello-world

คำสั่งนี้จะดาวน์โหลด Image หากยังไม่มีอยู่ในเครื่อง แล้วรันเพื่อแสดงข้อความทดสอบ

18.2 ตรวจสอบ Container

sudo docker ps
sudo docker ps -a
sudo docker images
sudo docker logs --tail 100 CONTAINER_NAME

เปลี่ยน CONTAINER_NAME เป็นชื่อ Container ที่มีอยู่จริง

18.3 รัน Web Server ใน Container

ตัวอย่าง:

sudo docker run -d \

--name web-test \

-p 127.0.0.1:8080:80 \

nginx

จากนั้นทดสอบบนเครื่อง Server:

curl -I http://127.0.0.1:8080/

ตัวอย่างนี้ผูกพอร์ตไว้ที่ Loopback Address ของ Server เท่านั้น ทำให้เครื่องอื่นในเครือข่ายไม่สามารถเชื่อมต่อผ่านพอร์ตนี้โดยตรงได้ตามปกติ เหมาะสำหรับการทดลองหรือให้ Reverse Proxy ภายในเครื่องเรียกใช้งาน

ข้อควรระวังสำคัญ: การเผยแพร่พอร์ตของ Container อาจมีผลต่อกฎ Firewall ที่ตั้งไว้ จึงต้องตรวจสอบนโยบาย Packet Filtering ของ Docker และระบบ Firewall ก่อนนำไปใช้จริง

18.4 Docker Compose

เมื่อแอปพลิเคชันมีหลายบริการ เช่น Web และ Database สามารถใช้ Compose เพื่อกำหนดโครงสร้างระบบไว้ในไฟล์เดียวได้

ตัวอย่างไฟล์ compose.yaml สำหรับทดลอง Web Server:

services:

web:

image: nginx:stable

ports:

restart: unless-stopped

เริ่มบริการ:

sudo docker compose up -d
sudo docker compose ps
sudo docker compose logs

ก่อนใช้ใน Production ควรกำหนด Image Version ที่ผ่านการทดสอบ จัดการ Persistent Storage สำรองข้อมูลที่จำเป็น และกำหนดวิธีอัปเดตและย้อนกลับเวอร์ชัน

ส่วนที่ 9: Monitoring, Logging และการดูแลระบบ

19. ตรวจสอบสถานะ Service ด้วย systemd

Linux Server ส่วนใหญ่ที่ใช้ Ubuntu หรือ Rocky Linux รุ่นปัจจุบันใช้ systemd ในการจัดการบริการ

คำสั่งพื้นฐาน:

# ตรวจสอบสถานะ

sudo systemctl status nginx

# เริ่มบริการ

sudo systemctl start nginx

# หยุดบริการ

sudo systemctl stop nginx

# Restart บริการ

sudo systemctl restart nginx

# โหลด Configuration ใหม่

sudo systemctl reload nginx

# ตั้งให้เริ่มทำงานหลัง Boot

sudo systemctl enable nginx

# ตรวจสอบว่าตั้งให้เริ่มอัตโนมัติหรือไม่

sudo systemctl is-enabled nginx

อย่าใช้ restart แทน reload โดยอัตโนมัติทุกครั้ง เพราะการ Restart อาจทำให้การเชื่อมต่อที่กำลังใช้งานอยู่ได้รับผลกระทบ ขึ้นอยู่กับบริการนั้น ๆ

20. ตรวจสอบ CPU, Memory, Disk และ Network

CPU

uptime

top

ดู Load Average และ Process ที่ใช้ CPU สูง

Memory

free -h

vmstat 1 5

ตรวจสอบ RAM, Swap และแนวโน้มการใช้ทรัพยากร

Disk

df -h
df -i

lsblk

ตรวจสอบพื้นที่ว่าง Inode และอุปกรณ์จัดเก็บข้อมูล

Network

ip -s link

ss -lntup

ตรวจสอบสถิติ Interface และ Port ที่กำลังเปิดรับการเชื่อมต่อ

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

21. ติดตั้งระบบ Monitoring

ตัวเลือกที่นิยมใช้ ได้แก่:

Prometheus

เก็บ Metrics จากระบบต่าง ๆ และรองรับการ Query ข้อมูลเพื่อสร้าง Alert

Grafana

สร้าง Dashboard สำหรับ CPU, Memory, Disk, Database และ Application

Zabbix

ใช้ตรวจสอบ Server, Network, Service และกำหนด Trigger สำหรับแจ้งเตือน

ระบบ Monitoring ที่ดีควรติดตามอย่างน้อย:

CPU และ Load Average

Memory และ Swap

Disk Space และ Inode

Network Throughput และ Packet Errors

สถานะ Service และ Health Check

จำนวน Database Connections

Query Latency และ Error Rate

อายุ Backup ล่าสุดและผลการทดสอบ Restore

ควรกำหนด Alert ให้สะท้อนความเสี่ยงทางธุรกิจ ไม่ใช่แจ้งเตือนทุกครั้งที่ทรัพยากรเพิ่มขึ้นชั่วคราว และควรแยก Monitoring Server ออกจากระบบที่กำลังตรวจสอบเมื่อเป็นไปได้

22. ตรวจสอบ Log

สำหรับระบบที่ใช้ systemd:

# Log ของ Nginx

sudo journalctl -u nginx -n 100 --no-pager

# Log ของ PostgreSQL

sudo journalctl -u postgresql -n 100 --no-pager

# Log ของระบบในช่วง Boot ปัจจุบัน

sudo journalctl -b -p warning

# ดู Log แบบต่อเนื่อง

sudo journalctl -f

ตำแหน่ง Log จริงอาจขึ้นอยู่กับการตั้งค่า Service และ Distribution จึงควรตรวจสอบไฟล์ Configuration ของบริการนั้น ๆ ด้วย

แนวทางจัดการ Log ที่ดี:

กำหนดอายุการเก็บ Log ให้เหมาะสม

ใช้ Log Rotation เพื่อควบคุมขนาดไฟล์

ป้องกัน Log เต็มจนกระทบพื้นที่ระบบ

จำกัดสิทธิ์การอ่าน Log ที่มีข้อมูลสำคัญ

ซิงโครไนซ์เวลาระหว่าง Server เพื่อให้นำ Log มาเทียบเหตุการณ์กันได้

ส่วนที่ 10: Backup, Security และ Disaster Recovery

23. วางแผน Backup Server

การสำรองข้อมูลต้องครอบคลุมมากกว่า Database เพราะระบบจริงยังมี Configuration, Application, Certificate, ไฟล์ผู้ใช้ และข้อมูลที่ใช้กู้คืนบริการ

สิ่งที่ต้องสำรองตัวอย่าง
DatabasePostgreSQL, MySQL/MariaDB
ApplicationJAR, Source Release, Deployment Artifact
ConfigurationNginx, SSH, Firewall, systemd
User Dataไฟล์เอกสาร รูปภาพ และไฟล์ที่ระบบสร้าง
ContainerCompose Files, Image Version, Persistent Volumes
Security Configurationรายการบัญชี สิทธิ์ และนโยบายระบบ
Recovery Documentationขั้นตอน Restore และลำดับเปิดบริการ

ตัวอย่างสำรอง Configuration ที่ต้องการเก็บ:

sudo tar -czf /backup/server-config-$(date +%F).tar.gz \
/etc/nginx \
/etc/ssh \
/etc/systemd/system

ตัวอย่างนี้สมมติว่ามี /backup อยู่แล้ว และต้องตรวจสอบก่อนว่า Configuration ที่เก็บมีข้อมูลลับหรือไม่ ควรจำกัดสิทธิ์ไฟล์สำรองและเข้ารหัสตามความเหมาะสม

การสำรองไฟล์ Configuration เพียงอย่างเดียวไม่เพียงพอสำหรับกู้คืนระบบทั้งหมด ต้องมีแผนสำรองข้อมูลจริงและตรวจสอบว่าไฟล์สำรองสมบูรณ์

หลักการสำรองข้อมูลที่แนะนำ

มีสำเนาอย่างน้อยหนึ่งชุดแยกจาก Server ต้นทาง

ป้องกันไม่ให้ผู้ดูแลระบบที่ถูกยึดบัญชีลบ Backup ได้ทั้งหมด

เข้ารหัสข้อมูลสำรองที่มีข้อมูลสำคัญ

กำหนด Retention Policy

ทดสอบ Restore ในระบบแยก

บันทึกเวลาที่ใช้กู้คืนจริงเพื่อประเมิน RTO และ RPO

PostgreSQL มีวิธีสำรองหลายแบบ เช่น SQL Dump, File-System Backup และ Continuous Archiving ซึ่งเหมาะกับความต้องการกู้คืนต่างกัน

24. Security Hardening สำหรับ Linux Server

Security Hardening คือการลดจุดเสี่ยงของระบบให้เหลือเท่าที่จำเป็นต่อการใช้งาน

รายการตรวจสอบเบื้องต้น:

Security Checklist

0/10

อัปเดต OS และแพ็กเกจตามรอบที่กำหนด

ใช้บัญชีแยกตามหน้าที่และให้สิทธิ์เท่าที่จำเป็น

ตรวจสอบ SSH Key และการเข้าถึงจากระยะไกล

เปิดเฉพาะ Port ที่บริการต้องใช้

ไม่เปิด Database ให้เข้าถึงจาก Internet โดยไม่จำเป็น

ตรวจสอบ Permission ของไฟล์และโฟลเดอร์

กำหนด Log Rotation และตรวจสอบพื้นที่ดิสก์

สำรองข้อมูลและทดสอบ Restore

ตรวจสอบ Certificate และการต่ออายุ

กำหนดแผน Incident Response และ Recovery

คัดลอก Checklist

SELinux และ AppArmor

Linux บาง Distribution มีระบบ Mandatory Access Control เพื่อจำกัดสิ่งที่ Process สามารถเข้าถึงได้

Rocky Linux/RHEL ใช้ SELinux ในการควบคุมการเข้าถึงตาม Policy

Ubuntu ใช้ AppArmor ในการกำหนดข้อจำกัดให้โปรแกรมที่มี Profile

เมื่อ Application เปิดไฟล์ไม่ได้หรือ Bind Port ไม่สำเร็จ อย่ารีบปิดระบบความปลอดภัยทั้งหมด ควรตรวจสอบ Audit Log, Permission, Security Context และ Policy ที่เกี่ยวข้องก่อนแก้ไข

ส่วนที่ 11: แผนผังติดตั้ง Server สำหรับใช้งานจริง

ตัวอย่างต่อไปนี้เป็นโครงสร้างสำหรับองค์กรขนาดเล็กถึงกลาง ไม่จำเป็นต้องติดตั้งทุกบริการไว้บนเครื่องเดียว

Users / Mobile Applications

Reverse Proxy / Web Tier

Nginx · HTTPS · Access Control

Application Tier

Java · Node.js · PHP · Background Workers

Database Tier

PostgreSQL หรือ MySQL/MariaDB

Monitoring

Metrics · Logs · Alerts

Backup

Off-server · Restore Test

หลักการสำคัญของโครงสร้างนี้คือ Database ไม่ควรรับการเชื่อมต่อจากผู้ใช้อินเทอร์เน็ตโดยตรง แต่ควรรับจาก Application Server ที่ได้รับอนุญาตเท่านั้น

สำหรับระบบขนาดเล็ก สามารถรวม Web และ Application ไว้เครื่องเดียวกันได้ ส่วนระบบที่ต้องการความพร้อมใช้งานสูงควรพิจารณาแยกชั้นระบบ มี Load Balancer, Replica, Backup และขั้นตอน Failover ที่ทดสอบแล้ว

ส่วนที่ 12: Troubleshooting — เมื่อ Server ใช้งานไม่ได้

25. ตารางแก้ไขปัญหาเบื้องต้น

อาการสิ่งที่ควรตรวจสอบ
SSH เข้าไม่ได้IP, Route, Firewall, sshd, Authentication
เว็บไซต์เข้าไม่ได้Nginx/Apache Status, DNS, Port, Access/Error Log
Application หยุดsystemctl status, journalctl, Runtime และ Configuration
Database Connection FailedService, Credentials, ACL, Network, Connection Limit
Disk เต็มdf -h, df -i, Log, Backup, Database Storage
CPU สูงtop, uptime, Process และ Application Log
RAM ไม่พอfree -h, vmstat, Process Memory และ Swap
HTTPS Certificate ErrorDomain, Certificate Chain, เวลาเครื่อง และวันหมดอายุ
Container เข้าไม่ได้Container Status, Port Mapping, Network และ Firewall
DNS Resolve ไม่ได้DNS Records, Resolver, Routing และ Port 53

ตัวอย่างการตรวจสอบเมื่อ Web Server ใช้งานไม่ได้

เริ่มจากตรวจสถานะ:

sudo systemctl status nginx

ตรวจ Configuration:

sudo nginx -t

ตรวจพอร์ต:

sudo ss -lntp

ทดสอบจากเครื่อง Server:

curl -v http://127.0.0.1/

ตรวจ Error Log:

sudo journalctl -u nginx -n 100 --no-pager
sudo tail -n 100 /var/log/nginx/error.log

จากนั้นจึงตรวจ Firewall, DNS และเส้นทางเครือข่ายจาก Client หาก Local Request สำเร็จแต่ Client เชื่อมต่อไม่ได้ ปัญหาอาจอยู่ใน Firewall, Routing, DNS หรือ Network ACL แทนตัว Web Server เอง

ส่วนที่ 13: ลำดับการฝึกปฏิบัติ

หากต้องการเรียนรู้จนสามารถติดตั้งและดูแล Linux Server ได้จริง แนะนำให้ทำ Lab ตามลำดับนี้

Linux Server Lab Checklist

0/10

Lab 1 — Linux Foundation

ติดตั้ง Ubuntu Server, สร้างผู้ใช้, ตรวจ CPU/RAM/Disk และจัดการ Service

Lab 2 — Remote Administration

ติดตั้ง SSH, ทดสอบจาก Client และกำหนด Firewall

Lab 3 — Web Server

ติดตั้ง Nginx, สร้างเว็บไซต์ และตรวจ Access/Error Log

Lab 4 — Database Server

ติดตั้ง PostgreSQL หรือ MySQL สร้าง User/Database และทดลอง CRUD

Lab 5 — Application Server

รัน Java Application ผ่าน systemd และตรวจ Log

Lab 6 — HTTPS

ตั้ง Domain, DNS และ TLS Certificate บนเครื่องทดสอบ

Lab 7 — File Server

สร้างพื้นที่ SFTP หรือ Samba และทดสอบสิทธิ์ผู้ใช้

Lab 8 — Container

ติดตั้ง Docker และทดลอง Deploy Web Container

Lab 9 — Monitoring

ติดตาม CPU, RAM, Disk, Service และตั้ง Alert

Lab 10 — Backup & Recovery

สำรอง Database และ Configuration แล้วทดสอบ Restore บนเครื่องแยก

แหล่งอ้างอิงและการนำเนื้อหาไปใช้โดยไม่ละเมิดลิขสิทธิ์

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

Ubuntu Server Documentation

การติดตั้ง OS, Network, SSH, Firewall, DNS, DHCP และ File Sharing

เอกสารทางการของ Ubuntu Server

Nginx Documentation

การติดตั้งและตั้งค่า Web Server, Static Content และ Reverse Proxy

เอกสารทางการของ Nginx

Apache HTTP Server Documentation

การติดตั้ง Virtual Hosts, Modules และการตั้งค่าเว็บไซต์

เอกสารทางการของ Apache

PostgreSQL Documentation

SQL, Database Administration, Backup, Restore และ Recovery

เอกสารทางการของ PostgreSQL

MySQL Documentation

การติดตั้ง การดูแลฐานข้อมูล และการจัดการ Service

เอกสารทางการของ MySQL

Docker Engine Documentation

การติดตั้ง Container Engine และการจัดการ Container บน Linux

เอกสารทางการของ Docker

Certbot / Electronic Frontier Foundation

วิธีออกและต่ออายุ Certificate สำหรับ HTTPS

คู่มือ Certbot