2009-05-16 14 views
8

Dopo aver fatto qualche ricerca qui, non ho trovato nessuna domanda sullo sviluppo di un server web.Suggerimenti per lo sviluppo di un server Web

Principalmente lo farò per due motivi. Come progetto collaterale e per saperne di più sullo sviluppo di un programma server. Questo non si trasformerà in un'applicazione utilizzabile, più di uno strumento di apprendimento

Quindi le domande sono semplici.

  • Hai sviluppato un server web? (Indipendentemente dalla lingua)
  • Quali sono i trucchi e gli altri buoni consigli si possono fornire

Link a siti utili sono i benvenuti, ma non dei collegamenti a un progetto di lavoro che è open source, dal momento che questo è sul processo di apprendimento.

risposta

16

Un server web inizia ad essere un estremamente semplice pezzo di codice:

  • aprire un socket TCP/IP sulla porta 80
  • pur non essendo terminato
    • attesa per connessioni su quel socket
    • quando qualcuno ti invia intestazioni HTTP
      • trovare il percorso per il file e
      • copiare il file alla presa

modo che la struttura del codice è facile.

Ora, avete qualche complessità da gestire:

  • nella versione più semplice del codice, mentre si sta parlando con un browser, tutti gli altri non possono connettersi. Devi trovare un modo per gestire più connessioni.
  • spesso è conveniente essere in grado di inviare qualcosa di più di un semplice file statico (anche se i primi server HTTP hanno fatto esattamente questo) quindi è necessario essere in grado di eseguire altri programmi.

Gestire la possibilità di connessioni multiple è anche relativamente facile, con un numero di possibili scelte.

  • versione più semplice (di nuovo, questo è il modo in cui è stato fatto originariamente) è avere il codice che ascolta porta 80 impostare un socket specifico per tale connessione, quindi forcella una copia di se stesso per gestire quella connessione. Quel processo viene eseguito finché il socket non viene chiuso e quindi termina. Tuttavia, è relativamente costoso: una forcella impiega in genere decine di millisecondi, quindi limita la velocità di esecuzione.
  • La seconda scelta consiste nel creare un processo leggero - a/k/a a thread - per elaborare la richiesta.

L'esecuzione di un programma è in realtà abbastanza semplice. In generale, si definisce un percorso speciale per una directory CGI; un URL che ha un percorso attraverso quella directory quindi interpreta il nome del percorso come il percorso di un programma. Il server creerebbe quindi un sottoprocesso usando fork/exec, con STDOUT connesso al socket. Il programma viene quindi eseguito, inviando l'output a STDOUT e inviato al browser client.

Questo è lo schema di base; tutto ciò che fa un server web è solo aggiungere fronzoli e funzionalità aggiuntive a questo schema di base.

Qui ci sono alcune altre fonti per esempio di codice:


E prett y fa molto niente di quello che si voleva davvero, ma per semplice è difficile da battere this one da http://www.commandlinefu.com:

$ python -m SimpleHTTPServer

+0

In realtà ho già una versione ancora più semplice in python, stupita di quanto fosse facile. Sta solo inviando un'intestazione e un contenuto statici. –

+0

Molto bella aggiunta alla risposta. –

0

Stavo pensando di iniziare lo stesso progetto come un modo per imparare meglio Python. C'è un BaseHTTPServer class che è un buon punto di partenza.

Ecco alcuni articoli esercitazione di stile: 1 & 2

+0

Sì, questo è un buon punto di partenza, ma quello che vorrei fare è fare tutto da zero ... la creazione di prese e gli ascoltatori. Grazie comunque. –

1

Il collegamento in rete ed altri sono giusti piuttosto standard, quindi non preoccupatevi tanto di questo. (ci sono diversi server di rete "istantanei" di esempio nella maggior parte dei linguaggi.)

Invece, concentrarsi sull'attuazione effettiva delle specifiche HTTP. Rimarrai stupito da a) cosa non sai e b) quante cose dovrebbero essere conformi a HTTP, in realtà non lo sono, ma fingi bene.

Allora ti meraviglierai che il web funzioni a tutti.

Quando hai finito con HTTP, divertiti a provare a implementare IMAP.

1

Ho scritto un webserver leggero in Python alcuni anni fa, anche come progetto di apprendimento.

Il consiglio più semplice che posso dare, specialmente come un progetto di apprendimento, è costruire un nucleo che funziona, quindi un design iterativo in più. Non mirare alla luna direttamente dal salto, iniziare molto piccolo, quindi aggiungere i featuers, perfezionare e continuare. Consiglierei l'uso di uno strumento che incoraggia la sperimentazione, come Python, in cui è possibile digitare e testare il codice alla volta.

8

In primo luogo, si prega di non lasciare che questo diventi un progetto utilizzabile - ottenere la sicurezza giusta per i server Web è davvero difficile.

Ok, qui ci sono cose da tenere a mente:

  1. Il filo che accetta connessioni ha bisogno a portata di mano fuori ad thread in background nel più breve tempo possibile .
  2. Non è possibile avere una discussione per ogni singola connessione - con grandi volumi si esaurirà il limite di thread .
  3. Utilizzare una sorta di pool di thread di lavoro per gestire le richieste .
  4. Assicurarsi di eseguire lo scrub l'URL quando si ottiene una richiesta HTTP GET . Quindi non potevo fare qualcosa come http://localhost/../../Users/blah/ per ottenere un accesso di livello superiore.
  5. Assicurarsi di impostare sempre i tipi di contenuto e mime pertinenti.

Buona fortuna - questo è un lavoro infernale.

+0

Dopo aver lavorato sul web come sviluppatore di siti, conosco bene la sicurezza della questione :) Bella risposta però. –

+0

Conoscere i rischi di esporre il codice eseguibile su Internet ti mette davanti alla maggior parte degli sviluppatori. :) – rein

1

Il corso ho TAED avuto un incarico procura così ho posso fare un po 'di luce qui, penso.

Quindi, finirai per modificare molte intestazioni solo per semplificarti la vita. Vale a dire, HTTP/1.0 è molto più facile da gestire rispetto a HTTP/1.1. Non vuoi avere a che fare con la gestione di timeout e keep-alive e cose del genere. Una connessione per transazione è più semplice.

Stai per fare parecchie analisi. Parsing è difficile in C. Io vi consiglio di scrivere una funzione che è qualcosa di simile

int readline(char *buff, int maxLen) { 
    while((c = readNextCharFromSocket(&s)) && c != '\n' && i < maxLen) 
     buff[i++] = c; 
    return i; 
} 

e gestire una linea alla volta, solo perché è più facile da utilizzare le funzioni di stringa C esistenti su una linea a un tempo. Inoltre, ricorda che le linee sono \ r \ n separate e le intestazioni sono terminate con un \ r \ n \ r \ n.

Il problema principale sarà l'analisi, purché sia ​​possibile leggere i file, tutto il resto funzionerà come previsto.

Per il debug, è probabile che si desideri stampare le intestazioni che vengono passate al test di integrità durante le interruzioni.

1

local-web-server è un esempio di un semplice server di sviluppo web scritto in node.js .. E 'più affidabile e ha più caratteristiche che python -m SimpleHTTPServer

0

ho già sviluppato un server web che gira (HTML e PHP) utilizzando C lingua non è così complicato dovresti sapere come usare socket TCP/IP, Thread per gestire più richieste, processi fork (devi creare un figlio per php esecuzione riga di comando (ho usato execvp))

Penso che la parte più strugling stia gestendo le stringhe in c langage e invii richieste POST/GET nella riga di comando.

Buona fortuna

+0

Non vedo cosa questo aggiunge al post. :) – gsamaras

+0

ti dirò cosa aggiunge: passaggi per creare un server –

Problemi correlati