多VPS部署:Django站点、脚本与远程PostgreSQL的连接方案
核心架构与分步实现方案
1. 网络基础配置
优先使用服务商提供的**私有网络(VPC)**让4台VPS在同一内网通信,避免公网传输的延迟和安全风险。如果服务商不支持私有网络,就通过防火墙规则限制数据库端口的访问范围:
- 记录所有VPS的公网/私有IP:DB服务器(比如
10.0.0.2)、Django服务器(10.0.0.1)、两台脚本服务器(10.0.0.3、10.0.0.4) - 在DB服务器的防火墙中,仅允许上述三个IP访问5432端口(PostgreSQL默认端口)
2. PostgreSQL数据库服务器配置
调整监听与访问规则
- 编辑PostgreSQL配置文件
/etc/postgresql/{version}/main/postgresql.conf:listen_addresses = '10.0.0.2' # 设为DB服务器的私有IP,或'*'允许所有IP(不推荐) - 编辑
pg_hba.conf文件,添加允许其他三台VPS访问的规则:# 允许Django服务器访问 host your_django_db django_app 10.0.0.1/32 scram-sha-256 # 允许两台脚本服务器访问 host your_django_db script_runner 10.0.0.3/32 scram-sha-256 host your_django_db script_runner 10.0.0.4/32 scram-sha-256 - 重启PostgreSQL服务:
sudo systemctl restart postgresql
创建专用数据库用户
避免使用超级用户连接,分别创建对应权限的用户:
-- 给Django站点用的用户,拥有数据库全部权限 CREATE USER django_app WITH PASSWORD 'your_strong_django_pw'; GRANT ALL PRIVILEGES ON DATABASE your_django_db TO django_app; -- 给脚本用的用户,仅授予必要权限(比如增删改查) CREATE USER script_runner WITH PASSWORD 'your_strong_script_pw'; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO script_runner; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO script_runner;
3. Django站点服务器配置
修改settings.py中的数据库连接配置,指向DB服务器的私有IP:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'your_django_db', 'USER': 'django_app', 'PASSWORD': 'your_strong_django_pw', 'HOST': '10.0.0.2', # DB服务器的私有IP 'PORT': '5432', } }
测试连接:执行python manage.py shell,输入以下代码验证:
from django.db import connection cursor = connection.cursor() print("连接成功")
Nginx和Gunicorn的配置保持原有单台部署的逻辑即可,无需额外修改。
4. 脚本服务器配置
根据脚本的编程语言,配置数据库连接:
Python脚本示例(使用psycopg2)
import psycopg2 def get_db_connection(): return psycopg2.connect( dbname='your_django_db', user='script_runner', password='your_strong_script_pw', host='10.0.0.2', port='5432' ) # 使用示例 conn = get_db_connection() cur = conn.cursor() cur.execute("SELECT * FROM your_table LIMIT 1;") print(cur.fetchone()) cur.close() conn.close()
关键注意事项
- 脚本中避免创建大量短连接,尽量复用连接
- 根据脚本服务器的CPU核心数,控制并发进程/线程数(比如4核服务器用4-6个并发)
5. 负载优化建议
数据库连接池优化
如果脚本会产生大量数据库连接,安装pgBouncer作为连接池:
- 在DB服务器安装pgBouncer:
sudo apt install pgbouncer - 编辑
/etc/pgbouncer/pgbouncer.ini:listen_addr = '10.0.0.2' port = 6432 auth_type = scram-sha-256 auth_file = /etc/pgbouncer/userlist.txt databases = your_django_db = host=127.0.0.1 port=5432 dbname=your_django_db - 创建
userlist.txt添加用户:"django_app" "your_strong_django_pw" "script_runner" "your_strong_script_pw" - 重启pgBouncer:
sudo systemctl restart pgbouncer - 修改Django和脚本的数据库连接端口为
6432,通过连接池访问数据库,减少DB的连接压力。
脚本逻辑优化
- 把单条数据库操作改成批量操作(比如Django的
bulk_create,psycopg2的executemany) - 避免在循环中频繁查询数据库,尽量一次性获取所需数据
- 对脚本进行定时调度(比如用
cron),避免高峰时段集中运行
监控与排查
- 在DB服务器用
pg_stat_activity查看连接状态:SELECT * FROM pg_stat_activity; - 用
htop、vmstat监控各VPS的CPU、内存、磁盘IO负载 - 查看PostgreSQL日志(
/var/log/postgresql/postgresql-{version}-main.log)排查慢查询
内容的提问来源于stack exchange,提问作者Fresto
相关产品推荐
相关产品推荐

