创建与nginx通信的c ++应用程序的最佳方法

时间:2012-01-31 17:14:49

标签: c++ http node.js nginx fastcgi

我需要编写一个C ++接口,它可以读取我们的数据结构,并使用http协议提供基于查询的o / p。

服务器需求
它应该能够同时为100个客户提供服务。

为何选择C ++
所有代码都是用C ++编写的。所以我们需要在C ++中编写一个http层。这就是我选择C ++而不是更传统的网络编程语言的原因。

我正在考虑使用nginx来提供静态文件,并使用其代理传递来与C ++通信。

我找到了两种方法:

  • 编写FastCGI c ++模块。

  • 编写node.js c ++模块。

  • 如果您有

  • ,请另外提出任何其他建议

请根据以往的经验列出每种方法的优缺点?

6 个答案:

答案 0 :(得分:18)

这里没有人似乎已经解决了实际问题,尽管已经提供了一些很好的解决方案。我已经能够为nginx构建C ++模块,只需进行一些小改动。

  1. 将模块源文件名更改为以.cpp结尾,以便gcc意识到它正在处理C ++。
  2. 确保所有nginx包含(例如ngx_config.h,ngx_core.h等)都包含extern“C”{}结构。同样地,确保通过包装器声明通过nginx函数指针调用的任何函数。
  3. 在设置nginx时将--with-ld-opt =“ - lstdc ++”添加到“configure”调用中。
  4. 通过这三个步骤,您的模块应该编译,构建,链接并实际工作。

答案 1 :(得分:12)

我想我会继续使用Nginx模块devlopment http://www.evanmiller.org/nginx-modules-guide.html

为什么?

  1. 它不需要任何其他库依赖,如fastcgi和 其他
  2. 我可以在我的模块中使用nginx的所有功能。

答案 2 :(得分:10)

您要问的基本上是如何将包含数据结构的c ++流程转换为Web服务器。这可能不是最佳方式。 (然后,也许它就是你的情况。这取决于你想要暴露的c ++进程接口的复杂性。)

无论如何,我会尝试在c ++进程和可以执行http工作的客户端之间使用一个小的http前端,并使用一些简单的消息传递协议(如ZeroMQ/zmq与c ++后端进程通信。

c / c ++中的

zmq非常简单,非常高效且速度非常快。使用zmq,您可以非常快速地在python中设置一个简单的Web服务器前端,或者您喜欢的具有zmq bindings的任何语言,并使该前端与使用zmq的后端c ++进程异步或同步地进行通信。

如果您正在研究使用zmq,c++ examplesthe guide是不错的起点。

对于Node.js,还有a few examples

答案 3 :(得分:5)

尝试使用G-WAN,它允许您直接使用c ++应用程序。

答案 4 :(得分:0)

您可以尝试nginx c function

使用简单,并在应用层wiki for nginx c function

上内置了nginx缓存

Example project with cpp

示例代码:

#include <stdio.h>
#include <ngx_http_c_func_module.h>

/*** build the program as .so library and copy to the preferred place for nginx to link this library ***/
/*** gcc -shared -o libcfuntest.so -fPIC cfuntest.c ***/
/*** cp libcfuntest.so /etc/nginx/ ***/

int is_service_on = 0;

void ngx_http_c_func_init(ngx_http_c_func_ctx_t* ctx) {
    ngx_http_c_func_log(info, ctx, "%s", "Starting The Application");


    is_service_on=1;
}



void my_app_simple_get_greeting(ngx_http_c_func_ctx_t *ctx) {
    ngx_http_c_func_log_info(ctx, "Calling back and log from my_app_simple_get");

    ngx_http_c_func_write_resp(
        ctx,
        200,
        "200 OK",
        "text/plain",
        "greeting from ngx_http_c_func testing"
    );
}

void my_app_simple_get_args(ngx_http_c_func_ctx_t *ctx) {
    ngx_http_c_func_log_info(ctx, "Calling back and log from my_app_simple_get_args");

    ngx_http_c_func_write_resp(
        ctx,
        200,
        "200 OK",
        "text/plain",
        ctx->req_args
    );
}

void my_app_simple_get_token_args(ngx_http_c_func_ctx_t *ctx) {
    ngx_http_c_func_log_info(ctx, "Calling back and log from my_app_simple_get_token_args");

    char * tokenArgs = ngx_http_c_func_get_query_param(ctx, "token");
    if (! tokenArgs) {
        ngx_http_c_func_write_resp(
            ctx,
            401,
            "401 unauthorized",
            "text/plain",
            "Token Not Found"
        );
    } else {
        ngx_http_c_func_write_resp(
            ctx,
            401,
            "401 unauthorized",
            "text/plain",
            tokenArgs
        );
    }
}

void my_app_simple_post(ngx_http_c_func_ctx_t *ctx) {
    ngx_http_c_func_log_info(ctx, "Calling back and log from my_app_simple_post");

    ngx_http_c_func_write_resp(
        ctx,
        202,
        "202 Accepted and Processing",
        "text/plain",
        ctx->req_body
    );
}



void my_app_simple_get_no_resp(ngx_http_c_func_ctx_t *ctx) {
    ngx_http_c_func_log_info(ctx, "Calling back and log from my_app_simple_get_no_resp");


}

void ngx_http_c_func_exit(ngx_http_c_func_ctx_t* ctx) {
    ngx_http_c_func_log(info, ctx, "%s\n", "Shutting down The Application");

    is_service_on = 0;
}

答案 5 :(得分:0)

只需将HTTP前端添加到您的C ++代码中,就可以使用诸如Beast之类的库,然后从nginx将proxy_pass传递到您的C ++服务器。根据您的用途,您可能根本不需要Nginx。