Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. WordPress
Code

Apache so với Nginx: Ưu và Nhược điểm đối với WordPress

by
Difficulty:IntermediateLength:LongLanguages:

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Các yêu cầu về hiệu suất của WordPress có thể khác nhau giữa các dự án, nhưng chắc chắn có một điều giống nhau - đó là nó phải nhanh.

Một yêu cầu khác dễ nhận thấy đó là - nó phải ít tốn kém, vì vậy chúng ta không thể có các giải pháp cấp tốc. Giải pháp phải gọn gàng, vừa phải và đáng tin cậy, và tối đa hóa lượng truy cập trên trang web của bạn, chi phí cho host phải được giữ ở mức tối thiểu.

Nếu bạn dự đoán sẽ nhận được nhiều lượng truy cập, thì cấu hình máy chủ web mà bạn đang sử dụng cho WordPress có ảnh hưởng trực tiếp đến hiệu suất trang web của bạn, ảnh hưởng đến thời gian tải trang và sự ổn định.

Khi lựa chọn máy chủ web, bạn có một số lựa chọn; Apache, Nginx, IIS, Caddy và Lighttpd đều là các dự án thông dụng. Chúng ta sẽ khái quát Apache và Nginx trong hướng dẫn này.

Ước tính rằng trên toàn bộ kết nối internet, máy chủ Apache và Nginx phục vụ 50% lưu lượng web.

Nếu bạn là người mới đến với chủ đề này, có thể bạn đang bị bối rối bởi hai mục đích dường như giống nhau của phần mềm - để phục vụ các trang web. Tôi hy vọng làm rõ thêm ở bên dưới đây hai phần mềm khác nhau như thế nào và làm thế nào để tận dụng những tính năng mạnh mẽ của một trong hai.

Apache và Nginx là các dự án rất phổ biến, và cả hai đều có những lý do của chúng trong khi đạt được một mục tiêu giống hệt nhau trong việc phục vụ trang WordPress của bạn. Tuy nhiên, khi chúng ta nhìn sâu vào thiết kế của chúng, có một sự khác biệt lớn về cách kết nối được xử lý bởi mỗi máy chủ.

Sự khác nhau

Một sự khác biệt chính đó là trong cách kết nối được xử lý bởi hai phần mềm.

Nói một cách đơn giản, Apache sử dụng một giải pháp chia luồng (forked threaded), hoặc keep-alive, giữ một kết nối mở cho mỗi người dùng.

Ngược lại, Nginx sử dụng một vòng lặp sự kiện không bị chặn (non-blocking event loop), cái mà các kết nối vùng (pools connection) hoạt động không đồng bộ thông qua các tiến trình công việc.

Nginx worker process topology diagram

Nhờ kiến ​​trúc này, kết quả là một quá trình nginx đơn luồng, và các tiến trình bổ sung không phải sinh ra để xử lý mỗi kết nối mới. Vì vậy, ngay cả vào những thời điểm có lượng truy cập cao, CPU và RAM không bị ảnh hưởng bởi cách tiếp cận này.

Cũng như kiến ​​trúc, cũng có một số khác biệt nhỏ giữa hai phần mềm trong việc cấu hình, và chúng ta sẽ đi tìm hiểu chi tiết hơn về chúng trong phần sau của hướng dẫn này.

Trước tiên, hãy nhìn vào hai dự án và có được một cái nhìn tổng quan rõ ràng.

Apache

WordPress hoạt động với Apache khá đơn giản, một mô-đun PHP như mod_php là bắt buộc, nhưng không cần nhiều thứ khác để nó hoạt động.

Apache rất linh hoạt và có rất nhiều mô-đun. Thông thường, mod_rewrite được sử dụng để cung cấp việc ghi lại URL để phân giải các URL chẳng hạn như categories.php?id=4 thành /categories/4.

Nginx

  • Được bắt đầu vào năm 2002 bởi Igor Sysoev, một kỹ sư phần mềm người Nga, như một giải pháp cho vấn đề C10k - một thách thức đối với các máy chủ web để xử lý 10.000 kết nối đồng thời.
  • Được phát hành công khai vào năm 2004, đáp ứng mục tiêu là kiến ​​trúc không đồng bộ, không bị chặn, hướng sự kiện.
  • Chạy nhẹ nhàng trên phần cứng tối thiểu, cung cấp hiệu suất tuyệt vời cho nội dung tĩnh.
  • Khả năng đáp ứng cao khi có nhiều truy cập.
  • Sử dụng một tập tin cấu hình nginx.conf với một cú pháp dấu ngoặc nhọn giống với JS.
  • Có thể mở rộng bằng các mô-đun của bên thứ ba.

Là người kế nhiệm của Apache, Nginx có lợi thế khi biết được những cạm bẫy và các vấn đề về hiệu suất của sự xử lý đồng thời có thể xảy ra, và nó gặt hái được những phần thưởng xứng đáng với thiết kế vòng lặp sự kiện không đồng bộ rất nhanh của nó.

Đối với nội dung tĩnh thì nó hoạt động rất nhanh. Đối với nội dung động, chẳng hạn như PHP, Nginx không có khả năng xử lý điều này bằng một mô-đun giống như Apache. Nhưng đây không phải là một trở ngại, vì nó sử dụng FastCGI để đạt được điều này. Nó làm việc rất tốt khi kết hợp với các kết nối vùng (connection pools) php fpm và memcache.

Các Yêu cầu WordPress

  • PHP 7 trở lên
  • MySQL 5.6 hoặc Maria DB 10.0 trở lên
  • mod_rewrite (nếu sử dụng Apache)
  • SSL (nếu đang được sử dụng)

Cả Apache và Nginx đều hỗ trợ php fpm. Đây là một trình quản lý FastCGI, một forked process manager cho PHP có thể được sử dụng để cung cấp một thời gian phản hồi rất nhanh. Chạy như một daemon trên máy chủ, nó vốn sẽ sinh ra các tiến trình khi chúng được yêu cầu.

Cấu hình PHP FPM Với Apache

Người dùng Ubuntu và Debian có thể cài đặt các gói cần thiết với aptitude thông qua:

Bây giờ hãy kích hoạt mô-đun này trong apache:

Sau đó, trong tập tin cấu hình /etc/apache2/conf-available/php7.0-fpm.conf, hãy thêm những thứ sau đây:

Đồng thời, trong VirtualHost cho WordPress (đường dẫn mặc định /etc/apache2/sites-available/000-default.conf), hãy thêm những thứ sau đây:

Bây giờ hãy khởi động lại apache và bạn đã hoàn tất

Tạo một tập tin <?php phpinfo(); ?> và nhìn vào trình duyệt của bạn. PHP bây giờ sẽ được phục vụ với FPM.

Bây giờ hãy kiểm tra blog WordPress của bạn. Có nhận ra bất kỳ sự khác biệt nào không?

Cấu hình PHP FPM Với Nginx

Người dùng Ubuntu và Debian có thể cài đặt gói này bằng lệnh:

Bây giờ, bên trong tập tin cấu hình của bạn (mặc định là /etc/nginx/sites-available/default) trên máy chủ, bạn cần thêm cấu hình FastCGI như sau:

Ở đây chúng ta sử dụng đoạn code từ Nginx để thiết lập các tham số cgi và truyền vào fastcgi kết nối socket.

Tiếp theo, hãy đảm bảo rằng bạn thiết lập cgi.fix_pathinfo=0 trong php ini, vì cài đặt mặc định đang phá vỡ cấu hình. Hãy chỉnh sửa /etc/php/7.0/fpm/php.ini và thiết lập:

Bây giờ bạn có thể lưu tập tin và tải lại PHP FPM. Làm điều này thông qua:

Sau cùng, chúng ta có thể kiểm tra <?php phpinfo(); ?> trong một trình duyệt để xác nhận máy chủ hiện đang sử dụng PHP FPM với Nginx.

Thự hiện mod_rewrite trong Nginx

Nginx không sử dụng một tập tin .htaccess và để ghi lại URL nó có một cách tiếp cận đơn giản hơn nhiều.

Để cho blog WordPress của bạn hoạt động với Nginx, chỉ cần thêm code sau vào phần try_files trong cấu hình Nginx của bạn:

Nếu bạn đang sử dụng một thư mục cho blog WordPress của bạn, vui lòng thiết lập như sau:

Khởi động lại Nginx và bạn sẽ thấy tính năng ghi lại URL đang hoạt động.

Tối ưu hoá các Thiết lập

Bạn có nhiều tùy chọn để tối ưu hóa WordPress thông qua bộ nhớ đệm trên máy chủ thông qua memcache, varnish và đồng thời ở cấp ứng dụng WordPress với các plugin sẽ dễ dàng cho phép bạn truy cập vào thiết lập này.

Tuy nhiên, những gì mà Nginx cung cấp cho bạn là một giải pháp tuyệt vời để phục vụ nội dung trang web tĩnh với bộ nhớ đệm nội dung tĩnh mạnh và nhanh.

Bộ nhớ đệm Nội dung Tĩnh

Nginx rất nhanh khi được sử dụng như một bộ nhớ cache cho nội dung tĩnh, và đây là nơi mà việc sử dụng nó thật sự vượt trội khi đề cập đến WordPress và các bài viết trên blog với rất nhiều hình ảnh. Bạn có thể phục vụ CSS, JS và hình ảnh của bạn thông qua một máy chủ Nginx chỉ chạy cho những nhu cầu này.

Tốt nhất là luôn luôn thực hiện việc này trên một tên miền không chứa cookie do đó nội dung sẽ thật sự được lưu vào bộ nhớ đệm bởi trình duyệt (vì cookie không thể được lưu vào bộ nhớ đệm), vì vậy việc sử dụng một tên miền con như images.myblog.com hoặc static.myblog.com sẽ là lý tưởng.

Một khối địa chỉ cho cấu hình tên miền con tĩnh này sẽ như sau:

Sử dụng open_file_cache, chúng ta cho phép lưu vào bộ nhớ đệm các tập tin đa phương tiện tĩnh của chúng ta. Chúng ta chỉ định các tập tin tối đa để lưu vào bộ nhớ đệm và trong bao lâu với open_file_cache max=3000 inactive=120s;

Nếu bạn muốn thiết lập bộ nhớ đệm trên toàn bộ dự án, chỉ cần thêm bốn dòng sau đây vào cấu hình nginx.conf của bạn:

Quan trọng: open_file_cache_errors sẽ lưu các lỗi 404 thật sự vào bộ nhớ đệm, do đó tốt hơn là tắt tính năng này đi nếu bạn đang sử dụng bộ cân bằng tải kết hợp với điều này.

Vùng Kết nối (Connection Pools) với PHP-FPM

Có thể sử dụng các vùng khác nhau cho mỗi WordPress khác nhau, và sau đó bạn có thể phân bổ các tài nguyên rất chính xác cho từng trang web - thậm chí sử dụng những người dùng và các nhóm khác nhau cho mỗi vùng nếu cần thiết. Việc cấu hình rất linh hoạt.

Bạn có thể thiết lập một số cấu hình, ví dụ như:

Trong mỗi dòng sau, chúng ta có thể thiết lập rất nhiều cấu hình như sau:

Với điều này, bạn có thể chỉ định các tùy chọn cấu hình PHP-FPM chẳng hạn như pm.max_children, và bạn cũng có thể chỉ định các biến môi trường và thiết lập tên người dùng (username) và nhóm (group) ở đây.

Bộ cân bằng Tải của Nginx

Nếu bạn sắp có nhiều lượng truy cập thì có thể bạn sẽ cần phải thiết lập một bộ cân bằng tải để sử dụng với thiết lập php-fpm của bạn.

Theo quy ước, chúng ta sẽ cần khởi động một số máy chủ lưu trữ upstream cho back-end, tất cả chúng đều đang chạy các ánh xạ blog của bạn, và sau đó có một máy chủ khác chạy nginx ở phía trước đóng vai trò như một bộ cân bằng tải và sẽ hướng việc tải giữa các upstream .

Điều này có nghĩa là bạn có thể sử dụng nhiều máy chủ để chạy blog của bạn cùng một lúc, và cấu hình để làm điều đó là tương đối dễ dàng.

Một ví dụ về cấu hình này sẽ giống như sau. Trước tiên chúng ta bắt đầu với một mô-đun upstream:

Tại đây, mỗi backend1.example.com đều có cấu hình Nginx riêng của nó, một ánh xạ về trang web trước khi nó có bộ cân bằng tải. Nginx sẽ chọn máy chủ để sử dụng cho mỗi yêu cầu.

Nếu một trong các backend của chúng ta có một ổ cứng nhanh hơn, như SSD chẳng hạn hoặc có vị trí địa lý gần với người dùng, bạn có thể thiết lập tải trọng như sau:

Ngoài ra, nếu bạn nghĩ rằng một máy chủ có thể bị down hoặc lo lắng về thời gian phản hồi, cũng có những lựa chọn cấu hình cho vấn đề này:

Bây giờ, với cấu hình này, sau 3 lỗi hoặc khoảng thời gian chờ 15 giây, máy chủ sẽ không còn được sử dụng bởi bộ cân bằng tải nữa. Nếu bạn muốn tự đánh dấu một máy chủ là không hoạt động, hãy thêm từ khoá down, ví dụ, server backend3.example.com down;.

Tiếp theo, chúng ta cần chuyển nó đến máy chủ thông qua một proxy sử dụng upstream backend mà chúng ta vừa mới định nghĩa trước đó:

Bây giờ hãy khởi động lại máy chủ của bạn với lệnh service nginx restart, và bạn sẽ thấy đang chạy một phiên bản cân bằng tải của trang web của bạn!

Điều cuối cùng về chủ đề này, cũng là để bạn tham khảo ở đây là một hướng dẫn nginx về việc phục vụ nội dung tĩnh và các tùy chọn cấu hình tốt nhất. Ví dụ, hãy lưu ý việc sử dụng tcp_nopushsendfile cho Mp3.

Chuyển từ Apache sang Nginx

Bên cạnh việc đọc hướng dẫn về Nginx và tự mình thực hiện các thay đổi, bạn có thể sử dụng công cụ mã nguồn mở apache2nginx để dịch cấu hình của bạn từ Apache sang Nginx.

Thực hiện theo các bước cài đặt tại apache2nginx README, và một khi cài đặt xong, bạn sẽ có thể di chuyển các tập tin cấu hình bằng cách chạy:

Bây giờ bạn có thể kiểm tra cấu hình và thử nó trong cài đặt Nginx của bạn. Bạn có thể thấy việc dịch là không hoàn hảo, nhưng nó sẽ cho bạn một nền cơ bản để bắt đầu.

Tóm tắt

Đối với tốc độ và hiệu suất, thì Nginx là một sự lựa chọn hiển nhiên so với Apache, nhưng điều đó không có nghĩa là Apache không thể xử lý một số lưu lượng truy cập. Nếu bạn dự định cho trang front-page của Reddit bất kỳ lúc nào, có lẽ bạn nên tìm kiếm một giải pháp mạnh mẽ hơn với Nginx và PHP-FPM.

Chuyển WordPress của bạn sang Nginx không phải là việc quá khó khăn, và cấu hình trong Nginx thì cũng rất đơn giản và dễ dàng truy xuất so với Apache.

Mặc dù không có các mô-đun tương tự như Apache, và có thể lúc đầu bạn không quen, nhưng bạn sẽ có thể tìm thấy các mô-đun thay thế trong hầu hết các trường hợp. Nếu không, một giải pháp dự phòng đó là, bạn luôn có thể proxy máy chủ cũ thông qua nginx của bạn cho mục đích này nếu cần.

Có nhiều cách để cấu hình cả hai máy chủ, vì vậy một giải pháp tốt hầu như có thể luôn luôn được tìm thấy cho bất cứ yêu cầu nào. Hiện tại, có vẻ như Apache sẽ luôn là sự lựa chọn mặc định trên phần mềm lưu trữ cPanel phổ biến hiện có, do công cụ thiết lập EasyApache đi kèm với nó.

Trong tương lai, có thể có nhiều hơn các máy chủ sử dụng các công cụ Nginx ví dụ như Engintron cung cấp Nginx trên cPanel.

Còn bây giờ, nếu bạn muốn chuyển sang WordPress chạy trên Nginx, bạn sẽ cần phải thiết lập một VPN Linux tại DigitalOcean, AWS hoặc một nhà cung cấp host khác.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.