Cài đặt PostgreSQL trên VPS Ubuntu 24.04 chi tiết

SSH vào VPS VPS Ubuntu 24.04 vừa khởi tạo, tác vụ đầu tiên của sysadmin thường là cài database. PostgreSQL 16 hiện là bản mới nhất của hệ quản trị cơ sở dữ liệu quan hệ mã nguồn mở hàng đầu, được ưa chuộng nhờ tính năng ACID, khả năng mở rộng và hỗ trợ JSON gốc. Bài viết này hướng dẫn bạn từng bước cài đặt, cấu hình bảo mật và tối ưu PostgreSQL trên VPS chạy Ubuntu 24.04 LTS, đảm bảo sẵn sàng cho production workload.
Yêu cầu trước khi bắt đầu
- VPS chạy Ubuntu 24.04 LTS (bạn có thể thuê VPS Ubuntu với quyền root từ nhà cung cấp).
- User non-root có quyền
sudo. Nếu chưa có, hãy tạo một user mới và thêm vào groupsudo. - Kết nối SSH ổn định.
- RAM tối thiểu 1 GB (khuyến nghị 2 GB trở lên cho workload thực tế).
- Đã cập nhật hệ thống:
sudo apt update && sudo apt upgrade -y.
Vì sao cần cài PostgreSQL từ repository chính thức?
Kho phần mềm mặc định của Ubuntu 24.04 cũng có PostgreSQL (bản 16), nhưng thường chậm cập nhật bản vá bảo mật. Repository chính thức từ PostgreSQL Global Development Group luôn cung cấp bản mới nhất và các bản vá kịp thời. Bạn nên thêm apt.postgresql.org để đảm bảo điều này, nhất là khi VPS dùng cho ứng dụng thực tế.
Bước 1 - Thêm repository chính thức của PostgreSQL
Đầu tiên, import GPG key và thêm repository. Các lệnh sau chỉ chạy một lần trên VPS.
sudo apt install -y curl gnupg
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /usr/share/keyrings/postgresql-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/postgresql-archive-keyring.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt update
Lệnh lsb_release -cs trả về tên mã bản phân phối (với Ubuntu 24.04 là noble), giúp repository khớp với hệ thống. Output của sudo apt update sẽ hiện dòng Get:... noble-pgdg InRelease xác nhận thành công.
Bước 2 - Cài đặt PostgreSQL 16
Tiến hành cài đặt PostgreSQL server và client:
sudo apt install -y postgresql-16 postgresql-client-16
Sau khi cài, service PostgreSQL tự động khởi động. Kiểm tra trạng thái:
sudo systemctl status postgresql
Output mong đợi: dòng active (running) cùng với thông tin PID. Nếu không, chạy sudo systemctl enable --now postgresql.
Bước 3 - Bảo mật user mặc định postgres
User postgres là superuser mặc định của PostgreSQL. Bạn nên đặt mật khẩu ngay lập tức:
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'MatKhauManhCuaBan';"
Thay MatKhauManhCuaBan bằng mật khẩu phức tạp, có chữ hoa, số và ký tự đặc biệt. Giữ lại mật khẩu này để sau này đăng nhập qua psql.
Bước 4 - Tạo database và user riêng cho ứng dụng
Không nên dùng user postgres cho ứng dụng. Tạo database và user riêng:
sudo -u postgres psql
Trong giao diện psql, chạy các câu lệnh sau:
CREATE USER app_user WITH PASSWORD 'MatKhauUser';
CREATE DATABASE app_db OWNER app_user;
GRANT ALL PRIVILEGES ON DATABASE app_db TO app_user;
\q
Kiểm tra kết nối từ user mới:
psql -U app_user -d app_db -h localhost
Hệ thống sẽ hỏi mật khẩu và đăng nhập thành công. Để thoát gõ \q.
Bước 5 - Cấu hình cho phép kết nối từ xa (nếu cần)
Mặc định PostgreSQL chỉ lắng nghe trên localhost. Nếu ứng dụng của bạn chạy trên VPS khác, cần sửa file config:
sudo nano /etc/postgresql/16/main/postgresql.conf
Tìm dòng #listen_addresses = 'localhost', sửa thành:
listen_addresses = '*'
Lưu file. Tiếp theo, cấu hình file pg_hba.conf để cho phép IP cụ thể:
sudo nano /etc/postgresql/16/main/pg_hba.conf
Thêm dòng sau (đặt trước các dòng host khác):
host app_db app_user 192.168.1.0/24 md5
Thay 192.168.1.0/24 bằng subnet thực tế. Chú ý: không nên mở PostgreSQL ra toàn bộ internet (0.0.0.0/0) nếu không có firewall chặt chẽ. Hãy chỉ cho phép IP ứng dụng.
Khởi động lại PostgreSQL để áp dụng:
sudo systemctl restart postgresql
Verify: kiểm tra port 5432 đã lắng nghe trên tất cả interface:
sudo ss -tlnp | grep 5432
Output hiện 0.0.0.0:5432 hoặc :::5432 là đúng.
Bước 6 - Cấu hình firewall (UFW)
Nếu bạn đang dùng UFW trên VPS, mở port cho PostgreSQL nhưng chỉ từ IP nguồn cụ thể:
sudo ufw allow from 192.168.1.0/24 to any port 5432 proto tcp
sudo ufw reload
Kiểm tra lại rules: sudo ufw status numbered. Nếu chưa bật UFW, bật lên và nhớ mở port SSH trước:
sudo ufw allow ssh
sudo ufw enable
Nếu dùng firewall khác (nftables/firewalld), cấu hình tương tự.
Bước 7 - Tối ưu tham số PostgreSQL theo RAM VPS
Bạn có thể dùng công cụ pgtune để sinh cấu hình tự động, nhưng cần hiểu tham số căn bản nếu tự chỉnh. Dưới đây là công thức áp dụng cho VPS có 4GB RAM, workload hỗn hợp (OLTP + web). Mở file cấu hình:
sudo nano /etc/postgresql/16/main/postgresql.conf
Các tham số quan trọng
| Tham số | Giá trị khuyến nghị (VPS 4GB) | Giải thích |
|---|---|---|
shared_buffers | 1GB (25% RAM) | Bộ đệm trong bộ nhớ. Không nên quá 25-30% RAM, vì cache OS cũng cần. |
effective_cache_size | 3GB (75% RAM) | Ước lượng kích thước cache OS + shared_buffers, giúp planner quyết định index scan. |
work_mem | 16MB | Bộ nhớ cho mỗi operation sort/hash. Nếu nhiều connection đồng thời, không nên quá lớn để tránh OOM. |
maintenance_work_mem | 256MB | Cho vacuum, index creation. Có thể tăng lên 512MB nếu có nhiều index. |
random_page_cost | 1.1 | VPS NVMe có độ trễ rất thấp, nên giảm từ 4.0 xuống 1.1 để optimizer ưu tiên index scan. |
wal_buffers | 16MB | Bộ đệm ghi WAL, mặc định 16MB là đủ. |
Công thức nhanh (tuyến tính theo RAM): Nếu VPS của bạn là VPS Linux có 2GB RAM, dùng shared_buffers = 512MB, effective_cache_size = 1.5GB. Nếu 8GB RAM: shared_buffers = 2GB, effective_cache_size = 6GB. Luôn giữ work_mem tối đa 32MB trừ khi bạn biết rõ số lượng connection.
Áp dụng thay đổi
Sau khi sửa, kiểm tra cấu hình và reload:
sudo -u postgres psql -c "SHOW shared_buffers;"
sudo systemctl reload postgresql
Output hiển thị 1GB (hoặc giá trị bạn đã set).
Bước 8 - Tối ưu WAL và checkpoint cho VPS NVMe
VPS hiện nay dùng NVMe, tốc độ ghi rất cao, nhưng bạn vẫn nên giảm tần suất checkpoint để tránh I/O đột biến. Dùng pgtune nếu muốn nhanh:
sudo apt install pgtune -y
sudo pgtune -i /etc/postgresql/16/main/postgresql.conf -o /tmp/pgtune.conf
sudo cp /tmp/pgtune.conf /etc/postgresql/16/main/postgresql.conf
pgtune tự động tính toán dựa trên RAM và loại workload (mặc định là oltp). Bạn có thể chỉnh --type sang web hoặc data-warehouse nếu cần. Khởi động lại PostgreSQL sau đó:
sudo systemctl restart postgresql
Verify: Kiểm tra log không xuất hiện lỗi:
sudo journalctl -u postgresql | tail -20
Xử lý lỗi thường gặp
Lỗi: "FATAL: role "user" does not exist" hoặc "database does not exist"
Nguyên nhân: user/database chưa được tạo đúng cách hoặc kết nối sai tham số. Kiểm tra lại bằng cách đăng nhập với user postgres: sudo -u postgres psql -c "\du" và sudo -u postgres psql -c "\l". Nếu thiếu, chạy lại lệnh CREATE ở Bước 4.
Lỗi: "could not connect to server: Connection refused"
Kiểm tra PostgreSQL đã chạy chưa: systemctl status postgresql. Xem log: sudo journalctl -u postgresql -n 50. Nếu listen_addresses chưa được sửa, PostgreSQL chỉ lắng nghe localhost.
Lỗi: "peer authentication failed"
Khi kết nối từ localhost bằng user hệ thống không phải postgres, PostgreSQL dùng phương thức peer mặc định. Nếu bạn muốn kết nối từ app_user qua psql -U app_user -d app_db, hãy sửa dòng local trong pg_hba.conf từ peer thành md5 và khởi động lại service.
Câu hỏi thường gặp
PostgreSQL 16 có tương thích với ứng dụng cũ viết cho PostgreSQL 14 không?
Có, hầu hết các ứng dụng viết cho PostgreSQL 14, 15 đều chạy tốt trên phiên bản 16. Các API và câu lệnh SQL cơ bản không thay đổi. Tuy nhiên, nếu ứng dụng dùng các tính năng cũ đã bị deprecated, bạn cần kiểm tra release notes để biết chi tiết.
Sau khi cài xong, tôi nên backup database thế nào?
Dùng lệnh pg_dump để backup từng database: pg_dump -U app_user -h localhost app_db > backup.sql. Để tự động hóa, viết script cron chạy pg_dump hàng ngày và upload lên storage ngoài (S3, rsync đến VPS khác). Tham khảo thêm bài cài đặt Redis cache cho ứng dụng web trên VPS để kết hợp cache với PostgreSQL.
Port mặc định của PostgreSQL là gì? Có nên thay đổi?
Port mặc định là 5432. Đổi port có thể giảm scan tự động từ bot, nhưng không tăng bảo mật thực sự (hướng dẫn cấu hình UFW firewall quan trọng hơn). Nếu đổi, nhớ sửa firewall và cập nhật app config.
Có thể cài PostgreSQL trên VPS Windows không?
Có, PostgreSQL hỗ trợ Windows Server. Bạn có thể thuê VPS Windows và tải bản installer từ trang chủ. Tuy nhiên, bài này tập trung vào Ubuntu 24.04, phiên bản tối ưu cho PostgreSQL về hiệu năng.
Tôi cần bao nhiêu RAM cho PostgreSQL?
Với VPS 1 GB RAM, PostgreSQL vẫn chạy được nhưng cần tinh chỉnh shared_buffers xuống 256 MB và hạn chế số kết nối. Với 2 GB RAM trở lên, bạn có thể set shared_buffers ~ 25% RAM. Nếu database workload nặng, hãy chọn thuê VPS Linux có 4 GB RAM hoặc cao hơn.
Bài viết liên quan
- Hướng dẫn cài đặt Redis cache cho ứng dụng web trên VPS (phần 2)
- Hướng dẫn cấu hình UFW firewall cơ bản trên Ubuntu VPS
- Cấu hình Nginx làm reverse proxy trên Ubuntu 24.04


