2009-05-16 40 views
8

Sau khi thực hiện một số tìm kiếm tại đây, tôi thấy không có câu hỏi nào về việc phát triển máy chủ web.Mẹo để phát triển máy chủ web

Tôi chủ yếu sẽ làm điều này vì hai lý do. Là một dự án phụ và để tìm hiểu thêm về việc phát triển một chương trình máy chủ. Điều này sẽ không biến thành một ứng dụng có thể sử dụng, nhiều công cụ học tập hơn

Vì vậy, các câu hỏi rất đơn giản.

  • Bạn đã phát triển một máy chủ web chưa? (Không có vấn đề gì ngôn ngữ)
  • gì là gotchas và lời khuyên tốt khác mà bạn có thể cung cấp

Liên kết đến các trang web hữu ích được hoan nghênh, nhưng không liên kết với một dự án làm việc đó là mã nguồn mở, vì đây là về quá trình học tập.

Trả lời

16

Một máy chủ web bắt đầu ra như là một mảnh cực kỳ đơn giản mã:

  • mở/socket TCP IP trên cổng 80
  • trong khi không chấm dứt
    • chờ đợi cho các kết nối trên socket
    • khi ai đó gửi cho bạn tiêu đề HTTP
      • tìm đường dẫn đến tệp e
      • sao chép các tập tin vào ổ cắm

Vì vậy, các phác thảo của mã thật đơn giản.

Bây giờ, bạn có một số phức tạp để xử lý:

  • trong phiên bản đơn giản của các mã, trong khi bạn đang nói chuyện với một trình duyệt, tất cả những người khác không thể kết nối. Bạn cần phải tìm ra cách xử lý nhiều kết nối.
  • thường thuận tiện để có thể gửi một thứ gì đó không chỉ là tệp tĩnh (mặc dù các máy chủ HTTP đầu tiên đã thực hiện chính xác điều đó) nên bạn cần có khả năng chạy các chương trình khác.

Xử lý khả năng kết nối nhiều cũng tương đối dễ dàng, với một số lựa chọn có thể có.

  • phiên bản đơn giản (một lần nữa, đây là cách nó đã được thực hiện ban đầu) là có mã mà lắng nghe cổng 80 thiết lập một ổ cắm cụ thể cho kết nối đó, sau đó phân nhánh một bản sao của chính nó để xử lý một mà kết nối. Quá trình đó chạy cho đến khi socket được đóng lại, và sau đó kết thúc. Tuy nhiên, đó là tương đối đắt tiền: một ngã ba mất hàng chục mili giây nói chung, do đó giới hạn tốc độ bạn có thể chạy.
  • Lựa chọn thứ hai là tạo quy trình nhẹ - a/k/a a chủ đề - để xử lý yêu cầu.

Chạy chương trình cũng thực sự khá dễ dàng. Nói chung, bạn định nghĩa một đường dẫn đặc biệt tới một thư mục CGI; URL có đường dẫn qua thư mục đó sau đó diễn giải tên đường dẫn là đường dẫn đến chương trình. Sau đó, máy chủ sẽ tạo một tiến trình con bằng fork/exec, với STDOUT được kết nối với socket. Chương trình sau đó chạy, gửi đầu ra tới STDOUT, và nó được gửi đến trình duyệt của khách hàng.

Đây là mẫu cơ bản; mọi thứ khác mà máy chủ web làm chỉ là thêm kiểu cách và chức năng bổ sung cho mẫu cơ bản này.

Dưới đây là một số nguồn tin khác cho mã ví dụ:


Nó prett y nhiêu gì về những gì bạn thực sự muốn, nhưng đối với đơn giản thật khó để đánh bại this one từ http://www.commandlinefu.com:

$ python -m SimpleHTTPServer

+0

Tôi thực sự có một phiên bản thậm chí đơn giản hơn trong python đã, ngạc nhiên như thế nào nó được dễ dàng. Nó chỉ gửi một tiêu đề và nội dung tĩnh. –

+0

Bổ sung rất tốt cho câu trả lời. –

0

Tôi đã nghĩ đến việc bắt đầu cùng một dự án như một cách để học Python tốt hơn. Có một BaseHTTPServer class đó là một điểm khởi đầu khá tốt.

Dưới đây là một số điều hướng dẫn kiểu: 1 & 2

+0

Vâng, đó là điểm khởi đầu tốt, nhưng những gì tôi muốn làm là làm mọi thứ từ đầu ... tạo ổ cắm và người nghe. Cảm ơn mặc dù. –

1

Các mạng et al công bằng khá chuẩn, do đó, không lo lắng quá nhiều về điều đó. (có một số "máy chủ mạng" tức thời, mẫu trong hầu hết mọi ngôn ngữ.)

Thay vào đó, hãy tập trung vào thực sự triển khai đặc tả HTTP. Bạn sẽ ngạc nhiên trước một) những gì bạn không biết và b) bao nhiêu thứ được cho là tuân thủ HTTP, thực sự không, nhưng giả mạo nó tốt.

Sau đó, bạn sẽ ngạc nhiên khi web hoạt động.

Khi bạn hoàn tất HTTP, hãy thử triển khai IMAP.

1

Tôi đã viết một máy chủ web nhẹ bằng Python vài năm trước, cũng như một dự án học tập.

Lời khuyên đơn giản nhất mà tôi có thể đưa ra, đặc biệt là một dự án học tập, là xây dựng một lõi hoạt động, sau đó thiết kế lặp lại trên đó. Đừng nhắm vào mặt trăng ngay từ bước nhảy, bắt đầu rất nhỏ, sau đó thêm các thành tích, tinh chỉnh và tiếp tục. Tôi khuyên bạn nên sử dụng một công cụ khuyến khích việc thử nghiệm, như Python, nơi bạn có thể nhập và kiểm tra mã theo đúng nghĩa đen.

8

Thứ nhất, xin đừng để điều này trở thành một dự án có thể sử dụng - nhận quyền bảo mật cho máy chủ web thực sự khó khăn.

Ok, đây là điều cần lưu tâm:

  1. Sợi chỉ chấp nhận kết nối cần phải ra tay để đề nền càng sớm càng càng tốt.
  2. Bạn không thể có một chủ đề cho mỗi kết nối - với số khối lượng lớn bạn sẽ hết hạn giới hạn .
  3. Sử dụng một số loại hồ sơ chủ đề công nhân để xử lý các yêu cầu của bạn.
  4. Đảm bảo rằng bạn chà URL khi bạn nhận được yêu cầu HTTP GET . Vì vậy, tôi không thể làm điều gì đó như http://localhost/../../Users/blah/ để có quyền truy cập cấp cao hơn.
  5. Đảm bảo bạn luôn đặt các loại nội dung và mime có liên quan .

Chúc may mắn - đây là một công việc địa ngục.

+0

Sau khi làm việc trên web với tư cách là nhà phát triển trang web, tôi biết rõ về vấn đề bảo mật của vấn đề :) Mặc dù vậy, câu trả lời hay. –

+0

Hiểu biết về những rủi ro của việc hiển thị mã thực thi lên internet giúp bạn phát triển vượt trội so với hầu hết các nhà phát triển. :) – rein

1

Khóa học Tôi TAed đã có một nhiệm vụ ủy quyền vì vậy tôi có thể loại ánh sáng ở đây, tôi nghĩ vậy.

Vì vậy, bạn sẽ kết thúc thực hiện rất nhiều tiêu đề thay đổi chỉ để làm cho cuộc sống của bạn dễ dàng hơn. Cụ thể, HTTP/1.0 dễ dàng xử lý hơn HTTP/1.1. Bạn không muốn phải đối phó với việc quản lý thời gian chờ và giữ liên lạc và những thứ như thế. Một kết nối cho mỗi giao dịch là dễ nhất.

Bạn sẽ thực hiện nhiều thao tác phân tích cú pháp. Phân tích cú pháp là khó khăn trong C. Tôi muốn khuyên bạn nên viết một chức năng mà là một cái gì đó giống như

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

và xử lý nó một dòng tại một thời điểm, chỉ vì nó là dễ nhất để sử dụng các chức năng chuỗi C hiện trên cùng một dòng tại một thời gian. Ngoài ra, hãy nhớ các dòng được phân tách và tiêu đề được kết thúc bằng \ r \ n \ r \ n.

Điều khó khăn chính sẽ phân tích cú pháp, miễn là bạn có thể đọc tệp mọi thứ khác sẽ hoạt động như mong đợi.

Để gỡ lỗi, có thể bạn sẽ muốn in các tiêu đề được chuyển qua để kiểm tra độ chính xác khi các nội dung bị hỏng.

1

local-web-server là một ví dụ về một máy chủ web phát triển đơn giản viết bằng Node.js .. Đó là đáng tin cậy hơn và có nhiều tính năng hơn python -m SimpleHTTPServer

0

tôi đã phát triển một máy chủ web chạy (Html ​​và PHP) sử dụng Ngôn ngữ C nó không phức tạp, bạn nên biết cách sử dụng TCP/IP Sockets, Thread để xử lý nhiều yêu cầu, xử lý fork (bạn cần tạo một child cho php command line executing (i dùng execvp))

tôi nghĩ rằng phần strugling nhất là xử lý các chuỗi trong langage c và gửi POST/GET yêu cầu trong dòng lệnh.

Chúc may mắn

+0

Tôi không thấy điều này thêm vào bài đăng. :) – gsamaras

+0

tôi sẽ cho bạn biết điều gì thêm: các bước để tạo máy chủ –

Các vấn đề liên quan