openstack_ice之wsgi详解(paste从ini配置文件->routesr具体发布流程)

感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!

如有转载,请保留源作者博客信息。

Better Me的博客blog.youkuaiyun.com/tantexian

如需交流,欢迎大家博客留言。

对Restful API有了一个基础的了解,那么我们来看通过URL是怎样映射到具体的应用程序操作函数上了。在OpenStack中的API Daemon都会有一个Router类,来构建资源与URL直接的映射关系,完成从接收到URL请求然后映射到具体的函数上执行的整个过程。

这就要了解Python 中的Routes模块。

Routes 是一个python重新实现的Rails routes system,用来将urls映射到应用具体的action上,相反的,还生成url。由于Routes是Rails routes system的python实现,并且网上关于Routes的文档很少,故从rails的routes system入手,就能很好的理解Routes库了。

首先看一个简单的例子,就明白routes的作用,

例如浏览器接收到下面的HTTP请求, GET /instances/1 Rails的路由请求则负责将此请求解析后dispatch来代码中的具体某个函数,完成调用,例如返回虚拟机的信息。


第一部分:讲解wsgi的调用入口(paste)


python中的WSGI(Web Server Gateway Interface)是Python应用程序或框架与Web服务器之间的一种接口,定义了一套借口来实现服务器与应用端的通信规范。按照一套规范,应用端 想要通信,很简单,只需要实现一个接受两个参数的,含有__call__方法并返回一个可遍历的含有零个或者多个string结果的python对象。

服务端,对于每个http请求,调用一次应用端“注册”的那个协议规定应用必须实现的对象,然后返回相应的响应消息。 WSGI Server唯一的任务就是接收来自client的请求,然后将请求传给application,最后将application的response传递给client。中间存在的一些东西,就需要中间件来处理。


Paste Deployment是用于发现和配置WSGI appliaction和server的系统。对于WSGI application,用户提供一个单独的函数(loadapp),用于从配置文件或者python egg中加载WSGI application。因为WSGI application提供了唯一的单独的简单的访问入口,所以application不需要暴露application的内部的实现细节。

Paste.Deploy主要是用来载入WSGI中的Web App使用,其核心函数是loadapp()。

以下将以openstack的nova为例讲解paste如何载入启动nova服务(即发布routes API给上层提供调用)

1、nova --debug list开始:

命令的主要目的就是发送了两个url请求:(第一个发送给keystone授权,授权通过发送给nova获取虚拟机列表)

url中包括了token以及参数值



下图说明请求url成功,返回200.


2、接下来详解,发送以下url,如何映射到后台的v2版本的nova API以及又是如何进行权限认证配置。

http://192.168.1.120 :8774/v2/c865d5a3760348a4b8a92cf657a9176d/servers/detail

3、每一个url映射都是有paste模块进行解析,paste模块具体解析模块入口就是*.ini配置文件。
以下展示了整个openstack中所有的url映射控制的paste入口配置文件。
find /etc/ | xargs grep paste --color=auto 查找到所有的paste的ini配置文件。



4、以nova的api-paste.ini配置文件讲解。

首先介绍paste配置文件中的几个概念:

一个配置文件后缀为ini,内容被分为很多段(section),paste.depoly只关心带有前缀的段,比如[app:main]或者[filter:errors],总的来说,一个section的标识就是[type:name],不是这种类型的section将会被忽略。

一个section的内容是以键=值来标示的。#是一个注释。在段的定义中,有以下几类:

[app:main]:定义WSGI应用,main表示只有一个应用,有多个应用的话main改为应用名字

[server:main]:定义WSGI的一个server。

[composite:xxx]:表示需要将一个请求调度定向(dispatched)到多个,或者多种应用上。以下是一个简单的例子,例子中,使用了composite,通过urlmap来实现载入多应用。

[fliter:]:定义“过滤器”,将应用进行进一步的封装。

[DEFAULT]:定义一些默认变量的值。

vim /etc/nova/api-paste.ini 

其中openstack_compute_api_v2的use = call:nova.api.auth:pipeline_factory表示通过访问的url,来选择具体使用哪个应用。

根据http://192.168.1.120:8774/v2/c865d5a3760348a4b8a92cf657a9176d/servers/detail,由匹配规则,接下来调用

/v2: openstack_compute_api_v2应用。


这个Application对应了三个参数:noauth,keystone和keystone_nolimit。我们可以看到这里Application具体实现的方法是pipeline_factory。我们可以看到在参数noauth,keystone和keystone_nolimit中,分别集成了多个应用,实际上每个参数最终实现的Application分别是最后一个,即osapi_compute_app_v2osapi_compute_app_v2osapi_compute_app_v2,其前面的Application都扮演这最后一个Application的过滤器。我们以参数keystone为例,实现参数keystone的Application为osapi_compute_app_v2,它前面的faultwrap sizelimit authtoken keystonecontext等应用都是它的过滤器,其实现过程也就是faultwrap(sizelimit(authtoken(keystonecontext(osapi_compute_app_v2)))),具体的调用过程就是osapi_compute_app_v2->keystonecontext->authtoken->sizelimit->faultwrap,前面方法的执行结果作为后面方法的输入参数,最后得到的运行结果作为参数keystone的值。可以说明,三个参数noauth,keystone和keystone_nolimit的值都是这样得到的。


详解:

后面三句分别对应配置文件中不同配置执行不通的过滤流程,最终三个都将返回osapi_compute_app_v2应用。

use = call:nova.api.auth:pipeline_factory代码:

pipeline_factory函数的目的就是读取解析配置文件(/etc/nova/nova.conf)中定义的认证策略:noauth、keystone、keystone_nolimit。

假若在配置文件nova.conf中,配置的是auth_strategy=keystone,接下来匹配:

keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v2
faultwrap sizelimit过滤器不做进一步详解,有兴趣者请自行跟进代码查看。
5、分析authtoken 过滤器:

找到对应的代码:
由上述代码可知,授权对应过滤器authtoken,具体操作在AuthProtocol类的__call__函数。授权的具体细节请自行分析以上函数,再次不做过多讲解。
注:有paste的知识可知,每一个factory,都会有一个__call__函数。调用该factory就会调用此函数。

6、接下来分析keystonecontext 过滤器:

对应代码:

上述代码功能:在上一步授权走过滤器authtoken时候,从keystone中获取了一些必要的信息。例如X_USER_ID、X_TENANT_NAME、X_ROLES、token值等等,然后组装成一个http的request,请求对应的url信息。


从命令执行结果也可以看出authtoken、和keystonecontext两个过滤器各自功能及交互过程。

authtoken过滤器执行过程:(curl -i是发送一个url请求,INFO后面则是从keystone模块请求回来的参数,这些参数传递给keystonecontext过滤器,

keystonecontext过滤器根据这些参数,再组装出对应的http request,请求相应的url)

keystonecontext过滤器执行过程:


7、到此过滤器执行完了,接下来重点分析osapi_compute_app_v2应用:

keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v2

找到对应入口代码:

上述APIRouter类就是paste加载osapi_compute_app_v2应用,然后发布路由规则处。

class APIRouter(nova.api.openstack.APIRouter):
找到父类 nova.api.openstack.APIRouter:




8、打印router信息:

 vim /usr/lib/python2.6/site-packages/nova/api/openstack/__init__.py



重启openstack-nova-api服务

service  openstack-nova-api restart
tailf /var/log/nova/api.log


根据上述的routes信息,可以知道openstack nova模块发布出了哪些api开发给上层调用。(其他keystone、glance等模块发布流程类似,请自行研究。)

关于routes更多信息,请参考文章WSGI熟悉之Rails 入门(ruby-rails环境配置及简单使用)


关于如何在如何后台模块router中增加自定义api,及在前台dashboard中调用该自定义api,请参考后续文章--openstack_ice之routes自定义及调用详解。

<think>嗯,用户之前问过关于不使用框架、自行搭建网页的难度,现在他想梳理建设IT Helpdesk项目的整体思路,并且指定了使用AI生成代码,系统环境是CentOS 7.9,宝塔面板LNMP环境,包括Nginx 1.26、MySQL 5.7、PHP 8.0和phpMyAdmin 5.1。 首先,我需要确认用户的需求。他可能是一个新手,想利用AI辅助开发,但不太懂代码,所以需要详细的步骤和推荐的框架。之前的回答里提到了分阶段开发和使用低代码平台,但用户这次明确要用AI生成代码,并且指定了技术栈,可能倾向于更具体的实施方案。 接下来,用户提到的环境是CentOS 7.9,宝塔面板,LNMP。宝塔面板简化了服务器管理,所以安装和配置应该不是大问题。但用户需要的是整体思路,所以需要分阶段规划,从环境准备到开发、测试、部署,再到维护。 然后,考虑框架选择。用户之前的问题提到不使用框架,但这里可能需要推荐合适的框架,因为使用框架能提高效率,特别是对于新手。前端可能用Vue.js或React,后端用Laravel,因为PHP环境已经准备好了。这些框架有成熟的社区和AI支持,方便生成代码。 AI工具的选用,比如ChatGPT、GitHub Copilot,这些能帮助生成代码片段,但需要注意安全性和正确性,尤其是数据库操作和权限控制部分。用户可能不了解代码安全,需要强调人工审核的重要性。 数据库设计方面,IT Helpdesk需要工单表、用户表等,需要给出基本的字段建议,比如状态机、外键关联。同时,提醒用户使用ORM如Laravel的Eloquent,避免SQL注入。 部署部分,宝塔面板已经简化了流程,但SSL证书、备份策略这些需要指导。后期维护可能遇到问题,比如调试和升级,需要提前规划。 另外,用户可能没有考虑到安全风险,比如XSS、SQL注入,应该在代码生成时加入过滤和验证,比如Laravel的中间件和验证功能。 最后,需要总结一个步骤清晰的计划,分阶段进行,每个阶段的关键任务和使用的工具,让用户能按部就班地完成项目。同时提醒潜在风险,比如AI生成的代码可能存在漏洞,需要人工检查。</think>以下是基于**CentOS 7.9 + 宝塔面板LNMP环境**的IT-Helpdesk系统建设全流程规划(含AI代码生成策略): --- ### 一、技术栈选型建议 | 模块 | 推荐方案 | 选择理由 | AI支持度 | |-------------|-------------------------|------------------------------------|---------| | **前端** | Vue 3 + Element Plus | 组件丰富,AI训练数据量大(GitHub超14万star) | ★★★★☆ | | **后端** | Laravel 10 (PHP 8.0) | 自带Eloquent ORM,安全性高 | ★★★★ | | **数据库** | MySQL 5.7 + Redis | 宝塔面板原生支持,事务处理稳定 | ★★★★ | | **部署** | 宝塔面板+Docker | 可视化操作降低运维难度 | ★★★★☆ | > 注:phpMyAdmin 5.1已预装,用于数据库管理 --- ### 二、分阶段实施流程 #### 阶段1:环境配置(1天) 1. **宝塔初始化** ```bash # 宝塔面板常用命令 bt default # 查看面板地址 bt restart # 重启面板 ``` - 创建站点:域名→PHP 8.0→关闭防跨站 - 安全配置:SSH端口修改→防火墙放行80/443 2. **LNMP参数优化** ```nginx # nginx.conf 关键配置(AI生成模板) worker_processes auto; keepalive_timeout 65; gzip on; # 启用压缩 ``` #### 阶段2:数据库设计(2天) 1. **核心表结构** | 表名 | 字段示例(AI提示词参考) | |-------------|------------------------------------------| | tickets | `id, title, content, status(enum), user_id` | | users | `id, name, role(admin/user), password_hash` | | attachments | `file_path, ticket_id, upload_time` | ```sql -- AI生成示例(需人工校验) CREATE TABLE tickets ( id INT AUTO_INCREMENT PRIMARY KEY, status ENUM('open', 'in_progress', 'closed') DEFAULT 'open' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 2. **索引优化** - 给`tickets.user_id`添加外键索引 - 使用`EXPLAIN`分析慢查询 #### 阶段3:功能开发(7-15天) 1. **AI代码生成策略** - **前端**:用ChatGPT生成Vue组件模板 ```vue <!-- AI生成工单列表组件 --> <template> <el-table :data="tickets"> <el-table-column prop="title" label="工单标题"></el-table-column> <el-table-column prop="status" label="状态"> <template #default="{row}"> <el-tag :type="statusColor(row.status)">{{ row.status }}</el-tag> </template> </el-table-column> </el-table> </template> ``` - **后端**:Copilot生成Laravel控制器 ```php // AI生成工单API示例 class TicketController extends Controller { public function store(Request $request) { $validated = $request->validate([ 'title' => 'required|max:255', // 自动验证 ]); return Ticket::create($validated); } } ``` 2. **安全加固** - SQL注入防护:强制使用Laravel Query Builder - XSS防护:前端用`v-html`替代`{{{ }}}`输出 - 权限控制:实现Policy类 ```php // AI生成权限策略 class TicketPolicy { public function update(User $user, Ticket $ticket) { return $user->id === $ticket->user_id; // 仅创建者可修改 } } ``` #### 阶段4:联调测试(3天) 1. **接口测试** ```bash # 用curl测试API(AI生成测试命令) curl -X POST -H "Content-Type: application/json" -d '{"title":"网络故障"}' http://域名/api/tickets ``` 2. **压力测试** - 使用宝塔自带「网站监控」模块 - 调整PHP-FPM参数: ```ini pm.max_children = 50 # 根据服务器内存调整 pm.start_servers = 10 ``` #### 阶段5:部署上线(1天) 1. **宝塔一键部署** - 上传代码到`/www/wwwroot/域名` - 配置SSL证书(Let's Encrypt免费版) 2. **计划任务** ```bash # 每日凌晨备份数据库(AI生成命令) 0 3 * * * /www/server/mysql/bin/mysqldump -u root -p密码 数据库名 > /backup/db_$(date +\%F).sql ``` --- ### 三、关键风险控制 1. **AI代码缺陷** - 必须人工检查以下高危点: - 文件上传漏洞(需限制扩展名) - 会话固定攻击(使用`laravel_session`机制) - 密码存储(必须用`bcrypt`哈希) 2. **环境兼容问题** - 测试PHP 8.0特性:如`match`表达式、JIT编译 - 验证Nginx 1.26的HTTP/3支持性 --- ### 四、推荐AI工具链 | 场景 | 工具 | 使用技巧 | |---------------|-----------------------------|-----------------------------------------------------------------------| | 代码生成 | GitHub Copilot + ChatGPT4 | 输入详细注释:`// 需要实现工单状态流转,用Laravel状态机,支持open/in_progress/closed` | | 调试辅助 | PhpStorm + Xdebug | 用AI解释错误日志:`[Error] Class 'Ticket' not found` → 检查命名空间引入 | | 安全审计 | SonarQube + OWASP ZAP | 运行AI生成的扫描命令:`docker run -t zap zap-baseline.py -t http://域名` | --- ### 五、维护升级建议 1. **监控配置** - 宝塔面板开启「异常监控推送」 - 日志分析命令: ```bash tail -f /www/wwwlogs/域名.error.log | grep -E '500|502|503' # 实时捕获错误 ``` 2. **迭代策略** - 优先用AI生成补丁代码 - 重大更新前执行: ```bash php artisan down # 进入维护模式 git pull origin master php artisan migrate --force php artisan up ``` > 实施提示:所有AI生成的SQL语句必须通过phpMyAdmin执行前备份数据
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值