Because of some needs, I also started to develop module development for nginx. After reading some information, I wrote my first nginx module.

In fact, the development of nginx module is relatively easy. There are many modules for online open source, which can be used for reference. What shocks me is the OAuth module.

The nginx module compares some back-end language implementations. The most important feature is that the speed is fast. This is understandable. The difference between nginx module and apache is that apache loads the so module, and nginx directly compiles the module into the main program. Under my simple test, a very simple module with business logic can reach 1-2w/s requests. If your machine is good enough, this data is more impressive. For a PHP, it can be very good to be able to press 5000/s.

Personally feel that nginx module development data is still relatively small (seemingly contradictory with the above said = =), development is still embarrassing, so if you want to try some nginx module development, and apply to the production environment, recommend some business logic is relatively simple Think again.

Another advantage of nginx module development is that it is very easy to deploy and the compilation is very simple.

Well, nonsense will not say, the following gives a hello world demo. There are already many examples of hello world on the Internet, which is still very complicated in my opinion. I still have to say it myself.

Before developing the module, we need to create a new file called “config”. When nginx compiles, let the main program compile my module.

In this hello world example, config looks like this:

1
2
3
ngx_addon_name = ngx_hello_world_module
HTTP_AUX_FILTER_MODULES = "$ HTTP_MODULES ngx_hello_world_module" 
NGX_ADDON_SRCS = "$ NGX_ADDON_SRCS $ ngx_addon_dir / ngx_hello_world_module.c"

Need to pay attention to the name of the module and the location of your module source code

Then create a new ngx_hello_world_module.c in your directory.

Then enter the following code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <ngx_core.h> 
#include <ngx_http.h> 
#include <nginx.h>
 
static  char  * ngx_hello_world ( ngx_conf_t * cf , ngx_command_t * cmd ,  void  * conf ) ; 
static ngx_int_t ngx_hello_world_get_output ( ngx_http_request_t * r ,  char  * out_buf ) ; 
static ngx_int_t ngx_hello_world_handler ( ngx_http_request_t * r ) ;
 
/ * Commands * / 
static ngx_command_t ngx_hello_world_commands [ ]  =  { 
    { ngx_string ( "ngx_hello_world" ) , 
      NGX_HTTP_LOC_CONF | NGX_CONF_NOARGS , 
      ngx_hello_world , 
      NGX_HTTP_LOC_CONF_OFFSET , 
      0 , 
      NULL } ,
 
      ngx_null_command
};
 
static ngx_http_module_t  ngx_hello_world_module_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 */
};
 
/ * * / Remedy 
ngx_module_t ngx_hello_world_module =  { 
    NGX_MODULE_V1 , 
    & ngx_hello_world_module_ctx ,               / * module Context * / 
    ngx_hello_world_commands ,                  / * module directives * / 
    NGX_HTTP_MODULE ,                        / * module type * / 
    null ,                                   / * init master * / 
    null ,                                   / * init module * / 
    NULL ,              / * init process * / 
    NULL ,                                   / * init thread * / 
    NULL ,                                   / * exit thread * / 
    NULL ,              / * exit process * / 
    NULL ,                                  /* exit master */
    NGX_MODULE_V1_PADDING
};
 
 
static ngx_int_t ngx_hello_world_get_output(ngx_http_request_t *r, char *out_buf){
 
    sprintf(out_buf, "%s", "Hello World!");
    return NGX_OK;
}
 
static ngx_int_t
ngx_hello_world_handler ( ngx_http_request_t * r ) 
{ 
    ngx_int_t rc ; 
    ngx_buf_t     * b ; 
    ngx_chain_t out ;
 
    /* Http Output Buffer */
    char out_buf[20] = {0};
 
    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
        return NGX_HTTP_NOT_ALLOWED;
    }
 
    rc = ngx_http_discard_request_body(r);
 
    if (rc != NGX_OK && rc != NGX_AGAIN) {
        return rc;
    }
    //定制头信息
    r->headers_out.content_type.len = sizeof("text/html") - 1;
    r->headers_out.content_type.data = (u_char *) "text/html";
 
    if (r->method == NGX_HTTP_HEAD) {
        rc = ngx_http_send_header(r);
 
        if  ( rc == NGX_ERROR || rc > NGX_OK || r -> header_only )  { 
            return rc ; 
        } 
    }
 
    / / Get the output body 
    ngx_hello_world_get_output ( r , out_buf ) ;
 
    b = ngx_pcalloc ( r -> pool ,  sizeof ( ngx_buf_t ) ) ; 
    if  ( b == NULL )  { 
        return NGX_HTTP_INTERNAL_SERVER_ERROR ; 
    }
 
    out.buf = b;
    out.next = NULL;
 
    b->pos = (u_char *)out_buf;
    b->last = (u_char *)out_buf + strlen(out_buf);
    b->memory = 1;
    b->last_buf = 1;
    r->headers_out.status = NGX_HTTP_OK;
    r->headers_out.content_length_n = strlen(out_buf);
 
    rc = ngx_http_send_header(r);
 
    if  ( rc == NGX_ERROR || rc > NGX_OK || r -> header_only )  { 
        return rc ; 
    }
 
    return ngx_http_output_filter(r, &out);
}
 
static  char  * 
ngx_hello_world ( ngx_conf_t * cf , ngx_command_t * cmd ,  void  * conf ) 
{ 
    ngx_http_core_loc_conf_t * clcf = ngx_http_conf_get_module_loc_conf ( cf , ngx_http_core_module ) ;
 
    /* register hanlder */
    clcf->handler = ngx_hello_world_handler;
 
    return NGX_CONF_OK ; 
}

Then compile. 
What you need to understand when compiling is that we don’t have to compile our module. We only need to add the –add-module parameter when compiling nginx.

In addition, nginx rewrite is required to use the pcre library, so before compiling nginx, please compile and install pcre.

Then go to the nginx directory and configure

1
./configure --prefix=/home/www/nginx --user=www --group=www --add-module=/home/www/download/ngx_hello_world --with-cc-opt="-I /home/www/pcre/include" --with-ld-opt="-L /home/www/pcre/lib"

After –add-module is the directory address of our module. This directory contains the config file just written. The latter two are the directories that specify pcre. If you do not specify the installation directory when you configure pcre, you can remove these two parameters. .

After the compilation is complete, our module is “fitted” with the nginx main program.

At this point we enter nginx.conf and add the following information to your server block:

1
2
3
location /hello {
	ngx_hello_world;
}

Then start nginx, then open your server / hello can see the output hello world information. If you are interested, you can use PHP to write a Hello World, and then press to compare performance:)

The following is the package download of this module:

ngx_hello_world

  • Tags:,
  • Author: Wanda Hundley
  • Category: C

Wp-goo.gl is a WordPress plugin that converts links in your articles or comments into short URLs for goo.gl. Using the [goo.gl=”name”] link[/goo.gl] or the [goo.gl] link[/goo.gl] in the article will automatically resolve to the goo.gl short URL, you don’t need to enter it in the comments. These specific tags, wp-goo.gl, will automatically convert them to short URLs. Due to the need to make a request, the cURL extension must be enabled on your server! Note: This plugin will permanently change the link you entered!

Wp-goo.gl allows you to publish links in your posts or comments using goo.gl short URL service. With [goo.gl=”name”]link[/goo.gl] or [goo.gl]link[/goo .g] you will not have to write such special codes. wp-goo.gl will change the links automatically. The cURL functions must be available on your server. WARNING: This plug-in will permanently change your Input link!

Instructions:

1. Pass the wp-goo.gl directory to your wp-content\plugins. 
2. Open wp-goo.gl in the background. 
3. Adding the [goo.gl=”name”] link[/goo.gl] or the [goo.gl] link[/goo.gl] will automatically resolve to the short URL of goo.gl when posting the article. 
4. You can set the article or comment in the settings -wp-goo.gl!

== Installation ==

1. Upload `googl-url-shortener-for-wordpress` to the `/wp-content/plugins/` directory 
2. Activate the plugin through the ‘Plugins’ menu in WordPress 
3. Use [goo.gl=”name” ]link[/goo.gl] or [goo.gl]link[/goo.gl] in your posts.

Please test if you have any questions, please send me a message or send an email to admin@skiyo.cn

If you have any questions, please email to me. admin@skiyo.cn

download:

http://goo.gl/zU7K