Nginx là phần mềm mã nguồn mở không thể thiếu trong ngành công nghệ thông tin khi có thể được sử dụng cho web server, caching, load balancing, reverse proxy và media streaming. Với lợi thế về hiệu suất và tính ổn định cao, Nginx hỗ trợ tối ưu hóa việc xử lý các yêu cầu web và cung cấp trải nghiệm tốt hơn cho người dùng. Vậy Nginx là gì? Toàn bộ các thông tin hữu ích về Nginx sẽ được trình bày một cách cụ thể trong nội dung dưới đây. Hãy theo dõi và tìm hiểu nhé.
Nginx là gì?
Nginx là máy chủ web có mã nguồn mở hoạt động mạnh mẽ với kiến trúc đơn luồng và hướng sự kiện, đồng thời được đánh giá cao hơn so với Apache server về hiệu suất. Không chỉ giúp cho web server hoạt động một cách nhanh nhất, Nginx còn cung cấp thêm nhiều chức năng quan trọng như HTTP caching, load balancing và reverse proxy. Đồng thời là kiến thức không thể thiếu mà các devops, web developer và system administrator cần phải trang bị. Nhờ sự ưu việt trong quá trình đo lường hiệu suất, Nginx HTTP server chính là giải pháp hữu hiệu cho các dự án web nhằm nâng cao sự tăng cường và đáng tin cậy cho hệ thống.
Lịch sử phát triển của Nginx
Ban đầu, Igor Sysoev phát triển Nginx chỉ với mục đích là giải quyết vấn đề C10K - một thuật ngữ được đặt ra từ năm 1999 để mô tả những thách thức của việc xử lý số lượng lớn (10K) kết nối đồng thời (C) trên các máy chủ web. Dựa vào kiến trúc event-driven và asynchronous, Nginx đã nhanh chóng triển khai một phương án mới về cách hoạt động của máy chủ nhằm nâng cao hiệu suất và biến chúng thành máy chủ web nhanh nhất hiện nay.
Sau khi chính thức mở nguồn cung ứng dự án vào năm 2004 và nhận ra rằng nhu cầu sử dụng nó đã tăng lên nhanh chóng, Sysoev - người đồng sáng lập Nginx đã nhanh chóng tiếp thị Nginx Plus như một sản phẩm thương mại với hàng loạt tính năng được bổ sung. Hiện nay, Nginx và Nginx Plus đã có thể xử lý hàng trăm nghìn kết nối cùng lúc. Cho đến tháng 7/2011 thì công ty Nginx Inc chính thức được ra đời tại San Francisco, California, Hoa Kỳ. Đây chính là một cột mốc quan trọng trong quá trình phát triển và làm bệ phóng để quảng bá cho Nginx web server trên toàn cầu.
Nguyên lý hoạt động của Nginx web server
Thông thường, khi người dùng truy cập một trang web, trình duyệt sẽ thiết lập kết nối với máy chủ chứa trang web đó. Sau đó, máy chủ sẽ tìm và gửi lại cho người dùng file được yêu cầu từ trang web. Quy trình này thường được gọi là xử lý theo luồng đơn hay single thread, nghĩa là mỗi bước chỉ được thực hiện theo một luồng duy nhất và mỗi yêu cầu sẽ được gửi đến một luồng riêng biệt.
Tuy nhiên, Nginx lại hoạt động theo một nguyên lý khác biệt khi sử dụng kiến trúc bất đồng bộ và hướng sự kiện để tối ưu hóa việc sử dụng bộ nhớ, cũng như làm tăng khả năng chạy đồng thời. Cụ thể, Nginx HTTP server sẽ cho phép các luồng hoạt động một cách song song trong cùng một tiến trình - Process. Điều này có nghĩa là mỗi tiến trình sẽ chứa nhiều thực thể nhỏ hơn, trong đó Worker Connections được sử dụng để xử lý tất cả các luồng đó.
Trong quá trình này, Worker Connections sẽ đóng vai trò là cơ quan gửi yêu cầu tới Worker Process và sau đó Worker Process lại chuyển tiếp chúng tới Master Process. Cuối cùng, Master Process sẽ phản hồi các yêu cầu này cho người dùng. Đây cũng là lời giải đáp cho câu hỏi tại sao mỗi Worker Connections lại có thể xử lý hàng nghìn yêu cầu tương tự. Nhờ cơ chế này mà Nginx cũng có khả năng xử lý được hàng nghìn yêu cầu khác nhau trong cùng một thời điểm.
Những tính năng nổi bật của Nginx
Hiện nay, máy chủ HTTP Nginx được biết đến với nhiều tính năng nổi bật như sau:
- Xử lý đồng thời hơn 10.000 kết nối cùng một lúc với mức sử dụng bộ nhớ thấp.
- Hỗ trợ phục vụ các tập tin tĩnh và xây dựng các chỉ mục tập tin hiệu quả.
- Tăng tốc độ reverse proxy thông qua bộ nhớ đệm, đồng thời cân bằng tải đơn giản và đáng tin cậy.
- Hỗ trợ tăng tốc bằng FastCGI, SCGI,uwsgi và memcached.
- Kiến trúc modular cho phép nén gzip tự động để gia tăng tốc độ tải trang.
- Hỗ trợ mã hóa SSL và TLS để bảo vệ thông tin truyền tải.
- Cấu hình linh hoạt giúp dễ dàng lưu lại nhật ký truy vấn.
- Chuyển hướng lỗi 3XX-5XX và sử dụng Rewrite URL dựa trên biểu thức.
- Hạn chế tỷ lệ đáp ứng của truy vấn và số kết nối đồng thời từ một địa chỉ.
- Dễ dàng nhúng mã PERL vào các ứng dụng.
- Hỗ trợ hoàn toàn IPv6 và websockets.
- Truyền tải các file FLV và MP4 một cách hiệu quả.
Đánh giá ưu nhược điểm của Nginx HTTP server
Mặc dù được đánh giá rất cao về hiệu suất và tính ổn định nhưng cũng giống như nhiều loại máy chủ web khác, Nginx HTTP server vẫn có các ưu - nhược điểm sau:
1. Ưu điểm của Nginx
Nginx ngày càng trở nên phổ biến và được áp dụng rộng rãi tất cả là nhờ vào những ưu điểm sau:
- Cung cấp hiệu suất ứng dụng cao thông qua việc sử dụng cơ chế bộ nhớ đệm mạnh mẽ, giúp tăng cường hiệu suất khi có nhiều người dùng truy cập cùng một địa chỉ trong khoảng thời gian ngắn.
- Quy tắc ghi lại linh hoạt của Nginx đã có vai trò rất lớn khi cung cấp sự linh hoạt trong việc cấu hình chuyển hướng vĩnh viễn hoặc tạm thời cho một số URL.
- Là một web server nhẹ và có khả năng chuyển tiếp yêu cầu của người dùng đến máy chủ ứng dụng một cách hiệu quả.
- Nginx dễ dàng tùy chỉnh và triển khai qua giao thức HTTPS, từ đó giúp bảo vệ thông tin truyền tải một cách an toàn.
2. Nhược điểm của Nginx
Ngoài những ưu điểm đã được đề cập, Nginx cũng đi kèm với một số nhược điểm như sau:
- Cân bằng tải có sự hạn chế hơn so với một số máy chủ khác, ví dụ như hạn chế khả năng mở rộng của hệ thống.
- Cơ chế lưu trữ cần phải được cải thiện thông qua việc cung cấp các lệnh mạnh mẽ hơn để quản lý dữ liệu hiệu quả.
- Quá trình điều hướng giữa trang chủ của Nginx và bộ phận hỗ trợ khách hàng đôi khi gặp khó khăn, điều này đòi hỏi sự cải thiện trong việc quản lý và tổ chức các liên kết.
So sánh Nginx và Apache
Apache và Nginx là hai trong số các máy chủ web phổ biến nhất hiện nay, đồng thời cũng thường được xem là đối thủ đáng gờm của nhau. Trong đó, Apache đã tồn tại từ những năm 90 và đã có một cộng đồng người dùng lớn và mạnh mẽ. Vậy giữa Nginx và Apache có sự khác biệt nào không?
Trước khi so sánh chi tiết về Nginx và Apache thì trước tiên, bạn cần tìm hiểu một số điểm giống nhau của hai loại máy chủ web này như sau:
- Cả hai đều có khả năng chạy trên nhiều hệ điều hành của UNIX.
- Nginx, Apache đều được hỗ trợ thông qua hệ thống Mailing và diễn đàn Stack Overflow.
- Cả hai đều có khả năng bảo mật tốt cho mã nguồn.
- Nginx có thể kết nối với PHP và xử lý đồng thời giống như Apache với Module PHP-FPM.
- Cả hai loại máy chủ này đều có hiệu suất tương đương đối với nội dung động.
- Thời gian chạy trong môi trường PHP của cả hai cũng khá tương đương.
- Tất cả đều có cộng đồng người dùng lớn.
Còn về điểm khác biệt, cả Nginx và Apache đều có những nét riêng không hề gióng nhau, cụ thể:
Nginx | Apache | |
Hệ điều hành hỗ trợ | Nginx có thể chạy trên một số hệ điều hành Unix hiện đại và hỗ trợ một số tính năng trên Windows. Tuy nhiên, hiệu suất hoạt động của Nginx trên Windows không mạnh mẽ như Apache. | Nginx có thể chạy trên tất cả các hệ thống giống Unix và hỗ trợ một cách đầy đủ cho Windows. |
Hỗ trợ người dùng | Nginx có thể triển khai trên mọi loại hệ thống giống Unix và mang đến sự hỗ trợ đầy đủ cho Windows. | Thiếu sự hỗ trợ từ phía tổ chức (Apache Foundation) cho người dùng. |
Nội dung tĩnh | Có thể xử lý đến 1000 kết nối với nội dung tĩnh nhanh gấp 2.5 lần so với Apache và tiêu tốn ít bộ nhớ hơn. | Xử lý cùng lúc ít kết nối và không đạt tốc độ nhanh như Nginx. |
Khả năng tương thích | Năm 2016, Nginx mới bắt đầu chính thức hỗ trợ cho Dynamic Module. | Apache có ưu thế về việc cung cấp Dynamic Module từ rất lâu, điều này tạo ra một lợi thế so với Nginx. |
Nhìn chung thì về cơ bản, cả Nginx và Apache web server đều có những ưu điểm riêng của mình. Nginx thường được ưa chuộng trong việc xử lý nội dung tĩnh, trong khi ở môi trường nội dung động thì sự khác biệt giữa hai loại máy chủ web này lại không thật sự rõ ràng. Apache thể hiện sự xuất sắc đặc biệt trong tính linh hoạt, đặc biệt là với người dùng shared hosting. Tệp .htaccess của Apache và các mô-đun động cũng được đánh giá là phù hợp hơn, trong khi Nginx lại được tin dùng cho VPS và dedicated hosting.
Hướng dẫn cài đặt Nginx chi tiết
Để cài đặt Nginx, bạn có thể lựa chọn một trong hai cách sau:
- Sử dụng gói (package) đã được dựng sẵn.
- Cài đặt từ mã nguồn (source).
Trong đó, cách đầu tiên được đánh giá là đơn giản và nhanh chóng hơn. Tuy nhiên thì việc cài đặt từ mã nguồn sẽ mở ra khả năng cài đặt thêm các module khác, điều này giúp Nginx trở nên mạnh mẽ và linh hoạt hơn. Người dùng có thể tùy chỉnh để phù hợp với nhu cầu cụ thể của ứng dụng.
Để cài đặt một gói Debian dựng sẵn, bạn chỉ cần thực hiện một thao tác duy nhất, cụ thể:
sudo apt-get update sudo apt-get install nginx |
Sau khi hoàn thành quá trình cài đặt, bạn có thể kiểm tra xem mọi thứ đã hoạt động ổn định chưa bằng cách sử dụng lệnh sau, chúng sẽ hiển thị phiên bản của Nginx vừa được cài đặt như sau:
sudo nginx -v nginx version: nginx/1.18.2 |
Web server mới vừa được cài đặt sẽ nằm ở /etc/nginx/. Khi bạn truy cập vào thư mục này, bạn sẽ thấy nhiều tệp tin cùng với các thư mục khác. Tuy nhiên, điều quan trọng nhất mà bạn cần lưu ý chính là tệp tin nginx.conf và thư mục sites-available.
Sử dụng Nginx thế nào để đạt hiệu quả tốt nhất?
Nginx là một lựa chọn tuyệt vời có thể mang lại nhiều lợi ích cho dự án của bạn. Vậy nên, việc hiểu rõ những tính năng của Nginx sẽ giúp bạn tinh chỉnh nó sao cho phù hợp nhất với dự án của mình. Ngoài ra thì dưới đây còn là một số cách tuyệt vời mà bạn có thể tham khảo để tận dụng tối đa sức mạnh của Nginx:
1. Loại bỏ các limitation ở tầng kernel
Để tận dụng tối đa tiềm năng của Nginx, chúng ta có thể điều chỉnh một số giới hạn ở tầng kernel. Dưới đây là một số các thiết lập quan trọng trong của tệp /etc/sysctl.conf:
- net.core.somaxconn: Giúp tăng số kết nối tối đa mà Nginx có thể xếp hàng trước khi tiến hành xử lý.
- net.ipv4.iplocalportrange: Tăng phạm vi cổng cục bộ tạm thời, cho phép xử lý nhiều kết nối đồng thời và tránh tình trạng bị chặn do thiếu cổng..
- sys.fs.filemax: Tăng số file descriptor lên mức tối đa để giúp cho Nginx có thể mở ra nhiều kết nối hơn.
- net.ipv4.tcpwmem và net.ipv4.tcprmem: Tiến hành tăng kích thước đệm cho giao thức TCP/IP.
Những thiết lập này giúp tối ưu hóa hiệu suất và đảm bảo hệ thống hoạt động một cách mượt mà và ổn định hơn.
Dưới đây là danh sách các cấu hình được khuyến nghị cho máy chủ Nginx:
- net.ipv4.tcp_tw_reuse='1' - net.core.somaxconn='4096' - net.core.wmem_max='16777216' - net.ipv4.tcp_max_syn_backlog='20480' - net.ipv4.tcp_no_metrics_save='1' - net.ipv4.tcp_syn_retries='2' - net.ipv4.ip_local_port_range='1024 65000' - net.core.rmem_max='16777216' - net.ipv4.tcp_fin_timeout='15' - net.core.netdev_max_backlog='4096' - net.ipv4.tcp_rmem='4096 87380 16777216' - net.ipv4.tcp_max_tw_buckets='400000' - vm.min_free_kbytes='65536' - net.ipv4.tcp_synack_retries='2' - net.ipv4.tcp_wmem='4096 65536 16777216' |
2. Phân tích log Nginx để tìm bottle neck
Phân tích access log từ Nginx sẽ giúp bạn xác định được nơi có hiệu suất kém nhất (bottleneck) bằng cách sử dụng tool Kataribe. Để sử dụng công cụ này, bạn cần cấu hình định dạng log của Nginx bằng cách sử dụng directive:
log_format with_time '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" $request_time'; access_log /var/log/nginx/access.log with_time; |
3. Caching with Nginx
Khi sử dụng Nginx để server static file, điều quan trọng mà bạn cần nhớ đó là nên chú ý đến các cài đặt về bộ nhớ đệm (cache) và nén (compression). Việc cấu hình sử dụng gzip cho các tệp tĩnh cũng rất quan trọng. Bằng cách sử dụng gzip, bạn có thể giảm đáng kể chi phí liên quan đến IO và băng thông. Đồng thời, cấu hình điều khiển cache sẽ giúp máy chủ không gửi lại yêu cầu cho các tệp tĩnh đó cho đến khi bộ nhớ đệm hết hạn. Dưới đây là một số cài đặt mà bạn có thể tham khảo:
http { gzip on; gzip_http_version 1.0; gzip_types text/plain text/html text/xml text/css application/xml application/xhtml+xml application/rss+xml application/atom_xml application/javascript application/x-javascript application/x-httpd-php; gzip_disable "MSIE [1-6]\."; gzip_disable "Mozilla/4"; gzip_comp_level 1; gzip_proxied any; gzip_vary on; gzip_buffers 4 8k; gzip_min_length 1100; } |
Hãy tận dụng sự dư thừa bộ nhớ của bạn bằng cách sử dụng Nginx như một reverse proxy. Nếu lượng dữ liệu phản hồi không lớn, bạn có thể cấu hình Nginx để lưu trữ bộ nhớ cache thay vì lưu trữ trên đĩa cứng. Điều này có vai trò rất lớn trong việc tăng cường hiệu suất và cải thiện trải nghiệm người dùng khi truy cập vào các dữ liệu phản hồi:
proxy_cache_path /dev/shm/nginx levels=1:2 keys_zone=czone:16m max_size=32m inactive=10m;
4. Advance Nginx
Một cài đặt quan trọng mà bạn cần ghi nhớ đó là "keepalive" trong HTTP, nó giúp duy trì kết nối TCP (Transmission Control Protocol - Giao thức điều khiển truyền vận) sau khi kết thúc phiên kết nối HTTP, qua đó cho phép tái sử dụng kết nối cho các yêu cầu tiếp theo. Kỹ thuật này đặc biệt hữu ích khi người dùng giảm thời gian thiết lập kết nối, gửi nhiều yêu cầu để tải các tài nguyên tĩnh và tăng hiệu suất truy cập cho người dùng. Cách thức sử dụng keepalive trên Nginx rất đơn giản, bạn chỉ cần thêm chỉ thị keepalive vào phần upstream section:
upstream app { server 127.0.0.1:5000; keepalive 16; } |
Với những thông tin vừa được chia sẻ, Phương Nam Vina hi vọng bạn sẽ hiểu rõ hơn về khái niệm Nginx là gì và những thông tin cơ bản xoay quanh loại web server này. Từ đó có thể đưa ra được sự lựa chọn phù hợp nhất để có thể ứng dụng vào trong các phần mềm, dự án web của mình. Chúc bạn thành công!
Tham khảo thêm:
Name server là gì? Đặc điểm và cách thay đổi name server