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.
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
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]
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.
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!
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
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.
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ỉ?
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.
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ỉ?
Ngược lại là sao?
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
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í.
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...
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
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ỉ?
Giúp m tí nhé:
topic/23770