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-256django_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
相关产品推荐
相关产品推荐

