# Nginx域名转发管理平台 - 部署文档 日期: 2026-06-09 | 服务器: Rocky Linux 8.10 (10.1.1.160) --- ## 一、服务器环境信息 ### 1.1 10.1.1.160 - Nginx 专用服务器 | 项目 | 详情 | |------|------| | 操作系统 | Rocky Linux 8.10 (Green Obsidian) | | 内核版本 | 4.18.0-553.el8_10.x86_64 | | 主机名 | linuxNginx | | SSH | root@10.1.1.160:22 | | Nginx | 1.14.1 | | Python | 3.6.8 | | OpenSSL | 1.1.1k FIPS | ### 1.2 监听端口 | 端口 | 服务 | 用途 | |------|------|------| | 22 | sshd | SSH远程管理 | | 80 | nginx | HTTP转发入口 | | 443 | nginx | HTTPS转发入口(按需) | | 5000 | gunicorn | Nginx管理API | ### 1.3 外部依赖 | 服务 | 地址 | 用途 | |------|------|------| | MySQL | 10.1.1.122:3306 | 数据库 (nginxserver库) | --- ## 二、10.1.1.160 上执行的全部命令 ### 2.1 安装系统依赖 ```bash # 安装 Nginx + Python3 + OpenSSL dnf install -y nginx python3 python3-pip openssl # 安装 Python 依赖包 pip3 install flask gunicorn ``` ### 2.2 创建目录结构 ```bash # 项目代码目录 mkdir -p /opt/nginx-api/services # Nginx 配置与证书目录 mkdir -p /etc/nginx/conf.d mkdir -p /etc/nginx/ssl/ca ``` ### 2.3 部署代码文件 将本地 nginx-python-api/ 目录下文件上传到 /opt/nginx-api/: | 本地文件 | 服务器路径 | 权限 | |----------|-----------|------| | app.py | /opt/nginx-api/app.py | 755 | | services/__init__.py | /opt/nginx-api/services/__init__.py | 644 | | services/nginx_service.py | /opt/nginx-api/services/nginx_service.py | 644 | | services/ssl_service.py | /opt/nginx-api/services/ssl_service.py | 644 | | requirements.txt | /opt/nginx-api/requirements.txt | 644 | | gunicorn_config.py | /opt/nginx-api/gunicorn_config.py | 755 | | deploy.sh | /opt/nginx-api/deploy.sh | 755 | 上传方式(使用 Python paramiko SFTP 或 scp): ```bash # 方式一: scp scp -r nginx-python-api/* root@10.1.1.160:/opt/nginx-api/ # 方式二: Python paramiko SFTP # 见项目根目录下 upload_api.py(已执行) ``` ### 2.4 创建 systemd 服务文件 文件路径: /etc/systemd/system/nginx-api.service ```ini [Unit] Description=Nginx Manager Python API After=network.target nginx.service [Service] Type=simple User=root WorkingDirectory=/opt/nginx-api ExecStart=/usr/bin/python3 -m gunicorn -c gunicorn_config.py app:app Restart=always RestartSec=5 [Install] WantedBy=multi-user.target ``` 创建命令: ```bash cat > /etc/systemd/system/nginx-api.service << 'EOF' [Unit] Description=Nginx Manager Python API After=network.target nginx.service [Service] Type=simple User=root WorkingDirectory=/opt/nginx-api ExecStart=/usr/bin/python3 -m gunicorn -c gunicorn_config.py app:app Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF ``` ### 2.5 Gunicorn 配置文件 文件路径: /opt/nginx-api/gunicorn_config.py ```python import os # 监听地址和端口 bind = "0.0.0.0:5000" # Worker 进程数 workers = int(os.environ.get('GUNICORN_WORKERS', 2)) # Worker 类型 worker_class = "sync" # 超时设置 timeout = 60 graceful_timeout = 10 # 日志 accesslog = "-" # 标准输出 errorlog = "-" # 标准错误 loglevel = "info" # 进程名称 proc_name = "nginx-manager-api" # 前台运行(由 systemd 管理) daemon = False ``` ### 2.6 防火墙配置 ```bash # 开放端口和服务 firewall-cmd --permanent --add-port=5000/tcp firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --reload # 查看防火墙规则 firewall-cmd --list-all ``` 当前防火墙状态: ``` public (active) target: default interfaces: ens160 services: cockpit dhcpv6-client http https ssh ports: 5000/tcp ``` ### 2.7 启动服务并设置开机自启 ```bash # 启动 Nginx systemctl start nginx systemctl enable nginx # 重载 systemd 配置 systemctl daemon-reload # 启动 Python API systemctl start nginx-api systemctl enable nginx-api # 验证服务状态 systemctl status nginx systemctl status nginx-api ``` ### 2.8 验证部署 ```bash # Python API 健康检查 curl http://127.0.0.1:5000/api/nginx/health # 预期返回: # {"code":0,"data":{"conf_dir":"/etc/nginx/conf.d","nginx_installed":true,"ssl_dir":"/etc/nginx/ssl"},"message":"Nginx Manager API is running"} ``` --- ## 三、开机自启状态确认 | 服务 | systemd unit | 状态 | |------|-------------|------| | Nginx | nginx.service | enabled | | Python API | nginx-api.service | enabled | | SSHD | sshd.service | enabled | | Firewalld | firewalld.service | enabled | 查看命令: ```bash systemctl list-unit-files --state=enabled | grep -E "nginx|sshd|firewalld" ``` --- ## 四、服务器目录结构 ``` /etc/nginx/ ├── nginx.conf # Nginx 主配置文件(系统默认) ├── conf.d/ # 转发规则配置目录 │ └── .conf # 各域名的转发配置(由API自动生成) ├── ssl/ # SSL证书目录 │ ├── ca/ # 内部根CA │ │ ├── ca.crt # CA证书(有效期10年) │ │ ├── ca.key # CA私钥(权限600) │ │ └── ca.srl # 序列号文件 │ ├── .pem # 域名SSL证书 │ └── .key # 域名SSL私钥 /opt/nginx-api/ # Python API项目目录 ├── app.py # Flask主入口(7个API端点) ├── gunicorn_config.py # WSGI配置 ├── requirements.txt # Python依赖 ├── deploy.sh # 一键部署脚本 └── services/ ├── __init__.py ├── nginx_service.py # Nginx配置读写 + reload └── ssl_service.py # 内部CA + 证书签发 /etc/systemd/system/ └── nginx-api.service # Python API 服务定义 ``` --- ## 五、Python API 端点 | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/nginx/health | 健康检查 | | GET | /api/nginx/rules | 获取所有规则 | | GET | /api/nginx/rules/ | 获取单个规则 | | POST | /api/nginx/rules | 新增规则 | | PUT | /api/nginx/rules/ | 修改规则 | | DELETE | /api/nginx/rules/ | 删除规则 | | POST | /api/nginx/reload | 重载Nginx | ### 新增规则请求示例 ```json POST /api/nginx/rules Content-Type: application/json { "domain": "test.mokee.com", "protocol": "https", "target": "http://10.1.1.11:8080" } ``` ### 成功响应 ```json { "code": 0, "message": "规则创建成功", "data": { "domain": "test.mokee.com", "protocol": "https", "target": "http://10.1.1.11:8080", "config_file": "/etc/nginx/conf.d/test.mokee.com.conf", "ssl_cert": "/etc/nginx/ssl/test.mokee.com.pem", "ssl_key": "/etc/nginx/ssl/test.mokee.com.key" } } ``` --- ## 六、Nginx 配置模板(由 API 自动生成) ### HTTP 转发 ```nginx # /etc/nginx/conf.d/.conf server { listen 80; server_name ; location / { proxy_pass ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } } ``` ### HTTPS 转发 ```nginx # /etc/nginx/conf.d/.conf server { listen 80; server_name ; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name ; ssl_certificate /etc/nginx/ssl/.pem; ssl_certificate_key /etc/nginx/ssl/.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { proxy_pass ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } } ``` --- ## 七、MySQL 数据库初始化 连接信息: | 项目 | 值 | |------|-----| | 地址 | 10.1.1.122:3306 | | 数据库 | nginxserver | | 用户 | nginxserver | 初始化脚本: ```bash mysql -h 10.1.1.122 -u root -p < sql/init.sql ``` 表结构: ```sql -- forwarding_rules 表 CREATE TABLE forwarding_rules ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', domain VARCHAR(255) NOT NULL COMMENT '域名', protocol VARCHAR(10) NOT NULL COMMENT '协议类型: http / https', target VARCHAR(500) NOT NULL COMMENT '转发目标地址', config_file VARCHAR(500) COMMENT 'Nginx配置文件路径', ssl_cert VARCHAR(500) COMMENT 'SSL证书文件路径', ssl_key VARCHAR(500) COMMENT 'SSL私钥文件路径', status TINYINT DEFAULT 1 COMMENT '状态: 0-已删除, 1-正常', created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', UNIQUE KEY uk_domain (domain), INDEX idx_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Nginx转发规则表'; -- certificates 表 CREATE TABLE certificates ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', domain VARCHAR(255) NOT NULL COMMENT '域名', cert_path VARCHAR(500) COMMENT '证书文件路径', key_path VARCHAR(500) COMMENT '私钥文件路径', issue_date DATETIME COMMENT '签发日期', expire_date DATETIME COMMENT '过期日期', status VARCHAR(20) DEFAULT 'active' COMMENT '状态', created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', UNIQUE KEY uk_cert_domain (domain) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='SSL证书管理表'; ``` --- ## 八、HTTPS 证书方案 ### 8.1 内部 CA - 首次启动 Python API 时自动生成(如不存在) - CA 证书 /etc/nginx/ssl/ca/ca.crt,有效期 10 年 - CA 私钥 /etc/nginx/ssl/ca/ca.key,权限 600 - 不占用 80/443/5000 端口 ### 8.2 域名证书自动签发 - 选择 HTTPS 协议时自动签发 - 证书有效期 365 天 - 已存在且有效的证书直接复用 - 过期证书自动重新签发 ### 8.3 客户端信任 内网用户需将 CA 证书导入浏览器: ```bash # 下载 CA 证书 scp root@10.1.1.160:/etc/nginx/ssl/ca/ca.crt . # 然后在浏览器中导入为受信任的根证书颁发机构 ``` --- ## 九、常见运维命令 ```bash # === Nginx 管理 === nginx -t # 检查配置语法 nginx -s reload # 重载配置(不中断服务) systemctl restart nginx # 重启 Nginx systemctl status nginx # 查看状态 tail -f /var/log/nginx/access.log # 查看访问日志 tail -f /var/log/nginx/error.log # 查看错误日志 # === Python API 管理 === systemctl status nginx-api # 查看服务状态 systemctl restart nginx-api # 重启 API journalctl -u nginx-api -f # 实时查看日志 journalctl -u nginx-api -n 50 # 最近50行日志 # === API 测试 === curl http://127.0.0.1:5000/api/nginx/health # 健康检查 curl http://127.0.0.1:5000/api/nginx/rules # 查看规则列表 # === 防火墙管理 === firewall-cmd --list-all # 查看防火墙规则 firewall-cmd --add-port=5000/tcp # 临时开放端口 firewall-cmd --runtime-to-permanent # 保存临时规则为永久 ``` --- ## 十、Spring Boot 配置 配置文件: nginx-manager-backend/src/main/resources/application.yml ```yaml server: port: 4002 spring: datasource: url: jdbc:mysql://10.1.1.122:3306/nginxserver?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: nginxserver password: mokee. driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update python-api: base-url: http://10.1.1.160:5000 connect-timeout: 5000 read-timeout: 30000 ``` --- ## 十一、Vue.js 前端配置 ### 开发环境 (.env.development) ``` VITE_API_BASE_URL=http://localhost:4002 VITE_APP_TITLE=Nginx转发管理平台 ``` ### 生产环境 (.env.production) ``` VITE_API_BASE_URL=http://<生产服务器IP>:4002 VITE_APP_TITLE=Nginx转发管理平台 ``` ### 启动 ```bash npm run dev # 开发模式(端口3002) npm run build # 生产构建 ```