问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么用nginx输出helloworld

发布网友 发布时间:2022-04-20 09:58

我来回答

1个回答

热心网友 时间:2022-04-11 08:43

nginx模块的处理流程:

a.客户端发送http请求道nginx服务器

b.nginx基于配置文件中的位置选择一个合适的处理模块

c.负载均衡模块选择一台后端服务器(反向代理情况下)

d.处理模块进行处理并把输出缓冲放到第一个过滤模块上

e.第一个过滤模块处理后输出给第二个过滤模块

f.然后第二个过滤模块又到第三个过滤模块

g.第N个过滤模块。。。

h.发处理结果发给客户端

2.nginx模块编写

a、创建模块文件夹

<span style="font-size:16px;">mkdir -p /opt/nginx_hello_world
cd /op/nginx_hello_word</span>

b、创建模块配置文件

<span style="font-size:16px;">vi /opt/nginx_hello_word/config</span>

写入如下内容:

<span style="font-size:16px;">ngx_addon_name=ngx_http_hello_world_mole
HTTP_MODULES="$HTTP_MODULES ngx_http_hello_world_mole"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_world_mole.c"
CORE_LIBS="$CORE_LIBS -lpcre"</span>

c、创建模块主文件

<span style="font-size:16px;">vi /opt/nginx_hello_world/ngx_http_hello_world_mole.c</span>

写入如下内容:

<span style="font-size:16px;">#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>

static char *ngx_http_hello_world(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

/* Commands */
static ngx_command_t ngx_http_hello_world_commands[] = {
{ ngx_string("hello_world"),
NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
ngx_http_hello_world,
0,
0,
NULL },
ngx_null_command
};

static u_char ngx_hello_world[] = "hello world";

static ngx_http_mole_t ngx_http_hello_world_mole_ctx = {
NULL, /* preconfiguration */
NULL, /* postconfiguration */
NULL, /* create main configuration */
NULL, /* init main configuration */
NULL, /* create server configuration */
NULL, /* merge server configuration */
NULL, /* create location configuration */
NULL /* merge location configuration */
};
/* hook */
ngx_mole_t ngx_http_hello_world_mole = {
NGX_MODULE_V1,
&ngx_http_hello_world_mole_ctx, /* mole context */
ngx_http_hello_world_commands, /* mole directives */
NGX_HTTP_MODULE, /* mole type */
NULL, /* init master */
NULL, /* init mole */
NULL, /* init process */
NULL, /* init thread */
NULL, /* exit thread */
NULL, /* exit process */
NULL, /* exit master */
NGX_MODULE_V1_PADDING
};
static ngx_int_t
ngx_http_hello_world_handler(ngx_http_request_t *r)
{
ngx_int_t rc;
ngx_buf_t *b;
ngx_chain_t out;
/* Http Output Buffer */
r->headers_out.content_type.len = sizeof("text/plain") - 1;
r->headers_out.content_type.data = (u_char *) "text/plain";

b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));

out.buf = b;
out.next = NULL;

b->pos = ngx_hello_world;
b->last = ngx_hello_world + sizeof(ngx_hello_world);
b->memory = 1;
b->last_buf = 1;

r->headers_out.status = NGX_HTTP_OK;
r->headers_out.content_length_n = sizeof(ngx_hello_world);
ngx_http_send_header(r);

return ngx_http_output_filter(r, &out);
}
static char *
ngx_http_hello_world(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_http_core_loc_conf_t *clcf ;
/* register hanlder */
clcf = ngx_http_conf_get_mole_loc_conf(cf, ngx_http_core_mole);
clcf->handler = ngx_http_hello_world_handler;
return NGX_CONF_OK;
}
</span>

d、下载nginx源码包,我下载的是nginx-1.0.13.tar.gz

这里注意在编译helloworld模块前首先确认,nginx是否可以独立编译成功,是否安装了所需的所有模块

与helloworld模块一起编译nginx:

<span style="font-size:16px;">./configure --prefix=/usr/local/nginx --add-mole=/opt/nginx_hello_world/
make
make install</span>

e、配置nginx.conf

<span style="font-size:16px;">location= /hello {
hello_world;
}</span>

f、启动nginx,访问http://localhost/hello ,可以看到编写的helloworld模块输出的文字。

3.hello world模块分析

a.ngx_command_t函数用于定义包含模块指令的静态数组ngx_http_hello_world_commands

<span style="font-size:16px;">static ngx_command_t ngx_http_hello_world_commands[] = {
{ ngx_string("hello_world"), //设置指令名称字符串,注意不能包含空格,数据类型ngx_str_t之后会详细讲解。
NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS, //配置指令的合法位置,这里表示:location部分合法,并且指令没有参数。
ngx_http_hello_world,//回调函数,三个参数(ngx_conf_t *cf,ngx_command_t *cmd, void *conf)
0,//后面的参数有待发掘,我还没有用到
0,
NULL },
ngx_null_command
};</span>

b.static u_char ngx_hello_world[] ="hello world" 则是输出到屏幕的字符串。

c.ngx_http_mole_t用来定义结构体ngx_http_hello_world_mole_ctx:

<span style="font-size:16px;">static ngx_http_mole_t ngx_http_hello_world_mole_ctx = {
NULL, /* 读入配置前调用*/
NULL, /* 读入配置后调用*/
NULL, /* 创建全局部分配置时调用 */
NULL, /* 初始化全局部分的配置时调用*/
NULL, /* 创建虚拟主机部分的配置时调用*/
NULL, /* 与全局部分配置合并时调用 */
NULL, /* 创建位置部分的配置时调用 */
NULL /* 与主机部分配置合并时调用*/
};</span>

d.ngx_mole_t定义结构体ngx_http_hello_world_mole

<span style="font-size:16px;">ngx_mole_t ngx_http_hello_world_mole = {
NGX_MODULE_V1,
&ngx_http_hello_world_mole_ctx, /* mole context */
ngx_http_hello_world_commands, /* mole directives */
NGX_HTTP_MODULE, /* mole type */
NULL, /* init master */
NULL, /* init mole */
NULL, /* init process */
NULL, /* init thread */
NULL, /* exit thread */
NULL, /* exit process */
NULL, /* exit master */
NGX_MODULE_V1_PADDING
};</span>

他包含有模块的主要内容和指令的执行部分,下一节会详细讲解。

e.处理函数,ngx_http_hello_world_handler,也是hello world 模块的核心部分。

<span style="font-size:16px;">static ngx_int_t
ngx_http_hello_world_handler(ngx_http_request_t *r)//ngx_http_request_t *r 可以访问到客户端的头部和不久要发送的回复头部
{
ngx_int_t rc;
ngx_buf_t *b;
ngx_chain_t out;
/* Http Output Buffer */
r->headers_out.content_type.len = sizeof("text/plain") - 1;
r->headers_out.content_type.data = (u_char *) "text/plain";

b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));

out.buf = b;
out.next = NULL;

b->pos = ngx_hello_world;
b->last = ngx_hello_world + sizeof(ngx_hello_world);
b->memory = 1;
b->last_buf = 1;

r->headers_out.status = NGX_HTTP_OK;
r->headers_out.content_length_n = sizeof(ngx_hello_world);
ngx_http_send_header(r);

return ngx_http_output_filter(r, &out);
}</span>
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 nginx 一条请求 同时分发给两个程序 如何实现 Nginx启动期做了哪些事 nginx可以给html加自定义头部吗 openresty&nbsp;ffi怎么调用ngx函数 CHARM|NGX汉语是啥? “惊群”,看看nginx是怎么解决它的 / 蓝讯 晨曦之路txt全集下载 千年未解之谜小说txt全集免费下载 nginx 错误状态码有哪些 字母NNGX是什么意思 NGX文具盒忘记密码怎么打开? nvidia NGX组件是什么? ngx的lua模块怎么捕获 客户端主动关闭 如何判断一个网站用的Apache还是ngx ngixn进程数 什么是nginx进程 是干什么 steam首次安装搞ngx angluarpdf文件显示ngx ngx2是什么面料 煤矿职工代表提案 企业技术员开职代会应提一些什么建仪好 CD4051与HC4051有什么区别? 请问CD4067和74HC4051有什么参数上的区别?为什么... 74hc4051 中文资料 请问74LS、74HC、CD系列的详细区别是什么? 74HC4051内部原理图,管脚图,真值表 用Multisim做一个仿真,里面需要用到CC4051这个八选... 在protues中cd4051用什么代替 与CD4051相似的芯片有哪些 multisim中没有CD4051或74hc4051怎么办?求大神帮... 黄龙溪和洛带哪个好玩,有何不同? 临江到仙女洞有多少公里 临沂到黑龙江多少公里 从通化到四川广安有多少公里 铜陵市到吉林省白山市长白山朝鲜族自治县怎么走最方便 绥芬河到南京市多少公里 辽宁省鞍山市岫岩县跟成都东软学院距离多少 哈尔滨中央大街附近有什么特色早餐餐馆 深圳市积分入户网上预约几点放号? 提问:南京有什么特色小吃呀?还有哪些地方好玩的... 写人们互相关爱的作文