La meilleure méthode pour créer une application c++ pour communiquer avec nginx

j'ai besoin d'écrire une interface C++ qui peut lire notre structure de données et fournir l'o/p basé sur la requête en utilisant le protocole http.

Serveur De Besoin

Il devrait pouvoir servir 100 clients en même temps.

Pourquoi C++

Tout le code est déjà écrit en C++. Nous devons donc simplement écrire une couche http en C++. C'est pourquoi je choisis C++ au lieu d'un langage de programmation web plus conventionnel.

je suis penser à utiliser nginx pour servir des fichiers statiques et utiliser son proxy pass pour communiquer avec C++.

il y a deux approches que j'ai trouvées:

  • Ecrire un module C++ FastCGI.

  • Écrire un noeud.module js c++.

  • s'il vous Plaît toute autre suggestion si vous avez

pouvez-vous s'il vous plaît énumérer les avantages et les inconvénients pour chaque méthode basée sur l'expérience antérieure?

32
demandé sur tr9sh 2012-01-31 21:14:48

5 réponses

personne ici ne semble avoir abordé la question actuelle, bien que de belles solutions de rechange aient été proposées. J'ai pu construire des modules C++ pour nginx avec quelques modifications mineures.

  1. modifier le nom du fichier source du module pour terminer avec .cpp donc gcc se rend compte qu'il traite avec C++.
  2. assurez-vous que tous vos NGINX incluent (par exemple ngx_config.h, ngx_core.h, etc.) sont enveloppés d'une structure externe en "C". De même, assurez-vous que toutes les fonctions sont appelées par nginx les pointeurs de fonction sont déclarés avec un wrapper.
  3. ajouter -- with-ld-opt=" - lstdc++" à votre invocation "configure" lors de la configuration de nginx.

avec ces trois étapes, votre module devrait compiler, construire, lier et réellement fonctionner.

18
répondu Christopher Smith 2014-04-21 01:23:35

ce que vous demandez, c'est essentiellement comment transformer le processus c++ qui détient vos structures de données en un serveur web. Qui pourrait ne pas être la meilleure façon d'aller à ce sujet. (Encore une fois, peut-être que c'est dans votre situation. Cela dépend de la complexité des interfaces du processus c++ que vous essayez d'exposer je suppose.)

de toute façon, j'essaierais de coller une petite interface http entre le processus c++ et les clients qui pourraient faire le travail http et communiquer avec le processus de backend c++ en utilisant un protocole de messagerie simple comme ZeroMQ / zmq.

zmq en c/c++ est assez simple, et son très efficace et très rapide. En utilisant zmq vous pouvez très rapidement configurer un simple serveur web en python, ou n'importe quel langage que vous préférez qui a zmq liaisons, et que cette interface communique de façon asynchrone ou synchrone avec le processus c++ d'arrière-plan en utilisant zmq.

c++ exemples et la guide sont de bons points de départ si vous cherchez à utiliser zmq.

Pour Le Noeud.js il existe aussi quelques exemples.

10
répondu Kim Bowles Sørhus 2012-02-11 11:01:27

je pense que je vais aller de l'avant avec Nginx module de développement http://www.evanmiller.org/nginx-modules-guide.html

Pourquoi ?

  1. il ne nécessite pas d'autres dépendances de bibliothèque comme fastcgi et autre.
  2. je peux utiliser toutes les fonctionnalités de nginx dans mon module.
10
répondu Vivek Goel 2012-02-16 04:29:11

essayez G-WAN, il vous permet d'utiliser votre application c++ directement.

5
répondu Peter 2018-05-08 18:36:28

Vous pouvez essayer nginx fonction c

il est simple à utiliser et intégré dans la mémoire cache de nginx sur la couche apps,wiki pour nginx fonction c

Exemple de projet avec le rpc

exemple de code:

#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;
}
0
répondu Oktaheta 2018-09-21 10:41:21