Лучший способ создать приложение c++ для связи с nginx
Мне нужно написать интерфейс C++, который может читать нашу структуру данных и предоставлять o/p на основе запроса с использованием протокола http.
Сервер
Он должен быть способен обслуживать 100 клиентов одновременно.
Почему C++
Весь код уже написан на C++. Поэтому нам нужно просто написать http-слой на C++. Вот почему я выбираю C++ вместо более обычного языка веб-программирования.
Я думал используйте nginx для обслуживания статических файлов и используйте его прокси-пасс для связи с C++.
есть два подхода которые я нашел:
напишите модуль FastCGI c++.
писать узла.модуль на JS и C++.
пожалуйста, просто любое другое предложение, если у вас есть
можете ли вы перечислить плюсы и минусы для каждого метода на основе предыдущего опыта?
5 ответов
никто здесь, похоже, не обратился к фактическому вопросу, хотя были предложены некоторые хорошие работы. Я смог создать модули C++ для nginx с несколькими незначительными изменениями.
- измените имя исходного файла модуля на конец .cpp поэтому gcc понимает, что имеет дело с C++.
- убедитесь, что все ваши nginx включает (например, ngx_config.h, ngx_core.h, etc.) обернуты внешней структурой" C" {}. Аналогично убедитесь, что любые функции вызываются через указатели функций nginx объявляются с помощью оболочки.
- 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
Почему ?
- он не требует никакой другой зависимости библиотеки, такой как fastcgi и другой.
- Я могу использовать все функции nginx внутри моего модуля.
вы можете попробовать функция nginx c
Он прост в использовании и встроен в кэш-память nginx на уровне приложений, wiki для функции nginx c
пример кода:
#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;
}