Một ngày đi dạo, một người phụ nữ đi qua một công trường xây dựng và thấy ba người đàn ông đang làm việc. Cô ấy hỏi người đàn ông đầu tiên, “Anh đang làm gì vậy?”, một câu trả lời khó chịu, người đàn ông đầu tiên lớn tiếng “Bà không thấy tôi đang lát sàn à?”. Không hài lòng với câu trả lời. Cô ấy hỏi người đàn ôn thứ hai những gì anh ta đang làm. Người đàn ông thứ hai trả lời “Tôi đang xây dựng một tường gạch". Sau đó, quay ra chú ý đến người đàn ông đầu tiên, anh ta nói, “Này, bạn vừa đi qua hết bức tường, bạn cần tháo viên gạch cuối cùng đó". Một lần nữa không hài lòng với câu trả lời, cô ta hỏi người đàn ông thứ ba, anh ta đang là gì. Người đàn ông nói với cô ta trong khi nhìn lên bầu trời, “Tôi đang xây dựng một cái nhà thờ lớn nhất thế giới, lớn hơn cái mà ta từng biết". Trong khi anh ta đứng đó và nhìn lên bầu trời thì hai người đàn ông khác bắt đầu bàn luận về gạch bị sai. Người đàn ông quay ra người đàn ông đầu tiên và nói, “Này anh, đừng lo lắng về gạch. Nó là một bức tường bên trong. Nó sẽ được trát lên, và không ai có thể thấy được viên gạch đó. Chỉ cần chuyển sang một tầng khác.

 

Đạo đức trong câu truyện trên là khi bạn biết toàn thể hệ thống và làm thế nào để những phần khác nhau ăn khớp được với nhau (gạch, tường, nhà thờ), bạn có thể nhận định và sửa lỗi thật nhanh (gạch sai).

 

Làm gì để có thể tạo một máy chủ web từ đầu?

 

Tôi tin rằng để trở thành một lập trình viên tốt hơn bạn phải hiểu rõ hơn về cách hệ thống phần mềm cơ bản mà bạn sử dụng hàng ngày và nó gồm ngôn ngữ lập trình, trình biên dịch và trình thông dịch, cơ sở dữ liệu và hệ điều hành, máy chủ web và thư viện phát triển web. Và, để làm tốt hơn và hiểu sâu hơn những hệ thống bạn cần xây dựn lại chúng từ đầu, gạch ra gạch, tường ra tường.

Khóa học lập trình Web tại Techmaster học qua dự án, thực tập trực tiếp tại trung tâm.

Khổng tử nó theo cách này:

“Tôi nghe và tôi quên"

 

 

“Tôi thấy và tôi nhớ"

 

 

“Tôi làm và tôi hiểu"

 

 

Tôi mong đây là điểm thuyết phục bạn rằng nó là một ý tưởng tốt để bắt đầu xây dựng lại một phần mềm khác để học cách nó vận hành.

 

Trong bài thứ ba tôi sẽ cho bạn xem làm thế nào để xây dựng một máy chủ web của bạn. Bắt đầu thôi.

 

Thứ đầu tiên, máy chủ web là gì?

 

 

Nói tóm lại nó là một mạng các máy chủ dựa trên các máy chủ vật lý (oops, máy chủ trên máy chủ), và đợi một máy khác gửu yêu cầu. Khi nó nhận được yêu cầu, nó tạo một phản hồi và gửi lại phí máy khách. Giao tiếp giữa một máy khách và một server xảy ra sử dụng giao thức HTTP. Một máy khách dùng trình duyệt hoặc bất kỳ phần mềm nào có thể nói chuyện qua giao thức HTTP.

 

Thực hiện một ví dụ rất đơn giản của web server trông nó như thế nào? Tôi làm nó ở đây. Ví dụ này sử dụng Python nhưng cũng tương tự nếu bạn không biết Python (Nó là một ngôn ngữ rất đơn giản để xây dựng, hay thử xem!) bạn vẫn có thể hiểu được các khái niệm từ code vào giải thích bên dưới:
 

import socket

HOST, PORT = '', 8888
 
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print 'Serving HTTP on port %s ...' % PORT
while True:
   client_connection, client_address = listen_socket.accept()
   request = client_connection.recv(1024)
   print request
   http_response = """\

HTTP/1.1 200 OK
Hello, World!
"""
client_connection.sendall(http_response)

client_connection.close()

Lưu nó với tên webserver1.py hoặc tải ở https://github.com/rspivak/lsbaws/blob/master/part1/webserver1.py

và chạy nó ở command line như sau:

$ python webserver1.py
Serving HTTP on port 8888 …
 

Cứ làm đi, thật nghiêm túc. Nó sẽ đợi bạn trong khi bạn kiểm tra nó.

Hoàn thành, thật tuyệt. Giờ bàn luận xem làm thế nào nó là một chương trình thực sự.

Bắt đầu với địa chỉ web bạn nhập vào. Nó gọi là một URL và đây là cấu trúc cơ bản:

 

 

Bạn sẽ nó với trình duyệt địa chỉ của máy chủ web, nó cần tìm và kết nối tới trang trên máy chủ để lấy dữ liệu cho bạn. Trước khi bạn duyệt cần gửi một yêu cầu HTTP, nó cần thành lập một kết nối TCP với máy chủ web. Sau đó nó gửi một yêu cầu HTTP qua giao thức TCP tới máy chủ và đợi máy chủ gửi một phản hồi trở lại. Và khi đó trình duyệt của bạn nhận phản hồi và hiển thị nó. Trong phần này nó là “Hello, World!"

 

Khám phá thêm nào, làm sao máy khách và máy chủ thành lập một kết nối TCP trước khi gửi một yêu cầu HTTP và phản hồi. Để làm điều đó, chúng cần sử dụng cái gọi là sockets. Thay vì sử dụng một trình duyện trực tiếp, bạn sẽ mô phỏng trình bằng tay bằng cách sử dụng telnet trên command line.

 

Tương tự trên máy tính bạn sẽ chạy máy chủ web qua một phiên telnet trên command line chỉ rõ một host kết nối tới localhost và cổng kết nối tới 8888 và sau đó Enter.

$ telnet localhost 8888
Trying 127.0.0.1 …
Connected to localhost.
 

Trong bài này bạn sẽ thành lập một kết nối TCP với web và sẵn sàng gửi và nhận một thông điệp HTTP. Trong hình bên dưới bạn có thể thấy một tiêu chuẩn để một máy chủ đi qua để chấp nhận các kết nối TCP mới.

Trong phần này một phiên telnet GET /hello HTTP/1.1 và nhấn Enter:

$ telnet localhost 8888
Trying 127.0.0.1 …
Connected to localhost.
GET /hello HTTP/1.1
HTTP/1.1 200 OK
Hello, World!
 

Bạn vừa tự mô phỏng trình duyệt của mình. Bạn gửi một thông điệp HTTP và nhận một thông điệp phản hồi HTTP. Đây là cấu trúc cơ bản của thông điệp HTTP:

 

Thông điệp HTTP gồm hàng cho biết phương thức HTTP (GET, bởi vì chúng ta hỏi máy chủ để trả về một cái gì đó), đường dẫn /hello chỉ ra một trang trên máy chủ chúng ta muốn và phiên bản giao thức.

 

Để đơn giản, máy chủ web của chúng ta hoàn toàn bỏ qua các yêu cầu trên. Bạn có thể nhập bất cứ thứ gì thay vì “GET /hello HTTP/1.1” và bạn vẫn nhận được phải hồi “Hello, World!”.

 

Khi bạn đã gõ yêu cầu và nhấn Enter, máy khách gửi yêu cầu tới máy chủ, máy chủ đọc yêu cầu đó, hiển thị nó lên và trả về một phản hồi HTTP.

 

Đây là phản hồi HTTP mà máy chủ gửi lại cho máy khách (telnet trong trường hợp này):

 

Cùng phân tích nó nào. Phản hồi gồm một dòng trạng thái HTTP/1.1 200 OK, tiếp theo là một dòng trống rỗng, và thân của thông điệp HTTP.

 

Trạng thái phản hồi trên dòng HTTP/1.1 200 OK gồn phiên bản của HTTP, mã trạng thái của HTTP và mã trạng thái OK. Khi trình duyệt nhận được gói tin trả về, nó hiển thị phần thân của gói tin trả về và đó là tại sao bạn thấy “Hello, World!” trên trình duyệt.

 

Đó là mô hình cơ bản mà máy chủ web làm việc. Tổng kết lại: máy chủ web tạo một socket lắng nghe và chấp nhận kết nối mới trong một vòng lặp. Máy khách khởi tạo một kết nối TCP và sau khi thiết lập nó thành công, máy khách gửi một yêu cầu HTTP tới máy chủ và máy chủ phải hồi nó với HTTP phản hồi, máy khách sẽ nhận nó và hiển thị cho người dùng. Để thành lập một kết nối TCP gồm cả máy khách và máy chủ cần cần sử dụng sockets.

 

Trạng thái phản hồi trên dòng HTTP/1.1 200 OK gồn phiên bản của HTTP, mã trạng thái của HTTP và mã trạng thái OK. Khi trình duyệt nhận được gói tin trả về, nó hiển thị phần thân của gói tin trả về và đó là tại sao bạn thấy “Hello, World!” trên trình duyệt.

 

Đó là mô hình cơ bản mà máy chủ web làm việc. Tổng kết lại: máy chủ web tạo một socket lắng nghe và chấp nhận kết nối mới trong một vòng lặp. Máy khách khởi tạo một kết nối TCP và sau khi thiết lập nó thành công, máy khách gửi một yêu cầu HTTP tới máy chủ và máy chủ phải hồi nó với HTTP phản hồi, máy khách sẽ nhận nó và hiển thị cho người dùng. Để thành lập một kết nối TCP gồm cả máy khách và máy chủ cần cần sử dụng sockets.

 

Đây là cách cơ bản mà máy chủ web làm việc, nó có thể kiểm tra trình duyệt của bạn hoặc một vài máy khách khác. Như bạn đã thấy và hy vọng bạn đã thử, bạn cũng có thể là một người khách HTTP tương tự, bằng cách sử dụng telnet và nhập HTTP yêu cầu bằng tay.

 

Đây là một câu hỏi cho bạn: “Làm sao để chạy một ứng dụng Django, ứng dụng Flask và ứng dụng Pyramid trên máy chủ web của bạn mà không thực hiện thay đổi để đáp ứng tất cả các nền tảng web khác nhau?

 

BTW, tôi đang viết một cuốn sách “Let’s Build A Web Server: First Steps” giải thích làm sao để viết một máy chủ web cơ bản từ đầu và đi vào chi tiết các chủ đề tôi muốn nói.

 
 
Danh sách bài viết:
Let’s Build A Web Server. Part 1: https://techmaster.vn/posts/34671/build-a-web-server-part-1
Let’s Build A Web Server. Part 2: https://techmaster.vn/posts/34672/build-a-web-server-part-2
Let’s Build A Web Server. Part 3: https://techmaster.vn/posts/34691/build-a-web-server-part-3

 

Nguồn: https://ruslanspivak.com/lsbaws-part1/