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
Minh họa bằng những biểu đồ thật là ấn tượng. Cảm ơn Nam đã chia sẻ kinh nghiệm! Mấy ngày này Tuấn thấy truy cập trang nhanh hơn rất nhiều.
Ngoài tác dụng này, proxy nghịch còn có áp dụng trong một công nghệ mới được phổ biến gần 10 năm nay là edge caching (đệm biên). Chẳng hạn như toàn bộ nội dung chính bạn để ở máy A khá xa điểm truy cập, mà bạn có một máy chủ nhỏ B đặt ngay tại ISP của khách hàng. Thay vì truy cập vào máy A vừa lâu vừa tốn băng thông quốc tế, bạn chuyển mọi truy cập sang B. Lúc này B như là cái nginx trong bài, còn A chính là 127.0.0.1:81.
Tất nhiên, khi làm proxy nghịch mà máy đích ở xa, thì phải cache. Tức là truy vấn đầu tiên B phải lấy dữ liệu từ A, nhưng các truy vấn kế tiếp thì B đã có ngay dữ liệu cần thiết. Các phiên bản gần đây của nginx đã tích hợp ncache để giải quyết chuyện này.
Còn Apache vẫn làm được proxy nghịch và cũng hỗ trợ cache luôn! Khi máy chủ còn ở Mĩ, TTCN dùng một VPS chạy Apache + mod_proxy + mod_disk_cache (ngoài ra chẳng cài gì khác) để làm việc này.
Vậy có ứng dụng gì được vào TTCN hay chưa vậy?
Ứng dụng từ hôm 14. Hình minh hoạ ở trên là của TTCN.
@tuấn phạm: mình thấy tốc độ vẫn thế, có thể gói mạng mình tốt nên chả cảm thấy đc nhanh hơn rất nhiều như bạn
còn cái proxy nghịch mình chưa thấy rõ rệt ý nghĩa, nó vẫn chỉ là thay vì truy cập trực tiếp từ a->c (chậm), ta truy cập qua trung gian b hoặc nhiều "b" (nhanh hơn)
mình nghĩ chỉ khi nào rất nhiều lượt truy cập thì mới phát huy tác dụng của nginx, đơn thuần mà ai đó nhận ra nhanh hơn hẳn thì quả là cao siêu.
Lượt truy cập thì lúc nào cũng có rất nhiều, vì vậy mới dùng nginx. Còn nhanh hơn hẳn thì tuỳ bạn truy cập lúc nào, trước đây lúc nhanh lúc chậm (khi bị quá tải), còn giờ lúc nào cũng ổn định.
Đúng là nhanh hơn
Cám ơn bạn đã chia sẻ kinh nghiệm
hiệu nghiệm thật, TTCN tốc độ nhanh kinh hoàng !!!
Hôm nay có thêm một bài khác về dùng nginx với Drupal. Nội dung cũng vậy, nginx ở frontend để serve boost+static. Nhưng thêm cái là nginx làm LB luôn (dùng nhiều Apache): http://bit.ly/baJj3m
bác Nam qua tư vấn cho whitehouse đi, thấy trang đó chậm kinh khủng
Nói Obama chuyển server về VN để cho nó nhanh!
thế TTCN hiện giờ server đang đặt ở VN à ?
Đây: Chuyển máy chủ về Việt Nam thành công
Vào CDTT xem thì thấy cuối tháng lại hết bandwidth Nếu cần mình có thể làm cái mirror ở VN để mà lưu ảnh, tương tự CDN!
hic ! bandwidth là cái mình đang đau đầu nhất, SEO của mình khá tốt, không hề thua kém đối thủ nào tại VN, kể cả TTCN lẫn các báo chính thống
hiện đang dùng gói cheaphost 2GB díkspace , 20Gb bandwidth, mình thú thật làm CDTT chỉ để thử sức, khả năng và nhiệt huyết mình không thiếu, chỉ thiếu bandwidth
thật ra thì ngày trước mình làm CDTT vì "bất đồng" với TTCN, chắc bác không ngờ và rất ngạc nhiên
bây giờ làm được rồi, cứ cuối mỗi tháng mình lại "thất nghiệp" vì không có chỗ viết bài
đôi khi muốn quay về viết bài cho TTCN nhưng kiểu viết bài của mình sợ không có đất ở TTCN, và cá tính của mình quá mạnh, sợ không đủ bình yên để tồn tại lâu tại TTCN, dù lòng vẫn rất muốn chia sẻ những gì mình có thể làm
về hình ảnh mình đã có giải pháp tân dụng flickr để lưu ảnh, nên dung lượng+băng thông đỡ lo, nhưng không hiểu vì sao dạo này nó ngốn khủng thế, có lẽ những bài viết cũ không được sử dụng flick nên vẫn chiếm khá nhiều bandwidth
cám ơn bác đã có ý giúp đỡ, để đợi đầu tháng em truy tìm nguyên nhân ngốn bandwidth xem sao, nếu bác giúp em được cái khoảng badnwidth này em cảm tạ lắm lắm
thật sự lời đề nghị giúp đỡ của bác đối với một người luôn công kích TTCN như em làm em rất bất ngờ và bị mất ngủ, nếu bác có hứng thú hợp tác với một người như em thì em rất sẵn lòng
nếu bác giúp em được vấn đề bandwidth em xin viết bài không lương cho bác, bác thấy thế nào ?
Thực ra, bandwidth giờ khá rẻ, nên cũng còn nhiều giải pháp khác nhau. Flickr không phải cách hay, vì tạo thumbnail khó, lại làm thủ công, và phải để link trở lại Flickr (theo đúng thoả thuận của nó).
Đã trả lời mail, trong trường hợp bạn muốn mình mirror giùm dữ liệu.
Một bài giới thiệu tuyệt vời.
Xin hỏi anh Hải là ví dụ anh đưa ra là tất cả file nằm trong cùng một server.
Còn trường hợp có hai server khác nhau nằm ở hai datacenter khác nhau (không cùng một nhà cung cấp).
Một cho static file access
Một cho dynamic file acess
Thì không biết phải cấu hình sao.
Thêm một câu hỏi ngoài lề nữa là: với một trang web bất ký và hai server như kể trên thì làm sao để tối ưu tách static file và dynamic file ra để gửi đến hai server mà không gây lỗi.
Cảm ơn anh và xin lỗi nếu câu hỏi ngô nghê
Server chạy webapp và proxy mà không cùng DC là chuyện rất không nên, vì traffic qua lại giữa 2 DC này thường rất lớn, và tạo độ trễ. Bạn chỉ để proxy 1 nơi, file server 1 nơi thì được, vì khi đó proxy cache mọi nội dung static nên không phải lấy dữ liệu liên tục từ file server.
Còn cấu hình thì không khác gì cách mô tả trong bài.
Config có khác gì không nếu site cần hỗ trợ SSL
Cảm ơn anh đã trả lời rất nhanh.
Nhân tiện hỏi anh thêm là nếu site cần hỗ trợ SSL (ví dụ site thuơng mại điện tử) thì config phải thay đổi những gì.
Xin cảm ơn.
Cái đó bạn đọc tài liệu reverse proxy, mình không rành cấu hình SSL.
Xin hỏi thêm về Proxy Server
Tôi có một con VPS mạnh 2G Ram, nằm trên máy chủ 2 chip quad core.
Và một con VPS yếu hơn (1G ram) và chỉ được assiged co một core.
Một diến đàn tầm 80k mems và thường xuyên có khoảng 50, 200 mems online.
Không biết là con proxy cần đặt cấu hình mạnh hay con máy chủ đặt cấu hình mạnh nhỉ?
Hiện tại con forum của tôi cứ đến lúc cao điểm nhiều người vào là lăn ra chết.
Anh có thể cho lời khuyên không?
(2 con VPS này không cùng Datacenter)
Cảm ơn anh trước.
Hi vọng con VPS 2 core 2 GB RAM đó HDD của nó cũng ngon hơn. Vậy để cho nó chạy Apache và MySQL thôi. Con kia chạy nginx, nhớ thiết lập cache to to vào. TTCN từng dùng 1 cái VPS 256 MB làm reverse proxy (VN -> nước ngoài luôn) cho khoảng 95% số truy vấn.
Ngoài ra, nếu kết nối giữa 2 DC không tốt lắm, và diễn đàn của bạn dùng AJAX nhiều thì nên cho AJAX truy vấn thẳng đến Apache (tìm thêm cách hỗ trợ SSO). Đó chỉ là ý tưởng, đến lúc chạy có vấn đề lại tính tiếp.
Khong biet perfomance của drupal so với totmatocms của việt nam thế nào nhỉ?Thấy cms đó cũng tốt
Đây là lần đầu tiên minh nghe đến CMS này nên không có ý kiến gì. Với lại các vấn đề ngoài nginx/reverse proxy bạn gửi ở group/webmaster
tomatocms.com ấy....
Cho mình hỏi thêm là cấu hình hardware của toàn bộ site ttcn thế nào?các perfomance tips mà ttcn đã áp dụng để tối ưu toàn site.Vì giờ mình vào thấy nhanh ko thua gì vnexpress
Thanks các bạn.Chúc ttcn ngày 1 pt
Cấu hình máy chủ TTCN thuộc loại thấp, mới dùng từ tháng 11/2009: CPU X3220, 4 GB RAM, 1 HDD SATA2. Chỉ 1 máy chủ duy nhất.
Thực ra website nhanh hay chậm chủ yếu ở frontend. TTCN có nhiều hệ thống quảng cáo khác nhau nên chậm hơn bình thường. Tốc độ ở backend không thể hiện ra bên ngoài (vài trăm ms không quan trọng bằng vài giây load quảng cáo), mà chỉ thể hiện qua số pageview hệ thống có thể chịu được.
Vậy là TTCN chạy trên Dedicated Server ..
Mình cũng đã config thành công 2 máy vps chạy cho website của mình nhưng.
1. Có public IP --> no problem (internet --> VPS) --> tốc độ phản ứng nhanh
2. Dùng privated IP, --> Cấu hình phức tạp hơn và tốc độ có vẻ không ấn tượng lắm ^^.
(internet --> firewall --> VPS )
-----------------------------------------------
VPS (nginx, apache, mysql, php).
-----------------------------------------------
Có một điều mình đang muốn làm mà chưa làm được là:
LAMP đã hỗ trợ multi user (mỗi một user chạy dưới quyền riêng, không user nào xem được user nào) --> config no problem.
Nhưng với Nginx không biết làm sao để có thể config được vậy. Nếu thành công --> có thể share server giữa các users khác nhau mà không lo vấn đề bảo mật.
1. Cấu hình thế nào thì chỉ khác nhau cái firewall (thực chất là NAS trên router). Mà thường thì số request firewall có thể xử lí cao hơn webserver rất nhiều lần. Bạn xem lại chỗ đó.
2. nginx với Apache đều chạy với 1 user duy nhất, không khác gì nhau đâu bạn. Apache có thể chạy các script PHP dưới user khác (owner của script đó) nhờ suphp chẳng hạn, vậy thì bạn xem cấu hình nginx ở phần php-fpm xem.
Xin hỏi về phần mềm stats dùng trong report ở trên
Không biết phần mềm anh dùng để thống kê traffic va iosload ở trên là phần mềm gì nhỉ?
Cảm ơn anh trước.
Munin