ふふーん

一緒にやりたくなったのよ!あなたと、調合を!

nginxモジュールを作ってみるやつ

まずモジュールなしでビルドして動かすところまで。 特にconfigureのオプションもなしで普通にビルドするだけ。

$ curl -O https://nginx.org/download/nginx-1.13.1.tar.gz
$ tar -xf nginx-1.13.1.tar.gz
$ cd nginx-1.13.1
$ ./configure
$ make

objs/nginxに実行バイナリができる。 インストールはめんどくさいので適当にディレクトリ作ったりしてこのまま動かす。

$ echo hello > html/hello.html
$ mkdir logs
$ diff -u conf/nginx.conf{.00,}
--- conf/nginx.conf.00  2017-06-08 09:37:18.874240606 +0900
+++ conf/nginx.conf 2017-06-08 09:37:36.733276799 +0900
@@ -1,4 +1,4 @@
-
+daemon off;
 #user  nobody;
 worker_processes  1;
 
@@ -33,7 +33,7 @@
     #gzip  on;
 
     server {
-        listen       80;
+        listen       8000;
         server_name  localhost;
 
         #charset koi8-r;
$ objs/nginx -p . -c conf/nginx.conf
$ curl http://127.0.0.1:8000/hello.html
hello

ここまではOK。モジュールを作ってみる。

github.com

これを参考に(というかほぼそのまま)helloするだけのやつ。

$ mkdir hello
$ vim hello/config
$ vim hello/ngx_http_hello_module.c
# hello/config

ngx_addon_name=ngx_http_hello_module
HTTP_MODULES="$HTTP_MODULES ngx_http_hello_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_module.c"
/* hello/ngx_http_hello_module.c */

#include <ngx_core.h>
#include <ngx_http.h>

static char *ngx_http_hello(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
static ngx_int_t ngx_http_hello_handler(ngx_http_request_t *r);

static ngx_command_t ngx_http_hello_commands[] = {
    { ngx_string("hello"),
      NGX_HTTP_LOC_CONF | NGX_CONF_NOARGS,
      ngx_http_hello,
      0, 0, NULL
    },
    ngx_null_command
};

static ngx_http_module_t ngx_http_hello_module_ctx = { NULL };

ngx_module_t ngx_http_hello_module = {
    NGX_MODULE_V1,
    &ngx_http_hello_module_ctx,
    ngx_http_hello_commands,
    NGX_HTTP_MODULE,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NGX_MODULE_V1_PADDING
};

static char *ngx_http_hello(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);
    clcf->handler = ngx_http_hello_handler;

    return NGX_CONF_OK;
}

static ngx_int_t ngx_http_hello_handler(ngx_http_request_t *r) {
    ngx_int_t rc;
    ngx_chain_t out;
    ngx_buf_t *buf;
    ngx_str_t body = ngx_string("hello module\n");

    if (r->method != NGX_HTTP_GET && r->method != NGX_HTTP_HEAD)
        return NGX_HTTP_NOT_ALLOWED;

    buf = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
    if (buf == NULL)
        return NGX_HTTP_INTERNAL_SERVER_ERROR;

    buf->pos = body.data;
    buf->last = buf->pos + body.len;
    buf->memory = 1;
    buf->last_buf = 1;
    out.buf = buf;
    out.next = NULL;

    ngx_str_set(&r->headers_out.content_type, "text/plain");
    r->headers_out.status = NGX_HTTP_OK;
    r->headers_out.content_length_n = body.len;

    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);
}
$ ./configure --add-module=hello
$ make
$ diff -u conf/nginx.conf{.01,}
--- conf/nginx.conf.01  2017-06-08 10:31:04.078426749 +0900
+++ conf/nginx.conf 2017-06-08 10:31:46.636507922 +0900
@@ -45,6 +45,10 @@
             index  index.html index.htm;
         }
 
+        location /hello {
+            hello;
+        }
+
         #error_page  404              /404.html;
 
         # redirect server error pages to the static page /50x.html
$ objs/nginx -p . -c conf/nginx.conf
$ curl http://127.0.0.1:8000/hello
hello module

おわり。