2012-01-31 5 views
29

Ho bisogno di scrivere un'interfaccia C++ in grado di leggere la nostra struttura dati e fornire l'o/p basato sulla query utilizzando il protocollo http.Metodo migliore per creare un'app C++ per comunicare con nginx

Server bisogno
dovrebbe essere in grado di servire 100 clienti allo stesso tempo.

Perché C++
Tutto il codice è già scritto in C++. Quindi dobbiamo solo scrivere un layer http in C++. Ecco perché scelgo C++ invece di un linguaggio di programmazione web più convenzionale.

Sto pensando di utilizzare nginx per servire file statici e utilizzare il suo proxy pass per comunicare con C++.

Ci sono due approcci che ho trovato:

  • scrivere un modulo FastCGI C++.

  • Scrivere un modulo C++ node.js.

  • Si prega di un qualsiasi altro suggerimento se avete

Potete per favore elencare i pro ei contro di ciascun metodo basato sulla precedente esperienza?

+0

È possibile modificare la formulazione della domanda. Qual è il "migliore" che probabilmente coinvolgerà molte opinioni. –

+0

Dici "100 clienti allo stesso tempo". Hai veramente bisogno che le 100 connessioni si sovrappongano o stai cercando un certo througput specifico (ad esempio 100 "transazioni" al secondo)? Se si hanno connessioni lunghe (contrariamente ai cicli HTTP generalmente brevi), ciò potrebbe influenzare molto la risposta. –

+0

ok, sto pensando al titolo della domanda. Lo cambierà se trovato puoi suggerirne uno? –

risposta

9

penso di andare avanti con il modulo di Nginx devlopment http://www.evanmiller.org/nginx-modules-guide.html

Perché?

  1. Non richiede altre dipendenze di libreria come fastcgi e altro.
  2. Posso usare tutte le funzionalità di nginx nel mio modulo.
+0

Come hai capito con questo? – Homer6

+0

@ Homer6 L'unica ragione per cui ho scelto il modulo nginx per lo sviluppo era, non ho bisogno di alcuna terza lib. –

+3

Sembra buono. Mi stavo solo chiedendo se avessi avuto successo con quello. Se è così, potrei seguire il tuo percorso e scrivere il modulo anch'io. Qual è stata la tua impressione generale del modulo API? – Homer6

9

Quello che stai chiedendo è fondamentalmente come trasformare il processo C++ che contiene i tuoi dati in un webserver. Questo potrebbe non essere il modo migliore per farlo. (Di nuovo, forse è nella tua situazione. Dipende dalla complessità delle interfacce del processo C++ che stai cercando di esporre.)

Ad ogni modo, proverei ad attaccare un piccolo frontend http tra il processo C++ e i client che potrebbero fare il lavoro http e comunicare con il processo backend C++ usando un semplice protocollo di messaggistica come ZeroMQ/zmq.

zmq in c/C++ è abbastanza semplice, ed è molto efficiente e molto veloce. Usando zmq potresti configurare molto velocemente un semplice frontend webserver in python, o qualsiasi altra lingua tu preferisca che abbia zmq bindings, e che quel frontend comunichi in maniera asincrona o sincrona con il processo C++ di backend usando zmq.

I c++ examples e the guide sono buoni punti di partenza se stai cercando di utilizzare zmq.

Per Node.js ci sono anche a few examples.

+1

scusa, dimentico di tel, sto cercando una licenza non pagata. –

+2

ZeroMQ è gratuito. –

4

provare G-WAN

è possibile utilizzare il C++ applicazione direttamente, e G-WAN è veloce come l'inferno, più veloce di nginx.

+0

Non rispondere alle vecchie domande se la risposta non aggiunge nulla alle risposte già accettate. – alestanis

+2

IMO, Sempre utile per vedere più alternative. –

+1

G-WAN non è più veloce di Nginx. – Alice

17

Nessuno qui sembra aver affrontato la domanda vera e propria, sebbene siano state offerte alcune buone soluzioni. Sono stato in grado di compilare moduli C++ per nginx con un paio di modifiche minori.

  1. Modificare il nome del file di origine del modulo per terminare con .cpp in modo che gcc si accorga che ha a che fare con C++.
  2. Assicurati che tutto il tuo nginx includa (ad es. Ngx_config.h, ngx_core.h, ecc.) Siano avvolti con una struttura esterna "C" {}. Allo stesso modo assicurati che tutte le funzioni chiamate tramite i puntatori di funzione nginx siano dichiarate con un wrapper.
  3. Aggiungi --with-ld-opt = "- lstdC++" alla chiamata "configure" quando si imposta nginx.

Con questi tre passaggi il modulo deve essere compilato, creato, collegato e attualmente funzionante.

+2

Christopher, hai uno scheletro semplice per quello? Solo curiosità – gubble

+1

Grazie. Questa dovrebbe essere la risposta accettata (imo). –

Problemi correlati