zero2hero #4: Giới thiệu về LAMP, LEMP, Reverse Proxy - Mô hình hệ thống Web

19/03/2020

Mô hình đơn giản của một hệ thống web bao gồm:

Trong đó:

  • Client (còn gọi là web client): là công cụ chúng ta dùng để truy cập web như Web Browser (Chrome, IE, Firefox, Safari …), hoặc truy cập thông qua các script như curl, python, perl, java …
  • Web Server: Service tiếp nhận các request do Client gửi lên và điều phối xử lý.
  • Source code: mã nguồn của website, bao gồm các file code (PHP, Java, ASP.NET …) và các file static content (hình ảnh, js, css, font …)
  • Database Server: cơ sở dữ liệu.

Một request duyệt web thông thường sẽ được xử lý theo trình tự sau:

  1. Client truy cập vào link của website (hay gọi là Client gửi request đến server)
  2. Web server tiếp nhận request, nhận thấy request liên quan đến code nên gọi code xử lý.
  3. Trong quá trình xử lý của mình, code sẽ kết nối đến Database server để tương tác với dữ liệu.
  4. Kết quả của quá trình xử lý code là 1 cục HTML được trả ngược lại cho Web Server.
  5. Web server tiếp nhận cục HTML và điều chỉnh nếu cần, sau đó trả kết quả về cho Client.
  6. Client nhận được HTML sẽ xử lý và request các resources cần thiết tiếp theo sau đó hiển thị kết quả cho người dùng.

1. LAMP

Là viết tắt của: 

  • L: Linux – Hệ điều hành
  • A: Apache – Service đóng vai trò Web Server, thường được gọi bằng cái tên khác là httpd.
  • M: MySQL/MariaDB – Service đóng vai trò Database Server.
  • P: PHP – ngôn ngữ lập trình

Là stack thường dùng để triển khai một web server, được dùng từ rất lâu và phổ biến nhất trên thế giới. Apache là Web Server hoạt động trên cơ chế Process Oriented, nghĩa là mỗi Request của Client sẽ do một Process/Thread handle, điều này khiến cho các website có lượng truy cập lớn khi sử dụng Apache sẽ tốn nhiều tài nguyên RAM/CPU (do process được sinh ra nhiều). Tuy nhiên, Apache hỗ trợ Rewrite bằng .htaccess, điều này giúp phần lớn mà nguồn tương thích.

2. LEMP

Là viết tắt của:

  • L: Linux – Hệ điều hành
  • E: Nginx (đọc là Engine X): Service đóng vai trò Web server.
  • M: MySQL/MariaDB – Service đóng vai trò Database Server.
  • P: PHP – ngôn ngữ lập trình.

Ra đời sau LAMP, tuy nhiên LEMP đang là lựa chọn ưu tiên hiện nay do Nginx sử dụng cơ chế Event-Driven, xử lý các request dự trên event nên tiêu tốn ít tài nguyên, thích hợp với các website có lượng truy cập lớn. Do Apache được thay thế bằng Nginx nên LEMP không hỗ trợ file .htaccess, nếu muốn sử dụng, người dùng phải convert rule trong .htaccess sang các rewrite tương ứng của Nginx. Ngoài ra, khi sử dụng LEMP thì PHP sẽ được xử lý bởi PHP-FPM.

3. Reverse Proxy

Là sự kết hợp của LAMP và LEMP, trong đó Nginx sẽ đóng vai trò là Web Server chính tiếp nhận request của Client. Nginx sẽ phục vụ các static content, các request cần liên quan đến việc xử lý code PHP, Nginx sẽ đẩy request về cho Apache xử lý. Mô hình này phù hợp cho nhu cầu cân bằng giữa hiệu năng và tính phù hợp với mã nguồn. Mô hình Reverse Proxy sẽ tận dụng được cơ chế Event-Driven của Nginx để phục vụ lượng truy cập lớn, tiết kiệm tài nguyên nhưng đồng thời vẫn tương thích với mã nguồn sử dụng .htaccess.

4. Tổng kết

Trong phạm vi seri zero2hero mình sẽ hướng dẫn các bạn triển khai cả 3 mô hình LAMP, LEMP và Reverse Proxy. Về phần Database Server, hiện có 2 giải pháp được nhắc đến là MySQL và MariaDB, về căn bản có thể xem như là 1, lý do như sau:

  • Với phiên bản CentOS 6 trở về trước, MySQL là Database mặc định khi ta cài từ yum.
  • Sau khi Oracle mua lại Sun Microsystems (công ty sở hữu MySQL), nhóm tác giả của MySQL đã tách ra và tạo 1 bản fork từ MySQL với tên gọi là MariaDB.
  • MariaDB có hệ thống tương thích hoàn toàn với MySQL từ phiên bản 5.1 -> 5.5, nếu như bạn đang dùng MySQL 5.1 -> 5.5 thì việc import DB đó vào MariaDB sẽ không có gì khác biệt.
  • Các tham số cấu hình, câu lệnh, cách tổ chức, cách query, API tích hợp với các ngôn ngữ … của MariaDB hoàn toàn giống với MySQL phiên bản từ 5.1 -> 5.5.

Vậy nên, riêng trong seri zero2hero, khi nói đến MySQL hoặc MariaDB chúng ta có thể tạm xem chúng là 1 cho đơn giản vì mình sẽ lựa chọn phiên bản phù hợp!

p/s: Hãy tham gia vào Group Chat Telegram của nhóm để thảo luận vào học hỏi từ các thành viên khác: https://t.me/quantrilinux