You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多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数据库服务器配置

调整监听与访问规则

  1. 编辑PostgreSQL配置文件/etc/postgresql/{version}/main/postgresql.conf:
    listen_addresses = '10.0.0.2'  # 设为DB服务器的私有IP,或'*'允许所有IP(不推荐)
    
  2. 编辑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
    
  3. 重启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作为连接池:

  1. 在DB服务器安装pgBouncer:sudo apt install pgbouncer
  2. 编辑/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
    
  3. 创建userlist.txt添加用户:
    "django_app" "your_strong_django_pw"
    "script_runner" "your_strong_script_pw"
    
  4. 重启pgBouncer:sudo systemctl restart pgbouncer
  5. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:33:16