2009-05-16 15 views
8

Po przeprowadzeniu wyszukiwania tutaj, nie znalazłem żadnych pytań na temat tworzenia serwera WWW.Porady dotyczące tworzenia serwera WWW

Zamierzam głównie robić to z dwóch powodów. Jako projekt poboczny i dowiedz się więcej o tworzeniu programu serwera. To nie zamieni się w użyteczną aplikację, więcej narzędzia edukacyjnego

Pytania są więc proste.

  • Czy opracowałeś serwer WWW? (Bez względu na język)
  • Jakie są pułapek i innych dobrych rad można dostarczać

Linki do przydatnych stron są mile widziane, ale nie odwołuje się do projektu roboczego, który jest open source, ponieważ jest to o procesie uczenia się.

Odpowiedz

16

Serwer WWW rozpoczyna się jako niezwykle prosty kawałek kodu:

  • otworzyć gniazda TCP/IP na porcie 80
  • natomiast nie rozwiązana
    • czekać na połączenia na tym gnieździe
    • gdy ktoś wysyła nagłówki HTTP
      • znaleźć ścieżkę do fil e
      • skopiować plik do gniazda

Więc zarys kodu jest łatwe.

Teraz masz jakieś zawiłości obsługiwać:

  • w najprostszej wersji kodu, podczas gdy mówisz do jednej przeglądarce, wszyscy inni nie mogą się połączyć. Musisz wymyślić jakiś sposób obsługi wielu połączeń.
  • często wygodnie jest wysłać coś więcej niż tylko plik statyczny (chociaż pierwsze serwery HTTP dokładnie to zrobiły), więc musisz mieć możliwość uruchamiania innych programów.

Obsługa możliwości wielu połączeń jest również stosunkowo łatwa, z wieloma możliwymi opcjami.

  • najprostsza wersja (ponownie, to jest sposób, w jaki została wykonana pierwotnie) ma mieć kod, który nasłuchuje na porcie 80 utworzenie specjalnego gniazdo tego połączenia, a następnie widelec kopię sama obsłużyć, że jeden połączenie. Ten proces jest uruchamiany do momentu zamknięcia gniazda, a następnie zakończenia. Jest to jednak stosunkowo kosztowne: widelec zajmuje ogólnie kilkadziesiąt milisekund, więc ogranicza szybkość działania.
  • Drugi wybór to stworzenie lekkiego procesu - a/k/a wątek - w celu przetworzenia żądania.

Uruchomienie programu jest w rzeczywistości dość łatwe. Ogólnie definiujesz specjalną ścieżkę do katalogu CGI; adres URL, który ma ścieżkę do tego katalogu, interpretuje nazwę ścieżki jako ścieżkę do programu. Następnie serwer utworzyłby podproces za pomocą fork/exec, z STDOUT podłączonym do gniazda. Następnie program uruchamia się, wysyłając dane wyjściowe do STDOUT i jest wysyłany do przeglądarki klienta.

To jest podstawowy wzór; wszystko inne, co robi serwer sieciowy, to dodanie dodatków i dodatkowych funkcji do tego podstawowego wzorca.

Oto kilka innych źródeł na przykład kodu:


To prett y znacznie nic nie robi tego, co naprawdę chciał, ale dla prosty trudno pokonać this one z http://www.commandlinefu.com:

$ python -m SimpleHTTPServer

+0

Naprawdę mam jeszcze prostszą wersję w Pythonie, zdziwiona, jak łatwo było. To tylko wysyłanie statycznego nagłówka i treści. –

+0

Bardzo miły dodatek do odpowiedzi. –

0

Zastanawiam się nad uruchomieniem tego samego projektu jako sposobu na lepsze poznanie Pythona. Jest BaseHTTPServer class, który jest całkiem dobrym punktem wyjścia.

Oto niektóre artykuły poradnik stylu: 1 & 2

+0

Tak, to jest to dobry punkt wyjścia, ale to, co chciałbym zrobić, to zrobić wszystko od podstaw ... tworzenie gniazd i słuchaczy. W każdym razie dzięki. –

1

Tworzenie sieci i wsp są dość standardowe fair, więc nie martw się tak wiele o tym. (jest kilka "natychmiastowych", przykładowych serwerów sieciowych w większości języków.)

Zamiast tego skup się na faktycznym wdrażaniu specyfikacji HTTP. Zdziwisz się a) czego nie wiesz i b) ile rzeczy, które mają być zgodne z HTTP, naprawdę nie są, ale są fałszywe.

Wtedy będziesz się dziwić, że sieć działa w ogóle.

Po zakończeniu pracy z protokołem HTTP warto spróbować zaimplementować protokół IMAP.

1

Kilka lat temu napisałem prosty webserver w Pythonie, również jako projekt edukacyjny.

Najprostszą radą, jaką mogę dać, szczególnie w ramach projektu edukacyjnego, jest zbudowanie rdzenia, które działa, a następnie iteracyjny projekt. Nie celuj w Księżyc tuż po skoku, zacznij bardzo mały, a następnie dodawaj symbole, udoskonalaj i kontynuuj. Polecam używanie narzędzia zachęcającego do eksperymentowania, takiego jak Python, w którym można dosłownie pisać i testować kod w tym samym czasie.

8

Po pierwsze, nie pozwól, aby stał się on użytecznym projektem - uzyskanie odpowiedniego bezpieczeństwa dla serwerów WWW jest naprawdę trudne.

Ok, tu są rzeczy, o których należy pamiętać:

  1. wątku, który akceptuje połączeń musi oddać się do tle wątków jak najszybciej możliwe.
  2. Nie można mieć nici dla każdego połączenia - z dużymi woluminami skończy się limit wątków .
  3. Użyj pewnego rodzaju puli wątków roboczych pracowników, aby obsłużyć swoje żądania .
  4. Upewnij się, że szorujesz adres URL po otrzymaniu żądania HTTP GET . Nie mogłem więc zrobić czegoś, aby uzyskać dostęp na poziomie wyższego poziomu, takim jak http://localhost/../../Users/blah/ .
  5. Upewnij się, że zawsze ustawiono odpowiednie typy zawartości i MIME: .

Powodzenia - to piekielna praca.

+0

Po pracy w sieci jako programista strony wiem dobrze o bezpieczeństwie sprawy :) Dobra odpowiedź. –

+0

Wiedza o ryzyku związanym z ujawnieniem kodu wykonywalnego w Internecie znacznie wyprzedza większość programistów. :) – rein

1

Kurs I TAED miał zadanie proxy więc wydaje mi się, że mogę tu trochę rozjaśnić.

Będziesz musiał zmienić nagłówek, aby ułatwić sobie życie. Mianowicie, HTTP/1.0 jest łatwiejszy w obsłudze niż HTTP/1.1. Nie chcesz mieć do czynienia z zarządzaniem timeoutami i utrzymaniem żywych i tym podobnych. Jedno połączenie na transakcję jest najłatwiejsze.

Będziesz robił dużo i dużo parsowania. Parsowanie jest trudne w C. Radzę wam napisać funkcję, że jest coś takiego jak

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

i obsługiwać go jedną linię na raz, tylko dlatego, że najłatwiej wykorzystać istniejące funkcje ciągów C w jednej linii na czas. Pamiętaj też, że linie są rozdzielane \ r \ n, a nagłówki są kończone znakiem \ r \ n \ r \ n.

Główna trudna sprawa zostanie przeanalizowana, tak długo, jak możesz czytać pliki, wszystko inne będzie działać zgodnie z oczekiwaniami.

Do debugowania, prawdopodobnie będziesz chciał wydrukować nagłówki, które zostaną przekazane do testowania poprawności, gdy coś się zepsuje.

1

local-web-server jest przykładem prostego serwera WWW rozwój pisemnej w node.js .. To jest bardziej niezawodny i ma więcej funkcji niż python -m SimpleHTTPServer

0

mam już opracowane serwer WWW, który działa (HTML i PHP) przy użyciu Język C to nie jest takie skomplikowane, że powinieneś wiedzieć, jak korzystać z gniazd TCP/IP, wątków, aby obsłużyć wiele żądań, procesów fork (musisz stworzyć dziecko do wykonania polecenia php (użyłem execvp))

Myślę, że najbardziej kłopotliwą częścią jest obsługa ciągów w c-langage i wysyłanie żądań POST/GET w linii poleceń.

Powodzenia

+0

Nie widzę, co to dodaje do wpisu. :) – gsamaras

+0

Powiem ci, co dodaje: kroki, aby zbudować serwer –

Powiązane problemy