Webinoly trên Oracle VM A1 Flex

Webinoly là một script giúp tự động cài đặt Nginx, MariaDB, PHP hoàn chỉnh, rất đơn giản và dễ sử dụng, thậm chí nó có thể tự cấu hình PHP để phù hợp với phần cứng bạn đang sử dụng

Tuy thế không rõ vì sao, tác giả QROkes không làm phần tự động cấu hình MySQL, nếu bạn dùng các server có nhiều RAM, cấu hình phần MySQL thường không tối ưu, vì nó chạy phiên bản MariaDB với các giá trị mặc định

Bên dưới là cài đặt Webinoly cho Oracle US VM.Standard.A1.Flex 4 OCPU, 24Gb RAM, 100GB HDD sử dụng hệ điều hành Ubuntu 22.04

Đây cũng là cấu hình mình đang dùng trực tiếp trên thèng bibica.net

Không chắc chắn về nội dung trong bài, vì mình không có kinh nghiệm quản lý VPS nào quá 1GB RAM 😀 các tinh chỉnh thuần túy là cứ điền bừa =)) chạy không lỗi, hiệu năng ổn thì dùng thôi 😀

Đầu tiên bạn cần mở tất cả các port bên trong Ingress Rules, và tạo tài khoản root

Cài đặt Webinoly

  • Cập nhập OS và khởi động lại hệ thống
sudo apt update && sudo apt upgrade -y && sudo reboot
  • Cài đặt Webinoly
sudo wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/Oracle-VM-Standard-A1-Flex-Webinoly/main/setup.sh -O setup.sh && sudo chmod +x setup.sh && sudo ./setup.sh

Tổng thời gian chạy 2 đoạn code trên tầm 8-15 phút, tùy location Oracle bạn đang sử dụng

Việc cài đặt cơ bản là thế, các thông tin bên dưới, chủ yếu để bạn hiểu thêm về dòng code vừa cài vào 😀

Sau khi cài đặt xong, bạn sẽ thấy 1 số cảnh báo PHP 7.4 đã cũ và không nhận được các cập nhập liên quan tới bảo mật

- [WARNING] You have an obsolete PHP version (7.4) installed that not even receive security updates! (3) PHP Verification Test has some warning messages you should attend!

Phiên bản cài đặt cụ thể:

PHP v7.4.33
MariaDB v10.11.4
Nginx v1.24.0

Hiện tại, PHP 7.4 được đánh giá là lỗi thời, tốc độ cũng chậm hơn so với PHP 8.2, cá nhân mình vẫn quen dùng PHP 7.4, vì hỗ trợ các plugin đầy đủ hơn, PHP 8.2 đôi khi vài plugin hơi cũ chạy báo lỗi …

MariaDB v10.11.4 là bản được cam kết cập nhập lâu dài, trong 5 năm, đây cũng là bản Webinoly sử dụng làm mặc định, nên mình dùng bản này luôn

Nginx thường rất ít lỗi và cũng rất ít khác biệt giữa các phiên bản, dùng bản stable theo như mặc định của Webinoly là đủ

Không cài đặt

Let’s Encrypt
Duply & Duplicity (Backups)
Postfix
Redis
Memcached
phpMyAdmin

Do mình không dùng bất cứ addon nào kể trên, nên không cài vào 😀

Tùy chỉnh nhỏ:

File swap: không sử dụng
Chuyển về giờ Việt Nam Hồ Chí Minh
Tắt HTTP Authentication
Cho phép chạy và download 3 extensions .zip .rar .sh

24GB RAM quá thừa, nên mình tắt tạo file swap

Mặc định Webinoly chặn khá nhiều phần mở rộng, do thi thoảng mình có upload 1 ít file có đuôi .zip .sh .rar nên cho 3 phần mở rộng này được phép chạy và download 😀

Xóa các Header

Referrer Policy Header successfully disabled!
HSTS Header successfully disabled!
Cache Control Header successfully disabled!
CSP Header successfully disabled!
Permissions Policy Header successfully disabled!
X-Robots-Tag Header successfully disabled!
X-XSS-Protection Header successfully disabled!
X-Content-Type-Options Header successfully disabled!
X-Frame-Options Header successfully disabled!

Do mình đang dùng Cloudflare để quản lý DNS, nên gần như mọi header thêm vào đều không có ý nghĩa gì cả, mình tắt hết đi cho sạch sẽ, cần thêm header gì thì các plugin cài đặt sẽ tự thêm

Tắt firewall trên Ubuntu

Mặc định trên Oracle, hệ điều hành Ubuntu luôn bật sẵn firewall, quá là phiền nên mình tắt hết đi cho dễ nhớ

PHP Configuration

max_execution_time = 6000
max_input_time = 6000
max_input_vars = 5000
memory_limit = 512M
upload_max_filesize = 1000000M
max_file_uploads = 6000
post_max_size = 1000000M
disable_functions = 
[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=4096
opcache.interned_strings_buffer=512
opcache.max_accelerated_files=100000
opcache.max_wasted_percentage=10

Cấu hình PHP không có gì đặc biệt lắm, tăng thời gian chạy các file php, tăng giới hạn upload file, không giới hạn hàm nào

Memory limit trên Wordpress các plugin nặng nhất cũng chỉ cần 256MB là kịch, thực tế sử dụng thì mình thấy PHP chạy bình thường loanh quanh ~180M, set lên 512M chủ yếu do thừa RAM quá 😛

2 giá trị cần chú ý là

opcache.memory_consumption=4096
opcache.interned_strings_buffer=512

Thường 2 con số ở 2 giá trị này sẽ theo 1 combo nhất định, ví dụ

opcache.memory_consumption=1024 -> opcache.interned_strings_buffer=128

opcache.memory_consumption=4096 -> opcache.interned_strings_buffer=512

Set opcache.interned_strings_buffer quá 1024 rất dễ khiến PHP bị lỗi

OPcache đang set max tới 4GB, mình nghĩ chắc cũng hiếm ai code php mà tới 4GB nổi lắm :]]

FPM Configuration

pm = static
pm.max_children = 4

Mặc định trên CPU nhiều core, Webinoly sẽ tự đổi sang dùng static để nâng cao hiệu năng, cụ thể trên VM Standard A1 Flex, Webinoly tăng pm.max_children thành 12, dùng hiệu quả

Lý thuyết pm.max_children càng cao, nó càng tốn nhiều RAM lãng phí, bù lại, do chạy sẵn PHP, nên khi trang của bạn tăng đột biến traffic, kiểu đùng cái có 100-200 người vào xem 1 bài viết gì đó, pm.max_children cao sẽ có hiệu quả

Tuy thế với cách phần lớn chúng ta cấu hình Wordpress, đa phần sẽ cache trang về html, nên pm.max_children cao hay thấp nó gần như không có tác dụng thực tế, vì khách vào xem toàn là Nginx load file html, PHP không sử dụng 😀

Sau khi thử nhiều giá trị, từ 12-24-64 cho tới 128, kết quả đều khá tương đồng, mính quay về con số cơ bản nhất, là dựa theo lượng core CPU, dùng giá trị pm.max_children = 4

Ở mức này, khi chạy, nó không dùng cạn kiệt tài nguyên CPU, chỉ chạy 95%-97% công xuất thực, mình thích cách vận hành như này hơn, nên duy trì giá trị này

MySQL Configuration

[mysqld]
general_log = 1
general_log_file = /var/log/mysql/mysql.log
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
long_query_time = 1
slow_query_log = 1
max_binlog_size = 160M
innodb_log_file_size = 160M
expire_logs_days = 14
sync_binlog = 1
log_error = /var/log/mysql/mysql-error.log
log_queries_not_using_indexes = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
performance_schema = 0
binlog_format = mixed

max_connections = 150
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 1024
max_allowed_packet = 500M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 128M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 8M
key_buffer_size = 256M
thread_cache_size = 64
query_cache_type = 1
query_cache_size = 64M
query_cache_limit = 2M
ft_min_word_len = 4

innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 14G
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M

innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 64M
myisam_max_sort_file_size = 10G
interactive_timeout = 28800
wait_timeout = 28800

[mysqldump]
quick
max_allowed_packet = 500M

[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M

Cấu hình MySQL này mình dùng dựa theo cài đặt của OneinStack

Giá trị duy nhất mình nghĩ cần quan tâm là innodb_buffer_pool_size, trên VPS 24GB RAM thì có thể dùng 20GB cho innodb_buffer_pool_size, mình đang để con số an toàn là 14G

Bạn hoàn toàn có thể bỏ hết các giá trị khác, chỉ sử dụng duy nhất innodb_buffer_pool_size = 14G cũng đủ

Vấn đề là hiện tại, không ai chạy trần 1 trang Wordpress cả, ai cũng cache sang html hoặc dùng Cloudflare cache, vừa giảm tải cho PHP, Mysql …. vừa tăng tốc độ load trang, nên chuyện bạn set innodb_buffer_pool_size là 20GB, 14GB hay mặc định 128MB, nó cũng không có ý nghĩa ở thực tế sử dụng 😀 vì chẳng bao giờ trang của bạn dùng hết các con số đó cả :((

Các con số mình điều chỉnh, có thể gọi là phù hợp ở cấu hình 4 OCPU 24GB RAM, còn hiệu quả thực tế của nó khi sử dụng, thì gần như không khác gì so với … cài đặt mặc định cả

Mình có chú thích vị trí các file và giá trị cụ thể để nếu thích, bạn có thể tự điều chỉnh lại cho phù hợp 😀

Nói chung bài này các setting lằng nhằng, đơn giản nhất thì cứ cài đặt Webinoly mặc định, sau đó sửa lại 4 giá trị bên dưới là xong

memory_limit = 512M
opcache.memory_consumption=1024
opcache.interned_strings_buffer=128
innodb_buffer_pool_size = 20GB

Thử hiệu năng với loader.io

Cài đặt 1 trang Wordpress mặc định, sau đó test hiệu năng trên loader.io

2023-07-09_10-00-51

Ở bài test 100 kết nối mỗi giây, tốc độ trung bình ~ 1s cho mỗi kết nối, con số khá tương đồng với cài đặt mặc định từ Webinoly

2023-07-09_10-07-27

Ở bài test 500 kết nối mỗi giây, tốc độ trung bình ~ 5s, tốt hơn cài đặt mặc định từ Webinoly 1 chút, tuy thế nói nghiêm túc thì 5s hay 6s nó cũng không khác nhau là mấy, vì ai cũng gào chậm cả 😀

Thử nghiệm thêm, không quan tâm tới tốc độ, mà chỉ xem liệu nó có thể pass nổi 1000 kết nối mỗi giây hay không?

2023-07-09_10-13-19

Ở bài test 1.000 kết nối mỗi giây, tốc độ trung bình ~ 8s, tỷ lệ lỗi tới 43% :]]

Giá trị mặc định trên pm.process_idle_timeout = 10s, nên các kết nối nào > 10s, sẽ tự coi như thất bại, không cho chạy nữa, nhờ thế ~ 3900 kết nối thành công mới có tốc độ 8s, không thì phải 12-13s là ít

Bài test loader.io thì mình test cho vui là chính, thực tế sử dụng, chắc chỉ có các forum, mới có tốc độ comment, views theo thời gian thực mỗi giây nhiều như thế, còn trên WordPress, mình chưa thấy blog nào mà 1s có 100 comment mới để mà tính toán số liệu kiểu này 😛

Với cấu hình VM.Standard.A1.Flex 4 OCPU, 24Gb RAM, 100GB HDD, mình nghĩ bạn thậm chí có thể làm 1 shop bán hàng cực to, mỗi giây có vài chục đơn hàng mới, mà không lo chậm, lag hay lỗi gì luôn ấy 😛

Comment policy: We love comments and appreciate the time that readers spend to share ideas and give feedback.
Notes: However, those deemed to be spam or solely promotional will be deleted.

You can create a Gravatar account, add avatar, then use that email to comment here, your account will have a more beautiful Avatar, easier to recognize with other members.

Please use real emails, you can receive notifications when comments are replied