PostgreSQL เป็นระบบจัดการฐานข้อมูลเชิงสัมพันธ์แบบ Open Source ที่ได้รับความนิยมสูง ด้วยความสามารถรองรับ JSON, Full-Text Search, Window Functions และ Extension ต่าง ๆ ทำให้เหมาะกับงานตั้งแต่เว็บแอปพลิเคชันขนาดเล็กไปจนถึงระบบ Enterprise ขนาดใหญ่ เวอร์ชัน 16 มาพร้อมกับการปรับปรุงด้าน Query Performance, Logical Replication และ Monitoring ที่ดีขึ้นอย่างมาก
บทความนี้จะแนะนำขั้นตอนการติดตั้ง PostgreSQL 16 บนเซิร์ฟเวอร์ Linux ทั้ง Ubuntu/Debian และ CentOS/AlmaLinux พร้อมตั้งค่าเบื้องต้นให้พร้อมใช้งานจริง ครอบคลุมตั้งแต่เพิ่ม Repository, ติดตั้งแพ็กเกจ, ตั้งค่า Authentication ไปจนถึงการเปิดให้เชื่อมต่อจากภายนอก
ความต้องการขั้นต่ำของระบบ
ก่อนเริ่มติดตั้ง ควรตรวจสอบว่าเซิร์ฟเวอร์มีคุณสมบัติขั้นต่ำดังนี้
- CPU: 1 Core ขึ้นไป (แนะนำ 2 Cores สำหรับ Production)
- RAM: 1 GB ขึ้นไป (แนะนำ 2 GB สำหรับ Production)
- Disk: 10 GB ขึ้นไป (SSD แนะนำสำหรับประสิทธิภาพที่ดี)
- OS: Ubuntu 22.04/24.04, Debian 12, CentOS Stream 9, AlmaLinux 9 หรือ Rocky Linux 9
- สิทธิ์ root หรือ sudo access
ติดตั้งบน Ubuntu / Debian
เพิ่ม Official APT Repository
แพ็กเกจในคลัง Repository เริ่มต้นของ Ubuntu/Debian มักเป็นเวอร์ชันเก่า การเพิ่ม Repository อย่างเป็นทางการช่วยให้ได้เวอร์ชันล่าสุดพร้อมอัปเดตด้านความปลอดภัย
sudo apt update
sudo apt install -y gnupg2 wget
# เพิ่ม GPG Key
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# อัปเดตรายการแพ็กเกจ
sudo apt update
ติดตั้งแพ็กเกจ
# ติดตั้งตัวเซิร์ฟเวอร์และเครื่องมือ Client
sudo apt install -y postgresql-16 postgresql-client-16
# ตรวจสอบเวอร์ชัน
psql --version
หลังติดตั้งเสร็จ ระบบจะสร้าง Cluster เริ่มต้นและเปิดให้บริการอัตโนมัติ ตรวจสอบสถานะได้ด้วยคำสั่ง
sudo systemctl status postgresql
sudo systemctl enable postgresql
ติดตั้งบน CentOS / AlmaLinux / Rocky Linux
เพิ่ม Official YUM Repository
สำหรับตระกูล RHEL ต้องเพิ่ม Repository อย่างเป็นทางการเช่นกัน และปิดโมดูลที่มาพร้อมระบบเพื่อป้องกันเวอร์ชันชนกัน
# ติดตั้ง Repository
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# ปิดโมดูลเริ่มต้น
sudo dnf -qy module disable postgresql
ติดตั้งและ Initialize
# ติดตั้งแพ็กเกจ
sudo dnf install -y postgresql16-server postgresql16
# Initialize Database Cluster
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
# เปิดบริการและตั้งค่า Auto Start
sudo systemctl start postgresql-16
sudo systemctl enable postgresql-16
# ตรวจสอบสถานะ
sudo systemctl status postgresql-16
ข้อแตกต่างสำคัญคือ บน RHEL-based ต้องรัน initdb ด้วยตนเอง ขณะที่ Ubuntu/Debian จะสร้าง Cluster อัตโนมัติตั้งแต่ตอนติดตั้ง
ตั้งค่าเบื้องต้นหลังติดตั้ง
ตั้งรหัสผ่าน Superuser
หลังติดตั้งเสร็จ ผู้ใช้ postgres จะไม่มีรหัสผ่าน ควรตั้งรหัสผ่านทันทีเพื่อความปลอดภัย
# สลับไปยังผู้ใช้ postgres
sudo -i -u postgres
# เข้า psql แล้วตั้งรหัสผ่าน
psql
ALTER USER postgres PASSWORD 'YourStrongPassword123!';
\q
# ออกจากผู้ใช้ postgres
exit
สร้าง Database และ User สำหรับแอปพลิเคชัน
ไม่ควรใช้ Superuser ในการเชื่อมต่อจากแอปพลิเคชัน ควรสร้างผู้ใช้แยกที่มีสิทธิ์เฉพาะเท่าที่จำเป็น
sudo -i -u postgres psql
-- สร้างผู้ใช้ใหม่
CREATE USER appuser WITH PASSWORD 'AppSecurePass456!';
-- สร้างฐานข้อมูลและกำหนดเจ้าของ
CREATE DATABASE myappdb OWNER appuser;
-- ให้สิทธิ์ทั้งหมดในฐานข้อมูลนี้
GRANT ALL PRIVILEGES ON DATABASE myappdb TO appuser;
\q
ทดสอบเชื่อมต่อ
# เชื่อมต่อด้วยผู้ใช้ที่สร้างใหม่
psql -U appuser -d myappdb -h localhost
# ทดสอบคำสั่ง SQL
SELECT version();
\conninfo
\q
ทำความเข้าใจไฟล์ตั้งค่าหลัก
การตั้งค่าทั้งหมดอยู่ในไดเรกทอรี Data ซึ่งตำแหน่งจะแตกต่างกันตามระบบปฏิบัติการ
| ระบบปฏิบัติการ | ตำแหน่งไดเรกทอรี |
|---|---|
| Ubuntu/Debian | /etc/postgresql/16/main/ |
| CentOS/AlmaLinux | /var/lib/pgsql/16/data/ |
ไฟล์สำคัญ 2 ไฟล์ที่ต้องรู้จัก
- postgresql.conf — ไฟล์ตั้งค่าหลัก ควบคุมพฤติกรรมของเซิร์ฟเวอร์ทั้งหมด เช่น พอร์ต, หน่วยความจำ, Logging และ Performance
- pg_hba.conf — ไฟล์ควบคุมการเข้าถึง (Host-Based Authentication) กำหนดว่าใครสามารถเชื่อมต่อจากที่ไหนได้บ้าง
ตั้งค่า pg_hba.conf สำหรับ Authentication
ไฟล์ pg_hba.conf ควบคุมว่าใครสามารถเชื่อมต่อเข้ามาได้ แต่ละบรรทัดมีรูปแบบดังนี้
# TYPE DATABASE USER ADDRESS METHOD
local all all peer
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
อธิบายแต่ละคอลัมน์
- TYPE — ประเภทการเชื่อมต่อ: local (Unix Socket), host (TCP/IP), hostssl (เฉพาะ SSL)
- DATABASE — ชื่อฐานข้อมูลที่อนุญาต ใช้ all สำหรับทุกฐานข้อมูล
- USER — ชื่อผู้ใช้ที่อนุญาต ใช้ all สำหรับทุกคน
- ADDRESS — IP Address หรือ CIDR ที่อนุญาต (เฉพาะ host/hostssl)
- METHOD — วิธียืนยันตัวตน เช่น peer, scram-sha-256, md5, trust, reject
วิธี scram-sha-256 เป็นมาตรฐานที่แนะนำในเวอร์ชัน 16 เพราะปลอดภัยกว่า md5 อย่างมาก หากยังใช้ md5 อยู่ควรเปลี่ยนเป็น scram-sha-256 ทันที
เปิดให้เชื่อมต่อจากภายนอก (Remote Access)
ค่าเริ่มต้นจะรับเฉพาะการเชื่อมต่อจาก localhost เท่านั้น หากต้องการให้แอปพลิเคชันจากเครื่องอื่นเชื่อมต่อได้ ต้องแก้ไข 2 ไฟล์
แก้ไข postgresql.conf
# Ubuntu/Debian
sudo nano /etc/postgresql/16/main/postgresql.conf
# CentOS/AlmaLinux
sudo nano /var/lib/pgsql/16/data/postgresql.conf
# เปลี่ยนบรรทัด listen_addresses
listen_addresses = '*' # รับทุก IP
# หรือระบุเฉพาะ IP
listen_addresses = '0.0.0.0' # รับเฉพาะ IPv4 ทุก interface
แก้ไข pg_hba.conf
# เพิ่มบรรทัดอนุญาต IP ที่ต้องการ
# อนุญาตเฉพาะ IP เดียว
host myappdb appuser 192.168.1.100/32 scram-sha-256
# อนุญาตทั้ง Subnet
host myappdb appuser 192.168.1.0/24 scram-sha-256
# อนุญาตทุก IP (ไม่แนะนำสำหรับ Production)
host all all 0.0.0.0/0 scram-sha-256
รีสตาร์ทบริการและเปิด Firewall
# รีสตาร์ทเพื่อให้การตั้งค่ามีผล
sudo systemctl restart postgresql # Ubuntu/Debian
sudo systemctl restart postgresql-16 # CentOS/AlmaLinux
# เปิด Firewall (UFW)
sudo ufw allow 5432/tcp
# เปิด Firewall (firewalld)
sudo firewall-cmd --permanent --add-port=5432/tcp
sudo firewall-cmd --reload
คำเตือนด้านความปลอดภัย: การเปิดพอร์ต 5432 สู่อินเทอร์เน็ตโดยตรงมีความเสี่ยงสูง ควรจำกัด IP ที่เข้าถึงได้ใน pg_hba.conf และ Firewall ให้เฉพาะเจาะจง หรือใช้ VPN/SSH Tunnel แทน
ปรับแต่ง Performance เบื้องต้น
ค่าเริ่มต้นถูกออกแบบให้ทำงานได้บนทุกเครื่อง แต่สำหรับ Production ควรปรับแต่งให้เหมาะกับทรัพยากรที่มี โดยแก้ไขใน postgresql.conf
# หน่วยความจำ
shared_buffers = '256MB' # 25% ของ RAM (สำหรับ 1 GB RAM)
effective_cache_size = '768MB' # 75% ของ RAM
work_mem = '4MB' # หน่วยความจำต่อ Operation
maintenance_work_mem = '64MB' # สำหรับ VACUUM, CREATE INDEX
# WAL (Write-Ahead Logging)
wal_buffers = '8MB'
checkpoint_completion_target = 0.9
max_wal_size = '1GB'
# Query Planner
random_page_cost = 1.1 # ลดลงสำหรับ SSD
effective_io_concurrency = 200 # เพิ่มสำหรับ SSD
# Connection
max_connections = 100 # ปรับตามจำนวนผู้ใช้จริง
สูตรคำนวณค่าพื้นฐานสำหรับเซิร์ฟเวอร์ที่ใช้งานฐานข้อมูลเป็นหลัก
| พารามิเตอร์ | สูตรคำนวณ | ตัวอย่าง (4 GB RAM) |
|---|---|---|
| shared_buffers | 25% ของ RAM | 1 GB |
| effective_cache_size | 75% ของ RAM | 3 GB |
| work_mem | RAM / max_connections / 4 | 10 MB |
| maintenance_work_mem | RAM / 16 หรือ 256 MB | 256 MB |
หลังแก้ไขแล้วรีสตาร์ทบริการเพื่อให้มีผล จากนั้นตรวจสอบค่าด้วยคำสั่ง SHOW
sudo systemctl restart postgresql
# ตรวจสอบค่าที่ตั้งไว้
sudo -i -u postgres psql -c "SHOW shared_buffers;"
sudo -i -u postgres psql -c "SHOW effective_cache_size;"
sudo -i -u postgres psql -c "SHOW work_mem;"
ตั้งค่า Logging
Logging ที่ดีช่วยให้ตรวจสอบปัญหาและ Monitor ประสิทธิภาพได้ง่ายขึ้น เพิ่มการตั้งค่าต่อไปนี้ใน postgresql.conf
# เปิด Logging
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_rotation_age = 1d
log_rotation_size = 100MB
# บันทึก Query ที่ช้า
log_min_duration_statement = 1000 # บันทึก Query ที่ใช้เวลาเกิน 1 วินาที
log_statement = 'ddl' # บันทึกคำสั่ง DDL (CREATE, ALTER, DROP)
# ข้อมูลเพิ่มเติมใน Log
log_line_prefix = '%t [%p] %u@%d ' # เวลา, PID, ผู้ใช้, ฐานข้อมูล
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
ตั้งค่า Automatic Vacuuming
VACUUM เป็นกระบวนการสำคัญที่ทำความสะอาดข้อมูลที่ถูกลบหรืออัปเดตแล้ว (Dead Tuples) เพื่อคืนพื้นที่และรักษาประสิทธิภาพ Autovacuum เปิดใช้งานโดยค่าเริ่มต้น แต่สามารถปรับแต่งเพิ่มเติมได้
# ตั้งค่า Autovacuum ใน postgresql.conf
autovacuum = on
autovacuum_max_workers = 3
autovacuum_naptime = '1min'
autovacuum_vacuum_threshold = 50
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_threshold = 50
autovacuum_analyze_scale_factor = 0.05
ตรวจสอบสถานะ Autovacuum ได้ด้วยคำสั่ง SQL
SELECT schemaname, relname, last_vacuum, last_autovacuum,
vacuum_count, autovacuum_count, n_dead_tup
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
สำรองและกู้คืนข้อมูลเบื้องต้น
การสำรองข้อมูลเป็นสิ่งที่ต้องตั้งค่าตั้งแต่วันแรก เครื่องมือหลักที่ใช้คือ pg_dump และ pg_dumpall
# สำรองฐานข้อมูลเดียว
pg_dump -U postgres -d myappdb -F c -f /backup/myappdb_$(date +%Y%m%d).dump
# สำรองทุกฐานข้อมูล
pg_dumpall -U postgres -f /backup/all_databases_$(date +%Y%m%d).sql
# กู้คืนจากไฟล์ .dump
pg_restore -U postgres -d myappdb -c /backup/myappdb_20260407.dump
# กู้คืนจากไฟล์ .sql
psql -U postgres -f /backup/all_databases_20260407.sql
ตั้ง Cron Job สำหรับสำรองข้อมูลอัตโนมัติทุกวัน
# สร้างไดเรกทอรีสำรองข้อมูล
sudo mkdir -p /backup/postgresql
sudo chown postgres:postgres /backup/postgresql
# เพิ่ม Cron Job
sudo crontab -u postgres -e
# เพิ่มบรรทัดนี้ — สำรองทุกวันตี 2
0 2 * * * pg_dump -U postgres -d myappdb -F c -f /backup/postgresql/myappdb_$(date +\%Y\%m\%d).dump 2>> /var/log/pg_backup.log
# ลบไฟล์สำรองที่เก่ากว่า 30 วัน
0 3 * * * find /backup/postgresql -name "*.dump" -mtime +30 -delete
ติดตั้ง Extension ที่มีประโยชน์
จุดเด่นอย่างหนึ่งของ PostgreSQL คือระบบ Extension ที่ขยายความสามารถได้ง่าย Extension ที่แนะนำสำหรับการใช้งานทั่วไป
# ติดตั้งแพ็กเกจ Extension เพิ่มเติม
sudo apt install -y postgresql-16-postgis postgresql-contrib # Ubuntu/Debian
sudo dnf install -y postgresql16-contrib # CentOS/AlmaLinux
# เปิดใช้ Extension ในฐานข้อมูล
sudo -i -u postgres psql -d myappdb
CREATE EXTENSION IF NOT EXISTS pg_stat_statements; -- วิเคราะห์ Query Performance
CREATE EXTENSION IF NOT EXISTS pg_trgm; -- Full-Text Search ภาษาไทย
CREATE EXTENSION IF NOT EXISTS uuid-ossp; -- สร้าง UUID
CREATE EXTENSION IF NOT EXISTS hstore; -- Key-Value Storage
-- ตรวจสอบ Extension ที่ติดตั้งแล้ว
SELECT extname, extversion FROM pg_extension ORDER BY extname;
ตรวจสอบสถานะหลังติดตั้งเสร็จ
หลังตั้งค่าทุกอย่างเรียบร้อยแล้ว ตรวจสอบสถานะรวมเพื่อยืนยันว่าทุกอย่างทำงานถูกต้อง
# ตรวจสอบบริการ
sudo systemctl status postgresql
# ตรวจสอบเวอร์ชัน
sudo -i -u postgres psql -c "SELECT version();"
# ตรวจสอบฐานข้อมูลทั้งหมด
sudo -i -u postgres psql -c "\l"
# ตรวจสอบผู้ใช้ทั้งหมด
sudo -i -u postgres psql -c "\du"
# ตรวจสอบการตั้งค่าสำคัญ
sudo -i -u postgres psql -c "
SELECT name, setting, unit, short_desc
FROM pg_settings
WHERE name IN (
'listen_addresses', 'port', 'max_connections',
'shared_buffers', 'effective_cache_size', 'work_mem',
'logging_collector', 'log_min_duration_statement'
)
ORDER BY name;"
# ตรวจสอบว่ารับการเชื่อมต่อได้จริง
psql -U appuser -d myappdb -h localhost -c "SELECT current_user, current_database(), inet_server_addr(), inet_server_port();"
แนวปฏิบัติด้านความปลอดภัย
หลังติดตั้งเสร็จ ควรตรวจสอบด้านความปลอดภัยเพิ่มเติมเพื่อป้องกันการเข้าถึงโดยไม่ได้รับอนุญาต
- ใช้ scram-sha-256 — เปลี่ยน password_encryption ใน postgresql.conf เป็น scram-sha-256 และอัปเดต pg_hba.conf ให้ใช้วิธีนี้ทั้งหมด
- จำกัด IP ใน pg_hba.conf — อย่าใช้ 0.0.0.0/0 ใน Production ระบุเฉพาะ IP หรือ Subnet ที่จำเป็น
- ใช้ SSL/TLS — เปิด ssl = on ใน postgresql.conf และตั้งค่า Certificate เพื่อเข้ารหัสข้อมูลระหว่างทาง
- หลักสิทธิ์น้อยที่สุด — สร้าง User แยกสำหรับแต่ละแอปพลิเคชัน ให้สิทธิ์เฉพาะที่จำเป็น ไม่ใช้ Superuser
- อัปเดตสม่ำเสมอ — ตรวจสอบ Security Patch ทุกเดือนและอัปเดตเวอร์ชันย่อย เช่น 16.1 เป็น 16.2
- สำรองข้อมูล — ตั้ง Backup อัตโนมัติและทดสอบกู้คืนเป็นประจำ
สรุป
การติดตั้ง PostgreSQL 16 บน Cloud VPS ไม่ใช่เรื่องยาก ขั้นตอนหลักคือเพิ่ม Repository อย่างเป็นทางการ ติดตั้งแพ็กเกจ ตั้งรหัสผ่าน Superuser สร้าง Database/User สำหรับแอปพลิเคชัน แล้วปรับแต่ง pg_hba.conf กับ postgresql.conf ให้เหมาะกับการใช้งาน สิ่งสำคัญที่ไม่ควรลืมคือตั้งค่าความปลอดภัย Logging และ Backup ตั้งแต่วันแรก เพื่อให้ระบบฐานข้อมูลพร้อมรับมือกับปัญหาที่อาจเกิดขึ้นในอนาคต
แนะนำบริการ DE
หากคุณต้องการเซิร์ฟเวอร์สำหรับรัน PostgreSQL 16 ด้วยตัวเอง Cloud VPS ของ DE เป็นตัวเลือกที่เหมาะสม เพราะให้สิทธิ์ root เต็มรูปแบบ สามารถติดตั้งและตั้งค่าได้อิสระตามที่บทความนี้แนะนำ พร้อมรองรับ SSD Storage ที่ช่วยให้ประสิทธิภาพการอ่านเขียนข้อมูลดีขึ้น
สำหรับผู้ที่ต้องการโฮสต์เว็บไซต์ที่ใช้ PostgreSQL เป็น Backend โดยไม่ต้องจัดการเซิร์ฟเวอร์เอง Cloud Hosting ของ DE ก็เป็นอีกทางเลือกที่สะดวก มีระบบจัดการผ่าน Control Panel ที่ใช้งานง่ายโดยไม่ต้องใช้ Command Line

