Hiện nay Apache là máy chủ web được dùng phổ biến nhất trên thế giới do tính đa dụng. Nhưng cũng vì hỗ trợ nhiều tính năng nên phần mềm này trở nên nặng nề và không thích hợp để chạy các ứng dụng đơn giản cần tốc độ cao. Bài viết sẽ hướng dẫn cài đặt nginx như là một bổ sung cho Apache.

Thông thường Apache được cài đặt để nghe trên cổng 80 để đáp ứng các truy vấn http (và có thể nghe trên cổng 443 với https). Mỗi khi khách truy cập, sẽ có hàng chục, thậm chí hàng trăm truy vấn được gửi đến. Ngoài truy vấn chính, còn có rất nhiều truy vấn phụ để tải các hình ảnh, định dạng, mã lệnh... để hiển thị trên trình duyệt.

Việc dùng Apache để đáp ứng mọi truy vấn này không khác gì “dùng dao mổ trâu để giết gà”. Để giải quyết vấn đề này, cách phổ biến nhất là chạy một máy chủ web nhẹ cân như nginx, lighttpd ở một tên miền khác, còn Apache chạy ở tên miền chính, chỉ nhận các truy vấn chính. Chẳng hạn như YouTube sử dụng Apache ở máy chủ chính, lighttpd để đáp ứng javascript/css, và hai loại máy chủ riêng khác cho ảnh thumbnail và cho video.

Tuy nhiên, không thể chạy cùng lúc hai máy chủ web trên cùng một địa chỉ IP và cùng cổng 80. Trong trường hợp này, giải pháp thường được sử dụng là proxy nghịch. Proxy này sẽ chuyển các truy vấn khác nhau đến các máy chủ khác nhau nằm ở “hậu trường” trên các cổng khác nhau.

Các máy chủ web như Apache, nginx đều có khả năng làm proxy nghịch. Trong cấu hình này, chúng ta dùng nginx để phục vụ các yêu cầu thông thường, và chuyển các yêu cầu cần đến PHP sang Apache nghe trên cổng 81.

Đầu tiên, chúng ta cấu hình nginx trên cổng 80 và các tên miền www.example.com (chuyển các yêu cầu đến Apache) lẫn static.example.com (yêu cầu đến nội dung tĩnh). Trên tên miền static.example.com nếu không tìm thấy nội dung sẽ chuyển ngược về www.example.com (dùng cho Imagecache).

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://127.0.0.1:81;
    }
}
server {
    listen 80;
    server_name static.example.com;
    root /home/example/public_html;
    expires 30d;

    location / {
        try_files $uri @redirect;
    }

    location @redirect {
        rewrite ^(.*)$ http://www.example.com$1;
    }
}

Tiếp đến, cấu hình cho Apache nghe trên cổng 81, và chỉ nghe trên giao diện 127.0.0.1 vì không muốn xử lí các truy vấn từ ngoài. Chúng ta muốn mọi truy vấn cần gián tiếp thông qua cổng 80.

Listen 127.0.0.1:81
<VirtualHost 127.0.0.1:81>
    ServerName www.example.com
    DocumentRoot /home/example/public_html
</VirtualHost>

Chúng ta cùng xem một số kết quả sau khi thay đổi. Cấu hình của Apache vẫn không đổi, dùng MPM Prefork, mod_fcgid, chỉ có thay đổi về IP và cổng. Cùng lúc chuyển sang nginx, nhóm phát triển có tối ưu MySQL nên không phải tất cả mọi thay đổi đều do nginx.

Ảnh
Trước đây tải rất bất ổn, sau đó thì trở nên ổn định ở mức rất thấp, chỉ bằng 10% đến 20% lúc trước.
Ảnh
CPU xử lí ít hơn, đồng thời hiệu suất đĩa tốt hơn (tỉ lệ iowait rất thấp)
Ảnh
Truy xuất đĩa được tối ưu.
Ảnh
Không có nhiều thay đổi về bộ nhớ sử dụng. Nhưng nginx ổn định hơn, không phụ thuộc vào lượng khách truy cập.
Ảnh
Truy xuất mạng nhiều hơn do dùng proxy. Nhưng không ảnh hưởng đến hiệu năng.
Ảnh
Bởi vì tải thấp hơn nên truy vấn PHP thực hiện nhanh hơn, do đó số lượng trung bình tại một thời điểm có giảm nhẹ. Cũng không có hiện tượng đôi khi quá tải như trước kia.
Ảnh
nginx dùng luồng thay cho tiến trình. Số tiến trình giữ giá trị ổn định.

Trên đây là cách cấu hình máy chủ, một trong những thao tác để tối ưu ứng dụng web. Chúc các bạn tăng tốc cho Drupal của mình!




Bình luận

  • TTCN (43)
hoàng Trung Dương

em chả hiểu cái gì từ đầu đến cuối cái này viết cái gì nữa

Anh HẢi Nam pro chỉ em cái. em mù IT nên chả hiểu gì cả.

nick chat của em:[email protected]

VCN

Nội dung bài viết hay, nhưng quá tóm tắt, không chi tiết cho phần hướng dẫn, mà lại rất chi tiết cho phần "show hàng" :-P.

Đầu tiên, chúng ta cấu hình nginx trên cổng 80 và các tên miền www.example.com (chuyển các yêu cầu đến Apache) lẫn static.example.com (yêu cầu đến nội dung tĩnh). Trên tên miền static.example.com nếu không tìm thấy nội dung sẽ chuyển ngược về www.example.com (dùng cho Imagecache).

Tiếp đến, cấu hình cho Apache nghe trên cổng 81, và chỉ nghe trên giao diện 127.0.0.1 vì không muốn xử lí các truy vấn từ ngoài. Chúng ta muốn mọi truy vấn cần gián tiếp thông qua cổng 80.

Câu cú, ngữ pháp chểnh mảng dẫn đến sự khó hiểu cho người đọc?!

Just a my comment!

Hải Nam  30903

Một tấm hình có giá trị hơn cả đoạn văn dài. Không "show hàng" thuyết phục thì có mấy người sẽ đi theo Wink

Còn đoạn đó mình đọc lại thấy không có gì khó hiểu. Câu thứ hai thiếu chủ ngữ, mặc định hiểu chủ ngữ là "nginx". Ở đó có 4 câu không biết bạn bắt đầu khó hiểu từ câu nào? Ở dưới cũng có code minh hoạ kèm theo.

rok  23

Bạn Nam cho mình hỏi thêm là giữa dùng nginx làm front end cho apache và riêng nginx chạy luôn mod php-fpm thì hiệu suất 2 cái thế nào nhỉ?

Hải Nam  30903

php-fpm mình không dùng nên không rõ. Nhưng một khi trên 99% request là static rồi thì cái PHP đâu còn quan trọng nữa.

Apache có sẵn (dùng cPanel) nên mình dùng luôn cho tiện, đỡ cấu hình phức tạp.

rok  23

http://bit.ly/eARznM
Vậy nên để nginx chạy p 80 làm reverse proxy cho âpche ở port 81 hay ngược lại để tối ưu nhỉ?

Hải Nam  30903

Ngược lại là sao?

rok  23

Build thêm với varnish cahing nữa thì tuyệt...VPS mình setup trên linode 1G ram test dc hơn 5000 r/s với D7.
Varnish frontend(port 80)-caching- nginx-php-fpm port #80
http://bit.ly/e530ZS

Hải Nam  30903

5k hay 10k r/s, D1 hay D10 cũng vậy thôi à. Nó không liên quan gì đến Drupal cả, vì chỉ có mỗi Varnish xử lí.

rok  23

Nhưng rõ ràng hiệu quả đã tăng rõ rệt vì trước khi chạy với vảnish mình ben chỉ dc tối đa 500r/s với d7 bật cache...

Hải Nam  30903

Trước đây 500 r/s (cao thế!) là Drupal (Apache + PHP + MySQL), còn giờ 5000 r/s thì chỉ 1 request là Drupal, còn còn lại là Varnish lấy thẳng từ trong cache, nên bạn benchmark trang chủ (Drupal) hay 1 trang HTML tĩnh thì kết quả cũng như nhau.

Benchmark cái này rất khó. Cách dễ nhất là cho vô thực tế thử thôi Big Grin

rok  23

Uh...500r/s là bật cache của drupal rồi bạn à...còn ko cache thì chỉ dc 40r/s thôi...thằng varnish hiệu quả hơn memcached nhỉ?

rok  23

Giúp m tí nhé:
topic/23770