[Case Study] 2GB RAM – 2 CPU cho website WordPress 200 users online




data vpn

Tuần qua mình có nhận được email của một bạn nói với mình rằng bạn ấy đang gặp vấn đề website WordPress tốn quá nhiều tài nguyên, trong khi website mỗi ngày chỉ có khoảng 10.000 lượt truy cập nhưng RAM hầu như lúc nào cũng hết, hay bị lỗi thiếu tài nguyên hoặc lỗi 500, 502.

Và bạn ấy cũng kêu là nếu có thể thì hãy viết bài chia sẻ cách cấu hình cho VPS để sử dụng với các website có traffic tầm trung nhưng lại có VPS có tài nguyên trung bình. Và mình cũng nhận thấy, nếu các bạn sử dụng WordPress trên VPS mà không biết cách cấu hình thì không bao giờ là đủ tài nguyên cho nó chạy.

Ở bài này, mình sẽ chia sẻ một case study trong việc tối ưu VPS của một khách hàng lâu năm của mình đó là trang blog Giupbanlamdep với lượt truy cập mỗi ngày trung bình khoảng 35.00040.000 Unique Visitors và user online thấp nhất là ở ngưỡng 150 và cao nhất vào giờ cao điểm/mới đăng bài là gần 500 users online cùng thời điểm.

Trên web này, mình đang thiết lập 1 VPS có cấu hình rất bình thường như sau:

  • Nhà cung cấp: DigitalOcean
  • Máy chủ: Singapore 1
  • RAM: 2GB
  • CPU: 2
  • Plugin sử dụng trong WordPress: 53
  • Số lượng bài viết: 330

Tổng quan

Với các thiết lập mà mình sẽ chia sẻ trong bài này, Giupbanlamdep đã load rất vi vu và CPU không bao giờ vượt quá 70%, nếu nó vượt khoảng trên 60% là hệ thống tự phân tán các tiến trình cũ và lúc này CPU lại tụt xuống ngưỡng 5 – 15%. Khi user online xuống thấp còn khoảng 50 – 70 vào ban đêm thì coi như CPU chỉ mất có vài phần trăm.

Tốc độ xử lý trong VPS cũng rất nhanh, trung bình từ 200 đến 600ms. Nói chung với 2GB RAM và 1 CPU thì không có việc gì xảy ra với traffic này cả thậm chí cả khi đã tắt cache, hãy xem ở video dưới.


Dĩ nhiên bạn vẫn có thể làm tốt hơn ở VPS 1 CPU với 1 Core bằng việc bật cache lên (mình khuyến khích Disk Cache nếu dùng NGINX làm front-end proxy).

Cách thiết lập

Trên VPS này, dĩ nhiên mình không sử dụng bất cứ Webserver Control Panel nào như cPanel, DirectAdmin, VirtualMin, VestaCP,….và mình cũng khuyến khích bạn đừng dùng mấy control panel này mà hãy tập tự cài đặt Webserver và dùng command line để quản trị.

Mình sử dụng Apache Webserver để xử lý các file PHP (mod_php) và sử dụng NGINX như một phương thức cache các file tĩnh chứ không sử dụng LEMP vì đơn giản là mình thích sử dụng phương án cài đặt này để xem hiệu quả của nó. [XEM HƯỚNG DẪN]

Trong file httpd.conf, mình thiết lập như sau:

  KeepAlive On  MaxKeepAliveRequests 500  KeepAliveTimeout 15

KeepAlive là chức năng mà chúng ta sẽ không cho Apache đóng kết nối để phục vụ các kết nối kế tiếp mà sẽ giữ lại để phục vụ. Tính năng này sẽ rất có lợi nếu như bạn có một lượng dữ liệu lớn cần user tải xuống hoặc upload nhiều file lên một nơi khác do nó không phải mất công kêu Apache mở lại kết nối.

MaxKeepAliveRequests là request  tối đa được phép sử dụng cho mỗi kết nối. Nếu kết nối vượt quá số lượng này, nó sẽ tự đóng và mở kết nối khác. Tùy theo lượng traffic bạn có mà sẽ tùy chỉnh nó thích hợp, mình khuyến khích bạn nên đặt từ 500 đến 3000.

Chức năng này sẽ giúp bạn tiết kiệm CPU và tốc độ tải trang, nhưng bù lại sẽ làm bạn tốn thêm RAM một xíu.

Xem thêm: KeepAlive – On or Off?

phần prefork MPM thì mình thiết lập như sau:

  <IfModule prefork.c> StartServers       1 MinSpareServers    1 MaxSpareServers   3 ServerLimit      256 MaxClients       256 MaxRequestsPerChild  10000 </IfModule>

Mặc định Apache sẽ cho phép server bạn tạo ra 50 processes khác nhau cho Apache, điều này thật dễ bị tràn tài nguyên nếu như bạn chỉ có 1 hoặc 2 CPU vì nó không đủ CPU để phục vụ. Do đó, mỗi khi cài Apache vào bạn nên tìm tới file httpd.conf rồi sửa lại phần IfModule prefork.c như cấu hình bên trên hoặc bạn có thể tăng lên 1 xíu nếu có nhiều hơn 2 CPU.

Về database thì mình sử dụng MariaDB và cấu hình file my.cnf sẽ như sau:

  # # This group is read both both by the client and the server # use it for options that affect everything # [client-server]  # # include all files from the config directory # !includedir /etc/my.cnf.d [mysqld]  key_buffer = 500M table_cache = 4000 sort_buffer_size = 3M read_buffer_size = 2M read_rnd_buffer_size = 8M myisam_sort_buffer_size = 64M max_connections = 400 query_cache_type = 1 query_cache_limit = 5M query_c
ache_size = 500M tmp_table_size=20M max_heap_table_size=20M thread_cache_size = 64

Trong đó bạn có thể thấy mình đã thiết lập cache cho các truy vấn gửi từ webserver vào database vì mặc định nó không được kích hoạt nên sẽ rất tốn CPU nếu như bạn đang dùng 1 theme tin tức hay nhiều widget khác nhau để lấy post ra từ một nơi nào đó, nói chung nếu bạn thiết lập query cache thì sẽ tiết kiệm RAM và CPU hơn trong việc xử lý nó, tốc độ trong backend cũng nhanh hơn.

Còn về phần cấu hình cho NGINX để load các file tĩnh thì không có gì đặc biệt cả, thậm chí mình cũng chưa kích hoạt tính năng thiết lập thời hạn cache của các file tĩnh. Bạn có thể tham khảo cách cấu hình NGINX tối ưu tại bài này.

Có một ứng dụng cũng rất quan trọng trong việc giảm tải các file PHP đó là sử dụng Opcache của Zend vì trong WordPress, tính luôn cả plugin và theme thì sẽ có hàng chục nghìn file PHP khác nhau nên nếu không có PHP Caching cho tụi nó thì server sẽ phải vất vả hơn trong việc đọc và xử lý các mã PHP.

Lời kết

Chỉ đơn giản vậy thôi chứ không nhiều vì mình đang thử với cách thiết lập chỉ dùng vài phần mềm đơn giản đi kèm chứ không có nói qua các kỹ thuật phức tạp như Load Balancing vì không phải ai cũng có điều kiện mua nhiều server cùng lúc rồi triển khai Load Balancing.

Nếu bạn cần một hướng dẫn cách cài đặt Apache và NGINX kèm proxy với các thông số cấu hình y hệt như trang Giupbanlamdep.com mình đang dùng thì sẽ có tutorial sau nhé.




data vpn

Leave your comment