2022.03.07

Giới thiệu về Apache và Nginx

nginx-vs-apache

Đố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  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.

apache-request-handling

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-event-driven

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
  • Xử lý nội dung tĩnh sử dụng file-based method.
  • Nội dung tĩnh (static content) hoặc files thường là các các tệp được lưu trữ trên ổ đĩa của máy chủ (servers) như các file css, js, hình ảnh.
  • Apache xử lý các nội dung tĩnh này bằng cách sử dụng file-based method. Apache xử lý tất cả các request đó với chi phí cao hơn so với Nginx.
  • Với xử lý nội dung tĩnh, Nginx được xếp vào hạng nhất.
  • Với thiết kế kiến trúc của mình, Nginx được trang bị tốt hơn để xử lý tải. Nó nhanh khi xử lý nội dung tĩnh. Khi thực hiện một bài kiểm tra với hơn 1000 kết nối đồng thời, Nginx thực hiện nhanh hơn 2.5 lần so với Apache.
  • Nginx xử lý các nội dung tĩnh (static content) mà không cần một bên thứ 3 như PHP. Điều này khiến cho Nginx hoạt động có hiệu quả hơn và ít tốn tài nguyên hơn.

Static-content-comparison

Nội dung động (Dynamic Content)

Apache Nginx
  • Xử lý nội dung động trong máy chủ (servers).
  • Apache có thể xử lý nội dung động (dynamic content) trong chính máy chủ web (web server) mà không cần phụ thuộc vào bất kỳ thành phần bên ngoài nào.
  • Nginx không xử lý nội dung động.
  • Nginx không thể xử lý nội dung động (dynamic content) trong máy chủ web (web server) như Apache. Tất cả requests với nội dung động sẽ được chuyển qua một tiến trình bên ngoài (như php-fpm) để thực thi. Nginx sẽ chờ nội dung cuối cùng sau khi thực thi được trả về và cung cấp nó trở về cho client.

 

Nginx-performance

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:

Dynamic-content-comparison

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
  • Hỗ trợ tất cả các hệ thống Unix-like (Unix-like systems) bao gồm cả Linux và BSD.
  • Hỗ trợ trên cả hệ điều hành MS-Windows.
  • Apache chạy trên tất cả các loại Unix-like systems (Linux, BSD,…) và có hỗ trợ đầy đủ trên hệ điều hành MS-Windows.
  • Hỗ trợ hầu hết trên tất cả các Unix-like systems.
  • Hỗ trợ một phần trên hệ điều hành MS-Windows.
  • Nó chạy trên một số Unix-like systems hiệu đại và có hỗ trợ một phần trên hệ điều hành Windows. Nhưng trên hệ điều hành Windows, hiệu năng sẽ không mạnh như trên các nền tảng còn lại.

 

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
  • Cho phép cấu hình bổ sung trên cơ sở mỗi thư mục (directory) thông qua các file .htaccess.
  • Kiến trúc này cho phép các người dùng không có quyền chỉnh sửa cấu hình chính của web servers có thể kiểm soát một số phần nhất định trên website mà không cần cấp phát quyền chỉnh sửa cấu hình web servers.
  • Không cho phép cấu hình bổ sung.
  • Nginx không hỗ trợ cấu hình bổ sung, nhưng điều này lại khiến cho Nginx tăng thêm hiệu suất. Bằng việc không hỗ trợ cấu hình thư mục, nó có thể xử lý request nhanh hơn Apache. Nó không cần phải tìm kiếm các files .htaccess và phân tích yêu cầu từ người dùng.

 

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ể.

apache

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.

nginx

Trong một bài kiểm tra về tốc độ truyền tải (transfer rate – tốc độ data gửi và nhận giữa server và client). Ta có thể thấy Nginx hoạt động nhỉnh hơn.

transferrateapach3evsnginx

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
  • Hỗ trợ tùy biến của web server thông qua hệ thống modules linh động.
  • Tùy biến web server thông qua việc cài đặt và gỡ bỏ các modules. Apache hỗ trợ việc cái đặt và gỡ bỏ tự động từ rất sớm vì vậy hầu như tất cả các modules của nó đều có thể được cài đặt và gỡ bỏ một cách tự động.
  • Rõ ràng, ta thấy được Apache có tính linh hoạt cao hơn rất nhiều so với Nginx.
  • Không có đủ tính linh động (flexible) để hỗ trợ các tùy biến thông qua các modules tự động.
  • Tuy nhiên, vào đầu năm 2016, Nginx đã có hỗ trợ cho việc cài đặt các module một cách tự động. Trước thời điểm này, Nginx yêu cầu các quản trị viên phải biên dịch các modules muốn sử dụng thành dạng binary (Nginx binary).
  • Hầu hết các modules của Nginx chưa hỗ trợ cài đặt một cách tự động nhưng trong tương lai, có thể chúng sẽ được hỗ trợ chức năng này.

Bảo mật (Security)

Apache Nginx
  • Hỗ trợ bảo mật cao.
  • Apache đảm bảo rằng tất cả các website chạy trên nó được an toàn trước mọi tác hại và hackers.
  • Do đó, nó cung cấp các cách (mẹo) cấu hình để xử lý việc bị tấn công DDoS. Như module mod_evasive có thể đáp ứng được việc xử lý các cuộc tấn công HTTP DoS, DDoS hoặc tấn công dò (brute force – cách tấn công bằng cách chạy dò nhiều username/password với hy vọng tìm được đúng thông tin)
  • Bảo mật tốt hơn với các smaller codebase.
  • Mã cơ sở của Nginx (the Nginx code base), nhỏ hơn đáng kể so theo một số bậc độ lớn, do đó, đây chắc chắn là một điểm cộng lớn từ quang điểm bảo mật tiên tiến.

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
  • Hỗ trợ cộng đồng rất tốt thông qua việc gửi mail, IRC và Stack Overflow.
  • Có một số gói hỗ trợ thương mại cho Apache từ một số bên thứ 3, như OpenLogic…Nhưng không có một danh sách chính thức nào từ quỹ Apache. Apache hỗ trợ rất tuyệt vời cho tất cả người dùng của mình.
  • Hỗ trợ cộng đồng rất tốt thông qua việc gửi mail, IRC, forum và Stack Overflow.
  • Công ty phía sau Nginx cung cấp một sản phẩm thương mại được gọi là Nginx Plus. Nó hỗ trợ cho một số tính năng bổ sung đặc biệt như cân bằng tải (load balancing), truyền phát đa phương tiện (media streaming) và giám sát (monitoring).

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.

nginxwithapache

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

 

0 Comments
Inline Feedbacks
View all comments