หลายครั้งที่ทีม Developer มาหาแล้วบอกว่า “พี่ครับ MySQL มันช้าแล้ว ข้อมูลเยอะขึ้นเรื่อย ๆ ระบบเริ่มมีปัญหา” – นั่นแหละคือสัญญาณว่าถึงเวลาต้องมองหา Database Engine ที่แข็งแกร่งกว่าแล้ว
PostgreSQL (หรือที่เรียกกันว่า “Postgres”) คือฐานข้อมูลเชิงสัมพันธ์ (Relational Database) แบบ Open Source ที่โดดเด่นเรื่อง ACID Compliance, JSON Support, และรองรับข้อมูลขนาดใหญ่ได้ดีเยี่ยม – ไม่แปลกเลยที่องค์กรระดับโลกอย่าง Apple, Instagram, และ Spotify ต่างก็เลือกใช้
บทความนี้แนะนำการติดตั้งและตั้งค่า PostgreSQL บน Rocky Linux 10 ตั้งแต่ต้นจนใช้งานได้จริง พร้อม Hardening เบื้องต้นเพื่อความปลอดภัย
สิ่งที่คุณจะได้เรียนรู้
เมื่ออ่านบทความนี้จบ คุณจะสามารถ
- ติดตั้ง PostgreSQL บน Rocky Linux 10 ได้อย่างถูกต้อง
- ตั้งค่า Authentication และสร้าง User/Database ได้
- เปิดใช้งาน Remote Connection อย่างปลอดภัย
- ตรวจสอบสถานะและ Verify การติดตั้งด้วยตัวเอง
Prerequisites
ก่อนเริ่มต้น ตรวจสอบให้แน่ใจว่าพร้อมแล้วในทุกข้อ
| รายการ | รายละเอียด |
|---|---|
| OS | Rocky Linux 10 (x86_64) |
| RAM | ขั้นต่ำ 1 GB (แนะนำ 2 GB ขึ้นไป) |
| Disk | ขั้นต่ำ 10 GB |
| User | User ที่มีสิทธิ์ sudo |
| Network | เข้าถึง Internet ได้ |
| PostgreSQL Version | 16.x (Stable ล่าสุด) |
⚠️ หมายเหตุ: Rocky Linux 10 อิงฐานจาก RHEL 10 ใช้
dnfเป็น Package Manager และมาพร้อม SELinux เปิดใช้งานโดยค่าเริ่มต้น — บทความนี้จะไม่ปิด SELinux แต่จะแนะนำวิธีทำงานร่วมกับมัน
ขั้นตอนที่ 1 อัพเดทระบบ
เริ่มต้นด้วยการอัพเดท Package ให้เป็นเวอร์ชันล่าสุดก่อนเสมอ เป็น Best Practice ที่ไม่ควรข้ามไป
# อัพเดท package ทั้งหมดในระบบ
sudo dnf update -y
# ตรวจสอบ OS version ให้ชัดเจน
cat /etc/rocky-release
```
ผลลัพธ์ที่ควรเห็น
```
Rocky Linux release 10.x (Blue Onyx)
ขั้นตอนที่ 2 เพิ่ม PostgreSQL Official Repository
Rocky Linux มี PostgreSQL อยู่ใน Default Repository แต่แนะนำให้ใช้ PostgreSQL Official Repository (PGDG) เพราะจะได้เวอร์ชันใหม่ล่าสุดเสมอ และได้รับ Update ที่เร็วกว่า
# ติดตั้ง PGDG Repository สำหรับ Rocky Linux 10 / RHEL 10
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-10-x86_64/pgdg-redhat-repo-latest.noarch.rpm
จากนั้น Disable โมดูล PostgreSQL ที่มาพร้อมกับ AppStream เพื่อป้องกันความขัดแย้ง:
# ปิดการใช้งาน module postgresql ของ AppStream
# เพื่อให้ระบบใช้ version จาก PGDG แทน
sudo dnf -qy module disable postgresql
ตรวจสอบว่า Repository ถูกเพิ่มสำเร็จ
# แสดงรายการ repository ที่มีคำว่า postgresql
sudo dnf repolist | grep postgresql
```
ผลลัพธ์ที่ควรเห็น
```
pgdg16 PostgreSQL 16 for RHEL/Rocky 10 - x86_64
pgdg-common PostgreSQL common RPMs for RHEL/Rocky 10 - x86_64
ขั้นตอนที่ 3 ติดตั้ง PostgreSQL 16
# ติดตั้ง PostgreSQL 16 Server และ Client
sudo dnf install -y postgresql16-server postgresql16
💡 Tip: ถ้าต้องการ PostgreSQL เวอร์ชันอื่น เช่น 15 หรือ 17 เพียงเปลี่ยนตัวเลขในชื่อ Package เช่น
postgresql15-server
ตรวจสอบเวอร์ชันที่ติดตั้ง
# ตรวจสอบ version ของ PostgreSQL ที่ติดตั้ง
/usr/pgsql-16/bin/postgres --version
```
ผลลัพธ์
```
postgres (PostgreSQL) 16.x
ขั้นตอนที่ 4 Initialize Database Cluster
ก่อนจะเริ่มใช้งาน PostgreSQL ได้ ต้อง Initialize Database Cluster ก่อน (ทำครั้งเดียว):
# สร้าง Database Cluster เริ่มต้น
# คำสั่งนี้จะสร้างไฟล์ฐานข้อมูลใน /var/lib/pgsql/16/data/
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
```
ผลลัพธ์ที่ควรเห็น
```
Initializing database ... OK
⚠️ ข้อควรระวัง: ห้ามรันคำสั่งนี้ซ้ำหากมีข้อมูลอยู่แล้ว เพราะจะทำให้ข้อมูลถูกลบทิ้ง!
ขั้นตอนที่ 5 เปิดใช้งานและ Start Service
# เปิด service ให้ start อัตโนมัติเมื่อ reboot
sudo systemctl enable postgresql-16
# Start service ตอนนี้เลย
sudo systemctl start postgresql-16
# ตรวจสอบสถานะ
sudo systemctl status postgresql-16
```
ผลลัพธ์ที่ควรเห็น
```
● postgresql-16.service - PostgreSQL 16 Database Server
Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled)
Active: active (running) since ...
ขั้นตอนที่ 6 ตั้งค่า PostgreSQL เบื้องต้น
6.1 ตั้ง Password ให้ postgres Superuser
PostgreSQL จะสร้าง System User ชื่อ postgres ให้อัตโนมัติ ต้องตั้ง Password ก่อนใช้งาน:
# เข้าสู่ PostgreSQL shell ในฐานะ postgres user
sudo -u postgres psql
เมื่อเข้ามาแล้วจะเห็น Prompt postgres=# จากนั้นรันคำสั่งนี้:
-- ตั้ง password ให้ postgres superuser
-- เปลี่ยน 'YourStrongPassword@2024' เป็น password ที่แข็งแกร่ง
ALTER USER postgres WITH PASSWORD 'YourStrongPassword@2024';
-- ออกจาก psql
\q
6.2 สร้าง Database User และ Database สำหรับ Application
แนวปฏิบัติที่ดีคือ ไม่ควรใช้ User postgres สำหรับ Application โดยตรง ให้สร้าง User แยกต่างหาก:
# เข้า psql ในฐานะ postgres
sudo -u postgres psql
-- สร้าง user สำหรับ application
-- เปลี่ยน 'appuser' และ 'AppUserPassword@123' ตามต้องการ
CREATE USER appuser WITH PASSWORD 'AppUserPassword@123';
-- สร้าง database และกำหนดเจ้าของ
CREATE DATABASE myappdb OWNER appuser;
-- ให้สิทธิ์ทั้งหมดบน database ที่สร้าง
GRANT ALL PRIVILEGES ON DATABASE myappdb TO appuser;
-- ตรวจสอบ user ที่มีอยู่
\du
-- ตรวจสอบ database ที่มีอยู่
\l
-- ออกจาก psql
\q
```
ผลลัพธ์ `\du` ที่ควรเห็น:
```
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
appuser |
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
ขั้นตอนที่ 7 ตั้งค่า Authentication (pg_hba.conf)
ไฟล์ pg_hba.conf คือ “ประตูรักษาความปลอดภัย” ของ PostgreSQL ควบคุมว่า User ไหนจะเชื่อมต่อจากที่ไหนได้อย่างไร
# เปิดไฟล์ pg_hba.conf
sudo nano /var/lib/pgsql/16/data/pg_hba.conf
ค้นหาบรรทัดที่มี local และ host แล้วแก้ให้เป็นดังนี้
# TYPE DATABASE USER ADDRESS METHOD
# การเชื่อมต่อผ่าน Unix Socket (local) - ให้ใช้ peer authentication
local all postgres peer
# การเชื่อมต่อ local อื่น ๆ - ใช้ scram-sha-256 (แข็งแกร่งกว่า md5)
local all all scram-sha-256
# IPv4 local connections - ต้องมี password
host all all 127.0.0.1/32 scram-sha-256
# IPv6 local connections
host all all ::1/128 scram-sha-256
💡 Tip:
scram-sha-256คือวิธี Authentication ที่ปลอดภัยที่สุดใน PostgreSQL 16 แนะนำให้ใช้แทนmd5เสมอ
บันทึกไฟล์ แล้ว Reload PostgreSQL
# Reload configuration โดยไม่ต้อง restart service
sudo systemctl reload postgresql-16
ขั้นตอนที่ 8 ตั้งค่า Firewall
8.1 เปิด Port ด้วย firewalld
PostgreSQL ใช้ Port 5432 โดยค่าเริ่มต้น
# เปิด port 5432 สำหรับ zone public
sudo firewall-cmd --permanent --add-port=5432/tcp
# Reload firewall
sudo firewall-cmd --reload
# ตรวจสอบว่า port ถูกเพิ่มแล้ว
sudo firewall-cmd --list-ports
⚠️ ข้อควรระวัง: การเปิด Port 5432 สู่ Internet โดยตรงถือว่าเสี่ยงมาก หากต้องการให้ Remote Connection ควรใช้ SSH Tunnel หรือ VPN แทน หรือจำกัด Source IP ให้เฉพาะที่เชื่อใจ
ขั้นตอนที่ 9 เปิดใช้งาน Remote Connection (Optional)
ถ้าต้องการให้ Application Server อื่นเชื่อมต่อมายัง Database Server นี้ ต้องทำ 2 ขั้นตอน
9.1 แก้ไข postgresql.conf
sudo nano /var/lib/pgsql/16/data/postgresql.conf
ค้นหาบรรทัด listen_addresses แล้วแก้ไข:
# ค่าเริ่มต้นคือ 'localhost' ซึ่งรับเฉพาะ local connection
# เปลี่ยนเป็น '*' เพื่อรับทุก interface หรือระบุ IP ที่ต้องการ
listen_addresses = '*'
# Port มาตรฐาน ไม่ต้องเปลี่ยนหากไม่จำเป็น
port = 5432
9.2 เพิ่ม Rule ใน pg_hba.conf
sudo nano /var/lib/pgsql/16/data/pg_hba.conf
เพิ่มบรรทัดนี้ที่ท้ายไฟล์ (เปลี่ยน IP เป็น Network ของคุณ)
# อนุญาตให้ appuser เชื่อมต่อจาก network 192.168.1.0/24 เท่านั้น
# ห้ามใส่ 0.0.0.0/0 เพราะจะเปิดให้ทุกคนเข้าได้!
host myappdb appuser 192.168.1.0/24 scram-sha-256
Restart PostgreSQL เพื่อให้การเปลี่ยนแปลงมีผล:
sudo systemctl restart postgresql-16
ขั้นตอนที่ 10 — SELinux Context (สำคัญสำหรับ Rocky Linux)
Rocky Linux เปิด SELinux ไว้ค่าเริ่มต้น ถ้า PostgreSQL ทำงานปกติแต่ Remote Connection ไม่ได้ อาจเกิดจาก SELinux ให้ตรวจสอบก่อน
# ตรวจสอบว่า SELinux block connection อยู่หรือเปล่า
sudo ausearch -c 'postmaster' --raw | audit2allow -M postgresql_remote
ถ้ามีการ Block จริง ให้รัน
# อนุญาตให้ PostgreSQL รับ remote connection ผ่าน SELinux
sudo setsebool -P postgresql_can_rsync 1
ทดสอบและ Verify
ทดสอบการเชื่อมต่อ Local
# ทดสอบเชื่อมต่อด้วย appuser ไปยัง myappdb
psql -h 127.0.0.1 -U appuser -d myappdb -W
```
ถ้าสำเร็จจะเห็น Prompt
```
Password for user appuser:
psql (16.x)
Type "help" for help.
myappdb=>
คำสั่งตรวจสอบที่ควรรู้
-- ดู version ของ PostgreSQL
SELECT version();
-- ดู database ปัจจุบัน
SELECT current_database();
-- ดู user ปัจจุบัน
SELECT current_user;
-- ดู connection ที่ active อยู่
SELECT * FROM pg_stat_activity;
-- ออกจาก psql
\q
ตรวจสอบ Log
# ดู log ของ PostgreSQL
sudo tail -f /var/lib/pgsql/16/data/log/postgresql-*.log
# หรือดูผ่าน journald
sudo journalctl -u postgresql-16 -f
Troubleshooting ที่พบบ่อย
| อาการ | สาเหตุที่เป็นไปได้ | วิธีแก้ไข |
|---|---|---|
could not connect to server |
Service ยังไม่ Start | sudo systemctl start postgresql-16 |
FATAL: password authentication failed |
Password ผิด หรือ pg_hba.conf ไม่ถูกต้อง | ตรวจสอบ pg_hba.conf และ password |
connection refused (port 5432) |
Firewall block หรือ listen_addresses ไม่ถูกต้อง | ตรวจสอบ firewall-cmd --list-ports |
permission denied |
SELinux block | ตรวจสอบ ausearch และตั้งค่า SELinux |
FATAL: role does not exist |
ยังไม่ได้สร้าง User | CREATE USER ใน psql |
สรุป
ตอนนี้คุณมี PostgreSQL 16 ที่พร้อมใช้งานบน Rocky Linux 10 แล้ว โดยมีสิ่งที่ตั้งค่าไปแล้ว ได้แก่
- ✅ ติดตั้ง PostgreSQL 16 จาก Official PGDG Repository
- ✅ ตั้งค่า
postgresSuperuser Password - ✅ สร้าง Application User และ Database แยกจาก Superuser
- ✅ ตั้งค่า Authentication ด้วย
scram-sha-256 - ✅ กำหนดสิทธิ์ Firewall อย่างเหมาะสม
- ✅ ดูแล SELinux Context
—
Write by SysAdmin Knowledge
https://www.sysadmin.in.th
March 25, 2026
