Лучший способ создать приложение c++ для связи с nginx

Мне нужно написать интерфейс C++, который может читать нашу структуру данных и предоставлять o/p на основе запроса с использованием протокола http.

Сервер
Он должен быть способен обслуживать 100 клиентов одновременно.

Почему C++
Весь код уже написан на C++. Поэтому нам нужно просто написать http-слой на C++. Вот почему я выбираю C++ вместо более обычного языка веб-программирования.

Я думал используйте nginx для обслуживания статических файлов и используйте его прокси-пасс для связи с C++.

есть два подхода которые я нашел:

  • напишите модуль FastCGI c++.

  • писать узла.модуль на JS и C++.

  • пожалуйста, просто любое другое предложение, если у вас есть

можете ли вы перечислить плюсы и минусы для каждого метода на основе предыдущего опыта?

5 ответов


никто здесь, похоже, не обратился к фактическому вопросу, хотя были предложены некоторые хорошие работы. Я смог создать модули C++ для nginx с несколькими незначительными изменениями.

  1. измените имя исходного файла модуля на конец .cpp поэтому gcc понимает, что имеет дело с C++.
  2. убедитесь, что все ваши nginx включает (например, ngx_config.h, ngx_core.h, etc.) обернуты внешней структурой" C" {}. Аналогично убедитесь, что любые функции вызываются через указатели функций nginx объявляются с помощью оболочки.
  3. Add --with-ld-opt=" - lstdc++" для вызова "configure" при настройке nginx.

с этими тремя шагами ваш модуль должен компилировать, строить, связывать и фактически работать.


то, что вы спрашиваете, в основном, как превратить процесс c++, который содержит ваши данные strutures в веб-сервер. Возможно, это не лучший способ. (Опять же, возможно это в вашей ситуации. Это зависит от сложности интерфейсов процесса c++, которые вы пытаетесь разоблачить, я думаю.)

в любом случае, я бы попытался вставить небольшой http-интерфейс между процессом c++ и клиентами, которые могли бы выполнять работу http и общаться с бэкэндом C++, используя некоторые простой протокол обмена сообщениями, как ZeroMQ/zmq.

zmq в c / C++ довольно прямо вперед, и его очень эффективный и очень быстрый. Используя zmq, вы можете очень быстро настроить простой интерфейс веб-сервера на python или на любом языке, который вы предпочитаете привязки zmq, и пусть этот интерфейс общается asyncronously или syncronously с процессом backend c++ с помощью zmq.

на Примеры c++ и в руководство хорошие отправные точки, если вы изучаете использование zmq.

Для Узла.js есть также несколько примеров.


Я думаю, что пойду вперед с модулем devlopment nginxhttp://www.evanmiller.org/nginx-modules-guide.html

Почему ?

  1. он не требует никакой другой зависимости библиотеки, такой как fastcgi и другой.
  2. Я могу использовать все функции nginx внутри моего модуля.

попробуйте G-WAN, он позволяет использовать приложение c++ напрямую.


вы можете попробовать функция nginx c

Он прост в использовании и встроен в кэш-память nginx на уровне приложений, wiki для функции nginx c

пример проекта с 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;
}