Files
nginxserver/DEPLOYMENT.md
2026-07-16 13:03:11 +08:00

13 KiB
Raw Permalink Blame History

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 安装系统依赖

# 安装 Nginx + Python3 + OpenSSL
dnf install -y nginx python3 python3-pip openssl

# 安装 Python 依赖包
pip3 install flask gunicorn

2.2 创建目录结构

# 项目代码目录
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:

# 方式一: 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

[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

创建命令:

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

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 防火墙配置

# 开放端口和服务
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 启动服务并设置开机自启

# 启动 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 验证部署

# 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

查看命令:

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/ 获取单个规则
POST /api/nginx/rules 新增规则
PUT /api/nginx/rules/ 修改规则
DELETE /api/nginx/rules/ 删除规则
POST /api/nginx/reload 重载Nginx

新增规则请求示例

POST /api/nginx/rules
Content-Type: application/json

{
  "domain": "test.mokee.com",
  "protocol": "https",
  "target": "http://10.1.1.11:8080"
}

成功响应

{
  "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 转发

# /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 转发

# /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

初始化脚本:

mysql -h 10.1.1.122 -u root -p < sql/init.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 证书导入浏览器:

# 下载 CA 证书
scp root@10.1.1.160:/etc/nginx/ssl/ca/ca.crt .
# 然后在浏览器中导入为受信任的根证书颁发机构

九、常见运维命令

# === 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

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转发管理平台

启动

npm run dev       # 开发模式端口3002
npm run build     # 生产构建