GGSheng's picture
feat: deploy Gemma 4 to hf space
55ba4a3 verified
# 第三方 Nginx 接入方案
## 方案概述
本方案核心目标是**读取第三方 Nginx 实例及全量配置文件**,通过解析、分类、重构,生成符合面板规范的配置(支持 PHP 项目、反向代理、静态 HTML 项目),实现第三方 Nginx 无缝对接面板管理。
---
## 一、模块架构
### 目录结构
```
mod/base/pynginx/
├── nginx_base.py # 基础类定义(Token、Directive、Block等)
├── nginx_parser.py # 词法/语法解析器
├── nginx_components.py # Nginx组件实现(Http、Server、Location、Upstream等)
├── nginx_config.py # Config和Include类
├── extension/ # 配置操作扩展工具
│ ├── config.py # 配置查找工具(ConfigFinder、ConfigTools)
│ ├── server.py # Server块操作工具(ServerTools)
│ ├── location.py # Location块操作工具
│ ├── nginx_info.py # Nginx信息获取
│ └── utils.py # 工具函数
└── btnginx/ # 第三方Nginx接入实现
├── nginx_detector.py # Nginx实例探测器
├── site_detector.py # 站点配置分离与分类
├── bt_formater.py # 面板兼容配置格式化
├── create_site.py # 面板站点创建工具
├── rel2real_path.py # 相对路径转绝对路径
└── panel_utils.py # 面板工具函数
```
### 核心类关系
```
┌─────────────┐ 解析 ┌─────────────┐
│ nginx.conf │ ───────────▶ │ Config │
└─────────────┘ └──────┬──────┘
┌────────────────┼────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Http │ │ Upstream │ │ Include │
└────┬─────┘ └──────────┘ └──────────┘
┌──────────┐
│ Server │ ───▶ SiteInfo (站点信息)
└────┬─────┘
┌──────────┼──────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Location │ │ Location │ │ 指令... │
└──────────┘ └──────────┘ └──────────┘
```
---
## 二、Nginx 实例定位策略
### 1. 进程名称匹配
直接扫描系统运行进程,匹配 `nginx` 进程标识。
通过进程信息反推核心路径:可执行文件路径 + 主配置文件(nginx.conf)路径。
### 2. 常见路径兜底扫描
若进程匹配未命中,遍历行业通用安装路径:
- `/usr/sbin/nginx`
- `/usr/local/nginx/sbin/nginx`
- `/www/server/nginx/sbin/nginx`
- `/opt/nginx/sbin/nginx`
### 使用示例
```python
from mod.base.pynginx.btnginx.nginx_detector import ng_detect, ng_detect_by_bin
# 获取所有Nginx实例
instances = ng_detect()
for ins in instances:
print(f"可执行文件: {ins.nginx_bin}")
print(f"配置文件: {ins.nginx_conf}")
print(f"版本: {ins.version}")
print(f"运行状态: {ins.running}")
# 仅获取运行中的实例
running_instances = ng_detect(only_running=True)
# 通过可执行文件路径获取实例
ins = ng_detect_by_bin("/usr/local/nginx/sbin/nginx")
```
---
## 三、配置文件全量解析
### 解析能力
- 解析范围:主配置文件(nginx.conf)+ 所有通过 `include` 指令引入的子配置文件(含多级嵌套引入)。
- 解析目标:提取配置结构树(全局块、http 块、server 块、location 块等)、指令参数、注释信息。
- 特殊支持:Lua代码块(`*_by_lua_block`)解析。
### 使用示例
```python
from mod.base.pynginx import parse_file, parse_string, dump_config
# 从文件解析(不解析include)
config = parse_file("/etc/nginx/nginx.conf")
# 从文件解析(递归解析include)
config = parse_file(
"/etc/nginx/nginx.conf",
parse_include=True,
main_config_path="/etc/nginx" # 用于定位include相对路径
)
# 从字符串解析
config = parse_string("""
server {
listen 80;
server_name example.com;
root /var/www/html;
}
""")
# 查找所有server块
servers = config.find_servers()
# 查找http块
http = config.find_http()
# 查找所有upstream块
upstreams = config.find_upstreams()
# 导出配置为字符串
content = dump_config(config)
```
### 指令查找
```python
from mod.base.pynginx import Config
# 查找指定指令
listen_dirs = server_block.find_directives("listen")
# 查找指令(包含include子块)
server_dirs = http_block.find_directives("server", include=True)
# 查找指令(包含所有子块)
all_proxy_pass = server_block.find_directives("proxy_pass", include=True, sub_block=True)
```
---
## 四、站点配置分离与分类
从解析后的全量配置中,提取所有 `http -> server` 虚拟主机块,按"服务类型"分类、"域名规则"聚合:
### 1. 服务类型判定标准
- **PHP 项目**:配置中存在 `fastcgi_pass` 指令(关联 PHP-FPM 服务)。
- **反向代理项目**:配置中存在 `proxy_pass` 指令(指向后端服务地址)。
- **静态项目**:不满足上述两类条件,默认判定为静态资源服务。
### 2. 虚拟主机聚合规则
- 相同 `server_name` 则合并为一个站点配置(统一管理 HTTP/HTTPS 规则)。
### 使用示例
```python
from mod.base.pynginx import parse_file
from mod.base.pynginx.btnginx.site_detector import site_detector, SiteInfo
# 解析配置
config = parse_file("/etc/nginx/nginx.conf", parse_include=True)
# 检测站点
sites = site_detector(config)
for site in sites:
print(f"域名: {site.server_names}")
print(f"端口: {site.listen_ports}")
print(f"类型: {site.site_type}") # PHP/反向代理/静态
```
---
## 五、面板兼容配置生成
基于解析后的原始配置,进行"结构调整 + 功能增强",生成符合面板使用规范的配置文件。
### 配置文件调整
1. **主配置文件调整**
- 直接保留:非 `http` 块的所有全局配置
- 条件保留:`http` 块中不含 `server` 块的 `include` 文件
- 强制注入:面板必需的基础指令和标记
2. **站点配置功能增强**
- 解析展开:将所有 `include` 引用的子配置直接展开
- 插入关键标识位:SSL证书配置、PHP关联配置等
- 结构重组:按规范顺序组织配置
### 使用示例
```python
from mod.base.pynginx.btnginx.bt_formater import bt_nginx_format
from mod.base.pynginx.btnginx.nginx_detector import ng_detect
# 获取Nginx实例
nginx_ins = ng_detect(only_running=True)[0]
# 创建格式化器, 解析并生成面板兼容配置
result = bt_nginx_format(nginx_ins)
# result包含:
# - site_conf: 站点配置信息列表
# - tmp_path: 临时配置文件目录
# - main_conf_path: 主配置文件路径
```
---
## 六、核心API参考
### nginx_base.py - 基础类
| 类/函数 | 说明 |
|--------------|---------------------------------------|
| `Token` | 词法标记,包含类型、内容、行号、列号 |
| `TokenType` | 标记类型枚举(EOF, KEYWORD, QUOTED_STRING等) |
| `Directive` | 指令实现,包含name、parameters、block、comment等 |
| `Block` | 块实现,包含directives列表 |
| `IDirective` | 指令接口定义 |
| `IBlock` | 块接口定义 |
### nginx_parser.py - 解析器
| 函数 | 说明 |
|-------------------------------------------------------------------------|----------|
| `parse_file(path, parse_include, main_config_path, comment_line_count)` | 从文件解析配置 |
| `parse_string(content, parse_include, comment_line_count)` | 从字符串解析配置 |
| `dump_config(config, style)` | 导出配置为字符串 |
| `dump_block(block, style)` | 导出块为字符串 |
### nginx_components.py - 组件类
| 类 | 说明 |
|------------------|--------------------|
| `Http` | HTTP块组件 |
| `Server` | Server块组件 |
| `Location` | Location块组件 |
| `Upstream` | Upstream块组件 |
| `UpstreamServer` | Upstream中的server指令 |
| `LuaBlock` | Lua代码块组件 |
### nginx_detector.py - Nginx探测器
| 函数 | 说明 |
|------------------------------|---------------|
| `ng_detect(only_running)` | 获取所有Nginx实例 |
| `ng_detect_by_bin(bin_path)` | 通过可执行文件路径获取实例 |
### site_detector.py - 站点检测器
| 类/函数 | 说明 |
|-------------------------|---------------------------------------------------------------|
| `SiteInfo` | 站点信息数据类(server_names, listen_ports, site_type, server_blocks) |
| `SiteDetector` | 站点检测器类 |
| `site_detector(config)` | 检测并分类所有站点配置 |
### extension/config.py - 配置工具
| 类 | 说明 |
|----------------|-------------------------|
| `ConfigTools` | 配置基础工具(获取主server、导出字符串) |
| `ConfigFinder` | 配置查找工具(查找域名、端口、IP限制等) |
### extension/server.py - Server块工具
| 类 | 说明 |
|---------------|----------------------------|
| `ServerTools` | Server块操作工具(设置SSL端口、移除域名等) |
---
## 七、完整工作流程
```python
# 1. 探测Nginx实例
from mod.base.pynginx.btnginx.nginx_detector import ng_detect
nginx_instances = ng_detect(only_running=True)
if not nginx_instances:
print("未找到运行中的Nginx实例")
exit()
nginx_ins = nginx_instances[0]
# 2. 解析配置文件
from mod.base.pynginx.btnginx.bt_formater import bt_nginx_format
# 3. 格式化为面板兼容配置
result = bt_nginx_format(nginx_ins)
# 4. 查看识别到的站点
for site in result['site_conf']:
print(f"站点: {site['name']}")
print(f" 类型: {site['site_type']}")
print(f" 域名: {site['domains']}")
print(f" 端口: {site['ports']}")
# 5. 在面板中创建站点
from mod.base.pynginx.btnginx.create_site import CreateSiteUtil
util = CreateSiteUtil(result['tmp_path'])
for site in result['site_conf']:
if site['site_type'] == 'PHP':
util.create_php_site(site)
elif site['site_type'] == 'proxy':
util.create_proxy_site(site)
else:
util.create_static_site(site)
```
---
## 八、注意事项
1. **路径解析**:解析include文件时需指定`main_config_path`参数,否则相对路径无法正确解析。
2. **Lua块支持**:支持`*_by_lua_block`指令的解析和格式化。
3. **注释保留**:默认保留指令前1行注释,可通过`comment_line_count`参数调整。
4. **配置验证**:探测器会执行`nginx -t`验证配置有效性。