手里攥着两台云服务器,既要跑Web服务,又要扛数据库,还得兼容PHP、Java、Node.js、Python多种语言项目。每天重复初始化环境、部署服务、手动备份、查故障,费时费力还容易出错。
别再埋头手动运维了!
今天给大家带来一套极简、稳定、零复杂、可直接抄作业的双服务器自动化运维方案,适配多语言环境+PostgreSQL数据库,看完就能落地,彻底解放双手。
📌 适用场景
🧰 方案选型(轻量不折腾)
拒绝臃肿架构,只用刚需工具,运维成本极低,新手也能玩转:
Ansible:批量管控两台服务器,一键初始化、批量操作
Docker+Docker Compose:环境标准化,杜绝“一台能跑一台报错”
PostgreSQL主从:主库对外服务,从库实时备份,防止数据丢失
定时备份+Cron:每天自动备份数据库+项目文件,跨机同步
Uptime Kuma:轻量可视化监控,服务宕机及时告警
🖥️ 两台服务器分工
服务器A(主):8.255.255.255
对外Web入口,承载全站访问
PostgreSQL主数据库
运行全部多语言项目
监控中心、自动备份脚本
服务器B(备):8.255.255.254
备用Web环境
PostgreSQL从库,实时同步主库数据
备份文件存储节点,防止单点故障
📄 全套配置(直接复制粘贴,零修改)
这里把域名、IP、数据库密码全部填实,拿到手就能用,省去手动改配置的麻烦。
1. Ansible批量管控配置
主机清单(hosts文件)
[web_servers]server_a ansible_host=8.255.255.255 ansible_user=rootserver_b ansible_host=8.255.255.254 ansible_user=root[all:vars]ansible_ssh_private_key_file=~/.ssh/id_rsaansible_port=22
服务器初始化脚本(init.yml)
- name: 初始化两台服务器环境 hosts: web_servers gather_facts: false tasks: - name: 更新并安装基础工具 apt: update_cache: yes name: [git, curl, vim, unzip, wget, gnupg, lsb-release] state: present - name: 安装 Docker shell: curl -fsSL https://get.docker.com | bash - name: 启动并开机自启 Docker service: name: docker state: started enabled: yes - name: 创建备份目录 file: path: /backup state: directory mode: '0755'
执行命令
ansible-playbook -i hosts init.yml
2. 服务器A 主环境Docker Compose
存放路径:/root/docker-compose.yml
version: '3.8'services: # 主 PostgreSQL 数据库 postgres: image: postgres:15 restart: always ports: - "5432:5432" environment: POSTGRES_USER: admin POSTGRES_PASSWORD: 123456 POSTGRES_DB: demo volumes: - ./pg_data:/var/lib/postgresql/data networks: - app_net # Nginx + PHP 环境 php: image: wyplay/fpm-nginx:php8.2 restart: always ports: - "8080:80" volumes: - ./php_web:/var/www/html networks: - app_net # Java 运行环境 java: image: eclipse-temurin:17 restart: always ports: - "8081:8080" volumes: - ./java_app:/app command: java -jar /app/app.jar networks: - app_net # Node.js 运行环境 node: image: node:20 restart: always ports: - "8082:3000" volumes: - ./node_app:/app working_dir: /app command: npm start networks: - app_net # Python 运行环境 python: image: python:3.11 restart: always ports: - "8083:8000" volumes: - ./python_app:/app working_dir: /app command: python app.py networks: - app_net # 统一入口Nginx(绑定域名) nginx: image: nginx:alpine restart: always ports: - "80:80" - "443:443" volumes: - ./nginx/conf.d:/etc/nginx/conf.d - ./nginx/ssl:/etc/nginx/ssl - ./php_web:/var/www/html networks: - app_net # 轻量监控面板 kuma: image: louislam/uptime-kuma:1 restart: always ports: - "3001:3001" volumes: - ./kuma_data:/app/data networks: - app_netnetworks: app_net:
启动命令
3. 服务器B PG从库Docker Compose
存放路径:/root/docker-compose.yml
version: '3.8'services: postgres_slave: image: postgres:15 restart: always ports: - "5432:5432" environment: POSTGRES_USER: admin POSTGRES_PASSWORD: 123456 PGUSER: admin PGPASSWORD: 123456 volumes: - ./pg_slave_data:/var/lib/postgresql/data command: | bash -c " until pg_basebackup -h 8.255.255.255 -U admin -D /var/lib/postgresql/data -X stream -P; do sleep 5; done; echo 'primary_conninfo = host=8.255.255.255 port=5432 user=admin password=123456' > /var/lib/postgresql/data/postgresql.auto.conf; echo 'standby_mode = on' >> /var/lib/postgresql/data/postgresql.auto.conf; chown -R postgres:postgres /var/lib/postgresql/data; docker-entrypoint.sh postgres " networks: - slave_netnetworks: slave_net:
4. 全自动备份脚本
存放路径:服务器A /backup.sh
功能:每日凌晨2点自动备份数据库+全站文件,同步到备用服务器,自动清理7天前旧备份
#!/bin/bashDATE=$(date +%Y%m%d)# 备份PG主库docker exec postgres pg_dump -U admin demo > /backup/pg_demo_$DATE.sql# 打包全部项目文件tar -zcf /backup/web_all_$DATE.tar.gz \ /root/php_web \ /root/java_app \ /root/node_app \ /root/python_app# 同步到备用服务器scp /backup/pg_demo_$DATE.sql /backup/web_all_$DATE.tar.gz root@8.255.255.254:/backup/# 清理过期文件find /backup -type f -mtime +7 -delete
授权并设置定时任务
chmod +x /backup.shcrontab -e
添加以下内容,保存退出
5. 域名Nginx配置
存放路径:/root/nginx/conf.d/demo.conf
适配域名:www.demo.com,统一分发多语言项目请求
server { listen 80; server_name www.demo.com; # PHP项目访问 location /php { root /var/www/html; index index.php; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } # Java服务访问 location /java { proxy_pass http://java:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # Node服务访问 location /node { proxy_pass http://node:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # Python服务访问 location /python { proxy_pass http://python:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 默认首页 location / { root /var/www/html; index index.html index.php; }}
重启Nginx生效
docker compose restart nginx
6. 监控面板访问
Uptime Kuma监控地址:http://*:3001
监控网站、数据库、各语言服务运行状态
支持邮件、钉钉、企业微信告警
服务异常第一时间通知,不用守着服务器
✅ 这套方案能实现什么?
一键初始化两台服务器,省去重复配置
一套环境兼容4种语言,互不冲突
数据库主从同步,不怕单点故障
每日自动备份+跨机存档,杜绝数据丢失
域名统一访问,路径清晰易维护
可视化监控,宕机自动告警
系统崩溃重装,10分钟恢复全套环境
💡 写在最后
运维不用拼体力,选对工具、搭好架构,两台服务器也能做到稳定、安全、全自动。
这套方案足够个人、小企业使用,后期扩容也不用重构架构,直接加机器拓展即可。
收藏起来,部署的时候直接照着抄,告别手动运维,把时间花在更有价值的事上。