2022.03.07
Giới thiệu về Apache và Nginx
Đối với các lập trình viên, hẳn đã không còn xa lạ gì với hai cái tên Nginx và Apache phải không. Nếu bạn là người mới làm quen hay mới bắt đầu làm việc với công việc lập trình web thì hãy theo chân mình trong bài viết này nhé.
Trong bài viết hôm nay mình sẽ giới thiệu sơ lược về Apache và Nginx, ưu điểm của từng loại, sự khác nhau về cơ chế hoạt động và cách cài đặt từng web server này nhé.
Giới thiệu về Apache (Apache HTTP Server)
Apache HTTP Server là một web server mã nguồn mở đa nền tảng được quản lý bởi Apache Software Foundation và được phát triển, maintained bởi cộng đồng mở lập trình viên dưới ASF. Nó còn được biết đến với tên gọi Httpd hay Apache. Thường được triển khai trên hệ điều hành linux, apache được sử dụng để triển khai đến 46% trang web trên toàn thế giới. Ngoài ra, nó còn là thành phần quan trọng của LAMP Stack bao gồm Linux, Apache, PHP, MySql.
Giới thiệu về Nginx
Nginx là một web server được phát hành vào năm 2004 bởi Igor Sysoev, ngày nay nó được phát triển còn hơn cả là một web server. Khởi điểm, nginx được sử dụng như là một phần bổ sung của apache. Nó thường được sử dụng để xử lý các file tĩnh (static file), ngày nay, nó đã được phát triển một cách hoàn thiện các tác vụ mà một web server cần thực hiện. Ngoài ra, nginx còn được sử dụng để làm reverse proxy, load balancer, mail proxy và HTTP caching.
Cả nginx và apache đã trở thành hai web server thông dụng nhất trên hệ điều hành linux hiện nay. Cùng với nhau, chúng đã được dùng để triển khai phục vụ hơn 50% trang web trên toàn thế giới.
So sánh Apache vs Nginx
Sự khác biệt lớn nhất giữa Nginx và Apache là ở cách thiết kế cấu trúc của chúng. Apache sử dụng process-driven, tạo ra một thread mới cho mỗi request. Nginx thì khác, nginx dùng cấu trúc event-driven để xử lý nhiều request với chỉ một thread*.
*Thread: một thread, hay còn gọi là “luồng”, là một đường dẫn thực thi trong một tiến trình. Một tiến trình có thể chứa nhiều thread.
Để biết được sự khác biệt giữa Nginx và Apache, chúng ta hãy cùng đi qua một số so sánh dưới đây.
Basic Architecture
Khi nói đến Nginx và Apache, sự khác biệt cơ bản giữa cả hai là về thiết kế kiến trúc của chúng. Nghĩa là chúng khác nhau về cách xử lý kết nối (connections), lưu lượng truy cập (traffic), cách chúng phản ứng (respond) với các điều kiện lưu lượng khác nhau (traffic conditions).
Apache tiếp cận theo phương hướng process-driven approach. Nginx thì lại theo hướng event-driven architecture.
Apache
- Tiếp cận theo hướng tiến trình (Process Driven Approach )
- Tạo mới một thread cho mỗi request.
Apache tiếp cận theo hướng multi-threaded. Nó cung cấp một bộ các modules xử lý rất đa dạng. Các modules này về cơ bản bao gồm 3 loại thuật toán xử lý request. Mỗi cái sẽ đáp ứng nhu cầu của các máy chủ (server) khác nhau.
MPMs (Multi-Processing Modules) cung cấp một kiến trúc linh hoạt để lựa chọn các kết nỗi khác nhau và các thuật toán xử lý khác nhau. MPMs gồm 3 loại chính là:
- Process (Pre-fork) MPM.
- Worker MPM.
- Event MPM.
Phiên bản cũ của Apache (2.2) sử dụng mpm_worker, mpm_prefork và mod_php. Lên đến phiên bản Apache (2.4) được cấu hình để sử dụng mpm_event, php-fpm.
Mặc định, Apache 2.2 được cấu hình với Pre-fork (mpm_prefork). Nó trả về 1 tập các processes, trong đó mỗi process phục vụ cho một request riêng biệt tại 1 thời điểm. Nói cách khác, Apache sẽ tạo ra một thread mới để xử lý mỗi request.
Vì vậy, với thiết kế kiến trúc này, Apache có thể dẫn đến việc tiêu thụ tài nguyên lớn, do đó có thể dẫn đến các vấn đề với máy chủ.
Nginx
- Sử dụng phương pháp hướng sự kiện (Event-Driven approach).
- Xử lý nhiều request với chỉ một thread.
Nginx sử dụng cấu trúc hướng sự kiện và xử lý các request không đồng bộ. Nó được thiết kế sử dụng thuật toán xử lý kết nối theo hướng sự kiện không chặn (non-blocking). Do đó, tiến trình của nó có thể xử lý hàng ngàn kết nối (request) trong 1 luồng xử lý (thread). Với cách xử lý kết nối như vậy cho phép Nginx làm việc rất nhanh và mạnh với lượng tài nguyên hạn chế.
Ta có thể thấy, ở tiêu chí Basic Architecture, Nginx có cấu trúc gọn nhẹ và nhanh hơn so với Apache.
Performance
Nói về Apache và Nginx, cả hai web servers trên xử lý nội dung tĩnh (static content) và nội dung động (dynamic content) khác nhau.
Nội dung tĩnh (static content)
Apache | Nginx |
|
|
Nội dung động (Dynamic Content)
Apache | Nginx |
|
|
Nginx có thể xử lý nội dung động nếu được sử dụng cùng với xử lý SCGI và FastCGI module.
Với một bài kiểm tra hiệu quả khi xử lý nội dung động (dynamic content) mỗi giây, ta được kết quả như sau:
Về Performance, nội dung tĩnh (static content), Nginx xử lý hiệu quả và nhanh hơn Apache. Nội dung động (dynamic content), cả hai có mức độ xử lý như nhau.
OS Support
Apache | Nginx |
|
|
Từ đây ta có thể thấy, Apache được hỗ trợ trên các nền tảng OS khác nhau rộng hơn Nginx.
Cấu hình phân tán (Distributed) / tập trung (Centralized)
Apache | Nginx |
|
|
Nếu ta xem xét về mặt cấu hình thư mục, Apache có khả năng linh động cao hơn. Còn nếu xét về tốc độ xử lý, Nginx lại có tốc độ xử lý nhanh hơn.
Cách diễn giải request (Request Interpretation)
Nginx và Apache có cách xử lý và diễn giải request theo hai cách hoàn toàn khác nhau. Sự khác nhau này khiến cho chúng trở nên độc nhất.
Apache
Passes File system location
Cung cấp khả năng giải thích request như là một tài nguyên vật lý trên hệ thống tệp tin (file system location). Nó chuyển request dưới dạng vị trí của tệp tin trên hệ thống. Và khi ta tạo hoặc cấu hình một host ảo (virtual host), Apache sử dụng các khối thư mục (directory blocks) dưới thư mục gôc (document root)
Các tùy chọn theo khối thư mục (directory blocks) này có thể được sử dụng trong các files .htaccess để ghi đè các cài đặt gốc của một khối thư mục cụ thể.
Nginx
Passes URI to interpret requests
Nginx được tạo ra để đáp ứng được cả hai nhu cầu là một web server và một reverse proxy server. Để đáp ứng được cả hai nhu cầu trên, thiết kế kiến trúc của Nginx chuyển các request dưới dạng URI thay vì vị trí hệ thống tệp (file system locations) như Apache.
Nginx không kiểm tra các file hệ thống cho đến khi nó sẵn sàng để xử lý request. Điều này giải thích vì sao nó không sử dụng file .htaccess như Apache.
Chính vì thiết kế để xử lý request dưới dạng URI cho phép Nginx dễ dàng hoạt động với vai trò là một web server, một proxy server hay load balancer và HTTP cache.
Các Modules tính năng (Feature Modules)
Cả Nginx và Apache đều cho phép các phần mở rộng thông qua hệ thống Modules. Nhưng cả hai lại có cách hoạt động của riêng mình.
Apache
Có 60 Modules chính thức có thể cài đặt tự động và có thể bật hoặc tắt.
Apache có nột bộ tính năng phong phú, có thể kích hoạt bằng cách cài đặt và khởi động một trong số 60 modules chính thức của nó. Ngoài có còn có rất nhiều tính năng (modules) không chính thức của nó được phát triển và có thể được tìm thấy trên internet.
Các modules của nó cho phép ta có thể cài đặt hoặc gỡ bỏ một cách dễ dàng để có thể đáp ứng được các nhu cầu của chúng ta. Các modules này cũng có thể bật hoặc tắt.
Tuy nhiên, dù Apache có rất nhiều modules để đáp ứng nhu cầu của chúng ta, nhưng nhiều trong số đó không được sử dụng thường xuyên.
Nginx
Sử dụng các core modules phát triển của bên thứ 3, ta không thể cài đặt nó tự động.
Nginx cho phép ta lựa chọn và biên dịch (compiled) thêm vào các plugin của bên thứ 3. Không thể cài đặt tự động. Nó được xem là an toàn hơn nhiều so với Apache vì các thành phần bất kỳ có thể được thêm vào Apache.
Cũng như, Nginx có thể cung cấp tất cả các chức năng chính (core features) của một web server mà không cần phải hy sinh đi các đặc điểm nổi bật của mình là gọn nhẹ và hiệu suất cao.
Ta có thể ví von một chút, Apache có thể được xem là Microsoft Word và Nginx là notepad. Tại sao lại nói thế, vì Apache có rất nhiều lựa chọn để phục vụ nhu cầu nhưng đôi khi chúng ta chỉ cần một phần trong số chúng. Còn Nginx, không có nhiều lựa chọn nhưng vừa đủ cho một số nhu cầu cơ bản của chúng ta, đổi lại ta có được hiệu suất về tốc độ cao hơn.
Tính linh động (Flexibility)
Apache | Nginx |
|
|
Bảo mật (Security)
Apache | Nginx |
|
|
Hỗ trợ (Support)
Hỗ trợ là điều mà gần như bất kỳ khách hàng nào cũng quan tâm. Nó có thể nâng cao hoặc phá vỡ trải nghiệm người dùng của khác hàng.
Apache | Nginx |
|
|
Tổng Kết
Cả Nginx và Apache đều có ưu điểm riêng của chính nó. Tùy theo nhu cầu sử dụng mà ta xem xét mình nên sử dụng web server nào trong dự án của mình.
Khi nào ta nên chọn Apache
- Khi ta muốn một số người dùng có thể tự cấu hình vùng làm việc của mình, một bộ phận nào đó trên một hệ thống tổng thể mà không ảnh hưởng đến cấu hình tổng thể. Để thực hiện điều này, ta sử dụng sự linh động của file .htaccess trên Apache.
- Trong trường hợp hạn chế chức năng. Nginx có một số modules cốt lõi (core modules) rất quang trọng. Tuy nhiên vẫn sẽ có một số chức năng không được hỗ trợ trên Nginx. Trong trường hợp đó ta cần phải nhờ vào sự hỗ trợ của một số modules mở rộng mà nginx không hỗ trợ, hãy chọn Apache.
Khi nào ta nên chọn Nginx
- Khi ta cần đến khả năng xử lý nội dung tĩnh thượng thừa của Nginx.
- Phù hợp cho các website có số lượng lớn truy cập (high traffic) nhờ khả năng xử lý nhiều request với chỉ một thread của Nginx.
Hoặc có thể sử dụng cả Nginx và Apache
Đúng vậy, Nginx và Apache có thể hoạt động chung với nhau một cách nhịp nhàng với nhau để phát huy được tốt nhất ưu điểm của từng loại.
Ta có thể để Nginx đứng trước để nhận request như là một máy chủ proxy và xử lý các nội dung tĩnh (static content), nội dung động (dynamic content sẽ được truyền về và xử lý với apache).
Ngoài ra còn có thêm một server đơn giản nhưng rất mạnh mẽ nữa là Caddy với chỉ 1 file config cho tất cả.
Tài liệu tham khảo