Подтвердить что ты не робот

Лучший способ создания приложения С++ для общения с nginx

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

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

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

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

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

  • Записать модуль FastCGI С++.

  • Напишите модуль node.js С++.

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

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

4b9b3361

Ответ 1

Я думаю, что я продолжу разработку модуля Nginx http://www.evanmiller.org/nginx-modules-guide.html

Почему?

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

Ответ 2

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

  • Измените имя исходного файла модуля, чтобы закончить с .cpp, так что gcc понимает, что он имеет дело с С++.
  • Убедитесь, что все ваши nginx включают (например, ngx_config.h, ngx_core.h и т.д.), завернутые в структуру extern "C" {}. Аналогично убедитесь, что любые функции, вызываемые с помощью указателей на функции nginx, объявляются с помощью обертки.
  • Добавьте -with-ld-opt = "- lstdС++" к вашему вызову configure при настройке nginx.

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

Ответ 3

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

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

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

примеры С++ и руководство являются отличными отправными точками, если вы изучаете использование zmq.

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

Ответ 4

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

Ответ 5

Вы можете попробовать функцию 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;
}