你好,章亦春
之前有在sina微博上请教过关于Uri的简单的问题,并得到了清晰的回复。非常感谢
目前在开发自定义module过程中,遇到了问题,真心希望你能抽出时间,帮我看看,并能得到你的帮助和指点。
实现需求:
1. 自定义 module 中根据请求的图片Url 可以映射出一个磁盘路径。该图片源是从其他机器通过mount方式挂载到linux文件系统下。
2. 该自定义module内部逻辑过程中,希望在读取图片文件时,增加超时机制,在图片源出现问题时,这边也能根据设定的超时时间,快速处理并返回
希望利用 linux下的epoll 以及nginx 的 定时器事件。但是实现思路不太明确。
目前的实现思路:
1. 通过ngx_http_request_t 指针r 内部的 ngx_connection_t 指针对象c上的 ngx_event_t 指针 read,获取读事件
2. 提供2个方法,读远程图片方法和关闭读取远程图片方法。ngx_http_read_remote_file(内部是同步阻塞读取) 和 ngx_http_close_read_remote_file
3. 设置读事件的回调函数(handler)为ngx_http_close_read_remote_file(当超时时执行)
4. 将读事件加入的定时器中,设置定时器超时时间
5. 调用系统调用,将读事件加入到epoll中
6. 调用 ngx_http_read_remote_file,执行读取远程图片方法。如果很快成功,而超时时间还没有到达,将读事件的handler设置为NULL,继续后续正常处理,返回图片内容。
7. 如果超过设定的超时时间还没有完成,则执行读事件的handler,关闭连接。返回404。
//以下是实现方法框架
static ngx_int_t ngx_http_close_read_remote_file(ngx_http_request_t *r){
//具体的关闭读取远程文件的逻辑代码
}
static ngx_int_t ngx_http_read_remote_file(ngx_http_request_t *r){
//具体的读取远程图片逻辑代码
}
//自定义module handler方法
static ngx_int_t ngx_http_autohome_pic_handler(ngx_http_request_t *r){
ngx_int_t rc;
ngx_event_t *rev;
ngx_connection_t *c;
c = r->connection;
rev = c->read;
rev->handler = ngx_http_close_read_remote_file;
c->write->handler = ngx_http_empty_handler;
ngx_add_timer(rev, 3000); //设定时间
if (ngx_handle_read_event(rev, 0) != NGX_OK) {
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
rc = ngx_http_read_remote_file(r); //同步阻塞读取远程文件
if(rc == NGX_OK){
rev->handler = NULL; //将handler设置为NULL,取消对关闭操作的调用
}
//继续其他处理
//执行过滤并返回
}
这个方案目前还是无法实现,是否有改进的地方或存在其他解决办法。再次感激。
邮件内容有点多,见谅!