Лучший способ создания приложения С++ для общения с nginx
Мне нужно написать интерфейс С++, который может читать нашу структуру данных и предоставлять o/p на основе запроса с использованием протокола http.
Необходимость сервера
Он должен одновременно обслуживать 100 клиентов.
Почему С++
Весь код уже написан на С++. Поэтому нам нужно просто написать http-слой в С++. Вот почему я выбираю С++ вместо более обычного языка веб-программирования.
Я думаю использовать nginx для обслуживания статических файлов и использовать его прокси-проход для связи с С++.
Есть два подхода, которые я нашел:
-
Записать модуль FastCGI С++.
-
Напишите модуль node.js С++.
-
Пожалуйста, просто любое другое предложение, если у вас
Не могли бы вы перечислить плюсы и минусы для каждого метода на основе предыдущего опыта?
Ответы
Ответ 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;
}