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
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
Ở 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
Ở 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?
Ở 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 😛
Chính sách bình luận: Chúng tôi rất trân trọng các bình luận của bạn và cảm ơn thời gian bạn dành để chia sẻ ý tưởng và phản hồi.
Ghi chú: Những bình luận được xác định là spam hoặc chỉ mang tính quảng cáo sẽ bị xóa.
• Để cải thiện trải nghiệm bình luận, chúng tôi khuyến khích bạn tạo một tài khoản Gravatar. Thêm avatar vào tài khoản Gravatar sẽ giúp bình luận của bạn dễ nhận diện hơn đối với các thành viên khác.
• ✂️ Sao chép và 📋 Dán Emoji 💪 giúp bình luận thêm sinh động và thú vị!