Giới thiệu

Web Server

Web Server là gì

Web server là máy chủ cài đặt các chương trình phục vụ các ứng dụng web.Nó lưu trữ các tệp tài nguyên của trang web như HTML, CSS, JavaScript, hình ảnh và video,... Webserver có khả năng tiếp nhận request từ các trình duyệt web và gửi phản hồi đến client thông qua giao thức HTTP hoặc các giao thức khác. Có nhiều web server khác nhau như: Apache, Nginx, IIS, … Web server thông dụng nhất hiện nay:

Các Web Server thông dụng
Độ phổ biến của các Web Server vào năm 2017

Web server hoạt động như thế nào

Cách web server hoạt động
Cách WebServer hoạt động

Khi một người dùng nhập địa chỉ URL vào trình duyệt, trình duyệt sẽ gửi một yêu cầu HTTP tới web server. Web server nhận yêu cầu, tìm kiếm tài nguyên được yêu cầu và gửi lại phản hồi chứa tài nguyên đó tới trình duyệt. Trình duyệt sau đó sẽ hiển thị trang web cho người dùng.

Bất cứ khi nào bạn xem một trang web trên internet, có nghĩa là bạn đang yêu cầu trang đó từ một web server. Khi bạn nhập URL trên trình duyệt của mình (ví dụ: https://github.com/Hehe-Boiz) nó sẽ tiến hành các bước sau để gửi lại phản hồi cho bạn.

  1. Trình duyệt phân giải tên miền thành địa chỉ IP

    Trình duyệt của bạn sẽ cần phải xác định địa chỉ IP nào mà tên miền github.com/Hehe-Boiz trỏ vào. Để làm việc đó trình duyệt sẽ thục hiện các bước:

    1. Trình duyệt kiểm tra bộ nhớ cache nội bộ: Trước tiên, trình duyệt kiểm tra xem liệu địa chỉ IP của tên miền đã được lưu trong bộ nhớ cache của nó hay chưa.
    2. Kiểm tra bộ nhớ cache hệ điều hành: Nếu nó không tìm thấy, nó sẽ hỏi hệ điều hành. Hệ điều hành có thể đã lưu trữ địa chỉ IP này trong bộ nhớ cache của mình.
    3. Yêu cầu đến máy chủ DNS: Nếu cả 2 đều không, yêu cầu sẽ được gửi tới máy chủ DNS. Máy chủ DNS sẽ tìm kiếm và trả về địa chỉ IP tương ứng với tên miền.
    4. Quá trình phân giải DNS: Nếu máy chủ DNS không có thông tin, nó sẽ liên hệ với các máy chủ DNS khác (những máy chủ DNS cấp cao hơn) để lấy địa chỉ IP.
  2. Web Server gửi lại client trang được yêu cầu

    Lúc này trình duyệt web đã biết địa chỉ IP của trang web, nó sẽ gửi một yêu cầu HTTP tới web server thông qua địa chỉ IP này.Web server xử lý và trả lại trang được yêu cầu theo các bước:

    1. Nhận yêu cầu: Yêu cầu này bao gồm phương thức (như GET hoặc POST), URL,...và các thông tin khác.
    2. Tìm kiếm tài nguyên: Server tìm tài nguyên yêu cầu (ví dụ: file HTML, JavaScript, hình ảnh,...) trong hệ thống tệp của mình.
    3. Xử lý yêu cầu: nếu cần, có thể thực hiện thêm các bước xử lý dữ liệu (chạy mã, truy vấn database,...).
    4. Gửi phản hồi: Sau khi tìm thấy hoặc tạo ra tài nguyên, web server gửi lại phản hồi HTTP tới trình duyệt. Phản hồi này bao gồm mã trạng thái (như 200 OK), nội dung trang web,...

    Nếu trang không tồn tại hoặc có lỗi khác xảy ra, nó sẽ gửi lại thông báo lỗi thích hợp.

  3. Trình duyệt hiển thị trang web

    Khi nhận được phản hồi từ web server, trình duyệt bắt đầu quá trình hiển thị trang web cho người dùng. Theo các bước.

    1. Phân tích HTML: Trình duyệt phân tích tài liệu HTML để xây dựng cây DOM.
    2. Yêu cầu tài nguyên bổ sung: khi trình duyệt phát hiện các tài nguyên bổ sung (như CSS, JavaScript,..) và gửi các yêu cầu HTTP để tải chúng.
    3. Xây dựng CSSOM: Trình duyệt phân tích các tệp CSS để xây dựng cây CSSOM.
    4. Thực thi JavaScript: quá trình có thể thay đổi cây DOM và CSSOM.
    5. Kết hợp và hiển thị: Trình duyệt kết hợp cây DOM và CSSOM để xây dựng cây render, và hiển vị trang theo yêu cầu.

Quá trình này diễn ra rất nhanh, thường chỉ mất vài giây hoặc thậm chí mili giây.

Apache

Lịch sử và đặc điểm của Apache

Lịch sử hình thành

Apache HTTP Server, thường được gọi là Apache phát triển bởi Apache Software Foundation và ra mắt lần đầu tiên vào năm 1995.Nó nhanh chóng trở thành web server phổ biến nhất trên Internet nhờ tính ổn định, linh hoạt và hỗ trợ cộng đồng mã nguồn mở mạnh mẽ.

Đặc điểm

Ưu điểm và nhược điểm của Apache

Ưu điểm

Nhược điểm

Bên cạnh những ưu điểm có thể nói gần như là hoàn hảo như thế thì vẫn tồn tại vài nhược điểm:

Cách Apache hoạt động

Apache hoạt động theo kiến trúc đa tiến trình (multi-process), hướng kết nối (connection-oriented). Kiến trúc này có thể hiểu là mỗi yêu cầu sẽ được xử lý bởi một tiến trình riêng biệt hoặc một thread riêng biệt, tùy thuộc vào cấu hình Multi-Processing Module (MPM) được sử dụng như: prefork MPM, worker MPM, Event MPM. Mỗi tiến trình hoặc thread này được gọi là một Worker, có khả năng xử lý một kết nối tại một thời điểm.

Chi tiết các bước

  1. Khởi động và Cấu hình
    • Khi Apache khởi động nó tạo ra một tiến cha được gọi là tiến trình chính (parent process) dựa trên các cấu hình trong tệp `httpd.conf`.
    • Tiến trình chính có nhiệm vụ đọc cấu hình và quản lý các tiến trình con (child processes).
  2. Tạo Tiến trình Con và Luồng
    • Tiến trình cha sẽ tọa ra một số tiến trình con. Số lượng này được xác định bởi các thông số cấu hình như `StartServers`, `MinSpareThreads`, `MaxSpareThreads`, và `MaxRequestWorkers`.
    • Tùy vào cấu hình MPM mà tiến trình có tạo ra luồng hay không. Mỗi tiến trình con tạo ra nhiều luồng (threads). Số lượng luồng trong mỗi tiến trình con được cấu hình bởi tham số `ThreadsPerChild`.
  3. Lắng nghe Yêu cầu
    • Tiến trình chính mở các cổng để lắng nghe các kết nối HTTP/HTTPS, thường là cổng 80 cho HTTP và cổng 443 cho HTTPS.
    • Tiến trình con và các luồng trong đó cũng sẽ lắng nghe các kết nối đến từ client
  4. Xử lý Yêu cầu
    • Khi một yêu cầu đến, một luồng trong một tiến trình con hoặc 1 tiến trình con sẽ nhận yêu cầu đó.
    • Luồng (tiến trình con) này sẽ phân tích yêu cầu HTTP để xác định tài nguyên được yêu cầu, như tệp tĩnh (HTML, CSS, JS) hoặc tệp động (PHP, Perl).
    • Nếu là tệp tĩnh, luồng sẽ đọc tệp từ source code và gửi lại nội dung cho client
    • Nếu là tệp động, Apache sử dụng các module như mod_php để xử lý và tạo ra nội dung động, sau đó gửi kết quả về cho client.
  5. Gửi Phản hồi
    • Sau khi xử lý yêu cầu, luồng sẽ tạo phản hồi HTTP bao gồm mã trạng thái, tiêu đề, và nội dung.
  6. Ghi Log
    • Apache ghi lại thông tin về mỗi yêu cầu và phản hồi vào tệp log (access log và error log)
    • Thông tin được ghi vào tệp log bao gồm địa chỉ IP của client, thời gian, phương thức yêu cầu, URL, mã trạng thái, và kích thước của phản hồi.
  7. Quản lý Kết nối
    • Sau khi gửi phản hồi, luồng có thể đóng kết nối hoặc giữ nó ở trạng thái mở (Keep-Alive) để xử lý các yêu cầu tiếp theo từ cùng một client.
    • Nếu kết nối được giữ ở trạng thái mở, luồng sẽ tiếp tục chờ và xử lý các yêu cầu tiếp theo trên cùng kết nối đó.
  8. Dọn Dẹp và Chuẩn Bị Cho Yêu Cầu Tiếp Theo
    • Sau khi hoàn thành xử lý xong một yêu cầu, luồng sẽ dọn dẹp tài nguyên và chuẩn bị để xử lý các yêu cầu tiếp theo.

Bài viết và web tham khảo :