Multi-site — satu server, banyak proyek
Banyak situs & database di satu VPS
Sudah sewa VPS untuk satu blog? Server yang sama biasanya sanggup menampung beberapa website sekaligus — blog, toko, dan portofolio — tanpa biaya tambahan. Di panduan ini kamu akan menjalankan banyak aplikasi dengan PM2, mengarahkan tiap domain lewat Nginx, dan memasang database dengan data terpisah per situs.
Hemat biaya
Beberapa proyek berbagi satu sewa VPS, bukan bayar server terpisah.
Tiap domain sendiri
Nginx mengarahkan tiap domain ke aplikasi yang tepat.
Data terpisah
Tiap situs punya database & user sendiri, tidak saling campur.
free -h dan pm2 status.Kenapa satu VPS untuk banyak situs?
Menyewa VPS terpisah untuk tiap proyek itu boros. Selama sumber daya (RAM, CPU) mencukupi, satu VPS bisa melayani banyak domain sekaligus. Kuncinya cuma dua: tiap aplikasi berjalan di port berbeda, dan Nginxbertugas sebagai "resepsionis" yang mengarahkan tiap domain ke port yang benar.
Cara kerjanya (alur)
Jalankan banyak app dengan PM2
Mulai tiap aplikasi pada port unik, beri nama agar mudah dikenali. Misalkan kamu punya tiga proyek di tiga folder:
# DI SERVER — jalankan tiap aplikasi di PORT berbeda
cd ~/blog && PORT=3000 pm2 start "pnpm start" --name blog
cd ~/toko && PORT=3001 pm2 start "pnpm start" --name toko
cd ~/portfolio && PORT=3002 pm2 start "pnpm start" --name portfolio
# Simpan agar otomatis nyala setelah server reboot
pm2 save
pm2 statusdeploy@server:~$ pm2 status┌────┬───────────┬─────────┬────────┐│ id │ name │ port │ status ││ 0 │ blog │ 3000 │ online ││ 1 │ toko │ 3001 │ online ││ 2 │ portfolio │ 3002 │ online │└────┴───────────┴─────────┴────────┘# tiga aplikasi jalan bersamaan ✅Arahkan tiap domain dengan Nginx
Buat satu file konfigurasi per domain. Yang membedakan hanyalah server_name (domain) dan proxy_pass (port aplikasinya). Situs pertama:
1# /etc/nginx/sites-available/blog.com2server {3 listen 80;4 server_name blog.com www.blog.com;5 6 location / {7 proxy_pass http://127.0.0.1:3000; # app "blog"8 proxy_http_version 1.1;9 proxy_set_header Host $host;10 proxy_set_header X-Real-IP $remote_addr;11 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;12 proxy_set_header X-Forwarded-Proto $scheme;13 }14}Situs kedua — perhatikan domain & port-nya berbeda:
1# /etc/nginx/sites-available/toko.com2server {3 listen 80;4 server_name toko.com www.toko.com;5 6 location / {7 proxy_pass http://127.0.0.1:3001; # app "toko" — beda port!8 proxy_http_version 1.1;9 proxy_set_header Host $host;10 proxy_set_header X-Real-IP $remote_addr;11 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;12 proxy_set_header X-Forwarded-Proto $scheme;13 }14}Aktifkan keduanya, uji, lalu muat ulang Nginx:
# Aktifkan kedua situs, uji, lalu muat ulang Nginx
sudo ln -s /etc/nginx/sites-available/blog.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/toko.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxPasang SSL untuk semua domain
Certbot bisa mengamankan banyak domain dalam sekali jalan. Ia otomatis mengubah config Nginx ke HTTPS dan memperbarui sertifikat sendiri:
# Satu perintah Certbot bisa mengamankan banyak domain sekaligus
sudo certbot --nginx \
-d blog.com -d www.blog.com \
-d toko.com -d www.toko.comInstall database (PostgreSQL/MySQL)
Sebagian situs (toko, aplikasi dengan login) butuh database. Kamu bisa memasangnya langsung di VPS yang sama. Contoh memakai PostgreSQL (paling umum untuk app modern):
# Install PostgreSQL
sudo apt update
sudo apt install -y postgresql postgresql-contrib
# Cek service berjalan
sudo systemctl status postgresql --no-pagersudo apt install -y mysql-server lalu amankan dengan sudo mysql_secure_installation. Konsep database/user terpisah di langkah berikut tetap sama.Buat database terpisah per situs
Praktik terbaik: tiap situs punya database & user sendiri. Kalau satu bocor, yang lain tetap aman. Masuk ke PostgreSQL:
# Masuk sebagai user postgres
sudo -u postgres psqlLalu jalankan perintah SQL berikut (ganti password!):
1-- Buat database & user terpisah untuk TIAP situs2CREATE DATABASE blog_db;3CREATE USER blog_user WITH ENCRYPTED PASSWORD 'ganti_password_kuat';4GRANT ALL PRIVILEGES ON DATABASE blog_db TO blog_user;5 6CREATE DATABASE toko_db;7CREATE USER toko_user WITH ENCRYPTED PASSWORD 'ganti_password_lain';8GRANT ALL PRIVILEGES ON DATABASE toko_db TO toko_user;9 10\qDi aplikasi, sambungkan lewat .env masing-masing ke database miliknya sendiri:
1# .env aplikasi "blog" — koneksi ke database-nya sendiri2DATABASE_URL="postgresql://blog_user:ganti_password_kuat@localhost:5432/blog_db"pg_dump/mysqldump otomatis lewat cron dibahas di panduan backup & restore.Masalah umum & cara mengatasinya
Bila salah satu situs bermasalah, cek tabel berikut:
| Gejala | Sebab | Solusi |
|---|---|---|
| Dua domain menampilkan situs yang sama | server_name salah atau symlink sites-enabled kurang. | Pastikan tiap file punya server_name benar & sudah di-enable, lalu reload. |
| Address already in use (EADDRINUSE) | Dua aplikasi memakai PORT yang sama. | Beri tiap app PORT unik (3000, 3001, 3002, ...). |
| psql: FATAL: password authentication failed | User/password salah atau metode auth belum diatur. | Cek kredensial di DATABASE_URL; sesuaikan pg_hba.conf bila perlu. |
| Server jadi lambat / kehabisan RAM | Terlalu banyak app untuk ukuran VPS. | Tambah RAM/swap, batasi memori tiap app via PM2, atau pisah ke VPS lain. |
Satu VPS, banyak proyek
Kamu kini bisa menampung beberapa website dan database dalam satu server yang hemat. Pastikan semuanya aman dengan backup terjadwal dan pemantauan.