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

RHEL9环境下多服务器部署Django应用并共享数据库的配置方法

RHEL9环境下多服务器部署Django应用并共享数据库的配置方法

嗨,我来帮你梳理下在RHEL9上实现这个多服务器部署Django子域名的具体步骤,咱们一步步来,确保每个环节都走通:

1. 先搞定DNS域名解析配置

这是第一步,得让用户访问不同域名时能定位到对应的服务器。你需要在域名服务商后台(或者自建DNS服务器)添加A记录:

  • 把主域名 website.com 解析到Server A的公网IP
  • 把子域名 sub.website.com 和 sub2.website.com 解析到Server B的公网IP

如果用RHEL9自带的Bind做DNS服务器,编辑区域配置文件(比如/var/named/website.com.zone),添加以下记录:

website.com.    IN  A   你的Server A公网IP
sub.website.com.IN  A   你的Server B公网IP
sub2.website.com.IN A   你的Server B公网IP

修改完成后重启Bind服务:systemctl restart named

2. 配置共享数据库(核心!)

因为三个站点都是同一个Django项目,必须共享同一个数据库,不然数据会各玩各的完全不一致。这里以PostgreSQL为例(MySQL配置逻辑类似):

  • 先在Server A的数据库服务器上(假设数据库部署在A上),修改监听配置:
    编辑/var/lib/pgsql/data/postgresql.conf,把listen_addresses的值改成*,允许外部IP访问数据库,然后重启PostgreSQL:systemctl restart postgresql
  • 接着设置数据库权限,允许Server B连接:
    编辑/var/lib/pgsql/data/pg_hba.conf,添加一行规则(替换成你的实际信息):
    host    django_project_db    django_user    ServerB的IP/32    scram-sha-256
    
    这里django_project_db是你的Django项目数据库名,django_user是数据库用户名。修改后重新加载配置:systemctl reload postgresql
  • 到Server B上,修改Django项目的settings.py,把数据库地址指向Server A的IP:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'django_project_db',
            'USER': 'django_user',
            'PASSWORD': '你的数据库密码',
            'HOST': 'ServerA的公网IP',  # 这里填Server A的IP
            'PORT': '5432',
        }
    }
    
  • 别忘了在Server B上安装数据库驱动,比如PostgreSQL的话,运行pip install psycopg2-binary

3. 同步两台服务器的Django项目代码

两台服务器都要部署同一个版本的django_project,最好用Git同步避免手动复制出错:

  • 把你的django_project代码推到Git仓库(比如GitHub、GitLab或自建仓库)
  • 在Server A和Server B上分别拉取代码:git clone 你的Git仓库地址
  • 两台服务器都安装项目依赖:pip install -r requirements.txt
  • 数据库迁移只需要在其中一台执行一次(比如Server A):python manage.py migrate
  • 静态文件可以选择:要么两台都执行python manage.py collectstatic,要么把Server A的静态文件目录通过NFS共享给Server B,或者用Nginx反向代理到Server A的静态文件地址——推荐统一用Server A的静态源,避免重复存储。

4. 配置Web服务器(Nginx+uWSGI示例)

RHEL9上用Nginx做反向代理,搭配uWSGI(或Gunicorn)跑Django应用是最常用的组合,咱们一步步来配:

4.1 Server A(主站website.com)配置

  • 先装Nginx和uWSGI:
    dnf install nginx
    pip install uwsgi
    
  • 创建uWSGI配置文件/etc/uwsgi/django_project.ini:
    [uwsgi]
    chdir = /你的django_project路径/
    module = django_project.wsgi:application
    master = true
    processes = 4  # 根据服务器配置调整进程数
    socket = /run/uwsgi/django_project.sock
    chmod-socket = 666
    vacuum = true
    
  • 创建systemd服务文件/etc/systemd/system/uwsgi.service,让uWSGI开机自启:
    [Unit]
    Description=uWSGI Emperor service
    After=network.target
    
    [Service]
    User=nginx
    Group=nginx
    WorkingDirectory=/你的django_project路径/
    ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi
    
    [Install]
    WantedBy=multi-user.target
    
  • 配置Nginx站点文件/etc/nginx/conf.d/website.conf:
    server {
        listen 80;
        server_name website.com;
    
        location /static/ {
            alias /你的django_project路径/static/;
        }
    
        location / {
            include uwsgi_params;
            uwsgi_pass unix:/run/uwsgi/django_project.sock;
        }
    }
    
  • 启动并启用服务:
    systemctl start uwsgi
    systemctl enable uwsgi
    systemctl start nginx
    systemctl enable nginx
    

4.2 Server B(子域名sub.website.com和sub2.website.com)配置

  • 同样先装Nginx和uWSGI:dnf install nginx && pip install uwsgi
  • 配置uWSGI,创建/etc/uwsgi/django_project_sub.ini:
    [uwsgi]
    chdir = /你的django_project路径/
    module = django_project.wsgi:application
    master = true
    processes = 4
    socket = /run/uwsgi/django_project_sub.sock
    chmod-socket = 666
    vacuum = true
    
  • Nginx配置两个子域名,创建/etc/nginx/conf.d/sub_website.conf:
    server {
        listen 80;
        server_name sub.website.com;
    
        location /static/ {
            # 可以反向代理到Server A的静态文件,比如:
            # proxy_pass http://ServerA的IP/static/;
            # 也可以用本地收集的静态文件,填本地路径
            alias /你的django_project路径/static/;
        }
    
        location / {
            include uwsgi_params;
            uwsgi_pass unix:/run/uwsgi/django_project_sub.sock;
        }
    }
    
    server {
        listen 80;
        server_name sub2.website.com;
    
        location /static/ {
            alias /你的django_project路径/static/;
            # 同样可以选择代理到Server A
        }
    
        location / {
            include uwsgi_params;
            uwsgi_pass unix:/run/uwsgi/django_project_sub.sock;
        }
    }
    
  • 启动并启用服务:
    systemctl start uwsgi
    systemctl enable uwsgi
    systemctl start nginx
    systemctl enable nginx
    

5. 配置防火墙(RHEL9的firewalld)

两台服务器都要开放HTTP(80)和HTTPS(443)端口,不然外部访问不了:

firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload

6. 配置HTTPS(可选但强烈推荐)

用Let's Encrypt的certbot免费获取SSL证书,配置HTTPS访问:

  • 安装certbot和Nginx插件:dnf install certbot python3-certbot-nginx
  • Server A上获取主域名证书:certbot --nginx -d website.com
  • Server B上获取两个子域名证书:certbot --nginx -d sub.website.com -d sub2.website.com
  • certbot会自动配置Nginx的HTTPS规则,而且证书会自动续期,非常方便。

备注:内容来源于stack exchange,提问作者bleh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 12:14:43