编译实现了C++的Nginx模块,并在本地的Mac上运行Nginx

简而言之

使用C++编写并构建了一个Nginx模块,然后在本地的Mac上注册了一个EP(入口点),向其发送请求并显示”Hello World”。

前提 – 唯一选择

用homebrew在mac上安装好Nginx。

(仅供参考)

 

执行环境

苹果电脑(本地)

步骤

准备处理描述的文件

为执行环境准备实现了config文件和cpp文件的配置文件。

关于实施的备忘录

 

只要想试试的人可以从下面的链接中克隆 git 仓库,关于具体实施细节不用担心。

# cloneする
$ git clone https://github.com/takarin0711/nginx-hello.git

准备Nginx软件包并进行构建。

为构建模块,准备Nginx软件包。

获取并解压与正在运行的Nginx版本相同的Nginx源代码。

# macに導入したNginxのバージョンを確認する
$ nginx -v
nginx version: nginx/1.25.1

# 同じバージョンのNginxパッケージを用意する
$ curl http://nginx.org/download/nginx-1.25.1.tar.gz -O

# 解凍
$ tar zxvf nginx-1.25.1.tar.gz

配置 (peizhi)

$ cd nginx-1.25.1

$ ./configure --add-dynamic-module=<configやcppファイルが置いてあるディレクトリへのパス> --with-http_realip_module --with-http_ssl_module --with-compat

# 例
$ ./configure --add-dynamic-module=/Users/hogeuser/nginx-hello --with-http_realip_module --with-http_ssl_module --with-compat

補足 –
補充 – 补充

    • 「–with-http_realip_module –with-http_ssl_module –with-compat」オプションをつけないとシグネチャが合わなくエラーになってしまう

 

    • シグネチャの値については、https://heartbeats.jp/hbblog/2017/02/nginx-dynamic-modules-201702.html を参照

 

    Nginxのバージョンとかによって、シグネチャの値が異なる場合があるので、適宜オプションを追加する

如果在这里遇到openssl的错误,可以参考以下对应措施,也许会有帮助。

 

模块构建

$ cd nginx-1.25.1

# モジュールをビルドする
$ make modules

# ビルドが成功したらsoファイルが作成されている
$ ls -la objs/ngx_http_hello_module.so

# シグネチャの値が一致していれば問題なし
# macにインストールしたNginx
$ strings /usr/local/bin/nginx | grep '^.,.,.,'
8,4,8,1011000111010111001101111111111111

# 今回ビルドしたNginx
$ strings objs/ngx_http_hello_module.so | grep '^.,.,.,'
8,4,8,1011000111010111001101111111111111

将制作的模块加载到Nginx并进行配置。

请在nginx.conf文件中添加代码,以加载对应的.so文件。

$ sudo vim /usr/local/etc/nginx/nginx.conf

worker_processes  4;

error_log /usr/local/var/log/nginx/error.log error;

worker_rlimit_nofile 32;

load_module <soファイルが置いてある場所へのパス>; # ←追加
# 例: load_module /Users/hogeuser/nginx-1.25.1/objs/ngx_http_hello_module.so;

events {
    worker_connections  10;
}

http {
    include mime.types;
    default_type application/octet-stream;
------------(省略)-------------

创建EP

$ sudo vim /usr/local/etc/nginx/nginx.conf

------------(省略)-------------
    server {
        listen 8080;

        server_name localhost;

        charset utf-8;

        access_log /usr/local/var/log/nginx/localhost.access.log  main;

        error_page 404 /404.html;

        location = / {
            root /usr/local/var/www;
            index index.html;
        }
        location /articles/ {
            root /usr/local/var/www;
        }
        location ~* \.(gif|jpg|jpeg|png)$ {
            root /usr/local/var/www/images;
        }
        location = /test {                        # ←追加
            proxy_pass http://qiita.com;          # ←追加
            hello 'Hello World';                  # ←追加
        }                                         # ←追加
    }
}

重新启动Nginx。

# 構文チェックしてエラーが出ないことを確認
$ sudo nginx -t
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

$ Nginx再起動
$ sudo nginx -s reload

确认动作

对于我制作的EP进行curl操作,并且获得的响应是”Hello World”。

$ curl localhost:8080/test
Hello World%

请参考

 

广告
将在 10 秒后关闭
bannerAds