- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
nginx中upstream的设计和实现(一).pdf
nginx 中upstream 的设计和实现(一)
在nginx 的模块中,分为3 种类型,分别是handler,filter 和upstream,其中upstream 可以看做一
种特殊的handler,它主要用来实现和后端另外的服务器(php/jboss 等)进行通信,由于在nginx 中全部
都是使用非阻塞,并且是一个流式的处理,所以upstream 的实现很复杂,接下来我会通过几篇blog 来
详细的分析下nginx 中upstream 的设计和实现。
upstream 顾名思义,真正产生内容的地方在”上游”而不是nginx,也就是说nginx 是位于client 和后端
的upstream 之间的桥梁,在这种情况下,一个upstream 需要做的事情主要有2 个,第一个是当client
发送http 请求过来之后,需要创建一个到后端upstream 的请求。第二个是当后端发送数据过来之后,
需要将后端upstream 的数据再次发送给client.接下来会看到,我们编写一个upstream 模块,最主要
也是这两个hook 方法。
首先来看如果我们要写一个upstream 模块的话,大体的步骤是什么,我们以memcached 模块为例子,
我们会看到如果我们自己编写upstream 模块的话,只需要编写upstream 需要的一些hook 函数,然后
挂载到upstream 上就可以了。
首先来看它的初始化部分。这个函数是命令memcached_pass 的handle,它主要做了两件事情,第一
件是保存目的upstream(memcached_pass 的参数).第二个是设置core module 的handler(这个
handler 会在update_location 中设置给content_handle),也就是说一个upstream 其实也就是一个
处于content phase 的handler。
1 static char *
2 ngx_http_memcached_pass(ngx_conf_t *cf, ngx_command_t *cmd, void
*conf)
3
{
4
5
value = cf-args-elts;
6
7
ngx_memzero(u, sizeof(ngx_url_t));
8
u.url = value[1];
9
u.no_resolve = 1;
10
//根据url,取得对应的upstream
11
mlcf-upstream.upstream = ngx_http_upstream_add(cf, u, 0);
12
if (mlcf-upstream.upstream == NULL) {
13
return NGX_CONF_ERROR;
14
}
15
16 clcf = ngx_http_conf_get_module_loc_conf(cf,
ngx_http_core_module);
17
//设置handler
18
clcf-handler = ngx_http_memcached_handler;
19
然后来看ngx_http_memcached_handler,它主要是初始化upstream 的相关回调,然后调用
ngx_http_upstream_init 设置对应的读写回调等等其他的操作。这里我们要主要看它设置的几个回调函
数。
1 static ngx_int_t
2 ngx_http_memcached_handler(ngx_http_request_t *r)
3 {
4 ngx_int_t rc;
5 ngx_http_upstream_t *u;
6 ngx_http_memcached_ctx_t *ctx;
7 ngx_http_memcached_loc_conf_t *mlcf;
8
9 if (!(r-method (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
10 return NGX_HTTP_NOT_A
文档评论(0)