520 lines
13 KiB
Markdown
520 lines
13 KiB
Markdown
# 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/ # 转发规则配置目录
|
||
│ └── <domain>.conf # 各域名的转发配置(由API自动生成)
|
||
├── ssl/ # SSL证书目录
|
||
│ ├── ca/ # 内部根CA
|
||
│ │ ├── ca.crt # CA证书(有效期10年)
|
||
│ │ ├── ca.key # CA私钥(权限600)
|
||
│ │ └── ca.srl # 序列号文件
|
||
│ ├── <domain>.pem # 域名SSL证书
|
||
│ └── <domain>.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/<domain> | 获取单个规则 |
|
||
| POST | /api/nginx/rules | 新增规则 |
|
||
| PUT | /api/nginx/rules/<domain> | 修改规则 |
|
||
| DELETE | /api/nginx/rules/<domain> | 删除规则 |
|
||
| 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/<domain>.conf
|
||
server {
|
||
listen 80;
|
||
server_name <domain>;
|
||
|
||
location / {
|
||
proxy_pass <target>;
|
||
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/<domain>.conf
|
||
server {
|
||
listen 80;
|
||
server_name <domain>;
|
||
return 301 https://$host$request_uri;
|
||
}
|
||
|
||
server {
|
||
listen 443 ssl;
|
||
server_name <domain>;
|
||
|
||
ssl_certificate /etc/nginx/ssl/<domain>.pem;
|
||
ssl_certificate_key /etc/nginx/ssl/<domain>.key;
|
||
ssl_protocols TLSv1.2 TLSv1.3;
|
||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||
ssl_prefer_server_ciphers on;
|
||
|
||
location / {
|
||
proxy_pass <target>;
|
||
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 # 生产构建
|
||
```
|