Hardening php.ini cho Shared Hosting: Bảo mật và Tối ưu Apache & PHP-FPM trên Ubuntu 20.04+

Hardening php.ini cho Shared Hosting: Bảo mật và Tối ưu Apache & PHP-FPM trên Ubuntu 20.04+

Hardening php.ini cho Shared Hosting: Bảo mật và Tối ưu Apache & PHP-FPM trên Ubuntu 20.04+

Document này trình bày cách harden php.ini cho môi trường Shared Hosting chạy trên stack Apache và PHP-FPM trên Ubuntu 20.04+. Nội dung tập trung vào quản lý cấu hình PHP và OPcache thông qua php.ini để tăng cứng an ninh và tối ưu hiệu suất, phù hợp với hệ thống chia sẻ tài nguyên và yêu cầu bảo mật nghiêm ngặt.

Giới thiệu

Trong mô hình Shared Hosting, PHP được vận hành giữa Apache hoặc Nginx và PHP-FPM. Việc cấu hình và làm cứng php.ini đóng vai trò then chốt để giảm thiểu rủi ro từ dữ liệu người dùng và tối ưu hiệu suất phục vụ cùng lúc nhiều người dùng. Các yếu tố liên quan tập trung vào cách PHP xử lý dữ liệu người dùng, bảo mật báo cáo lỗi và đặc biệt tối ưu hóa thông qua OPcache. Tài liệu tham khảo choOPcache và các tham số PHP được trình bày trong phạm vi Runtime Configuration của PHP.

Kiến trúc và khái niệm cốt lõi

php.ini là nơi định hình hành vi của PHP tại thời điểm chạy. Các tùy chọn trong php.ini cho phép điều chỉnh cách PHP xử lý dữ liệu người dùng, cách quản lý tài nguyên, và cách tối ưu hiệu suất thông qua OPcache. Trong phần Open Cache (OPcache), các tham số như opcache.enable, opcache.memory_consumption, opcache.validate_timestamps và các tham số liên quan khác đóng vai trò chính trong việc quyết định cách PHP biên dịch và lưu trữ mã nguồn dưới dạng opcode để tăng tốc thực thi.

OPcache là một phần cấu hình runtime của PHP và có nhiều tùy chọn để tinh chỉnh. Những tham số này được mô tả chi tiết trong tài liệu Runtime Configuration, cho thấy cách opcache.enable, opcache.memory_consumption, opcache.validate_timestamps và các tham số khác ảnh hưởng đến hành vi của hệ thống PHP tại runtime. Việc bật OPcache và thiết lập đúng các tham số giúp giảm tải CPU và tăng tốc đáp ứng cho các request đồng thời. Nguồn tham khảo cho các tham số OPcache và cách chúng được mô tả trong php.ini được trình bày trong phần phụ lục của tài liệu này.

Yêu cầu và chuẩn bị

Đối với Ubuntu 20.04+, hệ thống áp dụng stack Apache và PHP-FPM cho môi trường Shared Hosting. Trong khối tài liệu này khuyến nghị bật OPcache và tùy biến các tham số liên quan ở mức phù hợp với tải trọng và giới hạn tài nguyên của máy chủ, sao cho vừa đảm bảo an toàn vừa tối ưu hiệu suất phục vụ nhiều tài khoản hosting cùng lúc. Nhắc lại rằng OPcache là một phần của runtime configuration và có các tham số có thể được bật/tắt và điều chỉnh thông qua php.ini, với các tham số chủ đạo được liệt kê và mô tả trong phần cấu hình OPcache của tài liệu này.

Cấu hình chính cho php.ini

Một phần cấu hình hardening cho php.ini tập trung vào OPcache và các tham số liên quan đến hành vi runtime. Dưới đây là danh sách các tham số OPcache quan trọng và giá trị tham khảo dựa trên tài liệu Runtime Configuration. Hãy áp dụng chúng vào php.ini của PHP-FPM (hoặc thông qua các pool cấu hình nếu phù hợp với hệ thống của bạn).

opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.max_wasted_percentage=5
opcache.use_cwd=1
opcache.validate_timestamps=1
opcache.revalidate_freq=2
opcache.save_comments=1
opcache.fast_shutdown=0
opcache.file_cache_consistency_checks=1
opcache.lockfile_path /tmp
opcache.opt_debug_level=0
opcache.jit disable
opcache.jit_buffer_size 64M

Ghi chú về các tham số:
– opcache.enable=1: Bật OPcache để lưu trữ và phục hồi opcode, giúp tăng tốc xử lý các yêu cầu PHP.
– opcache.enable_cli=0: Tắt OPcache cho CLI, tránh rò rỉ bộ nhớ và tăng tính ổn định cho các tác vụ dòng lệnh nếu có.
– opcache.memory_consumption=128: Dung lượng bộ nhớ dùng cho opcode cache, sử dụng 128 MB làm mặc định cho môi trường có tải trung bình đến cao.
– opcache.interned_strings_buffer=8: Dung lượng bộ nhớ cho các chuỗi nội dung được interned, giúp tối ưu tham chiếu chuỗi trong quá trình biên dịch.
– opcache.max_accelerated_files=10000: Giới hạn số lượng file PHP được cache để đáp ứng số lượng file code được tải đồng thời.
– opcache.max_wasted_percentage=5: Tỉ lệ phần trăm tối đa của bộ nhớ cache có thể tạm thời bị loại bỏ do thiếu mã nguồn hợp lệ.
– opcache.use_cwd=1: Tối ưu hóa caching theo thư mục làm việc hiện tại để tránh cache chung cho toàn bộ hệ thống.
– opcache.validate_timestamps=1: Theo dõi sự thay đổi timestamp của files để làm mới cache khi có thay đổi.
– opcache.revalidate_freq=2: Số lần lược bỏ cache hợp lệ trước khi làm mới khi có thay đổi file với tần suất thấp.
– opcache.save_comments=1: Lưu lại các nhận xét trong opcode để hỗ trợ debugging và tooling.
– opcache.fast_shutdown=0: Tắt chế độ shutdown nhanh để đảm bảo an toàn khi xử lý nhiều request đồng thời.
– opcache.file_cache_consistency_checks=1: Bật kiểm tra tính nhất quán cho cache file ở cấp độ hệ thống.
– opcache.lockfile_path /tmp: Định vị đường dẫn lockfile cho OPcache để hỗ trợ đồng bộ hóa truy cập cache trong môi trường đa tiến trình.
– opcache.opt_debug_level=0: Thiết lập mức debug tối thiểu cho OPcache để cân bằng giữa hiệu suất và khả năng chẩn đoán.
– opcache.jit=disable và opcache.jit_buffer_size=64M: Vô hiệu hóa JIT hoặc tinh chỉnh khi cần, phù hợp cho môi trường chia sẻ với PHP-FPM.

Những giá trị trên là tham khảo từ tài liệu Runtime Configuration và có thể điều chỉnh tùy theo phiên bản PHP đang chạy và tải trọng thực tế. Trong quá trình triển khai, nên bắt đầu với các giá trị an toàn và theo dõi hiệu suất, sau đó tinh chỉnh dần dần.

Bảo mật và thực hành an toàn liên quan đến php.ini

Các khía cạnh an ninh liên quan đến PHP có thể được ảnh hưởng bởi php.ini ở nhiều mức độ. Các nội dung sau đây dựa trên phân tích của tài liệu liên quan đến bảo mật và cấu hình PHP:

  • Quản lý dữ liệu người dùng và xử lý dữ liệu người nộp: php.ini có vai trò quyết định cách PHP xử lý dữ liệu người dùng, vì vậy nên giới hạn các cơ chế nhận dữ liệu và đảm bảo xác thực người dùng ở mức ứng dụng. Đảm bảo các tham số như báo cáo lỗi được kiểm soát để không làm lộ thông tin nhạy cảm ra bên ngoài.
  • Bảo mật báo cáo lỗi: Thiết lập sao cho lỗi hệ thống không bị hiển thị công khai, và log được ghi lại cho phân tích sự cố sau này. Yếu tố này nằm ở mục giới thiệu an ninh tổng thể và ảnh hưởng tới chuyển đổi cấu hình php.ini theo hướng an toàn.
  • Quản lý dữ liệu nhúng và tải lên tệp: PHP có cơ chế xử lý file uploads và dữ liệu người dùng; php.ini được dùng để giới hạn kích thước tải lên và các tham số liên quan tới xử lý dữ liệu người dùng.
  • Ẩn thông tin và giảm fingerprint hệ thống: trong khía cạnh an ninh, ẩn thông tin về môi trường thực thi cũng là mục tiêu có thể được cân nhắc thông qua php.ini và cấu hình máy chủ.

Những nguyên tắc này được mô tả trong tài liệu Security Introduction đi kèm với tài liệu Runtime Configuration và được áp dụng đồng bộ với các tham số OPcache ở trên để tối ưu cả bảo mật lẫn hiệu suất trong môi trường shared hosting.

Hiệu suất và tối ưu hóa

OPcache đóng vai trò then chốt trong tối ưu hiệu suất của PHP khi chạy trên PHP-FPM và Apache. Việc bật OPcache và tinh chỉnh các tham số liên quan có thể giảm tải CPU và cải thiện thời gian đáp ứng cho nhiều người dùng cùng lúc. Trong tài liệu Runtime Configuration, OPcache được trình bày với các tham số có thể điều chỉnh và ảnh hưởng trực tiếp đến cách PHP biên dịch và lưu trữ opcode. Việc tối ưu dựng lên từ các tham số như bộ nhớ cache, số file được cache, thời gian làm mới cache và cách thức xử lý các file có thể tạm thời ảnh hưởng tới hiệu suất theo từng trường hợp cụ thể.

Đối với môi trường Ubuntu 20.04+ chạy Apache và PHP-FPM, việc tối ưu hóa OPcache nên cân nhắc các yếu tố sau:

  • Dung lượng bộ nhớ cho OPcache phụ thuộc tải trọng và giới hạn tài nguyên. Với số lượng file code và số request đồng thời, việc tăng memory_consumption có thể cải thiện hiệu suất, lưu ý không vượt quá giới hạn RAM có sẵn để tránh swapping.
  • Kiểm soát thời gian làm mới cache và theo dõi timestamp để cân bằng giữa tính đồng bộ và hiệu suất. Tham số validate_timestamps và revalidate_freq cho phép bạn xác định tần suất làm mới khi có sự thay đổi mã nguồn.
  • Khung chữ ký và cấu hình JIT (Just-In-Time compilation) có thể được tắt hoặc bật tùy phiên bản và workload. Trong môi trường chia sẻ, khởi đầu với chế độ disable JIT là an toàn, và kích hoạt khi có nhu cầu tối ưu hóa thêm.

Việc áp dụng các tham số OPcache như đã nêu sẽ giúp tối ưu hiệu suất cho các ứng dụng chạy trên PHP-FPM và phục vụ đồng thời nhiều tài khoản hosting mà không làm tăng rủi ro bảo mật. Đây là một trong các bước then chốt trong quá trình hardening php.ini cho môi trường shared hosting.

Giám sát và quan sát hiệu suất

Việc theo dõi trạng thái hoạt động của OPcache và PHP là cần thiết để xác định hiệu suất và mức độ ổn định của hệ thống. Trong thực tiễn, hãy theo dõi các chỉ số liên quan đến OPcache và log lớp runtime để có thể điều chỉnh cấu hình khi tải trọng thay đổi. Các tham số OPcache được mô tả ở mục trên là cơ sở để bạn thiết lập và so sánh khi phân tích hiệu suất hệ thống, đồng thời kết hợp với các biện pháp bảo mật đã đề cập ở phần trước.

Kiểm tra và xác thực cấu hình

Để xác nhận rằng cấu hình php.ini đã được áp dụng đúng, bạn có thể thực hiện các bước sau đây, dựa trên các tham số OPcache đã thiết lập ở trên:

  • Xác nhận OPcache đang được bật và các tham số chính đang có hiệu lực bằng cách kiểm tra cấu hình runtime của PHP thông qua các công cụ quản trị hoặc bằng cách xem các tệp log phù hợp của PHP-FPM và Apache.
  • Kiểm tra tính hợp lệ của các file code và thời gian làm mới cache, đảm bảo rằng hệ thống sẽ làm mới đúng theo thiết lập revalidate_freq và validate_timestamps để đảm bảo rằng các bản vá và cập nhật mã nguồn được phản ánh kịp thời.
  • Đảm bảo rằng các tham số bảo mật liên quan đến báo cáo lỗi và ghi log được áp dụng đúng cách để ngăn rò rỉ thông tin nhạy cảm ra bên ngoài.

Những thực hành trên đều dựa trên nguyên tắc được mô tả trong tài liệu Runtime Configuration và Security Introduction và áp dụng một cách nhất quán với hệ thống Apache và PHP-FPM trên Ubuntu 20.04+.

Checklist vận hành cuối cùng

    <li Xác định phiên bản PHP đang chạy và đường dẫn tới php.ini cho PHP-FPM và Apache để áp dụng cấu hình đúng cho mỗi pool hoặc vhost nếu cần. <li Bật OPcache và áp dụng các tham số đã liệt kê ở mục Cấu hình chính. <li Giới hạn và định lượng tải: thiết lập memory_consumption phù hợp với RAM sẵn có và tải trọng tối đa dự kiến. <li Thiết lập revalidate_freq và validate_timestamps để cân bằng giữa tính đúng đắn của cache và hiệu suất. <li Đảm bảo an toàn báo cáo lỗi và không hiển thị thông tin nhạy cảm cho người dùng. <li Theo dõi hiệu suất sau khi triển khai và điều chỉnh tham số OPcache theo nhu cầu.

Kết luận

Hardening php.ini cho môi trường Shared Hosting là một phần quan trọng của quy trình quản trị hệ thống. Việc bật và tối ưu OPcache thông qua các tham số trong php.ini không chỉ giúp cải thiện hiệu suất phục vụ nhiều tài khoản mà còn góp phần tăng cường bảo mật bằng cách quản lý cách PHP xử lý và cache mã nguồn. Với Ubuntu 20.04+ và stack Apache cùng PHP-FPM, bạn có thể áp dụng các tham số OPcache được mô tả ở đây và điều chỉnh dựa trên tải trọng thực tế của máy chủ. Hãy duy trì một chu kỳ kiểm tra cấu hình và hiệu suất để đảm bảo hệ thống luôn ở trạng thái an toàn và tối ưu nhất cho người dùng cuối.

MariaDB/MySQL Performance Tuning: Tối ưu hóa InnoDB Buffer Pool cho RAM lớn trên CentOS

MariaDB/MySQL Performance Tuning: Tối ưu hóa InnoDB Buffer Pool cho RAM lớn trên CentOS

Giới thiệu

Trong môi trường sản xuất chạy MariaDB hoặc MySQL, tối ưu hóa InnoDB Buffer Pool là một trong những hoạt động quan trọng nhất để tận dụng RAM lớn và đảm bảo hiệu năng ổn định cho các workload có lượng dữ liệu và truy vấn lớn. Buffer Pool là vùng nhớ được engine InnoDB dùng để lưu trữ dữ liệu và index đang được truy cập, giúp giảm I/O đĩa và tăng tốc độ trả kết quả truy vấn. Khi RAM trên máy chủ đủ lớn, việc điều chỉnh kích thước và cấu hình Buffer Pool có thể mang lại hiệu suất xử lý đáng kể, đặc biệt trên hệ thống CentOS/khác tương thích. Tài liệu tham khảo liên quan đến tối ưu hóa bộ nhớ đệm và đặc biệt là InnoDB Buffer Pool được đề cập trong tài liệu tối ưu hóa của MariaDB và tài liệu tối ưu hóa của MySQL.

Kiến thức cốt lõi và kiến trúc liên quan đến InnoDB Buffer Pool

InnoDB Buffer Pool là khu vực nhớ được InnoDB dùng để nắm giữ dữ liệu và các trang chỉ mục (index pages) đang được truy cập. Mục tiêu của Buffer Pool là tối ưu hóa tỷ lệ truy cập dữ liệu từ RAM thay vì phải đọc từ đĩa vật lý, từ đó giảm độ trễ và tăng thông lượng. Khi RAM lớn và workload đòi hỏi, việc phân bổ Buffer Pool thành nhiều khu vực (buffer pool instances) có thể cải thiện đồng thời truy cập từ nhiều CPU. Các tài liệu liên quan nhắc tới tầm quan trọng của Buffers, Caches và Threads cũng như cách tối ưu hóa tác động của các yếu tố này lên hiệu năng tổng thể của hệ thống. Ngoài ra, các hướng dẫn liên quan đến tối ưu hóa I/O và cấu hình lưu trữ của InnoDB đều được đề cập trong các tài liệu tham khảo của MySQL và MariaDB.

Trong cấu trúc của InnoDB, Buffer Pool không chỉ lưu dữ liệu mà còn lưu các trang thuộc chỉ mục, dữ liệu đã ghi và các trang được truy cập gần đây theo nguyên tắc LRU. Khi RAM được cấp đủ lớn, việc tăng kích thước Buffer Pool và chia nó thành nhiều phiên bản (buffer pool instances) có thể giảm contention ở cấp cơ sở dữ liệu và tăng đồng thời thông lượng cho các multi-core hệ thống. Tuy nhiên, việc cấp quá nhiều RAM cho Buffer Pool có thể gây ra hiệu ứng ngược, khiến hệ điều hành không còn đủ RAM cho các tác vụ nền hoặc các tiến trình khác. Do đó, quá trình tối ưu cần căn cứ vào tổng RAM, đặc điểm workload và yêu cầu độ trễ mục tiêu.

Chuẩn bị và xem xét hệ thống trước khi điều chỉnh

Trước khi điều chỉnh, hãy thực hiện các bước chuẩn bị cơ bản để đảm bảo an toàn và có thể kiểm tra được tác động của thay đổi:

  • Xác định tổng RAM và trạng thái sử dụng bộ nhớ của hệ thống. Sử dụng các lệnh như free -h và top -bn1 để có cái nhìn tổng quan về memory và swap. Đối với CentOS/điểm đến tương thích, hãy ghi nhận lượng RAM có sẵn dành cho cơ sở dữ liệu và các tiến trình hệ thống.
  • Xác định phiên bản MariaDB/MySQL đang chạy và đường dẫn tới tệp cấu hình. Thông thường tệp cấu hình nằm ở /etc/my.cnf hoặc /etc/mysql/my.cnf, hoặc các tệp cấu hình bổ sung trong thư mục /etc/my.cnf.d/ (điều này phụ thuộc phân phối và gói cài đặt).
  • <liLưu trữ và sao lưu cấu hình trước khi thay đổi. Việc quay lại cấu hình cũ là bảo đảm nếu có sự cố khi cân chỉnh Buffer Pool. <liXác định workload và mục tiêu hiệu năng. Nếu workload chủ yếu đọc dữ liệu, Buffer Pool kích thước lớn có thể mang lại lợi ích lớn; với workload ghi nhiều, cần cân nhắc thêm tới kích thước log và cách flush dữ liệu ra đĩa.

Cấu hình chính cho InnoDB Buffer Pool trên CentOS

Theo khuyến nghị chung trong tài liệu tối ưu hóa InnoDB và các phần liên quan, mục tiêu là đảm bảo Buffer Pool đủ lớn để chứa tập dữ liệu làm việc nóng (working set) và giảm thiểu IO đĩa, đồng thời không chiếm quá mức RAM cho hệ điều hành và các process khác. Đối với hệ thống có RAM lớn và dành riêng cho database, bạn có thể xem xét tăng kích thước Buffer Pool và phân bổ số lượng buffer pool instances phù hợp với số lõi CPU để tối ưu hoá đồng thời truy cập. Việc chia Buffer Pool thành nhiều instances có thể giúp giảm contention giữa các worker threads khi hệ thống có lưu lượng truy cập cao.

Dưới đây là các nguyên tắc và các biến cấu hình liên quan hay được đề cập trong tài liệu tối ưu hóa InnoDB. Bạn có thể áp dụng chúng như một khung tham khảo để xây dựng cấu hình phù hợp với hệ thống của mình. Lưu ý rằng các giá trị xuất hiện trong ví dụ là minh hoạ và cần được điều chỉnh dựa trên tổng RAM và workload thực tế.

[mysqld]
# Kích thước Buffer Pool cho InnoDB
innodb_buffer_pool_size = 64G
# Số lượng buffer pool instances (nên điều chỉnh theo number of CPU cores và RAM)
innodb_buffer_pool_instances = 8
# Kích thước log InnoDB để tối ưu I/O liên quan tới buffer pool
innodb_log_file_size = 4G
innodb_log_files_in_group = 2

Ghi chú:

  • innodb_buffer_pool_size nên được cân nhắc dựa trên tổng RAM của hệ thống và mức độ dành cho hệ điều hành. Trong môi trường riêng biệt cho cơ sở dữ liệu, Buffer Pool chiếm phần lớn RAM nhằm giảm IO đĩa và tăng thông lượng đọc/ghi dữ liệu.
  • <liinnodb_buffer_pool_instances nên được xác định dựa trên số lõi CPU và kích thước Buffer Pool. Mục tiêu là phân tách vùng nhớ để giảm contention giữa các luồng truy cập đồng thời. <liinnodb_log_file_size và số lượng nhóm log InnoDB có thể ảnh hưởng tới I/O và thời gian phục hồi. Điều chỉnh chúng song song với Buffer Pool để tối ưu chu kỳ flush và checkpoint.

Bên cạnh Buffer Pool, các yếu tố liên quan khác của InnoDB cần được xem xét để tối ưu hóa hiệu năng trên hệ thống RAM lớn, bao gồm tối ưu hóa I/O của đĩa và cấu hình log. Tài liệu đề cập đến các phần như tối ưu hoá I/O đĩa cho InnoDB và tối ưu hoá cấu hình InnoDB nói chung, nhằm cải thiện hiệu suất đọc/ghi và thời gian phản hồi. Bạn có thể tham khảo phần liên quan để điều chỉnh các tham số khác nếu workload của bạn đòi hỏi.

Ví dụ thực hành trên CentOS

Dưới đây là một quy trình thực hành thực tế để áp dụng tối ưu InnoDB Buffer Pool trên CentOS hoặc hệ điều hành tương thích, kèm theo các lệnh kiểm tra và xác thực cơ bản:

  1. Kiểm tra tổng quan hệ thống và xác định nhu cầu RAM cho database:
free -h
lscpu | grep -E "^Architecture|^CPU|^Socket|^Core|^Thread|^MHz"
  1. Sao lưu cấu hình hiện tại và tệp cấu hình MySQL/MariaDB:
cp /etc/my.cnf /etc/my.cnf.bak.$(date +%F-%T)
# Nếu có tệp cấu hình bổ sung, sao lưu thêm các tệp trong /etc/my.cnf.d/
  1. Chỉnh sửa tệp cấu hình để cập nhật Buffer Pool và các tham số liên quan. Ví dụ với MariaDB/MySQL ở CentOS, có thể thêm hoặc cập nhật các dòng sau trong phần [mysqld]:
[mysqld]
innodb_buffer_pool_size = 64G
innodb_buffer_pool_instances = 8
innodb_log_file_size = 4G
innodb_log_files_in_group = 2
  1. Khởi động lại dịch vụ để áp dụng cấu hình:
systemctl restart mariadb
systemctl status mariadb -l
  1. Xác nhận cấu hình đã được áp dụng và hiệu năng được cải thiện:
mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_instances';"
  1. Kiểm tra trạng thái và hiệu năng thời gian thực:
SHOW ENGINE INNODB STATUS\G
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_free';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';

Trong quá trình vận hành, theo dõi các chỉ số trên sẽ cho biết Buffer Pool có đang hoạt động như mong muốn hay không. Nếu buffer pool quá lớn so với RAM còn lại dành cho hệ điều hành và các process, hệ thống có thể bắt đầu swap và hiệu năng sẽ suy giảm. Ngược lại, nếu buffer pool quá nhỏ, workload sẽ phải đọc từ đĩa nhiều hơn và làm giảm thông lượng. Việc điều chỉnh là một quá trình lặp, dựa trên dữ liệu giám sát thực tế.

Bảo mật và an toàn khi tối ưu hóa

Khi thay đổi cấu hình liên quan đến bộ nhớ và I/O, cần đảm bảo quyền truy cập hợp lệ và không cấp quyền rộng rãi cho người dùng không đáng tin cậy. Cấu hình này ảnh hưởng đến toàn bộ tiến trình của máy chủ cơ sở dữ liệu và có thể ảnh hưởng đến thời gian hồi cứu (recovery) và bảo vệ dữ liệu trong trường hợp xảy ra mất điện hoặc hệ thống khởi động lại. Để giảm thiểu rủi ro, luôn sao lưu cấu hình và kiểm tra kỹ lưỡng trên môi trường staging trước khi áp dụng cho hệ thống sản xuất.

Hiệu năng và giám sát liên tục

Buffer Pool là thành phần then chốt trong hiệu năng InnoDB. Khi RAM lớn, mục tiêu là dựa vào kích thước Buffer Pool để giảm IO đĩa và tăng tốc độ truy vấn. Tuy vậy, bạn cần cân nhắc giữa kích thước Buffer Pool và RAM dành cho hệ điều hành, cũng như các tiến trình hệ thống khác. Các tài liệu (của MariaDB và MySQL) nhấn mạnh vai trò của Buffer Pool và các yếu tố liên quan như tối ưu hóa I/O, tối ưu hóa cấu hình biến và monitoring để có thể đánh giá và điều chỉnh đúng cách.

Để giám sát hiệu năng và đảm bảo chúng ta đạt được mục tiêu, sử dụng các công cụ và phương pháp sau đây:

  • Giám sát kích thước Buffer Pool và số lượng trang được chứa bằng cách tra cứu các biến và trạng thái liên quan trong MySQL/MariaDB và InnoDB Status.
  • Kích hoạt và theo dõi performance_schema để có cái nhìn về hoạt động của các câu truy vấn và tài nguyên DB.
  • Theo dõi hoạt động IO và thời gian phản hồi qua các chỉ số về IO và log liên quan tới InnoDB.

Validation và kiểm tra hiệu năng

Để xác nhận rằng việc tối ưu Buffer Pool mang lại hiệu năng như mong đợi, thực hiện các bước kiểm tra sau:

  • So sánh thời gian đáp ứng trước và sau khi điều chỉnh với các truy vấn điển hình của workload thực tế.
  • Đánh giá thông lượng (throughput) và tổng số IO từ hệ điều hành và từ InnoDB.
  • Kiểm tra sự ổn định của memory usage và số lần swap nếu có; tối ưu Buffer Pool nếu thấy hệ thống bắt đầu swap quá nhiều.

Kết luận và checklist vận hành

Tối ưu hóa InnoDB Buffer Pool cho RAM lớn trên CentOS là một quá trình cân bằng giữa kích thước bộ nhớ dành cho InnoDB và nhu cầu của hệ điều hành cùng các process. Sử dụng các biến cấu hình như innodb_buffer_pool_size và innodb_buffer_pool_instances một cách thận trọng, kết hợp với việc tối ưu log và I/O, sẽ mang lại sự cải thiện về thông lượng và thời gian đáp ứng cho hầu hết các workload có dung lượng dữ liệu lớn. Hãy thực hiện các bước kiểm tra, giám sát và điều chỉnh một cách có hệ thống để đảm bảo an toàn, ổn định và hiệu quả cho môi trường sản xuất.

Danh sách vận hành cuối cùng

    <li Xác định tổng RAM và workload để xác định kích thước Buffer Pool phù hợp. <li Sao lưu cấu hình và chuẩn bị quy trình khôi phục cấu hình. <li Cập nhật các tham số innodb_buffer_pool_size và innodb_buffer_pool_instances phù hợp với hệ thống. <li Khởi động lại dịch vụ và xác nhận cấu hình đã được áp dụng. <li Giám sát InnoDB Status và performance_schema để đánh giá hiệu năng và điều chỉnh thêm nếu cần. <li Thực hiện kiểm tra định kỳ và cập nhật cấu hình theo thay đổi workload hoặc phần cứng.

Kết thúc

Bài viết này cung cấp khung tham khảo dựa trên các nguyên tắc tối ưu hóa Buffer Pool đã được thảo luận trong tài liệu tối ưu hóa của MariaDB và MySQL. Việc áp dụng cần được điều chỉnh theo đặc thù của hệ thống, workload và ngân sách phần cứng của bạn. Luôn ưu tiên xác nhận bằng các thử nghiệm thực tế và giám sát liên tục để duy trì hiệu năng ổn định và an toàn dữ liệu.

NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên Ubuntu 20.04+

NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên Ubuntu 20.04+

Giới thiệu

Bài viết này trình bày cách cấu hình NGINX High Performance để thực hiện load balancing và quản lý persistence ở lớp ứng dụng (Layer 7) trên nền tảng Ubuntu 20.04+ hoặc các phân phối tương thích. Tài liệu tập trung vào cách sử dụng ngx_http_upstream_module để định nghĩa nhóm máy chủ backend và cách NGINX phân phối lưu lượng giữa chúng, đồng thời nêu rõ các tham số và chiến lược liên quan đến độ sẵn sàng và hiệu suất hệ thống. Các tham chiếu kỹ thuật từ tài liệu chính thức của NGINX cho phép triển khai một mô hình cân bằng tải ổn định, có khả năng mở rộng và dễ bảo trì trong môi trường sản xuất.

Kiến trúc và khái niệm cốt lõi

Nguyên lý cốt lõi của NGINX khi làm load balancer ở lớp ứng dụng được đóng gói trong module upstream. Module ngx_http_upstream_module cho phép định nghĩa một nhóm các máy chủ backend mà có thể được tham chiếu từ các directive như proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass, và grpc_pass. Định nghĩa này nằm trong một khối upstream và có thể có nhiều máy chủ với các tham số khác nhau. Ví dụ một khối upstream có thể trỏ tới nhiều máy chủ và cả socket UNIX để tối ưu hóa hiệu suất và tính sẵn sàng.

Khái niệm cơ bản: một upstream định nghĩa một tập máy chủ mà NGINX có thể gửi request tới. Các máy chủ có thể ở các cổng khác nhau hoặc thậm chí là UNIX-domain socket. Mặc định, NGINX phân phối các yêu cầu giữa các máy chủ bằng phương pháp cân bằng vòng quay có trọng số (weighted round-robin). Điều này cho phép ưu tiên một máy chủ nhất định bằng cách gán trọng số cao cho nó để nhận nhiều yêu cầu hơn so với các máy chủ còn lại. Ngoài ra, NGINX hỗ trợ các phương pháp cân bằng khác như hash, ip_hash và random, để đáp ứng các yêu cầu khác nhau về persistence và phân bổ lưu lượng.

Các tham số quan trọng được định nghĩa cho mỗi máy chủ trong upstream:

  • weight: xác định trọng số của máy chủ để ảnh hưởng tới phân phối lưu lượng. Trọng số càng cao, máy chủ nhận càng nhiều yêu cầu so với các máy chủ khác.
  • max_conns: giới hạn số kết nối đồng thời tới máy chủ backend (một giới hạn áp dụng nếu upstream nằm trong RAM chia sẻ và có nhiều worker).
  • max_fails: số lần thử không thành công liên tiếp với máy chủ, được đếm trong thời gian được chỉ định bởi fail_timeout để xem máy chủ có còn hợp lệ hay không.
  • fail_timeout: khoảng thời gian trong đó một số lần thử không thành công được xem là máy chủ bị unavailable.
  • backup: đánh dấu máy chủ là máy chủ sao lưu; các yêu cầu sẽ được chuyển tới máy chủ sao lưu khi các máy chủ chính không thể phục vụ.
  • down: đánh dấu máy chủ là unavailable vĩnh viễn.
  • resolve: quan sát sự thay đổi của địa chỉ IP tương ứng với tên miền của máy chủ và tự động cập nhật upstream mà không cần khởi động lại nginx (yêu cầu cấu hình resolver ở khối http hoặc upstream).
  • service: cho phép tra cứu DNS SRV và thiết lập tên dịch vụ.

Để vận hành ở mức độ cao hơn, cơ chế kiểm tra sức khỏe (health checks) có thể được bật, nhưng trong các phiên bản thương mại của NGINX. Ví dụ trong tài liệu tham khảo, khối upstream có thể sử dụng health_check để theo dõi tình trạng của backend.

Điểm đặc thù quan trọng khác là cách xác định địa chỉ của backend. Địa chỉ có thể là tên miền hoặc địa chỉ IP, và nếu không chỉ định port thì mặc định sẽ là cổng 80. Một tên miền có thể resolve thành nhiều địa chỉ IP sẽ tạo ra nhiều máy chủ backend cùng lúc. Thêm vào đó, tham số resolve cho phép cập nhật địa chỉ khi thay đổi DNS mà không cần khởi động lại nginx. Ngược lại, tham số backup sẽ đánh dấu một máy chủ phụ để nhận yêu cầu khi các máy chủ chính gặp sự cố. Những khía cạnh này cho phép thiết kế cơ chế cân bằng tải bền vững và có khả năng phục hồi đúng theo nhu cầu vận hành.

Yêu cầu và chuẩn bị

Đối với kiến trúc NGINX High Performance triển khai trên nền tảng Ubuntu 20.04+ hoặc các bản phân phối tương thích, cần đảm bảo một số yếu tố cơ bản sau:

  • Nguyên tắc cơ bản: NGINX được triển khai với các module cần thiết để định nghĩa upstream và thực thi proxy cho các backend HTTP hoặc các dạng kết nối khác (ví dụ FastCGI, uwsgi, memcached, grpc). Tham chiếu từ tài liệu cho upstream cho thấy các module như ngx_http_upstream_module và các module liên quan khác có thể được tích hợp tùy thuộc vào gói cài đặt của bạn.
  • Khả năng đọc / cập nhật DNS cho upstream động: nếu bạn dùng resolve và SRV records, cần có resolver được chỉ định ở khối http hoặc upstream để cho phép cập nhật địa chỉ backend khi DNS thay đổi.
  • Khả năng kiểm tra sức khỏe (health checks): một số tính năng nâng cao cho upstream có thể yêu cầu gói thương mại của NGINX để sử dụng health_check và các cơ chế phức tạp khác.

Trong tài liệu tham khảo, các khía cạnh trên nhấn mạnh sự linh hoạt của upstream và khả năng tinh chỉnh phân phối tải thông qua các tham số và các phương thức cân bằng để phù hợp với từng môi trường sản xuất.

Cấu hình chính

Phần cấu hình dưới đây minh họa một khối upstream cơ bản và một cấu hình server để phân phối lưu lượng đến nhiều backend. Đây là mẫu tham khảo và có thể được áp dụng trên Ubuntu 20.04+ hoặc các hệ thống tương đương có NGINX được biên dịch với module upstream.

upstream backend {
  server backend1.example.com weight=5;
  server backend2.example.com:8080;
  server unix:/tmp/backend3;
  server backup1.example.com:8080 backup;
  server backup2.example.com:8080 backup;
}
server {
  listen 80;
  location / {
    proxy_pass http:// backend ;
  }
}

Cấu hình ở trên cho phép phân phối tải qua các máy chủ backend xác định với các tham số trọng số, cổng khác nhau và cả socket UNIX. Máy chủ backup được gán để nhận yêu cầu khi các máy chủ chính gặp sự cố. Mặc định, NGINX sẽ sử dụng phương pháp cân bằng vòng quay có trọng số giữa các máy chủ trong upstream.

Để làm rõ cách phân phối lưu lượng, hãy tham khảo ví dụ dưới đây. Trong ví dụ này, mỗi chu kỳ 7 yêu cầu sẽ được phân phối như sau: 5 yêu cầu tới backend1.example.com, và mỗi máy chủ backend2 và backend3 nhận 1 yêu cầu. Điều này thể hiện rõ cơ chế trọng số tác động như thế nào tới phân bổ lưu lượng.

upstream dynamic {
  zone upstream_dynamic 64k;
  server backend1.example.com weight=5;
  server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
  server 192.0.2.1 max_fails=3;
  server backend3.example.com resolve;
  server backend4.example.com service=http resolve;
  server backup1.example.com:8080 backup;
  server backup2.example.com:8080 backup;
}
server {
  location / {
    proxy_pass http:// dynamic ;
    health_check;
  }
}

Ghi chú về mẫu nâng cao ở trên: khối upstream dynamic cho thấy cách định danh zone cho nhóm máy chủ, cho phép các máy chủ có các trạng thái khác nhau và khả năng tra cứu DNS SRV thông qua tham số service và resolve. Cú pháp health_check ở cuối khối server cho thấy một ví dụ về việc giám sát sức khỏe — điều này có thể được kích hoạt trong các phiên bản thương mại của NGINX để thực thi kiểm tra liên tục đối với các backend.

Cân bằng tải và persistence ở lớp 7

Ngữ cảnh cân bằng tải ở lớp 7 phụ thuộc vào cách bạn xác định các máy chủ backend và cách NGINX phân phối lưu lượng giữa chúng. Mặc định, upstream sử dụng phương pháp cân bằng vòng quay có trọng số, nhưng các phương pháp khác như hash, ip_hash và random cũng được nhắc tới như các tùy chọn cân bằng có thể áp dụng cho các tình huống khác nhau. Việc ưu tiên các backend hoặc thiết lập persistence có thể dựa vào các tham số của upstream và cách bạn cấu hình proxy_pass tới upstream để đảm bảo tính nhất quán của các phiên làm việc.

Ví dụ thực tế và giải thích cấu hình

  • Upstream backend với năm máy chủ backend và hai máy chủ backup. Trọng số cao hơn cho backend1 để ưu tiên xử lý; các máy chủ backup nhận khi các máy chủ chính không khả dụng.
  • Upstream dynamic cho phép quản lý địa chỉ động theo DNS và có tùy chọn resolve để cập nhật mà không cần restart nginx. Đoạn cấu hình mẫu cho health_check cho thấy tính năng giám sát sức khỏe có thể được kích hoạt khi cần thiết (điểm lưu ý là health_check có thể là phần của các phiên bản thương mại).

Bảo mật và tuân thủ

Khi triển khai load balancing ở lớp 7, cần lưu ý yếu tố bảo mật liên quan đến giao thức và TLS ở phía máy chủ. NGINX hỗ trợ các module liên quan như ngx_http_ssl_module để xử lý TLS cho các kết nối tới backend hoặc đi qua proxy. Việc xác thực và quản lý số lượng kết nối tới backend cũng có thể ảnh hưởng đến bảo mật và tuân thủ vận hành. Tài liệu tham khảo cho upstream cho thấy các module liên quan và các cơ chế để đảm bảo kết nối an toàn và hiệu quả, đồng thời cho phép giám sát và vận hành ở mức độ chấp nhận được trong môi trường prod.

Hiệu suất và tối ưu hóa

Hiệu suất của hệ thống phụ thuộc vào cách bạn cấu hình upstream và các tham số liên quan. Ví dụ, tham số weight cho mỗi máy chủ cho phép tối ưu hóa phân bổ tải theo mức độ ưu tiên của backend. Tham số max_conns giúp giới hạn số kết nối đồng thời đến từng backend, từ đó ngăn ngừa tình trạng quá tải và giảm thiểu tác động đến các backend khác. Failover và fail_timeout cho phép hệ thống quay vòng và phục hồi khi một backend gặp sự cố, giúp hệ thống duy trì khả năng phục vụ ổn định ngay cả khi một phần hệ thống gặp sự cố.

Quan sát và giám sát

Khả năng giám sát hiệu suất và tình trạng của upstream là một phần quan trọng của vận hành NGINX. Tài liệu liên quan cho thấy danh sách modules của NGINX bao gồm các module hỗ trợ giám sát và quản lý trạng thái, như ngx_http_stub_status_module và ngx_http_upstream_module. Việc theo dõi sức khỏe và trạng thái của backend giúp bạn nhận diện sớm các vấn đề và tối ưu lại cấu hình khi cần thiết. Trong một số trường hợp, health_check có thể được kích hoạt để có cái nhìn chi tiết về sức khỏe của từng backend trong upstream.

Kiểm tra và validation

Để đảm bảo cấu hình upstream hoạt động đúng, bạn nên thực hiện các bước kiểm tra sau:

  • Kiểm tra cú pháp và hợp lệ của tập cấu hình liên quan đến upstream và proxy_pass, sau đó nạp lại NGINX khi cần. Bạn nên theo dõi log để xác định các lỗi cú pháp hoặc lỗi liên quan tới backend.
  • Kiểm tra sự phân phối lưu lượng giữa các backend bằng cách gửi các yêu cầu tới các địa chỉ frontend và quan sát phản hồi. Theo dõi trạng thái trả về từ các backend và mức độ đáp ứng của từng máy chủ để điều chỉnh trọng số hoặc kết cấu liên quan.
  • Đối với các khối upstream có quyền truy cập DNS, kiểm tra DNS resolution và sự thay đổi địa chỉ khi DNS thay đổi. Đảm bảo resolver được cấu hình đúng để cập nhật upstream mà không cần restart.

Checklist vận hành

  • Đảm bảo upstream chứa danh sách máy chủ backend đúng và có thể đáp ứng tải.
  • Kiểm tra tham số weight và backup để tối ưu phân phối tải và khả năng phục hồi.
  • Xác nhận khả năng resolve cho DNS và SRV nếu bạn dựa vào cơ chế này để định danh backend.
  • Theo dõi log và trạng thái của backend để phát hiện sớm sự cố và kích hoạt cơ chế failover.

Kết luận

Cấu hình NGINX Upstream để load balancing và persistence ở lớp 7 trên Ubuntu 20.04+ mang lại khả năng phân phối lưu lượng linh hoạt, khả năng mở rộng và độ sẵn sàng cao cho các ứng dụng web. Việc sử dụng các tham số như weight, max_conns, fail_timeout và backup cho upstream cho phép tùy chỉnh hành vi phân phối và phục hồi khi backend gặp sự cố. Đồng thời, khả năng resolve và service cho DNS SRV cung cấp cơ chế quản lý địa chỉ backend động mà không làm gián đoạn dịch vụ. Để đạt được hiệu quả tối ưu, hãy thiết kế cấu hình dựa trên nhu cầu thực tế, theo dõi và thử nghiệm cẩn thận trong môi trường prod.

Tối ưu NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên CentOS

Tối ưu NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên CentOS

Tối ưu NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên CentOS

Trong môi trường CentOS và các hệ thống tương thích, NGINX High Performance cung cấp cơ chế load balancing và khả năng giữ phiên làm việc ở mức Layer 7 thông qua upstream module. Bài viết này trình bày cách cấu hình và tối ưu để đảm bảo tải trọng đồng đều, độ sẵn sàng cao và quản trị dễ dàng trên nền tảng CentOS. Nội dung tập trung vào các khía cạnh kỹ thuật thực tiễn, dựa trên tài liệu tham khảo chính thức của NGINX về module upstream và cách thức định tuyến/tiếp nhận yêu cầu qua upstream group.

Khái niệm cốt lõi và kiến trúc tổng quan

Module ngx_http_upstream_module cho phép định nghĩa một nhóm máy chủ (upstream) và tham chiếu chúng từ các chỉ thị proxy_pass, fastcgi_pass, uwsgi_pass, và các chế độ kết nối khác. Một upstream tập hợp các máy chủ backend có thể nghe trên các cổng khác nhau hoặc thậm chí trên các socket UNIX. Mặc định, các máy chủ trong upstream được phân phối yêu cầu bằng phương pháp cân bằng tải vòng quay có trọng số (weighted round-robin). Ngoài ra, upstream còn hỗ trợ các đặc tính giành riêng cho Layer 7 như cấu hình xác định trọng số, giới hạn số kết nối đồng thời, nhận diện máy chủ dự phòng và các cơ chế khác nhằm tối ưu hóa khả năng chịu lỗi và trải nghiệm người dùng.

  • Định nghĩa nhóm máy chủ upstream: upstream name { … }
  • Định danh máy chủ với tham số như weight, max_fails, fail_timeout, backup và xuống (down) khi cố gắng liên lạc thất bại
  • Hỗ trợ cấu hình giữ trạng thái kết nối (keepalive) cho các kết nối đến upstream để giảm overhead kết nối lại
  • Khả năng định tuyến theo DNS với resolver để cập nhật địa chỉ IP khi địa chỉ backend thay đổi
  • Hỗ trợ các tham số nâng cao như health_check ở mức cấu hình nâng cao cho phiên bản thương mại của NGINX

Với Layer 7 persistence, bạn có thể định tuyến lại lưu lượng dựa trên các đặc tính của phiên làm việc. Các cơ chế như ip_hash hoặc các tham số liên quan được mô tả trong tài liệu upstream và cho phép giữ cho các yêu cầu từ một client nhất định được chuyển tới cùng backend hoặc nhóm backend nhất định. Điều này giúp duy trì trạng thái phiên và cải thiện hiệu suất đối với các ứng dụng đòi hỏi sự nhất quán trong việc xử lý người dùng.

Kiến trúc và luồng xử lý của upstream

Khi một yêu cầu đến máy chủ NGINX, proxy_pass sẽ định tuyến tới một upstream group. Nếu upstream có nhiều máy chủ, NGINX sẽ chọn một trong số chúng dựa trên cơ chế cân bằng tải được chỉ định và có thể đồng thời thực hiện theo dõi tình trạng của từng máy chủ để bỏ qua những máy chưa sẵn sàng. Việc này giúp giảm thiểu thời gian phản hồi và tăng khả năng chịu lỗi của hệ thống.

Trong cấu hình nâng cao, bạn có thể khai báo một upstream với các máy chủ backend và tham số liên quan như keepalive để giữ các kết nối mở giữa NGINX và backend, từ đó tối ưu hóa hiệu suất thay vì tái thiết lập kết nối cho mỗi yêu cầu. Ngoài ra, việc dùng resolver cho upstream động cho phép hệ thống thích nghi với thay đổi IP của backend mà không cần khởi động lại NGINX.

Yêu cầu trước khi triển khai trên CentOS

Để triển khai cấu hình load balancing và Layer 7 persistence trên CentOS, bạn cần một cài đặt NGINX High Performance có sẵn module upstream. Mô-đun này cho phép bạn định nghĩa upstream groups và tham chiếu chúng từ các chỉ thị proxy_pass. Trong trường hợp bạn sử dụng các tính năng nâng cao như health_check hoặc các tính năng liên quan đến DNS resolver, hãy đảm bảo hệ thống có quyền truy cập DNS và có thể liên hệ với máy chủ định tuyến / resolver được cấu hình đúng cách.

Cấu hình cơ bản cho load balancing

Dưới đây là ví dụ cấu hình cơ bản cho một upstream với nhiều máy chủ backend và máy chủ dự phòng, áp dụng phương thức cân bằng tải mặc định (weighted round-robin). Đoạn cấu hình này phù hợp cho các dịch vụ web hoặc API HTTP được triển khai trên CentOS.

upstream backend {
  server backend1.example.com weight=5;
  server backend2.example.com:8080;
  server unix:/tmp/backend3;
  server backup1.example.com:8080 backup;
  keepalive 16;
}

server {
  listen 80;
  location / {
    proxy_pass http:// backend;
  }
}

Trong cấu hình trên, các máy chủ backend được gán trọng số, cho phép các máy chủ mạnh hơn nhận nhiều yêu cầu hơn. Máy chủ backup được sử dụng khi các máy chủ chính không thể đáp ứng. Tham số keepalive xác định số kết nối mở tối đa cho mỗi máy chủ backend, giúp giảm chi phí tái thiết lập kết nối cho các yêu cầu liên tiếp.

Cấu hình Layer 7 persistence và lưu lượng có trạng thái

Để duy trì sự nhất quán của phiên người dùng ở lớp 7, NGINX cho phép cấu hình các phương thức persistence nhất định trong upstream. Một ví dụ phổ biến là ip_hash, cho phép định tuyến mọi yêu cầu từ một địa chỉ IP client nhất định tới một máy chủ backend cố định. Đây là một cách đơn giản để duy trì trạng thái phiên mà không cần thêm thành phần phức tạp ở phía backend.

upstream app_ip_hash {
  ip_hash;
  server app1.example.com;
  server app2.example.com;
}

Đối với các trường hợp phức tạp hơn, upstream có thể hỗ trợ các tham số khác trong danh sách chỉ thị, như hash hoặc sticky, tùy thuộc vào phiên bản và phát hành của NGINX. Việc sử dụng các tham số này cho phép bạn tinh chỉnh hành vi phân phối tải và phân bổ phiên làm việc ở mức cao hơn tùy theo nhu cầu cụ thể của ứng dụng.

Cấu hình nâng cao với health checks và định vị DNS

Trong cấu hình nâng cao, bạn có thể thiết lập định vị DNS cho upstream bằng chỉ thị resolver để cập nhật các địa chỉ IP của backend khi địa chỉ DNS thay đổi. Ví dụ ở cấu hình sau, upstream động bao gồm cả máy chủ định danh có thể cập nhật mà không cần khởi động lại NGINX:

upstream dynamic {
  zone upstream_dynamic 64k;
  server backend1.example.com weight=5;
  server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
  server 192.0.2.1 max_fails=3;
  server backend3.example.com resolve;
  server backend4.example.com:8080 resolve;
  server backup1.example.com:8080 backup;
  server backup2.example.com:8080 backup;
}
server {
  location / {
    proxy_pass http:// dynamic;
    health_check;
  }
}

Đoạn cấu hình trên mô tả cách bạn có thể tận dụng health checks (không phải mọi phiên bản NGINX đều có tính năng này theo mặc định) nhằm giám sát tình trạng upstream và tự động loại bỏ các backend bị lỗi khỏi vòng phân phối tải. Ngoài ra, các máy chủ có tham số resolve cho phép tra cứu DNS và cập nhật địa chỉ IP mà không cần restart dịch vụ.

Bảo mật và tối ưu hóa cấu hình upstream

Để tăng cao độ tin cậy và hiệu suất, bạn có thể áp dụng các nguyên tắc sau trong cấu hình upstream:

  • Đặt máy chủ dự phòng (backup) để đảm bảo khả năng phục hồi khi các máy chủ chính gặp sự cố. Tham số backup ngăn không cho các yêu cầu tới các máy chủ dự phòng cho tới khi các máy chủ chính hết tình trạng sẵn sàng.
  • Sử dụng max_fails và fail_timeout để giới hạn số lần thất bại và thời gian bỏ qua một backend sau khi gặp sự cố.
  • Sử dụng keepalive để chia sẻ kết nối giữa NGINX và backend, giảm overhead của việc thiết lập kết nối liên tục.
  • Sử dụng resolver cho upstream động để cập nhật địa chỉ IP khi backend thay đổi mà không phải khởi động lại NGINX.

Hiệu năng và quan sát trong thực tế vận hành

Hiệu năng của NGINX khi làm reverse proxy và load balancer phụ thuộc vào nhiều yếu tố, trong đó phân phối tải qua upstream và khả năng duy trì kết nối ép buộc có tác động đáng kể. Các tham số như keepalive đóng vai trò quan trọng trong việc tối ưu hóa thời gian phản hồi và tải trọng đồng thời. Việc tận dụng các máy chủ dự phòng và các cơ chế Failover cũng giúp giảm thiểu thời gian ngừng dịch vụ cho người dùng cuối. Việc cấu hình health_check (nếu có sẵn) cho upstream sẽ cung cấp dữ liệu vận hành về trạng thái của từng backend và giúp hệ thống tự điều chỉnh trong thời gian thực.

Kiểm tra, xác thực cấu hình và vận hành thực tế

Sau khi cập nhật cấu hình, bạn nên rà soát tính hợp lệ và vận hành thông qua các nguồn cung cấp được đề cập ở trên. Cân nhắc theo dõi trạng thái của upstream và các máy chủ backend thông qua báo cáo sức khỏe và log của hệ thống. Cấu hình upstream nên được xem là một phần của chiến lược vận hành, có thể điều chỉnh theo lưu lượng và yêu cầu của ứng dụng mà bạn triển khai.

Checklist vận hành

  • Đảm bảo upstream được khai báo đúng và tham chiếu từ proxy_pass đúng tên upstream.
  • Thiết lập máy chủ dự phòng và các tham số liên quan như max_fails và fail_timeout để nâng cao khả năng chịu lỗi.
  • Kích hoạt keepalive cho các kết nối tới backend để tối ưu hóa hiệu suất.
  • Đảm bảo resolver được cấu hình đúng nếu bạn dùng upstream động và DNS-based discovery.
  • Giám sát sức khỏe và phản hồi của upstream để nhận diện nhanh các sự cố và khôi phục trạng thái sẵn sàng.

Kết luận

Việc cấu hình Load Balancing và Layer 7 Persistence trên NGINX High Performance cho CentOS đòi hỏi sự hiểu biết về upstream module và cách thức định tuyến, nhằm đảm bảo sự ổn định, mở rộng và dễ bảo trì cho các hệ thống sản phẩm/dịch vụ web. Các tham số như weight, backup, max_fails, fail_timeout, keepalive và resolver đóng vai trò then chốt trong việc tối ưu hóa phân phối tải và khả năng chịu lỗi. Với kiến thức và cấu hình phù hợp, bạn có thể xây dựng một kiến trúc phân phối tải hiệu quả và bền vững cho môi trường CentOS của mình.

Tối Ưu Hóa Bộ Nhớ Redis: Cấu Hình Eviction Policies Chi Tiết Trên Ubuntu 20.04+

Tối Ưu Hóa Bộ Nhớ Redis: Cấu Hình Eviction Policies Chi Tiết Trên Ubuntu 20.04+

Giới thiệu

Khi làm việc với Redis trên nền Ubuntu 20.04 trở lên, việc tối ưu bộ nhớ và xử lý hoạt động từ các chính sách eviction là yếu tố quyết định cho hiệu suất và độ ổn định của hệ thống. Eviction policies quyết định cách Redis phản ứng khi bộ nhớ đạt ngưỡng, để đảm bảo dữ liệu quan trọng vẫn có sẵn trong phạm vi bộ nhớ giới hạn. Bài viết này trình bày các khái niệm, khung kiến trúc và hướng tiếp cận thực tiễn để cấu hình eviction policy một cách an toàn và có kiểm soát trên môi trường Ubuntu 20.04+ trong bối cảnh quản trị Redis cấp doanh nghiệp.

Các khái niệm cốt lõi

Đến với Redis, quản lý bộ nhớ là một phần thiết yếu của vận hành hệ thống. Khi kích thước dữ liệu tăng lên hoặc lưu lượng truy cập tăng cao, Redis có thể hết bộ nhớ vật lý. Lúc này eviction policy sẽ quyết định hành vi của máy chủ Redis: loại bỏ dữ liệu cũ hay những mục ít được truy cập để nhường chỗ cho dữ liệu mới. Các yếu tố liên quan bao gồm:

  • Giới hạn bộ nhớ tối đa của Redis và cách mà nó áp dụng khi giới hạn này bị vượt quá.
  • Chiến lược loại bỏ dữ liệu khi bộ nhớ đầy nhằm duy trì tính khả dụng cho các dữ liệu quan trọng.
  • Ảnh hưởng của persistence và snapshotting lên hành vi giải phóng bộ nhớ trong quy trình eviction.
  • Quan hệ giữa eviction và cơ chế bảo mật, đảm bảo dữ liệu nhạy cảm không bị loại bỏ một cách trái phép khi hệ thống hoạt động ở chế độ mất dữ liệu.

Kiến trúc và mô hình triển khai

Kiến trúc Redis có thể ở mức đơn node hoặc ở mức có sao chép và tính sẵn sàng cao. Trong bối cảnh eviction và tối ưu bộ nhớ, một số mô hình triển khai phổ biến bao gồm:

  • Single-node Redis với giới hạn bộ nhớ được cấu hình để đảm bảo hiệu suất ổn định.
  • Cluster hoặc thiết lập sao chép để tăng tính sẵn sàng và phân bổ tải, đồng thời quản lý giới hạn bộ nhớ trên từng nút.
  • Giải pháp high availability như Sentinel hỗ trợ theo dõi trạng thái dịch vụ và tự động chuyển đổi khi cần thiết, giúp duy trì dịch vụ khi có sự cố và đảm bảo đúng quy trình làm việc với eviction.

Yêu cầu và chuẩn bị trên Ubuntu 20.04+

Trước khi bắt đầu cấu hình eviction, hãy đảm bảo hệ thống đáp ứng các yêu cầu sau:

  • Hệ điều hành: Ubuntu 20.04 hoặc phiên bản tương thích trở đi.
  • Trình quản lý gói: apt-get được cập nhật để cài đặt Redis từ kho lưu trữ chính thức của Ubuntu.
  • Quyền vận hành: quyền root hoặc quyền sudo để cài đặt và cấu hình dịch vụ Redis.
  • Mạng và bảo mật: xác định địa chỉ lắng nghe, giới hạn kết nối để tránh truy cập trái phép và đảm bảo an toàn khi lưu trữ dữ liệu.

Cấu hình chính cho eviction policies

Trong môi trường sản xuất, cấu hình eviction cần cân nhắc cẩn thận để cân bằng giữa dung lượng bộ nhớ, tính sẵn dùng dữ liệu và hiệu suất. Các yếu tố chính cần xem xét:

  • Thiết lập giới hạn bộ nhớ để Redis biết khi nào cần bắt đầu giải phóng dữ liệu.
  • Chọn chiến lược eviction phù hợp với đặc thù ứng dụng, ví dụ các trường hợp dữ liệu có TTL ngắn hoặc dữ liệu quan trọng càng ít thay đổi.
  • Kết hợp eviction với cơ chế Persistency và replication để giảm thiểu rủi ro mất mát dữ liệu.
  • Đảm bảo các thiết lập bảo mật và mạng liên quan không bị ảnh hưởng tiêu cực khi eviction diễn ra.

Ví dụ minh họa về cấu hình ở mức khung sẽ có dạng như sau để tham khảo, không phải là quy chuẩn bắt buộc và có thể điều chỉnh theo thực tế triển khai:

# Ví dụ cấu hình minh họa
maxmemory 2gb
maxmemory-policy allkeys-lru
appendonly yes

Ví dụ thực tế trên Ubuntu 20.04

Quy trình triển khai trên hệ điều hành Ubuntu 20.04+ có thể theo các bước sau, bao gồm cài đặt Redis và cấu hình ban đầu:

  1. Cập nhật hệ thống và cài đặt Redis từ kho chuẩn của Ubuntu.
  2. Kích hoạt và khởi động dịch vụ Redis để tự động chạy tại khởi động.
  3. Chỉnh sửa tệp cấu hình Redis để thiết lập giới hạn bộ nhớ và eviction policy.
  4. Khởi động lại Redis để áp dụng cấu hình mới.

Gợi ý các lệnh tham khảo cho môi trường Debian/Ubuntu tương ứng (không phải hướng dẫn chi tiết về mọi phiên bản):

sudo apt update
sudo apt install redis-server
sudo systemctl enable redis-server
sudo systemctl start redis-server

Sau khi cài đặt, bạn có thể chỉnh sửa tệp cấu hình phổ biến ở vị trí mặc định và đảm bảo Redis nhận các thiết lập mới khi khởi động lại. Trong môi trường thực tế, hãy cân nhắc áp dụng cấu hình ngay tại tệp cấu hình của Redis hoặc trong mẫu cấu hình của hệ quản trị cấu hình mà bạn đang dùng.

Kiểm tra và xác nhận

Để xác nhận rằng eviction policy và giới hạn bộ nhớ đã được áp dụng đúng cách, thực hiện các bước kiểm tra sau:

  • Kiểm tra cấu hình hiện tại của Redis liên quan đến giới hạn bộ nhớ và chính sách eviction.
  • Theo dõi hoạt động của bộ nhớ sau khi tải hệ thống hoặc xung đột dữ liệu xảy ra.
  • Đảm bảo dữ liệu vẫn có sẵn và hệ thống phục hồi đúng theo kỳ vọng sau khi eviction diễn ra.

Phương án kiểm tra phổ biến bao gồm các lệnh kiểm tra trạng thái bộ nhớ và cấu hình hiện tại từ trình khách Redis, tập trung vào thông tin liên quan đến bộ nhớ và chính sách eviction.

Bảo mật và vận hành an toàn

Khi triển khai eviction trên Redis, bảo mật là một phần không thể bỏ qua. Cân nhắc các biện pháp sau để đảm bảo an toàn vận hành:

  • Hạn chế truy cập mạng đến Redis bằng cách chỉ cho phép các máy chủ đáng tin cậy kết nối. Sử dụng tường lửa hoặc vùng mạng an toàn để quản lý lưu lượng.
  • Chỉ lắng nghe Redis từ các địa chỉ nội bộ hoặc trên các mạng riêng để giảm rủi ro truy cập trái phép.
  • Thiết lập cơ chế xác thực để ngăn người dùng trái phép thực thi các lệnh có thể ảnh hưởng đến bộ nhớ.
  • Kích hoạt lưu trữ persistence và sao lưu định kỳ để đảm bảo có thể khôi phục dữ liệu sau sự cố mà eviction gây ra.

Đối với các tính năng quản trị nâng cao và tình trạng hoạt động, tham khảo tài liệu quản trị Redis liên quan đến bảo mật và Sentinel để hỗ trợ quản lý HA và bảo đảm dịch vụ luôn sẵn sàng trong các môi trường phức tạp.

Giám sát và quan trắc hiệu suất

Quan sát các chỉ số liên quan đến bộ nhớ và eviction là phần cốt lõi của vận hành hiệu quả. Các yếu tố cần theo dõi gồm:

  • Dung lượng bộ nhớ đang sử dụng và mức giới hạn.
  • Tần suất và phạm vi eviction diễn ra trong thời gian thực.
  • Tình trạng replication và khả năng sao lưu để đảm bảo dữ liệu ít bị mất khi eviction xảy ra trong môi trường đa nút.

Việc tích hợp Redis với các công cụ giám sát hệ thống và chất lượng mạng sẽ giúp bạn nhanh chóng phát hiện các điểm nghẽn và điều chỉnh cấu hình cho phù hợp với tải thực tế.

Xác thực vận hành và thử nghiệm

Để đảm bảo cấu hình eviction hoạt động đúng như mong đợi trong môi trường thực tế, hãy thực hiện quy trình kiểm thử có kiểm soát:

  • Chạy các bài kiểm tra tải nhằm mô phỏng các trường hợp dữ liệu phát sinh nhanh và truy cập cao.
  • Kiểm tra hành vi của hệ thống khi bộ nhớ đạt ngưỡng và eviction được kích hoạt.
  • Đảm bảo các cơ chế backup và phục hồi hoạt động đúng sau eviction và trong trạng thái khởi động lại.

Checklist vận hành cuối cùng

    <li Xác định ngưỡng bộ nhớ phù hợp với tải dự kiến và giới hạn phần mềm/hardware. <li Chọn chiến lược eviction phù hợp với tính chất dữ liệu và yêu cầu hiệu suất của ứng dụng. <li Đảm bảo bảo mật mạng và quyền truy cập, cùng với thiết lập xác thực cho Redis. <li Thiết lập sao lưu và cơ chế phục hồi dữ liệu thích hợp để giảm thiểu tổn thất dữ liệu khi eviction diễn ra. <li Thi công giám sát bộ nhớ và cấp phép cho cảnh báo khi vượt ngưỡng.

Kết luận

Việc tối ưu bộ nhớ Redis thông qua cấu hình eviction policies trên Ubuntu 20.04+ là một phần quan trọng của quản trị cơ sở dữ liệu nhanh nhạy và ổn định. Phân tích đúng nhu cầu dữ liệu, tải hệ thống và đặc thù ứng dụng sẽ giúp bạn chọn lựa chiến lược eviction phù hợp, đồng thời đảm bảo an ninh, tính sẵn sàng và khả năng mở rộng của hệ thống. Trong khuôn khổ quản trị Redis, các tài liệu về bảo mật và Sentinel có thể hỗ trợ bạn xây dựng nền tảng an toàn và có độ tin cậy cao cho môi trường sản xuất.

Tối ưu hóa Docker Image với Multi-stage Builds trên Ubuntu 20.04+: Chiến lược Hardening cho Production

Tối ưu hóa Docker Image với Multi-stage Builds trên Ubuntu 20.04+: Chiến lược Hardening cho Production

Giới thiệu

Trong môi trường sản xuất hiện đại, tối ưu hóa Docker image và tăng cường an ninh cho container là yếu tố then chốt để đảm bảo hiệu năng, dễ bảo trì và tuân thủ quy trình vận hành. Đối với nền tảng Ubuntu 20.04 trở lên, chiến lược multi‑stage builds cung cấp một phương pháp hiệu quả để giảm kích thước hình ảnh, hạn chế surface area và cải thiện hardening cho production container. Bài viết này trình bày khung tham chiếu kỹ thuật cho sysadmins và đội DevOps muốn triển khai hình ảnh Docker được tối ưu và an toàn, đồng thời nêu ra các thực hành, mẫu Dockerfile và các bước kiểm thử, giám sát sau khi triển khai.

Khái niệm cốt lõi và kiến trúc tổng quát

Multi‑stage builds là kỹ thuật cho phép định nghĩa nhiều giai đoạn xây dựng trong một Dockerfile. Mỗi giai đoạn có một hình ảnh cơ sở riêng và có thể sao chép artefacts từ giai đoạn này sang giai đoạn khác. Mục tiêu chính là giữ lại các phần cần thiết cho runtime và loại bỏ phần phụ thuộc, công cụ build và mã nguồn khỏi image cuối cùng. Với Ubuntu 20.04 trở lên, bạn có thể tận dụng các base image tối giản ở giai đoạn runtime đồng thời giữ được tính tương thích và khả năng bảo trì của hệ thống.

Kiến trúc điển hình với multi‑stage bao gồm các phần sau:

  • Stage builder (stage xây dựng): chứa các công cụ và thư viện cần để biên dịch, biên tập và đóng gói ứng dụng. Đây là nơi tập trung toàn bộ phụ thuộc phát triển và các file nguồn.
  • Stage runtime (stage chạy): hình ảnh nhẹ, chỉ chứa các phần mềm cần thiết cho chạy ứng dụng ở môi trường production. Không mang theo các công cụ build hay mã nguồn thô.
  • Quá trình sao chép artefacts từ stage builder sang stage runtime, chỉ sao chép các tệp cần thiết cho vận hành (binary, script, tài nguyên) và loại bỏ các dependences không cần thiết.

Việc tách biệt giữa build và runtime giúp giảm kích thước image, giảm surface area tấn công và cải thiện khả năng nhận diện rủi ro. Đây là ý tưởng cốt lõi của hardening Docker image cho production trên nền tảng Ubuntu 20.04 và các hệ thống tương đương.

Yêu cầu và chuẩn bị

Trước khi bắt đầu, xác định rõ môi trường mục tiêu và phạm vi ứng dụng. Với nền tảng Ubuntu 20.04+, các khuyến nghị dưới đây sẽ hỗ trợ bạn xây dựng pipeline ổn định và an toàn:

  • Có Docker Engine được cài đặt trên máy chủ chạy Ubuntu 20.04 hoặc các phiên bản tương đương.
  • Sử dụng Dockerfile theo mẫu multi‑stage để tách biệt build và runtime.
  • Đảm bảo quyền truy cập và quản trị người dùng được kiểm soát chặt chẽ, ưu tiên chạy ứng dụng dưới tài khoản người dùng không phải root.
  • Xem xét tích hợp công cụ quét bảo mật và kiểm tra hình ảnh (image scanning) như một phần của chu trình CI/CD.
  • Thiết lập các công cụ giám sát và logging để đảm bảo khả năng vận hành và phát hiện sự cố.

Trong phạm vi bài viết, chúng ta sẽ đi qua một quy trình thực hành với một Dockerfile mẫu và các bước kiểm thử đi kèm, phù hợp với nền tảng Ubuntu 20.04+.

Cấu hình và mẫu Dockerfile với multi‑stage builds

Ý tưởng cơ bản là sử dụng hai hoặc nhiều stage trong Dockerfile. Stage builder sẽ chứa các dependency cần thiết để biên dịch hoặc đóng gói, trong khi stage runtime sẽ chỉ chứa những gì cần thiết để chạy ứng dụng. Dưới đây là một mẫu Dockerfile minh họa cho một ứng dụng nền tảng Linux tổng quát mà có thể được điều chỉnh cho các ngôn ngữ phổ biến như Go, C/C++, hoặc Node.js. Lưu ý rằng các khung lược bỏ phụ thuộc ở stage runtime giúp giảm kích thước và tăng mức độ an toàn của hình ảnh.

FROM ubuntu:20.04 AS builder
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    pkg-config \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /src
COPY . /src

# Giả định build một binary ứng dụng
RUN ./build-script.sh

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y --no-install-recommends \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

# Sao chép artefacts từ stage builder
COPY --from=builder /src/bin/app /usr/local/bin/app

# Tạo người dùng và vận hành với non-root
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser

ENTRYPOINT ['/usr/local/bin/app']

Giải thích nhanh về cấu hình trên:

  • Stage builder cài đặt các công cụ cần thiết cho quá trình build và biên dịch.
  • Stage runtime dùng base image ubuntu:20.04 và chỉ bao gồm các dependency cần thiết để chạy ứng dụng, không mang theo công cụ build hay mã nguồn đầy đủ.
  • Các artefacts được sao chép từ stage builder sang stage runtime, điều này giúp loại bỏ các file nguồn và thư viện build khỏi image cuối cùng.
  • Quy trình chạy với user non-root nhằm giảm thiểu rủi ro bảo mật tại runtime.

Điểm mấu chốt là chỉ sao chép những gì thực sự cần cho runtime và tránh mang toàn bộ mã nguồn hoặc công cụ biên dịch vào image sản xuất.

Một ví dụ chi tiết cho Dockerfile cho ứng dụng Go hoặc ngôn ngữ biên dịch khác

Đối với các dự án Go hoặc các ngôn ngữ biên dịch khác, mẫu Dockerfile có thể được điều chỉnh để tận dụng staged builds. Dưới đây là phiên bản tham khảo có thể áp dụng cho các dự án cần build và chạy ở runtime nghiêm ngặt:

FROM ubuntu:20.04 AS builder
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential git ca-certificates \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -trimpath -o app ./cmd/app

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates
RUN useradd -m -s /bin/bash appuser
USER appuser
COPY --from=builder /src/app /usr/local/bin/app
ENTRYPOINT ["/usr/local/bin/app"]

Trong mẫu trên, Go toolchain hoặc runtime build các dépendances ở stage builder. Stage runtime chỉ chứa binary đã biên dịch và các thư viện runtime cần thiết, giúp giảm thiểu kích thước và tăng tính bảo mật.

Bảo mật và hardening cho Docker image với multi‑stage builds

Bảo mật đóng vai trò then chốt trong production. Các biện pháp sau đây được khuyến nghị khi làm việc với multi‑stage builds trên Ubuntu 20.04+:

  • Sử dụng base image tối giản cho stage runtime; tránh mang theo các công cụ phát triển và thư viện không cần thiết.
  • Chạy ứng dụng ở chế độ non-root và cấp phát quyền tối thiểu cho hành động cần thiết, ví dụ tạo user riêng và gán quyền vào thư mục làm việc.
  • Sử dụng .dockerignore để loại trừ mã nguồn, dữ liệu nhị phân tạm thời và các file nhạy cảm khỏi quá trình build.
  • Hạn chế quyền truy cập mạng cho container nếu có thể, và cân nhắc áp dụng thiết lập seccomp, AppArmor hoặc SELinux tùy thuộc vào hạ tầng và mức độ ràng buộc bảo mật.
  • Đảm bảo việc cập nhật hình ảnh runtime được tích hợp trong chu trình CI/CD để nhận các bản vá bảo mật mới nhất.
  • Kiểm tra hạn mức và giới hạn tài nguyên cho container ở môi trường production để giảm thiểu tác động từ các cuộc tấn công từ chối dịch vụ hoặc lỗi vận hành.

Những nguyên tắc này giúp tăng cường độ an toàn cho hình ảnh Docker và giảm nguy cơ bị khai thác từ các lỗ hổng có thể có trong các công cụ build hoặc dependencies không cần thiết ở runtime.

Hiệu năng và tối ưu hoá hình ảnh

Hiệu năng là một phần thiết yếu của vận hành hệ thống. Các thực hành tối ưu hoá bao gồm:

  • Chỉ giữ lại những artefacts cần thiết cho chạy ứng dụng ở stage runtime; loại bỏ file nguồn, build cache và các dependency không cần thiết.
  • Gộp các lệnh RUN hợp lý để tối ưu hoá số lượng layers và tận dụng cache của Docker trong quá trình build.
  • Chọn base image phù hợp với ứng dụng và tối giản các gói cài đặt. Ví dụ sử dụng các base image có kích thước nhỏ và có sẵn runtime cho Linux.
  • Đảm bảo hình ảnh ở trạng thái có thể lặp lại trong CI/CD và không phụ thuộc vào biến môi trường vượt quá phạm vi được kiểm soát.

Với các áp dụng thực tế, bạn có thể kiểm tra kích thước hình ảnh và tối ưu hoá thêm bằng cách xem lịch sử từng layer và loại bỏ các layer không cần thiết. Quá trình này giúp giảm không chỉ dung lượng tải xuống mà còn thời gian triển khai và chi phí vận hành.

Giám sát và observability cho container chạy ở production

Việc giám sát và ghi nhận là phần không thể bỏ qua để duy trì chất lượng dịch vụ trong dài hạn. Các thực hành liên quan đến multi‑stage builds tập trung vào runtime ít hơn vào giai đoạn build:

  • Cấu hình Healthcheck cho container để xác định tình trạng hoạt động của ứng dụng và tự động tái khởi động khi cần thiết.
  • Ghi log ra stdout và stderr để tích hợp với hệ thống quản lý logs và phân tích logs tập trung.
  • Giải pháp theo dõi hiệu năng và sự cố ở mức hệ điều hành và ứng dụng, bao gồm giám sát tiêu thụ CPU, memory và I/O.
  • Áp dụng giới hạn tài nguyên cho container nhằm ngăn tình huống lún lõm tài nguyên khi có tải cao hoặc lỗ hổng bảo mật bị khai thác.

Việc tích hợp Healthcheck và logging chuẩn giúp đội vận hành nhanh chóng xác định và xử lý sự cố, đồng thời cung cấp dữ liệu cho quá trình tối ưu hoá và bảo mật.

Kiểm tra, xác thực và vận hành sau triển khai

Để đảm bảo hình ảnh multi‑stage hoạt động đúng như mong đợi trên nền tảng Ubuntu 20.04+, tiến hành các bước kiểm tra sau trước khi đẩy lên môi trường production:

  • Xây dựng lại hình ảnh và xác nhận không còn các file build hoặc thư viện phát triển trong stage runtime.
  • Chạy container ở chế độ thử nghiệm với các trường hợp sử dụng thực tế của ứng dụng, kiểm tra chức năng và hiệu năng.
  • Kiểm tra tính khả dụng của các dịch vụ liên quan, xác thực logging và healthcheck hoạt động đúng cách.
  • Đánh giá bảo mật với các công cụ quét hình ảnh và xác thực rằng non‑root user được áp dụng và các quyền truy cập được giới hạn.
  • Ghi nhận và phân tích kích thước hình ảnh, thời gian tải xuống và thời gian khởi động để đánh giá hiệu quả tối ưu hóa.

Ví dụ các lệnh kiểm tra có thể được thực hiện trong môi trường CI/CD và sau khi triển khai bao gồm kiểm tra kích thước image, xem lịch sử builder và xác nhận tài nguyên runtime được giới hạn phù hợp.

Checklist vận hành và triển khai

  • Đảm bảo Dockerfile được thiết kế theo chuẩn multi‑stage và ubuntu:20.04 là base image cho cả stage build và stage runtime.
  • Áp dụng người dùng non‑root cho runtime và cấp quyền tối thiểu cho thư mục làm việc.
  • Sử dụng .dockerignore để loại bỏ mã nguồn và file nhạy cảm khỏi quá trình build.
  • Kiểm tra và giới hạn tài nguyên cho container ở production (CPU, memory, I/O).
  • Áp dụng Healthcheck và logging cho khả năng vận hành và phát hiện sự cố nhanh chóng.
  • Sử dụng quy trình CI/CD để tự động quét bảo mật và xác thực version của image trước khi triển khai.
  • Theo dõi kích thước và surface area của image sau mỗi lần tối ưu hóa và cập nhật dependency.

Kết luận

Kỹ thuật multi‑stage builds là một phần cốt lõi để tối ưu hóa kích thước và an ninh cho Docker image khi làm việc trên Ubuntu 20.04+. Bằng cách tách biệt stage build và stage runtime, bạn có thể giảm đáng kể surface area, loại bỏ công cụ phát triển và các file nguồn khỏi image sản xuất, đồng thời tăng cường khả năng kiểm soát an ninh và vận hành. Để đạt hiệu quả tối đa, hãy kết hợp chiến lược này với các thực tiễn bảo mật và quản trị container như chạy dưới non‑root, sử dụng .dockerignore, cấu hình healthcheck, và tích hợp CI/CD cho kiểm tra bảo mật và xác thực version trước khi đẩy lên production.

Triển khai NGINX High Performance: Microservices Reverse Proxy với gRPC trên Ubuntu 20.04+

Triển khai NGINX High Performance: Microservices Reverse Proxy với gRPC trên Ubuntu 20.04+

Triển khai NGINX High Performance cho Microservices Reverse Proxy với gRPC trên Ubuntu 20.04+

NGINX High Performance là một nền tảng reverse proxy và load balancer mạnh mẽ, với khả năng xử lý gRPC và hỗ trợ các kiến trúc microservices. Với Ubuntu 20.04 trở lên, bạn có thể triển khai NGINX với các module cốt lõi và module grpc để đóng vai trò như một lớp reverse proxy cho các dịch vụ microservices, đồng thời tối ưu hóa hiệu năng, bảo mật và khả năng vận hành liên tục.

Trong khuôn khổ tài liệu này, chúng ta sẽ tập trung vào cách cấu hình NGINX để làm reverse proxy cho các service microservices giao tiếp bằng gRPC, thông qua upstream groups và grpc_pass. Nội dung dựa trên tài liệu kỹ thuật của NGINX và các mô-đun liên quan, đồng thời duy trì ngôn ngữ vận hành dành cho quản trị viên hệ thống.

Khái niệm cốt lõi và kiến trúc

Kiến trúc NGINX cho microservices với gRPC xoay quanh khái niệm upstream groups và các directive để định tuyến, gửi và quản lý lưu lượng giữa nhiều backend. Module ngx_http_upstream_module cho phép định nghĩa một nhóm máy chủ có thể tham chiếu từ các directive proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass và grpc_pass. Điểm mạnh ở đây là khả năng gộp nhiều backend thành một tập hợp duy nhất và áp dụng cơ chế cân bằng tải, timeout, và failover một cách tập trung.

Theo mô hình này, gRPC là một giao thức gọi từ xa có thể được “pass-through” hoặc “pass-to-upstream” thông qua grpc_pass. Cơ chế cân bằng tải mặc định của upstream là vòng lặp có trọng số (weighted round-robin), cho phép phân phối lưu lượng giữa các backend theo tỉ lệ mong muốn. Trong trường hợp một backend gặp sự cố, NGINX sẽ tự động chuyển sang các backend còn lại cho đến khi có phản hồi hợp lệ từ một máy chủ còn hoạt động.

Để đảm bảo tính linh hoạt và khả năng mở rộng, NGINX cho phép định nghĩa DNS hoặc SRV-based resolution cho upstream qua directive resolver và các tham số liên quan. Việc này hữu ích khi bạn triển khai các dịch vụ microservices được phát triển theo môi trường động hoặc trong các cluster có thể thay đổi địa chỉ backend theo thời gian.

Yêu cầu tiền đề cho Ubuntu 20.04+

  • Hệ điều hành: Ubuntu 20.04 trở lên hoặc bản phân phối tương thích, có sẵn đầy đủ các gói phụ trợ cho NGINX High Performance.
  • NGINX được xây dựng với hỗ trợ module grpc và các module đi kèm cần thiết cho vận hành ổn định. Module grpc_pass và module liên quan (ví dụ ngx_http_grpc_module và ngx_http_upstream_module) là thành phần cần thiết để định tuyến gRPC qua reverse proxy.
  • Khả năng giải quyết DNS cho upstream, thông qua directive resolver hoặc các cơ chế DNS được cấp quyền bởi NGINX, đặc biệt khi backend có địa chỉ domain thay đổi theo thời gian.
  • Khả năng TLS/SSL để bảo mật kết nối, đặc biệt khi bạn triển khai gRPC qua giao thức TLS (grpcs) hoặc khi dừng ở lớp termination tại NGINX trước khi forwards tới backend.
  • Khung bảo mật và tuân thủ: theo dõi các thực tiễn bảo mật cơ bản như phân đoạn mạng, giới hạn truy cập, và ghi log để vận hành và phản hồi sự cố.

Cấu hình chính cho Microservices Reverse Proxy với gRPC

Trong ngữ cảnh microservices và gRPC, cách tiếp cận phổ biến là tạo một upstream group gồm các backend gRPC và dùng directive grpc_pass trong một location để chuyển tiếp các cuộc gọi đến upstream. Dưới đây là ví dụ cấu hình tham khảo, dựa trên nguyên tắc định nghĩa upstream và cách proxy tới upstream thông qua grpc_pass:

upstream grpc_backend {
  server backend1.example.com:50051;
  server backend2.example.com:50051;
  server unix:/var/run/backend.sock;
}

server {
  listen 443 ssl http2;
  server_name api.example.com;

  ssl_certificate /etc/nginx/ssl/fullchain.pem;
  ssl_certificate_key /etc/nginx/ssl/privkey.pem;

  location / {
    grpc_pass grpcs://grpc_backend;
  }
}

Trong ví dụ trên, upstream grpc_backend định nghĩa một tập hợp backend có thể là các dịch vụ gRPC chạy trên các host hoặc các socket UNIX. location / được cấu hình để chuyển tiếp mọi gọi gRPC tới upstream bằng grpc_pass với định dạng grpcs:// khi bạn sử dụng TLS cho phía client và/hoặc TLS nội bộ tới backend.

Ngoài ra, để đảm bảo tính ổn định và phục hồi khi một backend gặp sự cố, bạn có thể bổ sung các tham số như fail_timeout, max_fails và backup để điều chỉnh hành vi khi mất kết nối. Ví dụ:

upstream grpc_backend {
  server backend1.example.com:50051 weight=3;
  server backend2.example.com:50051 weight=2 max_fails=3 fail_timeout=10s;
  server unix:/var/run/backend.sock backup;
}

Trong phương án có dynamic DNS hoặc thay đổi IP của backend, bạn có thể dùng resolver để theo dõi sự thay đổi của địa chỉ server và tự động cập nhật cấu hình upstream mà không cần khởi động lại NGINX. Ví dụ tham chiếu tới cách khai báo resolver và upstream có sử dụng resolve hoặc các trường hợp tương tự:

resolver 10.0.0.1;
upstream dynamic {
  zone upstream_dynamic 64k;
  server backend1.example.com weight=5;
  server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
  server 192.0.2.1 max_fails=3;
  server backend3.example.com resolve;
  server backend4.example.com service=http resolve;
  server backup1.example.com:8080 backup;
  server backup2.example.com:8080 backup;
}
server {
  location / {
    grpc_pass grpcs://dynamic;
  }
}

Ở ví dụ trên, upstream dynamic có khả năng resolve địa chỉ mới và có các máy chủ dự phòng cho trường hợp primary bị quá tải hoặc không đáp ứng, đồng thời có các máy chủ đánh dấu là backup để phục vụ khi các máy chủ chính không hoạt động. Đây là mô hình phù hợp với hạ tầng microservices có tính linh hoạt cao và yêu cầu độ sẵn sàng cao.

Bảo mật và hiệu suất trong môi trường gRPC

Để tăng cường bảo mật và hiệu suất, hãy cân nhắc các yếu tố sau:

  • Áp dụng TLS cho cả phía client và phía backend. Sử dụng grpcs:// trong grpc_pass và đảm bảo cấu hình TLS ở phía server có đầy đủ chứng chỉ hợp lệ.
  • Sử dụng HTTP/2 cho kết nối giữa client và NGINX để tối ưu hóa hiệu suất gRPC và multiplexing nhiều cuộc gọi đồng thời.
  • Tối ưu cấu hình thời gian chờ và retry bằng các tham số như fail_timeout và max_fails, cũng như các cơ chế backup để đảm bảo phục hồi khi backend bị quá tải hoặc bị ngắt kết nối.
  • Kích hoạt health check (nếu có sẵn trong phiên bản bạn dùng) để giám sát tình trạng các backend và giảm tải cho các backend không đáp ứng.
  • Sử dụng DNS SRV hoặc resolver khi backend có thể thay đổi địa chỉ liên tục, giảm thiểu sự cố do thay đổi IP mà không cần cập nhật toàn bộ cấu hình.

Giám sát, logging và observability

Để vận hành một hệ thống NGINX Reverse Proxy cho gRPC một cách hiệu quả, bạn cần các cơ chế giám sát và logging đáng tin cậy. Các module liên quan có trong NGINX High Performance bao gồm các thành phần cho ghi log và trạng thái hệ thống. Cụ thể, các module như ngx_http_stub_status_module có thể cung cấp thông tin trạng thái ở một endpoint nhỏ gọn, hỗ trợ quan sát lưu lượng và hiệu suất dưới dạng số liệu từ các upstream và máy chủ backend. Bên cạnh đó, khả năng ghi log ra syslog giúp tích hợp với hệ thống SIEM hoặc bộ tập trung log của bạn.

Để bắt đầu, bạn có thể kích hoạt và xem trạng thái cơ bản của NGINX trong môi trường tiền sản xuất hoặc staging, sau đó mở rộng sang giám sát chi tiết hơn bằng các giải pháp gián tiếp hoặc các module/tiện ích bổ sung theo nhu cầu vận hành.

Kiểm tra và xác thực triển khai

Trước khi đưa cấu hình mới vào môi trường sản xuất, hãy kiểm tra cú pháp và tính hợp lệ của cấu hình NGINX, sau đó thực thi nghiệm Thu thập bảo trì và vận hành:

  • Kiểm tra cú pháp cấu hình NGINX: xác nhận cấu hình của upstream và grpc_pass được thiết lập đúng cách và không có lỗi cú pháp.
  • Kiểm tra khả năng phân phối lưu lượng đến các backend bằng cách theo dõi log và trạng thái của upstream để đảm bảo vòng lặp có trọng số đang hoạt động.
  • Kiểm tra kết nối TLS và xác thực chứng chỉ ở phía client và phía backend nếu có TLS liên kết giữa NGINX và backend.
  • Kiểm tra khả năng failover và backup server bằng cách tắt một trong các backend và xác thực NGINX tự động chuyển sang các backend còn lại.
  • Kiểm tra tính tương thích của client gRPC với đường dẫn qua NGINX: đảm bảo client có thể gọi các service gRPC và nhận phản hồi đúng từ upstream.

Danh sách vận hành và checklist triển khai

  • Xác định topology microservices và danh sách các backend gRPC cần định tuyến thông qua NGINX.
  • Thiết lập upstream groups với các backend đầy đủ và thể hiện rõ các tham số trọng số, fail_timeout, max_fails và backup khi cần.
  • Cấu hình TLS cho kết nối giữa client và NGINX (và giữa NGINX và backend nếu cần sử dụng grpcs).
  • Cấu hình DNS resolver nếu backend được xác định bằng tên miền và có thể thay đổi theo thời gian.
  • Kích hoạt health_check (nếu có) và logging để giám sát trạng thái backend và hiệu suất hệ thống.
  • <liKiểm tra cấu hình với lệnh kiểm tra cú pháp và thực hiện reload khi áp dụng thay đổi trong môi trường thử nghiệm và sau đó ở môi trường sản xuất. <liThiết lập thay đổi và rollback plan để đảm bảo phục hồi nhanh khi gặp sự cố liên quan đến reverse proxy.

Kết luận

Việc triển khai NGINX High Performance làm reverse proxy cho microservices với gRPC trên Ubuntu 20.04+ mang lại lợi ích rõ ràng về hiệu suất xử lý, khả năng mở rộng và quản lý lưu lượng giữa các dịch vụ. Việc sử dụng upstream groups với grpc_pass cho phép định tuyến gọi gRPC một cách linh hoạt, đồng thời kết hợp với các cơ chế như resolver và health check để đảm bảo tính sẵn sàng và độ tin cậy của hệ thống. Hãy cân nhắc áp dụng các thực tiễn bảo mật và observability để có thể vận hành hệ thống một cách ổn định và an toàn trên môi trường sản xuất.

Linux System Hardening: Chiến lược cấu hình Firewall với NFTables/IPtables trên Ubuntu 20.04+

Linux System Hardening: Chiến lược cấu hình Firewall với NFTables/IPtables trên Ubuntu 20.04+

Giới thiệu

Linux System Hardening là quá trình củng cố an toàn hệ thống Linux bằng cách áp dụng các thực hành và chuẩn mực bảo mật được công nhận. Với nền tảng Ubuntu 20.04 trở lên, chiến lược cấu hình tường lửa và quản lý lưu lượng mạng thông qua NFTables hoặc IPTables đóng vai trò then chốt trong lớp phòng thủ phía biên. Bài viết này trình bày cách tiếp cận thực tế và có thể triển khai được, đồng thời tham chiếu các chuẩn bảo mật đáng tin cậy như CIS Benchmarks cho Ubuntu và các công cụ xác thực, quét tuân thủ để đảm bảo hệ thống vận hành an toàn trong production.

Trong khuôn khổ tài liệu, chúng ta tập trung vào các khía cạnh thực tiễn: cách thiết lập và giám sát cấu hình kernel nhằm hạn chế rủi ro từ mạng, cách tham gia các chuẩn bảo mật và các hoạt động kiểm thử xác thực nhằm giảm thiểu sự lệ thuộc vào các cài đặt thủ công dễ bị bỏ sót. Nội dung dựa trên nguồn tài liệu được xác thực, đồng thời giữ nguyên tính thực tiễn cho quản trị viên hệ thống và đội ngũ bảo mật.

Kiến trúc và khái niệm cốt lõi

Khung làm việc và vai trò của sysctl trong hardening

Sysctl là một cơ chế để cấu hình một số khía cạnh của kernel ở thời gian chạy, và thư mục /proc/sys/ cho phép quản trị viên thực hiện cấu hình mà không cần công cụ đặc thù. Thực hành này đặc biệt hữu ích trong công tác hardening hệ thống, cho phép tinh chỉnh hành vi mạng và tài nguyên hệ thống một cách linh hoạt. Quá trình khám phá và áp dụng các tham số mạng thường bắt đầu bằng việc liệt kê toàn bộ tham số có thể điều chỉnh thông qua sysctl và sau đó áp dụng các thay đổi theo đúng yêu cầu bảo mật.

Tài liệu tham khảo cho khung này nhấn mạnh rằng việc điều chỉnh kernel từ run-time thông qua sysctl là một phần của quá trình bảo mật, và /proc/sys/ chứa nhiều subdir liên quan đến mạng, hệ thống tập tin, quản lý bộ nhớ và các yếu tố khác. Do đó, để thực thi chiến lược firewall và cứng hóa mạng, cần hiểu cách các tham số này tương tác với lưu lượng và hành vi bảo mật của hệ thống.

Vai trò của CIS Benchmarks và chuẩn bảo mật cho Ubuntu

Trong khuôn khổ hardening hệ thống Ubuntu, CIS (Center for Internet Security) cung cấp tập hợp các chuẩn cấu hình an toàn cho Ubuntu Linux. Các chuẩn này được cập nhật liên quan đến phiên bản Ubuntu 20.04 LTS và các phiên bản kế tiếp, kèm theo các công cụ kiểm tra tự động như CIS Build Kits và CIS-CAT Pro để tự động hoá đánh giá tuân thủ. Các chuẩn bảo mật này đóng vai trò làm khung tham chiếu cho việc thiết kế và triển khai firewall, quản lý quyền truy cập, và kiểm tra cấu hình hệ thống so với baseline an toàn đã được cộng đồng và CIS xác nhận.

Ngoài các hướng dẫn cấu hình, CIS Benchmarks cung cấp các công cụ hỗ trợ tự động hoá đánh giá và kiểm tra tuân thủ. Điều này cho phép đội ngũ vận hành rà soát nhanh chóng các thiết lập firewall, cấu hình kernel và các biện pháp bảo mật liên quan đến mạng để đảm bảo hệ thống luôn ở trạng thái an toàn và ghi nhận được. Việc sử dụng CIS Benchmarks và các Build Kits tương ứng giúp đội ngũ bảo mật và quản trị viên có một tiêu chuẩn kiểm tra nhất quán khi triển khai firewall trên Ubuntu 20.04+.

Yêu cầu và chuẩn bị

Khảo sát môi trường và nền tảng

Với nền tảng Ubuntu 20.04 LTS và các bản vá mới hơn, chiến lược hardening nên được thiết kế để tương thích với các công cụ và chuẩn bảo mật đã được công nhận. Việc xác nhận nền tảng trước khi bắt đầu triển khai firewall và các biện pháp bảo mật là bước căn bản nhằm đảm bảo các quy tắc và công cụ được áp dụng đúng ngữ cảnh và phù hợp với phiên bản hệ điều hành.

Chuẩn bị công cụ và nguồn tham khảo

Đối với hoạt động hardening và kiểm tra tuân thủ, việc tham khảo CIS Ubuntu Linux Benchmarks là rất quan trọng. CIS Benchmarks cho Ubuntu Linux bao gồm các gợi ý cấu hình an toàn và tối ưu cho hệ thống, và có sẵn dưới dạng các tài nguyên như CIS Build Kits và CIS-CAT Pro để tự động hoá đánh giá. Việc tiếp cận các bộ công cụ này giúp đội ngũ vận hành thiết lập baseline an toàn cho firewall, ghi nhận các thay đổi và theo dõi sự tuân thủ theo thời gian.

Chuẩn bị công cụ kiểm tra và đánh giá tuân thủ

Ngoài CIS, các hoạt động quét và kiểm tra tuân thủ có thể được thực hiện thông qua các công cụ quét và chuẩn SCAP. Quá trình rà soát cấu hình hệ thống, lỗ hổng, và sự phù hợp với baseline có thể được hỗ trợ bởi các công cụ như SCAP Workbench hoặc các giải pháp tương tự. Các bước này giúp đảm bảo rằng các thay đổi cấu hình firewall và các tham số kernel được rà soát và xác nhận theo chuẩn bảo mật hiện hành.

Cấu hình và triển khai thực tiễn

Do giới hạn về nguồn tài liệu gốc, phần này trình bày khung làm việc và nguyên tắc triển khai ở mức thực tiễn, cùng với cách áp dụng chuẩn từ CIS Benchmarks và các công cụ xác thực để đảm bảo tính tuân thủ. Lưu ý rằng nội dung này nhấn mạnh cách tiếp cận, không phải hướng dẫn chi tiết từng lệnh hay quy tắc cụ thể mà có thể thay đổi theo từng môi trường và phiên bản phát hành.

Phác thảo chiến lược firewall và quản lý tuyến lưu lượng

Khi xây dựng chiến lược firewall cho Ubuntu 20.04+, mục tiêu là đảm bảo biên bảo vệ ở mức phù hợp, đồng thời cho phép các dịch vụ cần thiết hoạt động mà không phơi bày hệ thống trước các rủi ro. Việc sử dụng các chuẩn cấu hình từ CIS Benchmarks cho Ubuntu giúp xác định baseline cho các tham số liên quan đến mạng, logging, và quản lý truy cập. Các nguyên tắc chung bao gồm thiết lập chính sách mặc định nghiêm ngặt, ghi nhận đầy đủ và giám sát quá trình thay đổi cấu hình, đồng thời đảm bảo khả năng khôi phục khi cần.

Quản lý cấu hình kernel và tham số mạng

Trong quá trình hardening, quản trị viên có thể xem và thay đổi các tham số kernel liên quan đến mạng thông qua sysctl. Các tham số này nằm trong các subdir của /proc/sys/ và có thể ảnh hưởng đến cách hệ thống xử lý lưu lượng và các cơ chế bảo vệ mạng. Việc sử dụng sysctl cho run-time tuning cho phép kiểm tra nhanh và áp dụng các thay đổi nếu cần thiết để tăng cường bảo mật mạng và hạn chế các vector tấn công phổ biến.

Đối với các tham số mạng và hệ thống, quản trị viên nên bắt đầu từ việc liệt kê các tham số có thể điều chỉnh và xác định những tham số có ảnh hưởng trực tiếp đến an toàn của mạng và hệ thống. Sau khi xác định các tham số cần tối ưu, có thể áp dụng thay đổi ở thời gian chạy và theo dõi tác động của chúng, đồng thời ghi lại các thay đổi để phục vụ cho quá trình audit và tuân thủ.

Triển khai và tuân thủ baseline

Quá trình triển khai firewall và cấu hình hệ thống nên được đồng bộ với baseline bảo mật được xác nhận từ CIS Benchmarks cho Ubuntu. Điều này giúp đảm bảo rằng thiết lập firewall, các tham số mạng và các biện pháp kiểm soát truy cập đã được kiểm tra và xác nhận phù hợp với chuẩn công nhận. Sử dụng CIS Build Kits và CIS-CAT Pro hỗ trợ đánh giá tự động và theo dõi tuân thủ theo thời gian.

Cách tiếp cận bằng công cụ kiểm tra và quét

Trong khuôn khổ kiểm tra và xác thực, các công cụ SCAP và SCAP Workbench có thể được sử dụng để quét cấu hình hệ thống và đánh giá tuân thủ baseline. Các kết quả từ SCAP có thể được so sánh với chuẩn CIS hoặc các baseline nội bộ để phát hiện chênh lệch và lên kế hoạch remediate. Bên cạnh đó, các công cụ như AIDE hoặc các giải pháp kiểm tra integrity có thể được triển khai để đảm bảo tính toàn vẹn của hệ thống sau khi áp dụng firewall và thay đổi cấu hình.

Ví dụ thực tiễn và diễn tập

Trong khuôn khổ tài liệu, ta sẽ nêu các hướng dẫn thực tế chung về xác nhận và kiểm tra cấu hình bảo mật, đồng thời chỉ ra cách tiếp cận chuẩn để đảm bảo sự tuân thủ và sẵn sàng cho sản xuất.

  • Kiểm tra và đánh giá trạng thái hệ thống trước khi triển khai firewall: xác nhận phiên bản Ubuntu, tình trạng vá an toàn, và cấu hình baseline cho mạng.
  • Khởi tạo và xác nhận khung baseline bảo mật bằng CIS Benchmarks cho Ubuntu 20.04+ và Build Kits liên quan.
  • Thực hiện quét tuân thủ và cấu hình theo SCAP với SCAP Workbench hoặc công cụ tương tự; ghi nhận các báo cáo và theo dõi remediation.
  • Kiểm tra run-time và sự phù hợp của tham số kernel liên quan đến mạng bằng sysctl: liệt kê tham số, áp dụng thay đổi và xác nhận bằng sysctl -a.

Dưới đây là các ví dụ cú pháp tham khảo mang tính khái quát và được dùng để minh họa quá trình làm việc:

sysctl -a
sysctl -w <tên_tham_số>=<giá_trị>

Những lệnh trên cho phép quản trị viên xem toàn bộ tham số hiện có và áp dụng các thay đổi ở thời gian chạy. Sau khi thực hiện, có thể xác nhận lại bằng cách liệt kê tham số cần xem lại để đảm bảo thay đổi đã có hiệu lực.

Đối với kiểm tra baseline và tuân thủ, hãy tham khảo các tài nguyên như CIS Benchmarks cho Ubuntu 20.04 và các Build Kits tương ứng. Quá trình này có thể được hỗ trợ bởi các công cụ kiểm tra tự động, giúp đội ngũ vận hành nhanh chóng nhận diện các cấu hình bất hợp lý so với chuẩn đã công nhận.

Bảo mật, hiệu suất và giám sát

Hardening không chỉ là thiết lập một vài tham số. Nó còn là việc cân bằng giữa bảo mật và hiệu suất, đảm bảo mạng vẫn đáp ứng yêu cầu dịch vụ mà không mở cửa cho rủi ro. Việc giám sát liên tục và kiểm tra tuân thủ là phần thiết yếu để duy trì tình trạng an toàn của hệ thống theo thời gian.

Những khía cạnh sau đây là cần xem xét khi vận hành firewall và các biện pháp kernel-tuning trên Ubuntu 20.04+:

  • Đồng bộ với các chuẩn bảo mật: CIS Benchmarks cho Ubuntu và các biện pháp kiểm tra tự động để đảm bảo baseline luôn được duy trì qua các cập nhật và thay đổi môi trường.
  • Audit và giám sát: sử dụng các công cụ quét và kiểm tra tuân thủ để theo dõi sự xuất hiện của các thay đổi cấu hình không được chấp thuận và đánh giá ảnh hưởng lên bảo mật.
  • Hiệu suất và tài nguyên: kiểm tra tác động của các tham số mạng và quy tắc firewall đối với thông lượng và độ trễ, đảm bảo dịch vụ vẫn hoạt động ổn định.
  • Khôi phục khẩn cấp và ghi nhận: duy trì sổ nhật ký thay đổi và sẵn sàng cho việc phục hồi khi cần thiết, đồng thời ghi nhận các bước remediation cho audit trail.

Kiểm tra, validates và vận hành

Việc kiểm tra và xác thực là một phần không thể thiếu của chu kỳ vận hành hệ thống. Theo nguồn tài liệu tham khảo, CIS Benchmarks và SCAP cho phép tổ chức thực hiện các bước kiểm tra baseline một cách có hệ thống, từ đó phát hiện và khắc phục kịp thời các điểm yếu. Các hoạt động kiểm tra có thể bao gồm:

  • Đánh giá tuân thủ baseline cho Ubuntu 20.04+ bằng CIS Build Kits và CIS-CAT Pro để đảm bảo firewall và cấu hình liên quan đến mạng đã tuân thủ chuẩn.
  • Quét cấu hình và lỗ hổng bằng các công cụ SCAP hoặc SCAP Workbench; so sánh với baseline và lập kế hoạch remediation nếu có sự chênh lệch.
  • Kiểm tra tính toàn vẹn hệ thống bằng các công cụ như AIDE và các biện pháp bảo mật tích hợp khác để đảm bảo không có thay đổi trái phép sau khi cấu hình firewall được triển khai.

Trong thực tế, khung kiểm tra có thể được tích hợp vào quy trình CI/CD hoặc quy trình vận hành hàng ngày để đảm bảo rằng mọi thay đổi trong cấu hình mạng, firewall và kernel được kiểm tra và xác nhận trước khi đưa vào sản xuất.

Checklist vận hành cuối bài viết

  • Xác định và xác nhận nền tảng Ubuntu 20.04+ và các bản vá liên quan.
  • Áp dụng baseline bảo mật từ CIS Benchmarks cho Ubuntu và ghi nhận bằng Build Kits hoặc công cụ kiểm tra tương đương.
  • Định nghĩa chiến lược firewall ở mức high-level và sử dụng sysctl để tinh chỉnh các tham số kernel liên quan đến mạng khi cần.
  • Thực hiện quét tuân thủ và đánh giá cấu hình bằng SCAP Workbench hoặc công cụ tương đương; ghi nhận kết quả và remediation.
  • Kiểm tra và đảm bảo sự toàn vẹn hệ thống sau khi thay đổi cấu hình, sử dụng AIDE và các công cụ kiểm tra tích hợp khác.
  • Xây dựng quy trình ghi nhận thay đổi, backup cấu hình và khôi phục hệ thống khi xảy ra sự cố.

Kết luận

Chiến lược cấu hình firewall và các biện pháp hardening trên Ubuntu 20.04+ nên được xây dựng trên nền tảng chuẩn mực và kiểm tra tuân thủ. Việc sử dụng CIS Benchmarks cho Ubuntu, cùng với công cụ quét và đánh giá tự động, giúp vận hành viên gia tăng đáng kể khả năng nhận diện và khắc phục các rủi ro bảo mật liên quan đến firewall và lưu lượng mạng. Đồng thời, việc quản lý thông qua sysctl và các tham số kernel cho phép tinh chỉnh hành vi hệ thống theo nhu cầu bảo mật mà vẫn đảm bảo tính sẵn sàng và hiệu suất dịch vụ.

Prometheus Alertmanager: Thiết lập cảnh báo thông minh trên Ubuntu 20.04+

[Thực chiến] Prometheus Alertmanager: Thiết lập cảnh báo thông minh trên Ubuntu 20.04+

Giới thiệu và khi nào nên dùng Prometheus Alertmanager

Prometheus Alertmanager là thành phần quản lý cảnh báo trong hệ sinh thái Prometheus. Vai trò của Alertmanager là nhận cảnh báo từ Prometheus, thực hiện tổ chức và định tuyến chúng tới các kênh thông báo phù hợp, đồng thời hỗ trợ gom nhóm, ẩn cảnh báo (inhibition) và quản lý thời gian cảnh báo một cách hiệu quả. Trong bối cảnh triển khai trên Ubuntu 20.04+ hoặc hệ thống tương đương, Alertmanager giúp giảm nhiễu cảnh báo bằng cách gom nhóm các cảnh báo liên quan và gửi thông báo tới đội ngũ vận hành đúng lúc và đúng kênh nói chuyện.

Bản chất của Alertmanager là tập hợp các quy tắc định tuyến (routes), các receivers (kênh nhận thông báo), và các cơ chế tối ưu hóa như group_by, group_wait, group_interval và repeat_interval. Ngoài ra Alertmanager còn hỗ trợ quản lý tính sẵn có (High Availability), tích hợp nhiều kênh thông báo (email, Slack, PagerDuty, webhook, v.v.), và có thể làm việc phối hợp với các công cụ giám sát và thông báo khác như Prometheus và Pushgateway. Các nguyên tắc thiết kế được mô tả trong tài liệu Prometheus nhấn mạnh việc: giữ cho cảnh báo đơn giản, cảnh báo theo triệu chứng của sự cố người dùng, có liên kết tới các console cho nhanh chóng xác định nguyên nhân, và tránh cảnh báo khi không có hành động cần thực hiện.

Kiến trúc và khái niệm cốt lõi

Kiến trúc của hệ thống cảnh báo với Alertmanager xoay quanh vài khái niệm then chốt sau đây, được nêu rõ trong tài liệu của Prometheus:

  • Alerting và quy trình định tuyến: Alertmanager nhận cảnh báo từ Prometheus, sau đó phân bổ chúng theo các tuyến (route) và danh sách nhận (receivers). Các quy tắc gom nhóm (group_by, group_wait, group_interval) giúp hợp nhất nhiều cảnh báo liên quan thành một thông báo duy nhất để giảm nhiễu.
  • Những kênh nhận thông báo (notification integrations): Alertmanager có thể gửi cảnh báo qua nhiều kênh khác nhau như email, webhook, Slack hoặc các dịch vụ thông báo khác. Việc định tuyến có thể tùy biến dựa trên nhãn (labels) của cảnh báo để gửi tới đúng đội ngũ hoặc hệ thống liên quan.
  • Quản lý High Availability (HA): Đảm bảo dịch vụ cảnh báo luôn sẵn sàng bằng cách triển khai nhiều instance Alertmanager và phân phối tải hoặc bật chế độ HA theo thiết kế của hệ thống.
  • Templates và cấu hình thông báo: Alertmanager hỗ trợ các template thông báo để tùy biến nội dung và định dạng thông báo trước khi gửi tới receiver. Các tham chiếu template và ví dụ template được đưa ra nhằm giúp người vận hành điều chỉnh nội dung thông báo cho phù hợp với quy trình vận hành.
  • Quản trị và an ninh: Cấu hình có thể hỗ trợ xác thực và bảo mật khi trao đổi thông tin thông báo, cùng với khả năng phân quyền và quản lý các luồng cảnh báo nhạy cảm.

Yêu cầu và tiền đề triển khai với Ubuntu 20.04+

Để triển khai Prometheus Alertmanager trên nền Ubuntu 20.04+ (hoặc các hệ điều hành tương thích), cần lưu ý các yếu tố sau để đảm bảo vận hành ổn định và an toàn:

  • Hệ điều hành tối thiểu là Ubuntu 20.04 hoặc phiên bản tương thích với kernel và giao thức mạng hiện đại.
  • Prometheus đang hoạt động và có các rules cảnh báo được định nghĩa để gửi tới Alertmanager.
  • Kênh nhận thông báo (receivers) phải được định nghĩa rõ ràng và có quyền truy cập tới dịch vụ nhận thông báo (ví dụ máy chủ SMTP cho email hoặc endpoints của webhook).
  • Cân nhắc triển khai High Availability cho Alertmanager để đảm bảo khả năng sẵn sàng và giảm thiểu thời gian gián đoạn cảnh báo.
  • Cân nhắc an toàn mạng và bảo mật khi truyền nhận cảnh báo qua mạng, đặc biệt khi dùng HTTPS và xác thực cho các kênh nhận thông báo.

Cài đặt và triển khai tổng quan

Tài liệu nhấn mạnh vai trò của Alertmanager là quản lý cảnh báo một cách có tổ chức và cung cấp các kênh nhận thông báo linh hoạt. Đối với Ubuntu 20.04+, quy trình triển khai thường bao gồm cài đặt Alertmanager cùng với cấu hình để định tuyến cảnh báo tới kênh nhận phù hợp, sau đó kết nối với Prometheus để nhận các cảnh báo từ các rule được đánh giá trong Prometheus. Quá trình triển khai nên xem xét khả năng sẵn có (HA) và cơ chế quản lý cấu hình để dễ bảo trì trong môi trường sản xuất.

Dưới đây là một khung minh họa cho cấu hình Alertmanager ở mức tối giản nhằm hình dung các khối cơ bản. Lưu ý đây là ví dụ tham khảo; nội dung thực tế nên được điều chỉnh cho phù hợp với quy trình vận hành và các kênh nhận được hỗ trợ trong tổ chức của bạn.

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'default-receiver'

receivers:
- name: 'default-receiver'
  email_configs:
  - to: 'ops@example.com'
    send_resolved: true

Trong thực tế, cấu hình có thể mở rộng với nhiều receivers và quy tắc định tuyến phức tạp hơn để đáp ứng phạm vi hệ thống và yêu cầu vận hành của tổ chức.

Cấu hình Alertmanager và cách thức tích hợp với Prometheus

Alertmanager được thiết kế để làm việc cùng Prometheus nhằm tối ưu hoá việc gửi cảnh báo trên các kênh phù hợp. Prometheus sẽ đánh giá các alerting rules và gửi các cảnh báo tới Alertmanager. Tại đây, Alertmanager sẽ xử lý theo các route đã được định nghĩa, ghép nhóm cảnh báo tương tự, và đẩy thông báo tới receiver phù hợp. Việc định tuyến dựa vào các nhãn (labels) của cảnh báo cho phép phân phối cảnh báo đến đúng đội ngũ hoặc dịch vụ liên quan. Đây là yếu tố quan trọng giúp giảm noise và nâng cao thời gian phản hồi của đội ngũ vận hành.

Trong chủ đề an ninh và xác thực, cấu hình Alertmanager có thể được mở rộng với các cơ chế bảo mật để đảm bảo an toàn khi trao đổi thông báo qua mạng, bao gồm việc thiết lập HTTPS và xác thực cho các kênh nhận thông báo nếu cần thiết.

Ví dụ thiết kế và vận hành thực tế

Một kịch bản điển hình trong môi trường sản xuất là một ứng dụng phục vụ người dùng có độ trễ cao đột biến. Dưới đây là cách tiếp cận ở mức vận hành:

  1. Định nghĩa một alert rule trong Prometheus để phát hiện tăng latency vượt ngưỡng và/hoặc tỉ lệ lỗi tăng lên. Rule này sẽ gửi cảnh báo tới Alertmanager.
  2. Alertmanager nhận cảnh báo, kiểm tra các điều kiện để ghép nhóm và xác định receiver phù hợp với nhóm vận hành (ví dụ on-call hoặc the on-call channel).
  3. Route được cấu hình để gửi thông báo tới người chịu trách nhiệm qua kênh email và Slack, hoặc tới một webhook tích hợp hệ thống vận hành trung tâm.
  4. Khi sự cố được resolves, cảnh báo sẽ được đóng và một thông báo gửi tới receiver xác nhận tình trạng đã được khắc phục.

Trong quá trình triển khai, điều quan trọng là đảm bảo có thể kiểm thử luồng cảnh báo để xác nhận rằng Alertmanager có thể nhận được cảnh báo từ Prometheus, xử lý đúng bằng cách ghép nhóm và gửi thông báo tới receiver phù hợp. Một nguyên tắc được nhắc tới trong tài liệu Prometheus là cảnh báo nên tập trung vào triệu chứng thay vì cố gắng theo dõi mọi nguyên nhân có thể gây ra sự cố.

Bảo mật và hiệu năng

Với mô hình vận hành thực tế, các yếu tố bảo mật và hiệu năng là cần thiết để đảm bảo cảnh báo được gửi đúng người đúng lúc mà không rò rỉ thông tin hay gặp gián đoạn. Các yêu cầu quan trọng theo nguyên tắc được đề cập bao gồm:

  • Cấu hình an toàn cho kênh nhận thông báo: đảm bảo đường truyền tới receiver được bảo mật, đặc biệt khi gửi qua mạng công khai hoặc qua các hệ thống bên ngoài tổ chức.
  • Quản lý naming và tổ chức alert: đặt tên theo Camel Case cho các cảnh báo, hạn chế số lượng cảnh báo và đảm bảo mỗi cảnh báo liên quan tới một triệu chứng cụ thể có thể dễ dàng xác định. Việc này giúp giảm nhiễu và tăng khả năng đo lường tình trạng hệ thống.
  • Metamonitoring cho hệ thống cảnh báo: có các cảnh báo liên quan đến Prometheus servers, Alertmanager instances và các thành phần liên quan (ví dụ Pushgateway) nhằm đảm bảo toàn bộ chu trình cảnh báo đang hoạt động đúng cách.
  • Thiết kế cảnh báo theo ngữ cảnh người dùng: ưu tiên cảnh báo ở mức latency và error rate ở tầng cao nhất có thể, đồng thời liên kết với các console liên quan để dễ xem nguyên nhân.

Vận hành và giám sát hệ thống cảnh báo

Để đảm bảo Alertmanager vận hành liên tục, cần có các hoạt động giám sát và kiểm thử định kỳ. Các khía cạnh cần kiểm tra thường gặp bao gồm:

  • Kiểm tra tính sẵn có của Alertmanager ở chế độ HA và khả năng chịu lỗi khi có node bị lỗi.
  • Đảm bảo các receivers nhận đúng dạng cảnh báo và có thời gian đáp ứng phù hợp với mức độ nghiêm trọng của cảnh báo.
  • Kiểm tra các template thông báo để đảm bảo nội dung và định dạng phù hợp với thực tiễn vận hành và ghi nhận chi tiết giúp debugging nhanh chóng.
  • Kiểm tra luồng cảnh báo từ Prometheus tới Alertmanager và từ Alertmanager tới receiver, với các test nhỏ mô phỏng cảnh báo và xác nhận phản hồi.

Thông qua các nguyên tắc và khuyến nghị trên, quá trình vận hành Alertmanager trên Ubuntu 20.04+ có thể được duy trì ổn định và dễ bảo trì trong thời gian dài.

Kiểm thử, xác nhận và xác thực vận hành

Để đảm bảo chất lượng và tính đúng đắn của cấu hình Alertmanager, thực hiện một chu kỳ kiểm thử có thể bao gồm các bước sau:

  • Kiểm tra cú pháp cấu hình bằng cách xác nhận file cấu hình Alertmanager trước khi chạy trong môi trường sản xuất.
  • Thực hiện cảnh báo mô phỏng (test alert flow) bằng cách kích hoạt một cảnh báo trong Prometheus và xác nhận Alertmanager nhận và gửi thông báo tới receiver được định nghĩa.
  • Kiểm tra log của Alertmanager để xác nhận các hành động định tuyến và các thông báo nhận được bởi receiver.
  • Đảm bảo khả năng phục hồi khi một node trong chế độ HA bị lỗi và cảnh báo vẫn được định tuyến tới receiver còn hoạt động.

Checklist vận hành cuối bài

  • Đảm bảo Prometheus và Alertmanager được triển khai đúng với chu trình cảnh báo phù hợp với yêu cầu vận hành.
  • Cấu hình route và receivers phù hợp với tổ chức, team và SLAs.
  • Thiết lập TLS và xác thực cho các kênh nhận thông báo nếu cần thiết.
  • Thiết lập cơ chế High Availability cho Alertmanager và theo dõi sức khỏe của các node.
  • Thiết lập và kiểm tra templates thông báo để đảm bảo nội dung có thể đọc được và actionable.
  • Thực hiện kiểm thử luồng cảnh báo định kỳ và cập nhật cấu hình khi cần.

Kết luận

Prometheus Alertmanager cung cấp cơ chế quản lý cảnh báo tập trung, giúp định tuyến và tối ưu hóa các thông báo đến đúng người và đúng kênh. Khi triển khai trên Ubuntu 20.04+ hoặc hệ thống tương đương, cần chú ý tới các nguyên tắc thiết kế: định tuyến có ngữ cảnh, gom nhóm để giảm nhiễu, và ưu tiên cảnh báo theo triệu chứng có tác động lên người dùng. Bên cạnh đó, sự tích hợp giữa Alertmanager và Prometheus, cùng với các kênh thông báo và cơ chế HA, là nền tảng cho một hệ thống giám sát và vận hành mạnh mẽ và đáng tin cậy.

Apache2 trên Ubuntu 20.04+: giám sát và quan sát hệ thống cho quản trị viên

Apache2 trên Ubuntu 20.04+: giám sát và quan sát hệ thống cho quản trị viên

Apache2 trên Ubuntu 20.04+ giám sát và quan sát hệ thống cho quản trị viên

Việc giám sát và quan sát Apache2 trên nền tảng Ubuntu 20.04 trở nên quan trọng để đảm bảo khả dụng, hiệu suất và an toàn cho các ứng dụng web của bạn. Bài viết này trình bày các khía cạnh thực tiễn cho quản trị hệ thống, từ kiến trúc cốt lõi đến các biện pháp cấu hình tối ưu và phương pháp giám sát phù hợp với môi trường sản xuất. Nội dung được xây dựng dựa trên các tài liệu kỹ thuật hiện có và tập trung vào cách khai thác các directive và mô hình xử lý hiện có của Apache2 Version 2.4 để hỗ trợ công tác vận hành và bảo trì trên Ubuntu 20.04+.

Kiến trúc và khái niệm cốt lõi

Kiến trúc Apache2 cho phiên bản 2.4 gồm nhiều thành phần có thể điều chỉnh nhằm tối ưu hóa khả năng phục vụ các kết nối đồng thời. Một sự khác biệt quan trọng là việc dùng Multi Processing Module MPM để xử lý luồng công việc và kết nối. MPM event là một biến thể của MPM worker có mục tiêu tiêu thụ threads chỉ cho các kết nối đang có xử lý thực sự, trong khi các kết nối khác được quản lý bởi các listener thread, nhờ đó các worker threads có thể phục vụ yêu cầu mới nhanh hơn. Đây là một mô hình kết nối bất đồng bộ giúp giảm yếu tố thận thùng và tối ưu hóa xử lý đồng thời. Để dùng MPM event, cấu hình biên dịch cho httpd cần được thiết kế với tham số –with-mpm=event khi biên dịch chương trình, sau đó là quá trình biên dịch và cài đặt.

Trong cơ chế vận hành, Apache2 duy trì một control process và các process con, mỗi process con sẽ tạo ra một số lượng server thread cố định để xử lý yêu cầu và một listener thread tiếp nhận kết nối. Việc tách biệt giữa các giai đoạn nhận kết nối và xử lý chính giúp giảm chi phí khởi tạo tài nguyên cho mỗi kết nối và cải thiện khả năng xử lý đồng thời, đặc biệt khi lưu lượng cao hoặc có nhiều kết nối KeepAlive. Các yếu tố như AsyncRequestWorkerFactor và cách quản lý KeepAlive đều liên quan trực tiếp đến hiệu năng và khả năng chịu tải của hệ thống.

Để quản trị viên có thể theo dõi tiến trình và hiệu suất, Apache còn cung cấp các chỉ số và cơ chế trực quan thông qua sử dụng mod_status và Scoreboard. Việc theo dõi trạng thái các kết nối bất động và tổng số kết nối đang hoạt động giúp nhận diện bottleneck và điều chỉnh tham số cho phù hợp với tải thực tế.

Yêu cầu và chuẩn bị cài đặt

Trên Ubuntu 20.04+ hoặc các bản phân phối tương thích, bạn sẽ bắt đầu từ việc cài đặt Apache2 và đảm bảo các cấu hình an toàn cho server root cùng các thư mục liên quan. Trong ngữ cảnh bảo mật và ổn định, cần chú ý quản lý quyền trên các thư mục và tập tin quan trọng, đảm bảo chỉ root mới có thể chỉnh sửa các thành phần cốt lõi và các đường dẫn quan trọng của ServerRoot. Các bước cụ thể có thể được cân nhắc như sau:

  • Đảm bảo đúng quyền và sở hữu trên thư mục ServerRoot và các thư mục con như bin, conf, logs, đảm bảo rằng chúng chỉ có thể được sửa bởi root và các người dùng được cấu hình phù hợp trên hệ thống.
  • Tập tin thực thi httpd nên được bảo vệ nghiêm ngặt để ngăn sửa đổi trái phép và ngăn lưu đè lên log hoặc các tệp hệ thống quan trọng.
  • Khái niệm về Server Side Includes SSI và các rủi ro dẫn đến tải hệ thống và các vấn đề bảo mật liên quan đến SSI cần được cân nhắc trong môi trường chia sẻ và có nhiều người dùng.

Trong thực tế, các thiết lập cụ thể về nhận diện và xử lý kết nối cần được điều chỉnh dựa trên tải và đặc thù ứng dụng. Đối với Linux và các hệ điều hành có hỗ trợ AcceptFilter, bạn có thể cấu hình để offload một phần xử lý nhận kết nối cho kernel hoặc các cơ chế OS, nhằm giảm gánh nặng cho Apache. Phần này sẽ được trình bày kỹ hơn trong phần cấu hình.

Cấu hình chính cho giám sát và tối ưu hóa

Để đảm bảo khả năng giám sát và quan sát hệ thống, bạn cần chú ý đến một số directive cốt lõi và các cơ chế tối ưu hóa sẵn có trong Apache 2.4. Dưới đây là danh sách các khái niệm và directive quan trọng có liên quan trực tiếp đến giám sát và vận hành hệ thống:

  • TimeOut và KeepAlive: TimeOut xác định thời gian một client có thể mất để gởi yêu cầu. TimeOut có thể được giảm xuống mức thích hợp để giảm thiểu tình trạng DoS. KeepAlive cho phép giữ mở kết nối để tái sử dụng và giảm chi phí thiết lập lại kết nối, tuy nhiên việc giữ lại quá mức có thể ảnh hưởng đến hiệu suất. KeepAliveTimeout có thể được giả lập để tối ưu giữa khả năng phục hồi và hiệu suất.
  • Limit các yêu cầu và dữ liệu đầu vào: LimitRequestBody, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine và LimitXMLRequestBody được thiết kế để giới hạn nguồn lực tiêu thụ từ phần mô tả của client. Việc cấu hình các giới hạn này giúp hạn chế rủi ro từ dữ liệu đầu vào không hợp lệ hoặc cố tình nhồi dữ liệu lớn.
  • AcceptFilter và tối ưu hóa nhận kết nối: AcceptFilter giúp offload một phần xử lý cho kernel hay các thành phần hệ điều hành, dựa trên nền tảng OS. Ví dụ trên Linux có thể chọn AcceptFilter http data hoặc dataready, và trên Windows hoặc FreeBSD có các tùy chọn khác nhau. Việc bật AcceptFilter có thể giúp giảm tải cho Apache trong các môi trường có lưu lượng cao.
  • Async và MaxRequestWorkers: MPM event hỗ trợ xử lý bất đồng bộ và có tham số AsyncRequestWorkerFactor để điều chỉnh lượng công việc bất đồng bộ. MaxRequestWorkers quyết định số lượng kết nối đồng thời được phục vụ. Việc điều chỉnh các tham số này giúp tối ưu khả năng phục vụ và quản lý nguồn lực khi tải cao.
  • Scoreboard và quản trị tiến trình: Scoreboard cho biết trạng thái của các tiến trình và worker threads. Trong trường hợp scoreboard đầy hoặc các tiến trình đang ở trạng thái Graceful, bạn có thể nhận diện các bottleneck và tối ưu hóa lộ trình xử lý trong thời gian bảo trì hoặc khởi động lại.
  • Path và quản lý đường dẫn cài đặt: Chính sách URI và PATH_INFO thông qua AcceptPathInfo cho phép xác định cách xử lý các trailing path sau file thực thi, ảnh hưởng đến khả năng chạy script và bảo mật của đường dẫn.

Ví dụ cấu hình cho các directive phổ biến

TimeOut 5
KeepAlive On
KeepAliveTimeout 5
MaxRequestWorkers 150
AsyncRequestWorkerFactor 2
AcceptFilter http data
AcceptPathInfo On
ExtendedStatus On
ScoreBoardFile /var/log/apache2/status

Trong thực tế, các giá trị trên chỉ là ví dụ và cần được điều chỉnh dựa trên tải thực tế, tính sẵn có của phần cứng và đặc thù ứng dụng. Hãy cân nhắc đến khía cạnh an toàn khi cho phép PATH_INFO hoặc bất kỳ dạng dữ liệu đầu vào nào và luôn giám sát tác động lên nguồn lực hệ thống.

An ninh và bảo mật khi giám sát

An toàn là thành phần không thể tách rời của quá trình giám sát và vận hành. Các nguyên tắc bảo mật cơ bản liên quan đến quyền truy cập và cách Apache tương tác với hệ điều hành có thể ảnh hưởng lớn đến độ tin cậy của hệ thống. Một số biện pháp có thể tham khảo dựa trên tài liệu an toàn cho Apache 2.4:

  • Giữ ServerRoot và các thư mục quan trọng ở quyền và sở hữu đúng. Trong hoạt động bình thường, Apache được khởi động bởi người dùng root và sau đó chuyển sang người dùng được chỉ định bởi directive User để phục vụ các lượt truy cập. Đảm bảo rằng các thư mục và các tập tin trong ServerRoot chỉ có quyền write bởi root và các cấp cha con của chúng cũng vậy. Việc cho phép người dùng phi root chỉnh sửa các tập tin liên quan đến chạy chương trình có thể mở nguy cơ bị tấn công.
  • Nghỉ ngơi hoặc giảm thiểu rủi ro từ SSI. SSI có thể phát sinh tải trên máy chủ và các rủi ro bảo mật liên quan đến thực thi CGI hoặc các script dưới quyền của người dùng. Xem xét nhu cầu và ảnh hưởng trước khi bật SSI trong môi trường chia sẻ.
  • Config và giới hạn đầu vào từ phía client để giảm nguy cơ DoS và các hình thức tấn công qua dữ liệu đầu vào. Kết hợp với tường lửa và các cấu hình kernel phù hợp để hạn chế số luồng đồng thời từ một địa chỉ IP hay mạng nhất định.
  • Áp dụng AcceptFilter và các tối ưu OS để giảm tải cho Apache và tăng khả năng chịu tải trong các môi trường có lưu lượng cao.

Đối với hệ thống Linux, những khuyến nghị về AcceptFilter và offloading xử lý cho kernel có thể mở rộng khả năng đáp ứng và giảm tải cho máy chủ. Việc quản trị đúng các đường dẫn tài nguyên và đảm bảo quyền truy cập an toàn đóng vai trò then chốt trong việc duy trì tính toàn vẹn của hệ thống trong quá trình giám sát và vận hành.

Hiệu năng và tối ưu hóa

Hiệu năng của Apache2 phụ thuộc vào cách cấu hình MPM và cách quản trị tài nguyên. Các giải pháp tối ưu phổ biến bao gồm:

  • Chọn MPM event hoặc worker với cách phân bổ thread và process hợp lý, nhằm tối ưu hóa CPU và RAM. Sự chuyển đổi sang mô hình event giúp giảm chi phí cho mỗi kết nối và tăng khả năng phục vụ đồng thời.
  • Giảm thời gian chờ đợi cho từng yêu cầu bằng TimeOut và KeepAlive phù hợp với tải. Việc giảm KeepAlive và KeepAliveTimeout đối với các site dễ bị DoS có thể giúp giảm gánh nặng cho hệ thống, nhưng đi kèm với đánh đổi hiệu suất cho các site có nhiều CGI hoặc long running scripts.
  • Kiểm soát phạm vi và độ khắt khe của giới hạn đầu vào với các directive LimitRequestBody và các giới hạn khác để ngăn tình trạng tốn tài nguyên do dữ liệu từ client gửi lên.
  • Hướng tới OS level offloading cho việc xử lý nhận kết nối bằng AcceptFilter, nhằm tối ưu hóa luồng xử lý và giảm thiểu chi phí từ kernel.

Đồng thời hãy theo dõi sự thay đổi và cập nhật phần mềm. Apache có lịch sử bảo mật tốt, nhưng sự cố có thể phát sinh từ mã thêm hoặc hệ điều hành đi kèm. Vì vậy, việc cập nhật và tham gia danh sách thông báo từ Apache HTTP Server là điều được khuyến nghị để duy trì an ninh và tính ổn định của hệ thống.

Giám sát và observability

Khả năng quan sát hệ thống là yếu tố quyết định để duy trì vận hành liên tục. Các yếu tố cần theo dõi gồm:

  • Trạng thái và hiệu suất qua trang status của mod_status. Trang trạng thái cho phép xem thông tin về số kết nối đang chờ xử lý, số worker và các thông tin liên quan đến Async connections. Việc này cho phép nhận diện sớm các bottleneck và điều chỉnh tham số cho phù hợp.
  • Scoreboard và trạng thái của các tiến trình. Scoreboard cho biết trạng thái của các tiến trình và các worker threads, giúp bạn nhận diện các tình huống Graceful hoặc các vòng lặp xử lý đang chiếm dụng tài nguyên.
  • Quan sát log và nhật ký hệ thống. Việc theo dõi log là căn bản để nhận diện các sự kiện bất thường, lỗi và các xung đột khi chạy các module hoặc CGI script. Đảm bảo quyền ghi log được quản lý đúng cách để tránh bị sửa đổi trái phép.
  • Kiểm tra và đánh giá biểu đồ và dữ liệu từ các directive liên quan đến giới hạn và thời gian phản hồi nhằm đảm bảo rằng các phạm vi cấu hình đang phù hợp với tải thực tế.

Để thực hiện giám sát hiệu quả, bạn có thể bậtExtendedStatus để có thêm dữ liệu chi tiết tham gia vào mod_status và giữ nguyên chế độ theo dõi trong quá trình vận hành. Việc theo dõi quy mô và hiệu suất cần được thực hiện liên tục và kết hợp với các cảnh báo khi có sự cố. Trong đó hãy chú ý tới thời gian phản hồi và số lượng kết nối đồng thời để điều chỉnh tham số cho phù hợp với tải.

Kiểm tra và xác nhận vận hành

Kiểm tra cấu hình và xác nhận vận hành là bước quan trọng trước khi đẩy hệ thống vào sản xuất. Những bước kiểm tra cơ bản gồm:

  • Kiểm tra syntax và cú pháp cấu hình bằng cách kiểm tra đúng các directive đã bật và đảm bảo không có lỗi biên dịch hoặc cú pháp. Theo dõi các log để nhận diện cảnh báo hoặc lỗi liên quan đến cấu hình.
  • Kiểm tra khả năng xử lý kết nối đồng thời và qua mod_status để xem số lượng kết nối đang hoạt động và tình trạng các worker. Theo dõi bằng cách xem thông tin liên quan đến Async connections và MaxRequestWorkers.
  • Đảm bảo tính bảo mật của đường dẫn ServerRoot và các thư mục liên quan bằng cách kiểm tra quyền viết và quyền truy cập của non-root users. Theo dõi các log để đảm bảo không có thay đổi trái phép nào diễn ra.
  • Kiểm tra khả năng offloading nhận kết nối và tiến trình xử lý của kernel khi được kích hoạt AcceptFilter trên hệ thống Linux. Đảm bảo AcceptFilter hoạt động đúng theo các giá trị bạn đã cấu hình và theo dõi các log hệ thống khi cần thiết.

Trong quá trình vận hành, hãy bảo đảm hệ thống được theo dõi một cách liên tục và có kế hoạch sao lưu cấu hình cũng như sao lưu dữ liệu logs để có thể phục hồi nhanh chóng khi gặp sự cố. Việc tham gia danh sách thông báo của Apache và cập nhật kịp thời là yếu tố then chốt để duy trì an toàn và ổn định cho hệ thống.

Checklist vận hành ngắn gọn

  • Xác định mô hình MPM phù hợp với tải và yêu cầu ứng dụng
  • Cấu hình TimeOut, KeepAlive và các giới hạn đầu vào cho một phiên bản an toàn
  • Bật và cấu hình AcceptFilter cho hệ điều hành đang sử dụng, đặc biệt trên Linux
  • Bật ExtendedStatus và theo dõi mod_status để giám sát trạng thái và hiệu suất
  • Theo dõi log và đảm bảo quyền ghi, không cho phép sửa đổi trái phép
  • Đảm bảo quyền truy cập đúng trên ServerRoot và các thư mục quan trọng
  • Với các thay đổi cấu hình, kiểm tra syntax và xác nhận vận hành trước khi đưa vào sản xuất
  • Chuẩn bị kế hoạch sao lưu cấu hình và dữ liệu log

Kết luận ngắn

Việc giám sát và quan sát hệ thống Apache2 trên Ubuntu 20.04+ đòi hỏi sự cân bằng giữa hiệu năng và an toàn. Bằng cách áp dụng các nguyên tắc quản trị nguồn lực, tối ưu hóa thông qua MPM event, và thiết lập đúng các directive như TimeOut, KeepAlive, và các giới hạn đầu vào, bạn có thể duy trì hệ thống ổn định ngay cả khi đối mặt với lưu lượng cao. Việc tận dụng công cụ giám sát như mod_status và Scoreboard hợp cùng với các biện pháp bảo mật cơ bản sẽ giúp quản trị viên nhanh chóng nhận diện và xử lý các sự cố, từ đó đảm bảo dịch vụ web luôn sẵn sàng cho người dùng cuối.

Một số MySQL Command Line

Giới thiệu

MySQL Command Line là công cụ mạnh mẽ và linh hoạt cho việc quản lý cơ sở dữ liệu, từ thao tác đơn giản đến các tác vụ phức tạp. Trong bài viết này, chúng ta sẽ khám phá một số lệnh MySQL hữu ích mà bạn có thể sử dụng trực tiếp từ dòng lệnh. Cho dù bạn là người mới bắt đầu hay một chuyên gia quản trị cơ sở dữ liệu, việc nắm vững các lệnh này sẽ giúp bạn làm việc hiệu quả hơn, tiết kiệm thời gian và tối ưu hóa hiệu suất hệ thống. Hãy cùng bắt đầu với những lệnh cơ bản nhất và tiến đến những lệnh nâng cao hơn để quản lý và điều hành cơ sở dữ liệu MySQL của bạn.

USER COMMAND

Danh sách tất cả người dùng trên máy chủ cơ sở dữ liệu:
	mysql> Select user from mysql.user;  

Xem thêm thông tin về bảng người dùng:
	mysql> DESC user; 

Truy vấn host, account_locked, password_expired của người dùng:
	mysql> SELECT user, host, account_locked, password_expired FROM user;  

Hiển thị người dùng hiện tại:
	mysql> Select user();  
	mysql> Select current_user();
	
Xem người dùng hiện tại đang đăng nhập vào máy chủ cơ sở dữ liệu:
	mysql> SELECT user, host, db, command FROM information_schema.processlist;

Tạo Người Dùng Mới:
	CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';
	CREATE USER 'sammy'@'thanhnh.id.vn' IDENTIFIED BY 'password';

Cấp Quyền Cho Người Dùng:
	GRANT PRIVILEGE ON database.table TO 'username'@'host';
	GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'thanhnh.id.vn' WITH GRANT OPTION;

Thu hồi quyền:
	REVOKE type_of_permission ON database_name.table_name FROM 'username'@'host';

Xem lại các quyền hiện tại của người dùng:
	SHOW GRANTS FOR 'username'@'host';
	
Xóa Người Dùng:
	DROP USER user [, user] ....
	DROP USER 'jeffrey'@'thanhnh.id.vn';

LIST PRIVILEGES :

SELECT: Quyền cho phép người dùng truy vấn và lấy dữ liệu từ một bảng hoặc một tập hợp bảng.

INSERT: Cho phép người dùng thêm dữ liệu mới vào bảng.

UPDATE: Cho phép người dùng sửa đổi dữ liệu hiện có trong bảng.

DELETE: Cho phép người dùng xóa dữ liệu khỏi bảng.

CREATE: Cho phép người dùng tạo các đối tượng mới trong cơ sở dữ liệu, chẳng hạn như bảng, chỉ mục, hoặc cơ sở dữ liệu mới.

ALTER: Cho phép người dùng thay đổi cấu trúc của các đối tượng trong cơ sở dữ liệu, chẳng hạn như thêm cột mới vào bảng hoặc thay đổi kiểu dữ liệu của một cột.

DROP: Cho phép người dùng xóa các đối tượng khỏi cơ sở dữ liệu, chẳng hạn như xóa bảng, chỉ mục hoặc cơ sở dữ liệu.

GRANT: Cho phép người dùng cấp quyền cho người dùng khác.

REVOKE: Cho phép người dùng thu hồi quyền mà họ đã cấp cho người dùng khác.

EXECUTE: Cho phép người dùng thực thi các stored procedures và functions trong cơ sở dữ liệu.

INDEX: Cho phép người dùng tạo và xóa chỉ mục trên các bảng.

REFERENCES: Cho phép người dùng tạo các khóa ngoại (foreign key) liên kết bảng này với bảng khác.

LOCK TABLES: Cho phép người dùng khóa bảng để ngăn chặn các thao tác khác trong quá trình họ làm việc với bảng đó.

SHOW VIEW: Cho phép người dùng xem định nghĩa của một view (một bảng ảo được tạo từ kết quả của một truy vấn SELECT).

TRIGGER: Cho phép người dùng tạo và quản lý các triggers, là các hành động tự động được thực hiện khi có sự kiện xảy ra trong cơ sở dữ liệu.

TABLE Command :

Hiển thị cơ sở dữ liệu:
	SHOW DATABASES;

Tạo cơ sở dữ liệu mới có tên là ‘myfirstdb’:
	mysql> CREATE DATABASE myfirstdb;

Tạo cơ sở dữ liệu với các tùy chọn:
	mysql> CREATE DATABASE myfirstdb character set utf8 collate utf8_bin;

QUERRY DATABASE SIZE:

SELECT table_schema "mydatabasename",
        ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" 
FROM information_schema.tables 
GROUP BY table_schema; 

SQL AUTO INCREMENT :

CREATE TABLE Persons (
    Personid int NOT NULL AUTO_INCREMENT,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    PRIMARY KEY (Personid)
);

Default auto_increment = 1 and will increment by 1 for each new record, if want auto_increment start with another value, use this :
	ALTER TABLE Persons AUTO_INCREMENT=100;

Trên đây là một số lệnh cơ bản và nâng cao trong MySQL Command Line giúp bạn quản lý cơ sở dữ liệu một cách hiệu quả. Việc nắm vững các lệnh này không chỉ giúp bạn thực hiện các tác vụ quản trị dễ dàng hơn mà còn tối ưu hóa hiệu suất và bảo mật cho hệ thống. Hãy thực hành thường xuyên để làm quen với các lệnh này, và đừng ngần ngại khám phá thêm các tùy chọn và tính năng khác của MySQL để khai thác tối đa tiềm năng của công cụ này trong công việc của bạn.

Tìm hiểu Distro và các bản phân phối Linux

Giới thiệu distro

  • Distro là từ viết tắt thay thế cho Linux Distribution – bản phân phối của Linux – là một hệ điều hành được tập hợp từ nhiều phần mềm dựa trên nhân Linux (Linux Kernel) và thường có một hệ thống quản lý các gói tin.
  • Thành phần: Một bản distro điển hình bao gồm: một kernel Linux, các công cụ và thư viện GNU, các phần mềm thêm vào, phần document, một hệ thống window system (mà phần lớn là sử dụng X Window System – hệ thống cửa sổ dùng để hiển thị đồ họa Bitmap), window manager và desktop environment.
  • Hiện tại, có khoảng 600 bản distro tồn tại, với gần 500 trong số đó phát triển tích cực, liên tục được sửa đổi và cải thiện. Bởi sự sẵn có của số lượng lớn phần mềm, distro khá là đa dạng về hình thức – phù hợp với từ desktop, server, laptop, netbooks, điện thoại di động, máy tính bảng cũng như môi trường tối thiếu thường để sử dụng trong các hệ thống nhúng.
  • Có nhiều bản phân phối thương mại như Fedora (Red hat), OpenSUSE (SUSE), Ubuntu (Canonical Ltd); và hoàn toàn phân phối dựa vào cộng đồng như Debian, Slackware, Gentoo hay Arch Linux.

Loại hình và xu hướng phát triển

Nói chung, các bản phân phối Linux thể là:

  • – Thương mại hoặc phi thương mại
  • – Thiết kế cho người dùng doanh nghiệp, người dùng chuyên nghiệp hay cho người dùng gia đình.
  • – Hỗ trợ nhiều nền tảng phần cứng, hoặc nền tảng riêng, thậm chí đến mức chứng nhận bởi các nhà cung cấp nền tảng.
  • – Thiết kế cho máy chủ, máy tính cá nhân, hoặc cho thiết bi nhúng.
  • – Mục đích chung hoặc có chuyên môn cao về phía các chức năng máy cụ thể (ví dụ: tường lửa, router mạng, và điện toán cụm).
  • – Nhắm đến nhóm người dùng cụ thể, ví dụ thông qua việc quốc tế và bản địa hóa ngôn ngữ, hoặc thông qua bao gồm nhiều sản phẩm âm nhạc hoặc các gói tính toán khoa học.
  • – Xây dựng chủ yếu cho an ninh, khả năng sử dụng, tính di động, hoặc toàn diện.

Các nhánh distro phổ biến

  • Là một bản phân phối phi thương mại và là một trong những bản phân phối ra đời sớm nhất, duy trì bởi một cộng đồng phát triển tình nguyện với một cam kết mạnh mẽ cho nguyên tắc phần mềm miễn phí và quản lý dự án dân chủ.
  • Có 3 dạng khác nhau:
    • Phiên bản ổn định mà người dùng được khuyến khích sử dụng.
    • Phiên bản không ổn định.
    • Phiên bản thử nghiệm cho những ai mong muốn có được phần mềm mới nhất.
  • Hệ thống gói quản lý phần mềm sử dụng:
    • dpkg  cài đặt các gói phần mềm .deb
    • apt cài đặt phần mềm từ các kho trên mạng.

Debian có chính sách nghiêm ngặt đối với chất lượng các gói và bản phát hành cũng như tiến trình phát triển và kiểm tra mở. Cách này giúp cho việc nâng cấp các bản phát hành cũng như việc đặt hay gỡ bỏ dễ dàng hơn.

  • Có khá nhiều distro phát triển dựa trên distro Debian như: Raspbian, Knoppix, Astra Linux, Kali Linux, … và phổ biến nhất là nhánh Ubuntu

Ubuntu

– Do công ty Canonical phân phối chỉ mới xuất hiện vào quý 3/2004 và không lâu sau đó HĐH này đã trở nên phổ biến, uy tín về chất lượng và dễ dàng sử dụng.

– Dựa trên hệ thống quản lý gói mạnh mẽ APT của Debian, nhắm đến đối tượng người dùng đầu cuối, nhỏ gọn chỉ với 1 đĩa cài đặt. Người dùng Ubuntu có thể cảm nhận được sự tự do, tùy biến cao trong sử dụng, quản lý hệ thống.

– Theo thống kê của trang Distrowatch, cho đến hiện nay Ubuntu là distro phổ biến nhất với khoảng hơn 2.000 lượt người truy cập/ngày.

– Cứ 6 tháng, Ubuntu sẽ ra bản phát hành mới, còn với các phiên bản Long Term Support (LTS) thì việc cập nhật trình bảo mật sẽ từ 3 đến 5 năm.

– Cách đặt tên của Ubuntu theo định dạng YY.MM trong đó YY là năm phát hành và MM là tháng phát hành.

– Ubuntu sử dụng giao diện đồ họa thân thiện GNOME, hướng đến sự đơn giản hóa trong quá trình sử dụng. Ngoài ra, Ubuntu còn có bộ ứng dụng văn phòng OpenOffice, trình duyệt Firefox, trình gửi tin nhắn tức thời Pidgin, trình biên tập đồ họa GIMP…

  • Ngoài Ubuntu, các nhà phát triển còn sản sinh ra các distro mang hơi hướng tương tự Ubuntu như KubuntuXubuntu và LunbuntuLinux Mint. Các distro này chủ yếu khác biệt với Ubuntu ở giao diện màn hình.

Fedora

  • Là một bản phân phối cộng đồng được “đỡ đầu” bởi một công ty của Mỹ – Red Hat. Nó được tạo ra nhằm kiểm thử các công nghệ cho một bản phân phối thương mại khác của Red Hat – nơi mà các phần mềm nguồn mở mới được tạo lập, phát triển và kiểm thử trong môi trường cộng đồng trước khi được đưa vào Red Hat Enterprise Linux.
  • Chu kì ra phiên bản mới của Fedora là 6 tháng. Phiên bản mới với các tính năng bảo mật mà các chuyên gia đánh giá khá tốt.
  • Có thể nâng cấp lên phiên bản mới mà không cần cài đặt lại.
  • Dùng yum để quản lý các gói phần mềm định dạng .rpm
  • Fedora có thể dùng cho máy tính để bàn và máy trạm, thậm chí máy chủ; dành cho những người mới tiếp cận PMTDNM hay những người đã có nhiều kinh nghiệm.
  • 2 distro phổ biến nhất được phát triển dựa trên Fedora là Red Hat Enterprise Linux – với đối tượng hướng tới là các doanh nghiệp và công ty lớn (tất nhiên là có tính phí) ; và CentOS – free và hướng tới đối tượng là người sử dụng cá nhân.

Các nhóm Distro phổ biến

  • Linux có hàng trăm bản distro khác nhau đủ để phù hợp với nhu cầu của nhiều đối tượng sử dụng: từ người mới bắt đầu tới những người đã có hiểu biết chuyên sâu.
    • Với người sử dụng cá nhân thì các distro phổ biến là: Ubuntu, Linux Mint, Arch Linux, CentOS, Fedora, openSuSE …
    • Với đối tượng sử dụng là hệ thống sever có thể kể đến như là : Red Hat Enterprise Linux, Ubuntu Server, CentOS, SUSE Enterprise Linux..
  • Dựa trên các quy tắc, định hướng cũng như là mục tiêu mà Linux chia các distro phổ biến thành 4 nhóm:
    • Nhóm 1:
      • Nhắm vào người dùng am hiểu về hệ thống Linux. Hầu hết phương thức xây dựng và cấu hình hệ thống đều phải thực hiện qua môi trường dòng lệnh.
      • Đặc điểm: cấu trúc gọn nhẹ, uyển chuyển để có thể xây dựng một hệ thống hoàn toàn tuân theo ý của mình.
      • Các distro tiêu biểu: Arch, Gentoo, Slackware.
    • Nhóm 2:
      • Nhắm vào những người dùng am hiểu hệ thống, tuy nhiên cung cấp nhiều công cụ hơn cho những người chưa thật sự hiểu rõ hoàn toàn về Linux.
      • Nhóm này tương đối thân thiện với người dùng mới bắt đầu hơn nhóm 1. Tuy nhiên, các distro nhóm này lại có một quy trình phát triển và kiểm tra chất lượng các gói phần mềm cực kì khắt khe so với các distro còn lại.
      • Để trở thành một lập trình viên chính thức của Debian hay Fedora cần phải có thời gian đóng góp khá dài, và phải được chứng nhận bởi các lập trình viên khác. Do vậy, môi trường để lập trình và nghiên cứu ở 2 distro này khá tốt.
      • Distro tiêu biểu: Debian và Fedora.
    • Nhóm 3:
      • Chủ yếu nhắm vào thị trường doanh nghiệp, cơ quan, thị trường máy chủ… Các dòng distro này có nhiều đặc tính phù hợp cho mảng thị trường đòi hỏi sự ổn định cao như: thời gian ra phiên bản mới thường khá lâu, 3 – 5 năm tùy distro
      • Ít sử dụng các công nghệ mới nhất, thường tập trung phát triển các công nghệ lâu đời và đáng tin cậy.
      • Distro tiêu biểu: Centos, RHEL, SUSE EL…
    • Nhóm 4:
      • Nhắm đến người dùng cuối và người mới bắt đầu sử dụng Linux.
      • Đặc tính của các distro này là thời gian phát hành ngắn, ứng dụng liên tục các công nghệ mới với nhiều công cụ đồ họa để cấu hình hệ thống, thiết kế với mục đích dễ dùng, dễ làm quen, không cần đọc tài liệu đối với người mới.
      • Distro tiêu biểu: Ubuntu, Open SUSE, Linux Mint.

Tổng quan lại: Các distro của Linux được mô tả như hình sau:

Tài liệu tham khảo

Cài đặt Docker trên Linux

Giới thiệu

Docker đã trở thành một trong những công cụ hàng đầu trong lĩnh vực công nghệ phần mềm, đặc biệt là đối với các nhà phát triển và quản trị hệ thống. Với khả năng tạo và quản lý các container phần mềm, Docker không chỉ giúp tối ưu hóa quy trình phát triển mà còn đảm bảo tính linh hoạt, nhất quán trong môi trường triển khai. Vậy Docker là gì và tại sao nó lại quan trọng trong thế giới công nghệ hiện nay?

Docker là một dự án mã nguồn mở giúp tự động triển khai các ứng dụng Linux và Windows vào trong các container ảo hóa. Các thay đổi được lưu trữ trong các Docker image, các lớp tệp hệ thống được tạo ra và lưu lại dựa theo từng lớp (layer). Điều này giúp cho Docker Image giảm dung lượng đáng kể so với máy ảo (VM).

Các ứng dụng muốn chạy bằng Docker phải là ứng dụng chạy được trên Linux. Gần đây, Docker có hỗ trợ thêm việc chạy ứng dụng Windows trong các Windows container.

Thành phần

  • Docker Engine: dùng để tạo ra Docker image và chạy Docker container.
  • Docker Hub: dịch vụ lưu trữ giúp chứa các Docker image.
  • Docker Machine: tạo ra các Docker engine trên máy chủ.
  • Docker Compose: chạy ứng dụng bằng cách định nghĩa cấu hình các Docker container thông qua tệp cấu hình
  • Docker image: một dạng tập hợp các tệp của ứng dụng, được tạo ra bởi Docker engine. Nội dung của các Docker image sẽ không bị thay đổi khi di chuyển. Docker image được dùng để chạy các Docker container.
  • Docker container: một dạng runtime của các Docker image, dùng để làm môi trường chạy ứng dụng.

Cài đặt trên Linux

Set up Docker’s apt repository

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo 
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu 
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | 
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

Install Docker

Latest Version :

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Specific version :

List all available versions :

# List the available versions:
apt-cache madison docker-ce | awk '{ print $3 }'

5:27.3.1-1~ubuntu.24.04~noble
5:27.3.0-1~ubuntu.24.04~noble
...

Install specific version :

VERSION_STRING=5:27.3.1-1~ubuntu.24.04~noble
sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin

Verify Docker :

sudo docker run hello-world

Dù bạn là người mới bắt đầu hay một chuyên gia trong lĩnh vực công nghệ, Docker mang đến những giải pháp mạnh mẽ và linh hoạt để đơn giản hóa quy trình phát triển và triển khai ứng dụng. Việc hiểu rõ và áp dụng Docker không chỉ giúp nâng cao hiệu suất làm việc mà còn mở ra những cơ hội phát triển lớn trong tương lai. Hãy bắt đầu khám phá Docker ngay hôm nay!

Nguồn tham khảo :

https://en.wikipedia.org/wiki/Docker_(software)

https://docs.docker.com/engine/install/ubuntu

Nginx

nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. For a long time, it has been running on many heavily loaded Russian sites including YandexMail.RuVK, and Rambler.

NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên Ubuntu 20.04+

NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên Ubuntu 20.04+

Giới thiệu

Bài viết này trình bày cách cấu hình NGINX High Performance để thực hiện load balancing và quản lý persistence ở lớp ứng dụng (Layer 7) trên nền tảng Ubuntu 20.04+ hoặc các phân phối tương thích. Tài liệu tập trung vào cách sử dụng ngx_http_upstream_module để định nghĩa nhóm máy chủ backend và cách NGINX phân phối lưu lượng giữa chúng, đồng thời nêu rõ các tham số và chiến lược liên quan đến độ sẵn sàng và hiệu suất hệ thống. Các tham chiếu kỹ thuật từ tài liệu chính thức của NGINX cho phép triển khai một mô hình cân bằng tải ổn định, có khả năng mở rộng và dễ bảo trì trong môi trường sản xuất.

Kiến trúc và khái niệm cốt lõi

Nguyên lý cốt lõi của NGINX khi làm load balancer ở lớp ứng dụng được đóng gói trong module upstream. Module ngx_http_upstream_module cho phép định nghĩa một nhóm các máy chủ backend mà có thể được tham chiếu từ các directive như proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass, và grpc_pass. Định nghĩa này nằm trong một khối upstream và có thể có nhiều máy chủ với các tham số khác nhau. Ví dụ một khối upstream có thể trỏ tới nhiều máy chủ và cả socket UNIX để tối ưu hóa hiệu suất và tính sẵn sàng.

Khái niệm cơ bản: một upstream định nghĩa một tập máy chủ mà NGINX có thể gửi request tới. Các máy chủ có thể ở các cổng khác nhau hoặc thậm chí là UNIX-domain socket. Mặc định, NGINX phân phối các yêu cầu giữa các máy chủ bằng phương pháp cân bằng vòng quay có trọng số (weighted round-robin). Điều này cho phép ưu tiên một máy chủ nhất định bằng cách gán trọng số cao cho nó để nhận nhiều yêu cầu hơn so với các máy chủ còn lại. Ngoài ra, NGINX hỗ trợ các phương pháp cân bằng khác như hash, ip_hash và random, để đáp ứng các yêu cầu khác nhau về persistence và phân bổ lưu lượng.

Các tham số quan trọng được định nghĩa cho mỗi máy chủ trong upstream:

  • weight: xác định trọng số của máy chủ để ảnh hưởng tới phân phối lưu lượng. Trọng số càng cao, máy chủ nhận càng nhiều yêu cầu so với các máy chủ khác.
  • max_conns: giới hạn số kết nối đồng thời tới máy chủ backend (một giới hạn áp dụng nếu upstream nằm trong RAM chia sẻ và có nhiều worker).
  • max_fails: số lần thử không thành công liên tiếp với máy chủ, được đếm trong thời gian được chỉ định bởi fail_timeout để xem máy chủ có còn hợp lệ hay không.
  • fail_timeout: khoảng thời gian trong đó một số lần thử không thành công được xem là máy chủ bị unavailable.
  • backup: đánh dấu máy chủ là máy chủ sao lưu; các yêu cầu sẽ được chuyển tới máy chủ sao lưu khi các máy chủ chính không thể phục vụ.
  • down: đánh dấu máy chủ là unavailable vĩnh viễn.
  • resolve: quan sát sự thay đổi của địa chỉ IP tương ứng với tên miền của máy chủ và tự động cập nhật upstream mà không cần khởi động lại nginx (yêu cầu cấu hình resolver ở khối http hoặc upstream).
  • service: cho phép tra cứu DNS SRV và thiết lập tên dịch vụ.

Để vận hành ở mức độ cao hơn, cơ chế kiểm tra sức khỏe (health checks) có thể được bật, nhưng trong các phiên bản thương mại của NGINX. Ví dụ trong tài liệu tham khảo, khối upstream có thể sử dụng health_check để theo dõi tình trạng của backend.

Điểm đặc thù quan trọng khác là cách xác định địa chỉ của backend. Địa chỉ có thể là tên miền hoặc địa chỉ IP, và nếu không chỉ định port thì mặc định sẽ là cổng 80. Một tên miền có thể resolve thành nhiều địa chỉ IP sẽ tạo ra nhiều máy chủ backend cùng lúc. Thêm vào đó, tham số resolve cho phép cập nhật địa chỉ khi thay đổi DNS mà không cần khởi động lại nginx. Ngược lại, tham số backup sẽ đánh dấu một máy chủ phụ để nhận yêu cầu khi các máy chủ chính gặp sự cố. Những khía cạnh này cho phép thiết kế cơ chế cân bằng tải bền vững và có khả năng phục hồi đúng theo nhu cầu vận hành.

Yêu cầu và chuẩn bị

Đối với kiến trúc NGINX High Performance triển khai trên nền tảng Ubuntu 20.04+ hoặc các bản phân phối tương thích, cần đảm bảo một số yếu tố cơ bản sau:

  • Nguyên tắc cơ bản: NGINX được triển khai với các module cần thiết để định nghĩa upstream và thực thi proxy cho các backend HTTP hoặc các dạng kết nối khác (ví dụ FastCGI, uwsgi, memcached, grpc). Tham chiếu từ tài liệu cho upstream cho thấy các module như ngx_http_upstream_module và các module liên quan khác có thể được tích hợp tùy thuộc vào gói cài đặt của bạn.
  • Khả năng đọc / cập nhật DNS cho upstream động: nếu bạn dùng resolve và SRV records, cần có resolver được chỉ định ở khối http hoặc upstream để cho phép cập nhật địa chỉ backend khi DNS thay đổi.
  • Khả năng kiểm tra sức khỏe (health checks): một số tính năng nâng cao cho upstream có thể yêu cầu gói thương mại của NGINX để sử dụng health_check và các cơ chế phức tạp khác.

Trong tài liệu tham khảo, các khía cạnh trên nhấn mạnh sự linh hoạt của upstream và khả năng tinh chỉnh phân phối tải thông qua các tham số và các phương thức cân bằng để phù hợp với từng môi trường sản xuất.

Cấu hình chính

Phần cấu hình dưới đây minh họa một khối upstream cơ bản và một cấu hình server để phân phối lưu lượng đến nhiều backend. Đây là mẫu tham khảo và có thể được áp dụng trên Ubuntu 20.04+ hoặc các hệ thống tương đương có NGINX được biên dịch với module upstream.

upstream backend {
  server backend1.example.com weight=5;
  server backend2.example.com:8080;
  server unix:/tmp/backend3;
  server backup1.example.com:8080 backup;
  server backup2.example.com:8080 backup;
}
server {
  listen 80;
  location / {
    proxy_pass http:// backend ;
  }
}

Cấu hình ở trên cho phép phân phối tải qua các máy chủ backend xác định với các tham số trọng số, cổng khác nhau và cả socket UNIX. Máy chủ backup được gán để nhận yêu cầu khi các máy chủ chính gặp sự cố. Mặc định, NGINX sẽ sử dụng phương pháp cân bằng vòng quay có trọng số giữa các máy chủ trong upstream.

Để làm rõ cách phân phối lưu lượng, hãy tham khảo ví dụ dưới đây. Trong ví dụ này, mỗi chu kỳ 7 yêu cầu sẽ được phân phối như sau: 5 yêu cầu tới backend1.example.com, và mỗi máy chủ backend2 và backend3 nhận 1 yêu cầu. Điều này thể hiện rõ cơ chế trọng số tác động như thế nào tới phân bổ lưu lượng.

upstream dynamic {
  zone upstream_dynamic 64k;
  server backend1.example.com weight=5;
  server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
  server 192.0.2.1 max_fails=3;
  server backend3.example.com resolve;
  server backend4.example.com service=http resolve;
  server backup1.example.com:8080 backup;
  server backup2.example.com:8080 backup;
}
server {
  location / {
    proxy_pass http:// dynamic ;
    health_check;
  }
}

Ghi chú về mẫu nâng cao ở trên: khối upstream dynamic cho thấy cách định danh zone cho nhóm máy chủ, cho phép các máy chủ có các trạng thái khác nhau và khả năng tra cứu DNS SRV thông qua tham số service và resolve. Cú pháp health_check ở cuối khối server cho thấy một ví dụ về việc giám sát sức khỏe — điều này có thể được kích hoạt trong các phiên bản thương mại của NGINX để thực thi kiểm tra liên tục đối với các backend.

Cân bằng tải và persistence ở lớp 7

Ngữ cảnh cân bằng tải ở lớp 7 phụ thuộc vào cách bạn xác định các máy chủ backend và cách NGINX phân phối lưu lượng giữa chúng. Mặc định, upstream sử dụng phương pháp cân bằng vòng quay có trọng số, nhưng các phương pháp khác như hash, ip_hash và random cũng được nhắc tới như các tùy chọn cân bằng có thể áp dụng cho các tình huống khác nhau. Việc ưu tiên các backend hoặc thiết lập persistence có thể dựa vào các tham số của upstream và cách bạn cấu hình proxy_pass tới upstream để đảm bảo tính nhất quán của các phiên làm việc.

Ví dụ thực tế và giải thích cấu hình

  • Upstream backend với năm máy chủ backend và hai máy chủ backup. Trọng số cao hơn cho backend1 để ưu tiên xử lý; các máy chủ backup nhận khi các máy chủ chính không khả dụng.
  • Upstream dynamic cho phép quản lý địa chỉ động theo DNS và có tùy chọn resolve để cập nhật mà không cần restart nginx. Đoạn cấu hình mẫu cho health_check cho thấy tính năng giám sát sức khỏe có thể được kích hoạt khi cần thiết (điểm lưu ý là health_check có thể là phần của các phiên bản thương mại).

Bảo mật và tuân thủ

Khi triển khai load balancing ở lớp 7, cần lưu ý yếu tố bảo mật liên quan đến giao thức và TLS ở phía máy chủ. NGINX hỗ trợ các module liên quan như ngx_http_ssl_module để xử lý TLS cho các kết nối tới backend hoặc đi qua proxy. Việc xác thực và quản lý số lượng kết nối tới backend cũng có thể ảnh hưởng đến bảo mật và tuân thủ vận hành. Tài liệu tham khảo cho upstream cho thấy các module liên quan và các cơ chế để đảm bảo kết nối an toàn và hiệu quả, đồng thời cho phép giám sát và vận hành ở mức độ chấp nhận được trong môi trường prod.

Hiệu suất và tối ưu hóa

Hiệu suất của hệ thống phụ thuộc vào cách bạn cấu hình upstream và các tham số liên quan. Ví dụ, tham số weight cho mỗi máy chủ cho phép tối ưu hóa phân bổ tải theo mức độ ưu tiên của backend. Tham số max_conns giúp giới hạn số kết nối đồng thời đến từng backend, từ đó ngăn ngừa tình trạng quá tải và giảm thiểu tác động đến các backend khác. Failover và fail_timeout cho phép hệ thống quay vòng và phục hồi khi một backend gặp sự cố, giúp hệ thống duy trì khả năng phục vụ ổn định ngay cả khi một phần hệ thống gặp sự cố.

Quan sát và giám sát

Khả năng giám sát hiệu suất và tình trạng của upstream là một phần quan trọng của vận hành NGINX. Tài liệu liên quan cho thấy danh sách modules của NGINX bao gồm các module hỗ trợ giám sát và quản lý trạng thái, như ngx_http_stub_status_module và ngx_http_upstream_module. Việc theo dõi sức khỏe và trạng thái của backend giúp bạn nhận diện sớm các vấn đề và tối ưu lại cấu hình khi cần thiết. Trong một số trường hợp, health_check có thể được kích hoạt để có cái nhìn chi tiết về sức khỏe của từng backend trong upstream.

Kiểm tra và validation

Để đảm bảo cấu hình upstream hoạt động đúng, bạn nên thực hiện các bước kiểm tra sau:

  • Kiểm tra cú pháp và hợp lệ của tập cấu hình liên quan đến upstream và proxy_pass, sau đó nạp lại NGINX khi cần. Bạn nên theo dõi log để xác định các lỗi cú pháp hoặc lỗi liên quan tới backend.
  • Kiểm tra sự phân phối lưu lượng giữa các backend bằng cách gửi các yêu cầu tới các địa chỉ frontend và quan sát phản hồi. Theo dõi trạng thái trả về từ các backend và mức độ đáp ứng của từng máy chủ để điều chỉnh trọng số hoặc kết cấu liên quan.
  • Đối với các khối upstream có quyền truy cập DNS, kiểm tra DNS resolution và sự thay đổi địa chỉ khi DNS thay đổi. Đảm bảo resolver được cấu hình đúng để cập nhật upstream mà không cần restart.

Checklist vận hành

  • Đảm bảo upstream chứa danh sách máy chủ backend đúng và có thể đáp ứng tải.
  • Kiểm tra tham số weight và backup để tối ưu phân phối tải và khả năng phục hồi.
  • Xác nhận khả năng resolve cho DNS và SRV nếu bạn dựa vào cơ chế này để định danh backend.
  • Theo dõi log và trạng thái của backend để phát hiện sớm sự cố và kích hoạt cơ chế failover.

Kết luận

Cấu hình NGINX Upstream để load balancing và persistence ở lớp 7 trên Ubuntu 20.04+ mang lại khả năng phân phối lưu lượng linh hoạt, khả năng mở rộng và độ sẵn sàng cao cho các ứng dụng web. Việc sử dụng các tham số như weight, max_conns, fail_timeout và backup cho upstream cho phép tùy chỉnh hành vi phân phối và phục hồi khi backend gặp sự cố. Đồng thời, khả năng resolve và service cho DNS SRV cung cấp cơ chế quản lý địa chỉ backend động mà không làm gián đoạn dịch vụ. Để đạt được hiệu quả tối ưu, hãy thiết kế cấu hình dựa trên nhu cầu thực tế, theo dõi và thử nghiệm cẩn thận trong môi trường prod.

Tối ưu NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên CentOS

Tối ưu NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên CentOS

Tối ưu NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên CentOS

Trong môi trường CentOS và các hệ thống tương thích, NGINX High Performance cung cấp cơ chế load balancing và khả năng giữ phiên làm việc ở mức Layer 7 thông qua upstream module. Bài viết này trình bày cách cấu hình và tối ưu để đảm bảo tải trọng đồng đều, độ sẵn sàng cao và quản trị dễ dàng trên nền tảng CentOS. Nội dung tập trung vào các khía cạnh kỹ thuật thực tiễn, dựa trên tài liệu tham khảo chính thức của NGINX về module upstream và cách thức định tuyến/tiếp nhận yêu cầu qua upstream group.

Khái niệm cốt lõi và kiến trúc tổng quan

Module ngx_http_upstream_module cho phép định nghĩa một nhóm máy chủ (upstream) và tham chiếu chúng từ các chỉ thị proxy_pass, fastcgi_pass, uwsgi_pass, và các chế độ kết nối khác. Một upstream tập hợp các máy chủ backend có thể nghe trên các cổng khác nhau hoặc thậm chí trên các socket UNIX. Mặc định, các máy chủ trong upstream được phân phối yêu cầu bằng phương pháp cân bằng tải vòng quay có trọng số (weighted round-robin). Ngoài ra, upstream còn hỗ trợ các đặc tính giành riêng cho Layer 7 như cấu hình xác định trọng số, giới hạn số kết nối đồng thời, nhận diện máy chủ dự phòng và các cơ chế khác nhằm tối ưu hóa khả năng chịu lỗi và trải nghiệm người dùng.

  • Định nghĩa nhóm máy chủ upstream: upstream name { … }
  • Định danh máy chủ với tham số như weight, max_fails, fail_timeout, backup và xuống (down) khi cố gắng liên lạc thất bại
  • Hỗ trợ cấu hình giữ trạng thái kết nối (keepalive) cho các kết nối đến upstream để giảm overhead kết nối lại
  • Khả năng định tuyến theo DNS với resolver để cập nhật địa chỉ IP khi địa chỉ backend thay đổi
  • Hỗ trợ các tham số nâng cao như health_check ở mức cấu hình nâng cao cho phiên bản thương mại của NGINX

Với Layer 7 persistence, bạn có thể định tuyến lại lưu lượng dựa trên các đặc tính của phiên làm việc. Các cơ chế như ip_hash hoặc các tham số liên quan được mô tả trong tài liệu upstream và cho phép giữ cho các yêu cầu từ một client nhất định được chuyển tới cùng backend hoặc nhóm backend nhất định. Điều này giúp duy trì trạng thái phiên và cải thiện hiệu suất đối với các ứng dụng đòi hỏi sự nhất quán trong việc xử lý người dùng.

Kiến trúc và luồng xử lý của upstream

Khi một yêu cầu đến máy chủ NGINX, proxy_pass sẽ định tuyến tới một upstream group. Nếu upstream có nhiều máy chủ, NGINX sẽ chọn một trong số chúng dựa trên cơ chế cân bằng tải được chỉ định và có thể đồng thời thực hiện theo dõi tình trạng của từng máy chủ để bỏ qua những máy chưa sẵn sàng. Việc này giúp giảm thiểu thời gian phản hồi và tăng khả năng chịu lỗi của hệ thống.

Trong cấu hình nâng cao, bạn có thể khai báo một upstream với các máy chủ backend và tham số liên quan như keepalive để giữ các kết nối mở giữa NGINX và backend, từ đó tối ưu hóa hiệu suất thay vì tái thiết lập kết nối cho mỗi yêu cầu. Ngoài ra, việc dùng resolver cho upstream động cho phép hệ thống thích nghi với thay đổi IP của backend mà không cần khởi động lại NGINX.

Yêu cầu trước khi triển khai trên CentOS

Để triển khai cấu hình load balancing và Layer 7 persistence trên CentOS, bạn cần một cài đặt NGINX High Performance có sẵn module upstream. Mô-đun này cho phép bạn định nghĩa upstream groups và tham chiếu chúng từ các chỉ thị proxy_pass. Trong trường hợp bạn sử dụng các tính năng nâng cao như health_check hoặc các tính năng liên quan đến DNS resolver, hãy đảm bảo hệ thống có quyền truy cập DNS và có thể liên hệ với máy chủ định tuyến / resolver được cấu hình đúng cách.

Cấu hình cơ bản cho load balancing

Dưới đây là ví dụ cấu hình cơ bản cho một upstream với nhiều máy chủ backend và máy chủ dự phòng, áp dụng phương thức cân bằng tải mặc định (weighted round-robin). Đoạn cấu hình này phù hợp cho các dịch vụ web hoặc API HTTP được triển khai trên CentOS.

upstream backend {
  server backend1.example.com weight=5;
  server backend2.example.com:8080;
  server unix:/tmp/backend3;
  server backup1.example.com:8080 backup;
  keepalive 16;
}

server {
  listen 80;
  location / {
    proxy_pass http:// backend;
  }
}

Trong cấu hình trên, các máy chủ backend được gán trọng số, cho phép các máy chủ mạnh hơn nhận nhiều yêu cầu hơn. Máy chủ backup được sử dụng khi các máy chủ chính không thể đáp ứng. Tham số keepalive xác định số kết nối mở tối đa cho mỗi máy chủ backend, giúp giảm chi phí tái thiết lập kết nối cho các yêu cầu liên tiếp.

Cấu hình Layer 7 persistence và lưu lượng có trạng thái

Để duy trì sự nhất quán của phiên người dùng ở lớp 7, NGINX cho phép cấu hình các phương thức persistence nhất định trong upstream. Một ví dụ phổ biến là ip_hash, cho phép định tuyến mọi yêu cầu từ một địa chỉ IP client nhất định tới một máy chủ backend cố định. Đây là một cách đơn giản để duy trì trạng thái phiên mà không cần thêm thành phần phức tạp ở phía backend.

upstream app_ip_hash {
  ip_hash;
  server app1.example.com;
  server app2.example.com;
}

Đối với các trường hợp phức tạp hơn, upstream có thể hỗ trợ các tham số khác trong danh sách chỉ thị, như hash hoặc sticky, tùy thuộc vào phiên bản và phát hành của NGINX. Việc sử dụng các tham số này cho phép bạn tinh chỉnh hành vi phân phối tải và phân bổ phiên làm việc ở mức cao hơn tùy theo nhu cầu cụ thể của ứng dụng.

Cấu hình nâng cao với health checks và định vị DNS

Trong cấu hình nâng cao, bạn có thể thiết lập định vị DNS cho upstream bằng chỉ thị resolver để cập nhật các địa chỉ IP của backend khi địa chỉ DNS thay đổi. Ví dụ ở cấu hình sau, upstream động bao gồm cả máy chủ định danh có thể cập nhật mà không cần khởi động lại NGINX:

upstream dynamic {
  zone upstream_dynamic 64k;
  server backend1.example.com weight=5;
  server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
  server 192.0.2.1 max_fails=3;
  server backend3.example.com resolve;
  server backend4.example.com:8080 resolve;
  server backup1.example.com:8080 backup;
  server backup2.example.com:8080 backup;
}
server {
  location / {
    proxy_pass http:// dynamic;
    health_check;
  }
}

Đoạn cấu hình trên mô tả cách bạn có thể tận dụng health checks (không phải mọi phiên bản NGINX đều có tính năng này theo mặc định) nhằm giám sát tình trạng upstream và tự động loại bỏ các backend bị lỗi khỏi vòng phân phối tải. Ngoài ra, các máy chủ có tham số resolve cho phép tra cứu DNS và cập nhật địa chỉ IP mà không cần restart dịch vụ.

Bảo mật và tối ưu hóa cấu hình upstream

Để tăng cao độ tin cậy và hiệu suất, bạn có thể áp dụng các nguyên tắc sau trong cấu hình upstream:

  • Đặt máy chủ dự phòng (backup) để đảm bảo khả năng phục hồi khi các máy chủ chính gặp sự cố. Tham số backup ngăn không cho các yêu cầu tới các máy chủ dự phòng cho tới khi các máy chủ chính hết tình trạng sẵn sàng.
  • Sử dụng max_fails và fail_timeout để giới hạn số lần thất bại và thời gian bỏ qua một backend sau khi gặp sự cố.
  • Sử dụng keepalive để chia sẻ kết nối giữa NGINX và backend, giảm overhead của việc thiết lập kết nối liên tục.
  • Sử dụng resolver cho upstream động để cập nhật địa chỉ IP khi backend thay đổi mà không phải khởi động lại NGINX.

Hiệu năng và quan sát trong thực tế vận hành

Hiệu năng của NGINX khi làm reverse proxy và load balancer phụ thuộc vào nhiều yếu tố, trong đó phân phối tải qua upstream và khả năng duy trì kết nối ép buộc có tác động đáng kể. Các tham số như keepalive đóng vai trò quan trọng trong việc tối ưu hóa thời gian phản hồi và tải trọng đồng thời. Việc tận dụng các máy chủ dự phòng và các cơ chế Failover cũng giúp giảm thiểu thời gian ngừng dịch vụ cho người dùng cuối. Việc cấu hình health_check (nếu có sẵn) cho upstream sẽ cung cấp dữ liệu vận hành về trạng thái của từng backend và giúp hệ thống tự điều chỉnh trong thời gian thực.

Kiểm tra, xác thực cấu hình và vận hành thực tế

Sau khi cập nhật cấu hình, bạn nên rà soát tính hợp lệ và vận hành thông qua các nguồn cung cấp được đề cập ở trên. Cân nhắc theo dõi trạng thái của upstream và các máy chủ backend thông qua báo cáo sức khỏe và log của hệ thống. Cấu hình upstream nên được xem là một phần của chiến lược vận hành, có thể điều chỉnh theo lưu lượng và yêu cầu của ứng dụng mà bạn triển khai.

Checklist vận hành

  • Đảm bảo upstream được khai báo đúng và tham chiếu từ proxy_pass đúng tên upstream.
  • Thiết lập máy chủ dự phòng và các tham số liên quan như max_fails và fail_timeout để nâng cao khả năng chịu lỗi.
  • Kích hoạt keepalive cho các kết nối tới backend để tối ưu hóa hiệu suất.
  • Đảm bảo resolver được cấu hình đúng nếu bạn dùng upstream động và DNS-based discovery.
  • Giám sát sức khỏe và phản hồi của upstream để nhận diện nhanh các sự cố và khôi phục trạng thái sẵn sàng.

Kết luận

Việc cấu hình Load Balancing và Layer 7 Persistence trên NGINX High Performance cho CentOS đòi hỏi sự hiểu biết về upstream module và cách thức định tuyến, nhằm đảm bảo sự ổn định, mở rộng và dễ bảo trì cho các hệ thống sản phẩm/dịch vụ web. Các tham số như weight, backup, max_fails, fail_timeout, keepalive và resolver đóng vai trò then chốt trong việc tối ưu hóa phân phối tải và khả năng chịu lỗi. Với kiến thức và cấu hình phù hợp, bạn có thể xây dựng một kiến trúc phân phối tải hiệu quả và bền vững cho môi trường CentOS của mình.

Triển khai NGINX High Performance: Microservices Reverse Proxy với gRPC trên Ubuntu 20.04+

Triển khai NGINX High Performance: Microservices Reverse Proxy với gRPC trên Ubuntu 20.04+

Triển khai NGINX High Performance cho Microservices Reverse Proxy với gRPC trên Ubuntu 20.04+

NGINX High Performance là một nền tảng reverse proxy và load balancer mạnh mẽ, với khả năng xử lý gRPC và hỗ trợ các kiến trúc microservices. Với Ubuntu 20.04 trở lên, bạn có thể triển khai NGINX với các module cốt lõi và module grpc để đóng vai trò như một lớp reverse proxy cho các dịch vụ microservices, đồng thời tối ưu hóa hiệu năng, bảo mật và khả năng vận hành liên tục.

Trong khuôn khổ tài liệu này, chúng ta sẽ tập trung vào cách cấu hình NGINX để làm reverse proxy cho các service microservices giao tiếp bằng gRPC, thông qua upstream groups và grpc_pass. Nội dung dựa trên tài liệu kỹ thuật của NGINX và các mô-đun liên quan, đồng thời duy trì ngôn ngữ vận hành dành cho quản trị viên hệ thống.

Khái niệm cốt lõi và kiến trúc

Kiến trúc NGINX cho microservices với gRPC xoay quanh khái niệm upstream groups và các directive để định tuyến, gửi và quản lý lưu lượng giữa nhiều backend. Module ngx_http_upstream_module cho phép định nghĩa một nhóm máy chủ có thể tham chiếu từ các directive proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass và grpc_pass. Điểm mạnh ở đây là khả năng gộp nhiều backend thành một tập hợp duy nhất và áp dụng cơ chế cân bằng tải, timeout, và failover một cách tập trung.

Theo mô hình này, gRPC là một giao thức gọi từ xa có thể được “pass-through” hoặc “pass-to-upstream” thông qua grpc_pass. Cơ chế cân bằng tải mặc định của upstream là vòng lặp có trọng số (weighted round-robin), cho phép phân phối lưu lượng giữa các backend theo tỉ lệ mong muốn. Trong trường hợp một backend gặp sự cố, NGINX sẽ tự động chuyển sang các backend còn lại cho đến khi có phản hồi hợp lệ từ một máy chủ còn hoạt động.

Để đảm bảo tính linh hoạt và khả năng mở rộng, NGINX cho phép định nghĩa DNS hoặc SRV-based resolution cho upstream qua directive resolver và các tham số liên quan. Việc này hữu ích khi bạn triển khai các dịch vụ microservices được phát triển theo môi trường động hoặc trong các cluster có thể thay đổi địa chỉ backend theo thời gian.

Yêu cầu tiền đề cho Ubuntu 20.04+

  • Hệ điều hành: Ubuntu 20.04 trở lên hoặc bản phân phối tương thích, có sẵn đầy đủ các gói phụ trợ cho NGINX High Performance.
  • NGINX được xây dựng với hỗ trợ module grpc và các module đi kèm cần thiết cho vận hành ổn định. Module grpc_pass và module liên quan (ví dụ ngx_http_grpc_module và ngx_http_upstream_module) là thành phần cần thiết để định tuyến gRPC qua reverse proxy.
  • Khả năng giải quyết DNS cho upstream, thông qua directive resolver hoặc các cơ chế DNS được cấp quyền bởi NGINX, đặc biệt khi backend có địa chỉ domain thay đổi theo thời gian.
  • Khả năng TLS/SSL để bảo mật kết nối, đặc biệt khi bạn triển khai gRPC qua giao thức TLS (grpcs) hoặc khi dừng ở lớp termination tại NGINX trước khi forwards tới backend.
  • Khung bảo mật và tuân thủ: theo dõi các thực tiễn bảo mật cơ bản như phân đoạn mạng, giới hạn truy cập, và ghi log để vận hành và phản hồi sự cố.

Cấu hình chính cho Microservices Reverse Proxy với gRPC

Trong ngữ cảnh microservices và gRPC, cách tiếp cận phổ biến là tạo một upstream group gồm các backend gRPC và dùng directive grpc_pass trong một location để chuyển tiếp các cuộc gọi đến upstream. Dưới đây là ví dụ cấu hình tham khảo, dựa trên nguyên tắc định nghĩa upstream và cách proxy tới upstream thông qua grpc_pass:

upstream grpc_backend {
  server backend1.example.com:50051;
  server backend2.example.com:50051;
  server unix:/var/run/backend.sock;
}

server {
  listen 443 ssl http2;
  server_name api.example.com;

  ssl_certificate /etc/nginx/ssl/fullchain.pem;
  ssl_certificate_key /etc/nginx/ssl/privkey.pem;

  location / {
    grpc_pass grpcs://grpc_backend;
  }
}

Trong ví dụ trên, upstream grpc_backend định nghĩa một tập hợp backend có thể là các dịch vụ gRPC chạy trên các host hoặc các socket UNIX. location / được cấu hình để chuyển tiếp mọi gọi gRPC tới upstream bằng grpc_pass với định dạng grpcs:// khi bạn sử dụng TLS cho phía client và/hoặc TLS nội bộ tới backend.

Ngoài ra, để đảm bảo tính ổn định và phục hồi khi một backend gặp sự cố, bạn có thể bổ sung các tham số như fail_timeout, max_fails và backup để điều chỉnh hành vi khi mất kết nối. Ví dụ:

upstream grpc_backend {
  server backend1.example.com:50051 weight=3;
  server backend2.example.com:50051 weight=2 max_fails=3 fail_timeout=10s;
  server unix:/var/run/backend.sock backup;
}

Trong phương án có dynamic DNS hoặc thay đổi IP của backend, bạn có thể dùng resolver để theo dõi sự thay đổi của địa chỉ server và tự động cập nhật cấu hình upstream mà không cần khởi động lại NGINX. Ví dụ tham chiếu tới cách khai báo resolver và upstream có sử dụng resolve hoặc các trường hợp tương tự:

resolver 10.0.0.1;
upstream dynamic {
  zone upstream_dynamic 64k;
  server backend1.example.com weight=5;
  server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
  server 192.0.2.1 max_fails=3;
  server backend3.example.com resolve;
  server backend4.example.com service=http resolve;
  server backup1.example.com:8080 backup;
  server backup2.example.com:8080 backup;
}
server {
  location / {
    grpc_pass grpcs://dynamic;
  }
}

Ở ví dụ trên, upstream dynamic có khả năng resolve địa chỉ mới và có các máy chủ dự phòng cho trường hợp primary bị quá tải hoặc không đáp ứng, đồng thời có các máy chủ đánh dấu là backup để phục vụ khi các máy chủ chính không hoạt động. Đây là mô hình phù hợp với hạ tầng microservices có tính linh hoạt cao và yêu cầu độ sẵn sàng cao.

Bảo mật và hiệu suất trong môi trường gRPC

Để tăng cường bảo mật và hiệu suất, hãy cân nhắc các yếu tố sau:

  • Áp dụng TLS cho cả phía client và phía backend. Sử dụng grpcs:// trong grpc_pass và đảm bảo cấu hình TLS ở phía server có đầy đủ chứng chỉ hợp lệ.
  • Sử dụng HTTP/2 cho kết nối giữa client và NGINX để tối ưu hóa hiệu suất gRPC và multiplexing nhiều cuộc gọi đồng thời.
  • Tối ưu cấu hình thời gian chờ và retry bằng các tham số như fail_timeout và max_fails, cũng như các cơ chế backup để đảm bảo phục hồi khi backend bị quá tải hoặc bị ngắt kết nối.
  • Kích hoạt health check (nếu có sẵn trong phiên bản bạn dùng) để giám sát tình trạng các backend và giảm tải cho các backend không đáp ứng.
  • Sử dụng DNS SRV hoặc resolver khi backend có thể thay đổi địa chỉ liên tục, giảm thiểu sự cố do thay đổi IP mà không cần cập nhật toàn bộ cấu hình.

Giám sát, logging và observability

Để vận hành một hệ thống NGINX Reverse Proxy cho gRPC một cách hiệu quả, bạn cần các cơ chế giám sát và logging đáng tin cậy. Các module liên quan có trong NGINX High Performance bao gồm các thành phần cho ghi log và trạng thái hệ thống. Cụ thể, các module như ngx_http_stub_status_module có thể cung cấp thông tin trạng thái ở một endpoint nhỏ gọn, hỗ trợ quan sát lưu lượng và hiệu suất dưới dạng số liệu từ các upstream và máy chủ backend. Bên cạnh đó, khả năng ghi log ra syslog giúp tích hợp với hệ thống SIEM hoặc bộ tập trung log của bạn.

Để bắt đầu, bạn có thể kích hoạt và xem trạng thái cơ bản của NGINX trong môi trường tiền sản xuất hoặc staging, sau đó mở rộng sang giám sát chi tiết hơn bằng các giải pháp gián tiếp hoặc các module/tiện ích bổ sung theo nhu cầu vận hành.

Kiểm tra và xác thực triển khai

Trước khi đưa cấu hình mới vào môi trường sản xuất, hãy kiểm tra cú pháp và tính hợp lệ của cấu hình NGINX, sau đó thực thi nghiệm Thu thập bảo trì và vận hành:

  • Kiểm tra cú pháp cấu hình NGINX: xác nhận cấu hình của upstream và grpc_pass được thiết lập đúng cách và không có lỗi cú pháp.
  • Kiểm tra khả năng phân phối lưu lượng đến các backend bằng cách theo dõi log và trạng thái của upstream để đảm bảo vòng lặp có trọng số đang hoạt động.
  • Kiểm tra kết nối TLS và xác thực chứng chỉ ở phía client và phía backend nếu có TLS liên kết giữa NGINX và backend.
  • Kiểm tra khả năng failover và backup server bằng cách tắt một trong các backend và xác thực NGINX tự động chuyển sang các backend còn lại.
  • Kiểm tra tính tương thích của client gRPC với đường dẫn qua NGINX: đảm bảo client có thể gọi các service gRPC và nhận phản hồi đúng từ upstream.

Danh sách vận hành và checklist triển khai

  • Xác định topology microservices và danh sách các backend gRPC cần định tuyến thông qua NGINX.
  • Thiết lập upstream groups với các backend đầy đủ và thể hiện rõ các tham số trọng số, fail_timeout, max_fails và backup khi cần.
  • Cấu hình TLS cho kết nối giữa client và NGINX (và giữa NGINX và backend nếu cần sử dụng grpcs).
  • Cấu hình DNS resolver nếu backend được xác định bằng tên miền và có thể thay đổi theo thời gian.
  • Kích hoạt health_check (nếu có) và logging để giám sát trạng thái backend và hiệu suất hệ thống.
  • <liKiểm tra cấu hình với lệnh kiểm tra cú pháp và thực hiện reload khi áp dụng thay đổi trong môi trường thử nghiệm và sau đó ở môi trường sản xuất. <liThiết lập thay đổi và rollback plan để đảm bảo phục hồi nhanh khi gặp sự cố liên quan đến reverse proxy.

Kết luận

Việc triển khai NGINX High Performance làm reverse proxy cho microservices với gRPC trên Ubuntu 20.04+ mang lại lợi ích rõ ràng về hiệu suất xử lý, khả năng mở rộng và quản lý lưu lượng giữa các dịch vụ. Việc sử dụng upstream groups với grpc_pass cho phép định tuyến gọi gRPC một cách linh hoạt, đồng thời kết hợp với các cơ chế như resolver và health check để đảm bảo tính sẵn sàng và độ tin cậy của hệ thống. Hãy cân nhắc áp dụng các thực tiễn bảo mật và observability để có thể vận hành hệ thống một cách ổn định và an toàn trên môi trường sản xuất.

Install Nginx

Cài đặt phiên bản mới nhất của Nginx trên ubuntu

Update Ubuntu :

sudo apt update && sudo apt upgrade -y

Gỡ bỏ cài đặt cấu hình cũ của Nginx (nếu có):

sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old

Cài đặt và nâng cấp Nginx Repository

sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

Tải về và cài Nginx GPG key để xác nhận gói

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor 
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Xác thực key :

gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

Import Nginx stable Repository :

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] 
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" 
| sudo tee /etc/apt/sources.list.d/nginx.list

Import Nginx Mainline Repository:

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] 
http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" 
| sudo tee /etc/apt/sources.list.d/nginx.list

Cài đặt gói APT hướng đến phiên bản Nginx hoặc các phiên bản mặc định khác của PPA’s :

echo -e "Package: *nPin: origin nginx.orgnPin: release o=nginxnPin-Priority: 900n" 
| sudo tee /etc/apt/preferences.d/99nginx

Cải đặt Nginx :

sudo apt update
sudo apt install nginx

Khởi động của nginx :

systemctl start nginx
systemctl enable nginx

Kiểm tra hoạt động của nginx :

systemctl status nginx
nginx -t

Vậy là đã hoàn thành !

Install Let's Encrypt in Nginx

Install Core

sudo snap install core; sudo snap refresh core

Remove old certbot

sudo apt-get remove certbot

Install Certbot

sudo snap install --classic certbot

Prepare the Certbot command

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Install your certificates…

sudo certbot --nginx

Or, just get a certificate

sudo certbot certonly --nginx

Test automatic renewal

sudo certbot renew --dry-run

Second way to install :

sudo apt install certbot python3-certbot-nginx

Check SSL Certificate :

openssl s_client –showcerts –connect WebServerURL:PortNumber

Auto Renew Certbot by Cron :

43 6 * * * certbot renew --post-hook "systemctl reload nginx"

Configuration HTTP/2 NGINX

Open the configuration file for your domain:

sudo nano /etc/nginx/sites-available/your_domain

In the file, locate the listen variables associated with port 443:

...
    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl; 
...

The first one is for IPv6 connections. The second one is for all IPv4 connections. We will enable HTTP/2 for both.

...
    listen [::]:443 ssl http2 ipv6only=on; 
    listen 443 ssl http2; 
...

Test NGINX

sudo nginx -t

Removing Old and Insecure Cipher Suites

sudo nano /etc/nginx/sites-available/your_domain

Locate the line that includes the options-ssl-nginx.conf file and comment it out:

# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>

Below that line, add this line to define the allowed ciphers:

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Open the file /etc/nginx/snippets/ssl-params.conf in your text editor:

sudo nano /etc/nginx/snippets/ssl-params.conf

Locate the following line:

...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...

Modify it so it looks like this:

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Save the file and exit your editor.

sudo nginx -t
sudo systemctl reload nginx

Hide server nginx, apache in Respone Header

Solution 1 : Use the 3rd-party “Headers More” Module :

Upgrade nginx-common and nginx-extras :

sudo apt-get install nginx-common
sudo apt-get install nginx-extras

Configuration nginx.conf

nano /etc/nginx/nginx.conf
##Add this one :
load_module modules/ngx_http_headers_more_filter_module.so;
http {
    ...
       more_clear_headers Server;
    ...
}

Test Nginx

nginx -t
service nginx reload

Solution 2 : Install and Compile new module Headers-More-Nginx-Module

Download your version nginx :

wget http://nginx.org/download/nginx-1.12.2.tar.gz

Decompress your nginx.tar :

tar -xvzf nginx-1.12.2.tar.gz 

Download the source code of the dynamic module we need to compile :

git clone https://github.com/openresty/headers-more-nginx-module.git

Go to Nginx File

cd ~/nginx1.12.2

Compile and run source :

./configure --with-compat --add-dynamic-module=../headers-more-nginx-module
make modules 

In objs directory the “module.so” file will be created, copy the file to nginx modules directory :

sudo cp objs/ngx_http_headers_more_filter_module.so /usr/lib/nginx/modules

Let nginx know about the newly compiled module, add the following line in your nginx.conf file :

load_module modules/ngx_http_headers_more_filter_module.so;

And in the HTTP block of the engine.conf, add :

server_tokens off;
more_set_headers 'Server: Thanhnh';
// or 
more_set_header Server;

Tối ưu nén file Nginx

Mô tả

Tối ưu nén file Nginx là một phương pháp quan trọng nhằm cải thiện hiệu suất và tốc độ tải trang web. Bằng cách sử dụng các kỹ thuật nén như Gzip hoặc Brotli, Nginx có thể giảm kích thước của các tệp tin trước khi chúng được gửi tới trình duyệt của người dùng. Điều này không chỉ giúp tiết kiệm băng thông mà còn giảm thời gian tải trang, nâng cao trải nghiệm người dùng và tối ưu hóa tài nguyên máy chủ. Để triển khai hiệu quả, cần cấu hình đúng các tham số nén và đảm bảo các loại tệp tin cần thiết được nén, đồng thời kiểm tra hiệu suất để đảm bảo không ảnh hưởng đến hoạt động của hệ thống.

Phần 1 : Tối ưu với Gzip

Mở file cấu hình Nginx:

Thường thì file này nằm ở đường dẫn /etc/nginx/nginx.conf hoặc /etc/nginx/conf.d/default.conf.

Thêm hoặc chỉnh sửa các dòng cấu hình gzip:

Thêm các dòng sau vào block http trong file cấu hình:

http {
    gzip on; 
    gzip_comp_level 5;
    gzip_min_length 256; 
    gzip_buffers 16 8k; 
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_proxied any; 
    gzip_vary on; 
}

Bật nén Gzip.

gzip on;
gzip_static  on;

Bật nén cho cả HTTP/1.0 và HTTP/1.1.

gzip_http_version  1.1;

Mức độ nén (1-9). 5 là một sự cân bằng hoàn hảo giữa size và mức sử dụng CPU, cung cấp khoảng 75% giảm kích thước cho hầu hết các tệp ASCII (gần như giống hệt mức độ 9).

gzip_comp_level    5;

Không nén bất cứ thứ gì đã nhỏ và không có khả năng giảm kích thước nhiều nếu có. (mặc định là 20 byte, điều này không hợp lý vì thường dẫn đến tệp lớn hơn sau khi nén)

gzip_min_length 256;

Nén dữ liệu ngay cả đối với các client kết nối với chúng ta qua proxy, được xác định bởi header “Via” (cần thiết cho CloudFront).

gzip_proxied any;

**Yêu cầu proxy lưu trữ cả phiên bản đã nén và không nén của tài nguyên bất cứ khi nào tiêu đề khả năng Accept-Encoding của client thay đổi; **

  • Tránh vấn đề khi một client không có khả năng gzip (rất hiếm ngày nay) sẽ hiển thị ký tự lộn xộn nếu proxy của họ đưa cho họ phiên bản đã nén.
gzip_vary          on;

Nén tất cả các đầu ra được gắn nhãn với một trong các MIME-types sau.

# text/html luôn được nén bởi HttpGzipModule
gzip_types
application/atom+xml
application/javascript
application/json
application/rss+xml
application/vnd.ms-fontobject
application/x-font-ttf
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/opentype
image/svg+xml
image/x-icon
text/css
text/plain
text/x-component;

Test lại nginx :

nginx -t 
service nginx restart

Phần 2 : Tối ưu nginx với nén Brotli

Chuẩn bị package cần thiết :

apt-get update -y
apt-get install dpkg-dev curl gnupg2 build-essential zlib1g-dev libpcre3 libpcre3-dev unzip -y

Tải nginx và Source Brotli

Tải nginx :

cd ~
wget https://nginx.org/download/nginx-1.18.0.tar.gz
tar zxvf nginx-1.18.0.tar.gz

Tải Brotli :

git clone https://github.com/google/ngx_brotli.git
cd ~/ngx_brotli
git submodule update --init

Biên dịch :

cd ~/nginx-1.18.0
./configure --with-compat --add-dynamic-module=../ngx_brotli
make modules
sudo cp ./objs/*.so /usr/lib/nginx/modules

Sửa lại nginx.conf :

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
nano /etc/nginx/nginx.conf

Sau khi mở file nginx.conf bạn thêm vào 2 đoạn sau ở đầu file

load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

Test Nginx và khởi động lại :

nginx -t
service nginx reload

Thêm cấu hình Brotli vào vhost nginx :

/etc/nginx/sites-available/example.conf
brotli on;
brotli_comp_level 6;
brotli_static on;
brotli_types application/atom+xml application/javascript application/json application/vnd.api+json application/rss+xml
             application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype
             application/x-font-ttf application/x-javascript application/xhtml+xml application/xml
             font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon
             image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;

brotli_static

  • Cú pháp: brotli_static on|off|always
  • Mặc định: off
  • Ngữ cảnh: http, server, location
  • Mô tả: Bật hoặc tắt kiểm tra sự tồn tại của các tệp tin đã nén sẵn với phần mở rộng .br. Với giá trị always, tệp tin đã nén sẵn sẽ được sử dụng trong mọi trường hợp, không cần kiểm tra xem máy khách có hỗ trợ hay không.

brotli

  • Cú pháp: brotli on|off
  • Mặc định: off
  • Ngữ cảnh: http, server, location, if
  • Mô tả: Bật hoặc tắt nén đáp ứng ngay tại thời điểm phản hồi.

brotli_types

  • Cú pháp: brotli_types <mime_type> [..]
  • Mặc định: text/html
  • Ngữ cảnh: http, server, location
  • Mô tả: Bật nén đáp ứng ngay tại thời điểm phản hồi cho các loại MIME chỉ định thêm ngoài text/html. Giá trị đặc biệt * khớp với bất kỳ loại MIME nào. Các phản hồi với loại MIME text/html luôn được nén.

brotli_buffers

  • Cú pháp: brotli_buffers <number> <size>
  • Mặc định: 32 4k|16 8k
  • Ngữ cảnh: http, server, location
  • Mô tả: Đã lỗi thời, bỏ qua.

brotli_comp_level

  • Cú pháp: brotli_comp_level <level>
  • Mặc định: 6
  • Ngữ cảnh: http, server, location
  • Mô tả: Thiết lập mức độ chất lượng (nén) của nén Brotli ngay tại thời điểm phản hồi. Các giá trị chấp nhận trong khoảng từ 0 đến 11.

brotli_window

  • Cú pháp: brotli_window <size>
  • Mặc định: 512k
  • Ngữ cảnh: http, server, location
  • Mô tả: Thiết lập kích thước cửa sổ Brotli. Các giá trị chấp nhận bao gồm: 1k, 2k, 4k, 8k, 16k, 32k, 64k, 128k, 256k, 512k, 1m, 2m, 4m, 8m16m.

brotli_min_length

  • Cú pháp: brotli_min_length <length>
  • Mặc định: 20
  • Ngữ cảnh: http, server, location
  • Mô tả: Thiết lập độ dài tối thiểu của phản hồi sẽ được nén. Độ dài này chỉ được xác định từ trường tiêu đề phản hồi Content-Length.

Source :

TÌm hiểu thêm :

Hướng dẫn tạo Virtual Host Nginx

Tạo Virtual Host trong Nginx là một kỹ thuật quan trọng giúp bạn chạy nhiều trang web trên cùng một máy chủ. Điều này không chỉ giúp tối ưu hóa việc sử dụng tài nguyên mà còn mang lại sự linh hoạt trong quản lý và tổ chức các trang web của bạn. Trong bài viết này, chúng tôi sẽ cung cấp một hướng dẫn chi tiết về cách tạo và cấu hình Virtual Host trong Nginx.

Phần 1 : Virtual Host làm Reserve Proxy

server {
        listen 80 ;
        listen [::]:80 ;

        server_name example.com www.example.com;

##Block Google Crawl  
        if ($http_user_agent ~* (google) ) {
                return 403; 
        }
##Block Google Crawl

        location / {
                proxy_buffers 4 256k;
                proxy_buffer_size 128k;
                proxy_busy_buffers_size   256k;
                proxy_headers_hash_max_size 1024;
                proxy_headers_hash_bucket_size 128;

                #1 hour timeout
                proxy_read_timeout 3600;
                client_max_body_size 100M;

                proxy_pass http://192.168.1.10:80;
                proxy_set_header Accept-Encoding "";
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-SSL on;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header Accept-Encoding "";
                # Add HSTS header with preload.
                add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
        }
#Brotli
        brotli on;
        brotli_comp_level 8;
        brotli_static on;
        brotli_types application/atom+xml application/javascript application/json application/rss+xml
               application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype
               application/x-font-ttf application/x-javascript application/xhtml+xml application/xml
               font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon
               image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;
#Brotli


}

Với SSL Let’s Encrypt :

server {

    server_name thanhnh.id.vn;

    location / {
        # BLOCK SPAMMERS IP ADDRESSES
        #include /etc/nginx/conf.d/blockips.conf;

#        access_log one;
        access_log /var/log/nginx/thanhnh.id.vn/access.log;
        error_log /var/log/nginx/thanhnh.id.vn/error.log;

        proxy_set_header Accept-Encoding "";

                if ($request_method = 'OPTIONS') {
                        add_header 'Access-Control-Allow-Origin' '*';
                        #
                        # Om nom nom cookies
                        #
                        add_header 'Access-Control-Allow-Credentials' 'true';
                        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                        #
                        # Custom headers and headers various browsers should be OK with but aren't
                        #
                        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
                        #
                        # Tell client that this pre-flight info is valid for 20 days
                        #
                        add_header 'Access-Control-Max-Age' 1728000;
                        add_header 'Content-Type' 'text/plain charset=UTF-8';
                        add_header 'Content-Length' 0;
                        return 204;
                }
                if ($request_method = 'POST') {
                        add_header 'Access-Control-Allow-Origin' '*';
                        add_header 'Access-Control-Allow-Credentials' 'true';
                        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
                }
                if ($request_method = 'GET') {
                        add_header 'Access-Control-Allow-Origin' '*';
                        add_header 'Access-Control-Allow-Credentials' 'true';
                        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
                }

        proxy_buffers 4 256k;
        proxy_buffer_size 128k;
        proxy_busy_buffers_size   256k;

        #1 hour timeout
        proxy_read_timeout 3600;
        client_max_body_size 60M;

        proxy_pass http://192.168.12.220:8898/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-SSL on;
        proxy_set_header X-Forwarded-Proto $scheme;
        # Add HSTS header with preload.
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

#Brotli
    brotli on;
    brotli_comp_level 8;
    brotli_static on;
    brotli_types application/atom+xml application/javascript application/json application/rss+xml
         application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype
             application/x-font-ttf application/x-javascript application/xhtml+xml application/xml
             font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon
             image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;
#Brotli

    }

    listen [::]:443 ssl http2 ipv6only=on; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/thanhnh.id.vn/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/thanhnh.id.vn/privkey.pem; # managed by Certbot
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}
server {
    if ($host = thanhnh.id.vn) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    listen [::]:80;

    server_name thanhnh.id.vn;
    return 404; # managed by Certbot




}

Phần 2 : Nginx sử dụng để handle PHP code

server {
         listen       80;
         server_name  example.thanhnh.id.vn;
         root         /var/www/html/wordpress;

         access_log /var/log/nginx/example.thanhnh.id.vn-access.log;
         error_log  /var/log/nginx/example.thanhnh.id.vn-error.log error;
         index index.html index.htm index.php;

         location / {
                      try_files $uri $uri/ /index.php$is_args$args;
         }

  # pass PHP scripts on Nginx to FastCGI (PHP-FPM) server
  location ~ .php$ {
    include snippets/fastcgi-php.conf;

    # Nginx php-fpm sock config:
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    # Nginx php-cgi config :
    # Nginx PHP fastcgi_pass 127.0.0.1:9000;
  }

  # deny access to Apache .htaccess on Nginx with PHP, 
  # if Apache and Nginx document roots concur
  location ~ /.ht {
    deny all;
  }
}

Nginx handle PHPMYADMIN

server {
  listen 8080;
  listen [::]:8080;
  server_name pma.example.com;
  root /usr/share/phpmyadmin/;
  index index.php index.html index.htm index.nginx-debian.html;

  access_log /var/log/nginx/phpmyadmin_access.log;
  error_log /var/log/nginx/phpmyadmin_error.log;

  location / {
    try_files $uri $uri/ /index.php;
  }

  location ~ ^/(doc|sql|setup)/ {
    deny all;
  }

  location ~ .php$ {
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    include snippets/fastcgi-php.conf;
  }

  location ~ /.ht {
    deny all;
  }
}

Tìm hiểu thêm :

Các loại Load Balancing với Nginx

Giới thiệu

Trong các hệ thống hiện đại, Load Balancing (cân bằng tải) là một trong những phương pháp quan trọng để đảm bảo hiệu suất cao và độ tin cậy. Với Nginx, bạn không chỉ thiết lập Load Balancing một cách dễ dàng mà còn có thể tận dụng sức mạnh của nó trong vai trò Reverse Proxy. Bài viết này sẽ hướng dẫn bạn cách cấu hình Load Balancing với Nginx, giúp hệ thống của bạn xử lý lưu lượng truy cập hiệu quả hơn và giảm tải cho các server backend.

Nginx hỗ trợ nhiều kỹ thuật load balancing (cân bằng tải), phổ biến trong việc phân phối lưu lượng truy cập giữa các máy chủ backend để tăng cường hiệu suất và đảm bảo tính ổn định của hệ thống. Dưới đây là các thể loại load balancing mà Nginx cung cấp:

1. Round Robin

Nguyên lý: Các yêu cầu được phân phối tuần tự đến từng máy chủ trong danh sách, không xét đến tải hoặc trạng thái của máy chủ.

Ưu điểm:

  • Đơn giản, dễ cấu hình.
  • Phù hợp với các máy chủ có cấu hình và tài nguyên tương đồng.
upstream backend {
    server server1.example.com;
    server server2.example.com;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

2. Least Connections

Nguyên lý: Chuyển yêu cầu đến máy chủ có ít kết nối đang hoạt động nhất.

Ưu điểm:

  • Hiệu quả với các ứng dụng có thời gian xử lý yêu cầu không đồng nhất.
upstream backend {
    least_conn;
    server server1.example.com;
    server server2.example.com;
}

3. IP Hash

Nguyên lý: Yêu cầu từ một IP cụ thể luôn được chuyển đến cùng một máy chủ, dựa trên hàm băm của địa chỉ IP.

Ưu điểm:

  • Đảm bảo phiên làm việc (session) của người dùng được duy trì trên một máy chủ (sticky sessions).
upstream backend {
    ip_hash;
    server server1.example.com;
    server server2.example.com;
}

4. Generic Hash

Nguyên lý: Dựa trên giá trị được chỉ định (ví dụ: URL, cookie, v.v.), Nginx phân phối yêu cầu đến một máy chủ cụ thể.Ưu điểm:

  • Tùy chỉnh cao, phù hợp với các ứng dụng cần duy trì dữ liệu trên một backend cố định.
upstream backend {
    hash $request_uri consistent;
    server server1.example.com;
    server server2.example.com;
}

5. Weight-Based Load Balancing

Nguyên lý: Gán trọng số (weight) cho các máy chủ, máy chủ có trọng số cao hơn sẽ nhận nhiều yêu cầu hơn.

Ưu điểm:

  • Hữu ích khi các máy chủ có cấu hình không đồng đều.
upstream backend {
    server server1.example.com weight=3;
    server server2.example.com weight=1;
}

6. Dynamic Load Balancing (Sticky Sessions)

Nguyên lý: Duy trì yêu cầu của người dùng trên một máy chủ trong suốt thời gian làm việc bằng cách sử dụng cookie hoặc token.

Cách cấu hình (sử dụng Nginx Plus hoặc module third-party)

upstream backend {
    server server1.example.com;
    server server2.example.com;
    sticky cookie srv_id expires=1h path=/;
}

7. Active Health Check

Nguyên lý: Liên tục kiểm tra tình trạng của các máy chủ backend. Yêu cầu chỉ được gửi đến các máy chủ đang hoạt động.

Ưu điểm:

  • Giảm thiểu thời gian chết của hệ thống khi một hoặc nhiều máy chủ gặp sự cố.
upstream backend {
    server server1.example.com;
    server server2.example.com;
    health_check;
}

8. Failover

Nguyên lý: Khi một máy chủ không khả dụng, yêu cầu sẽ được chuyển đến một máy chủ khác trong danh sách.Ưu điểm:

  • Tăng tính sẵn sàng của hệ thống.

Cách cấu hình: Failover tự động được áp dụng với các loại cân bằng tải khác khi có health check.

9. Stream Load Balancing (TCP/UDP)

Nguyên lý: Cân bằng tải cho giao thức TCP và UDP, thường sử dụng cho các dịch vụ như MySQL, Redis, hoặc WebSocket.

stream {
    upstream backend {
        server server1.example.com:3306;
        server server2.example.com:3306;
    }

    server {
        listen 3306;
        proxy_pass backend;
    }
}

Tùy vào đặc điểm ứng dụng và yêu cầu hệ thống, bạn có thể chọn hoặc kết hợp các phương pháp trên để tối ưu hóa việc cân bằng tải.

Tối Ưu Hiệu Suất Redis trên CentOS

Tối Ưu Hiệu Suất Redis trên CentOS

Tối Ưu Hiệu Suất Redis trên CentOS

Redis là một kho lưu trữ dữ liệu in-memory mạnh mẽ cho việc cache và streaming. Trong bài viết này, chúng ta sẽ khám phá các kỹ thuật tối ưu hiệu suất cho Redis trên nền tảng CentOS.

1. Cài Đặt Redis trên CentOS

sudo yum install epel-release
sudo yum install redis

2. Tối Ưu Hóa Hiệu Suất

Sử dụng tệp cấu hình redis.conf để tối ưu hóa hiệu suất. Các tham số quan trọng bao gồm:

  • maxmemory: Giới hạn bộ nhớ mà Redis sử dụng.
  • maxmemory-policy: Chính sách khi đạt giới hạn bộ nhớ.
# Ví dụ cài đặt maxmemory
maxmemory 256mb
maxmemory-policy allkeys-lru

3. Bảo Mật Redis

Bảo mật là yếu tố quan trọng để bảo vệ dữ liệu. Hãy đảm bảo:

  • Thay đổi mật khẩu mặc định trong redis.conf.
  • Sử dụng cấu hình bind để chỉ cho phép địa chỉ IP cụ thể truy cập.
requirepass your_secure_password
bind 127.0.0.1

4. Giám Sát Redis

Các công cụ giám sát như Redis Monitoring giúp theo dõi hiệu suất và phát hiện các vấn đề nhanh chóng. Sử dụng redis-cli để kiểm tra:

redis-cli info

5. Lưu Trữ Dữ Liệu

Redis hỗ trợ một số phương pháp lưu trữ dữ liệu, bao gồm:

  • RDB Persistence: Lưu trữ dữ liệu ở định dạng snapshot.
  • AOF Persistence: Lưu mọi lệnh để khôi phục lại dữ liệu.
# Ví dụ cấu hình AOF
appendonly yes
appendfsync everysec

6. Kiểm Soát Lỗi Tổn Thất Thông Tin

Một trong những sai lầm phổ biến là không sao lưu cấu hình. Đảm bảo bạn thường xuyên sao lưu redis.conf và dữ liệu của bạn.

Checklist Tối Ưu:

  • Đã cấu hình maxmemory?
  • Bảo mật với requirepass?
  • Thiết lập giám sát?
  • Lưu trữ dữ liệu được cấu hình đúng?

Cài đặt Apache2.4 với PHP 7.4

Giới thiệu

Apache HTTP Server, thường được gọi là Apache, là một trong những máy chủ web phổ biến nhất trên thế giới. Nó là phần mềm mã nguồn mở, miễn phí và có khả năng phục vụ nội dung web với hiệu suất cao, được sử dụng rộng rãi bởi các doanh nghiệp, tổ chức và cá nhân để lưu trữ các trang web và ứng dụng trực tuyến.

PHP, viết tắt của “Hypertext Preprocessor,” là một ngôn ngữ lập trình kịch bản phía server mạnh mẽ và linh hoạt, được sử dụng chủ yếu cho phát triển web. Phiên bản PHP 7.4 mang lại nhiều cải tiến về hiệu năng và một loạt các tính năng mới, giúp tối ưu hóa các ứng dụng web.

Trong bài viết này, chúng ta sẽ hướng dẫn cách cài đặt Apache phiên bản 2.4 cùng với PHP phiên bản 7.4 trên hệ điều hành Ubuntu. Đây là một cấu hình phổ biến, được sử dụng trong nhiều dự án web từ nhỏ đến lớn, cho phép bạn triển khai các ứng dụng PHP một cách nhanh chóng và hiệu quả.

Hướng dẫn này sẽ bao gồm các bước cài đặt chi tiết, từ việc cập nhật hệ thống, cài đặt Apache và PHP, cho đến việc kiểm tra để đảm bảo mọi thứ hoạt động ổn định. Bài viết này dành cho những ai đang bắt đầu tìm hiểu về quản trị server web hoặc muốn cài đặt một môi trường phát triển PHP trên máy chủ của mình.

Cài đặt Apache2.4

Cập nhật hệ thống :

apt update
apt upgrade -y

Cài đặt Apache2 :

apt install apache2 -y
systemctl enable apache2
systemctl start apache2 
systemctl status apache2

Cài đặt các gói cơ bản thường dùng của PHP7.4 :

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
apt-get install php7.4-fpm
#Kiểm tra phiên bản của php
php -v

Cài đặt các extension PHP & Tích hợp PHP 7.4 với Apache

sudo apt-get install libapache2-mod-php7.4 -y 
&& sudo apt-get install -y php7.4-mcrypt 
&& sudo apt-get install -y php7.4-mbstring 
&& sudo apt-get install -y php7.4-mysqlnd 
&& sudo apt-get install -y php7.4-soap 
&& sudo apt-get install -y php7.4-curl 
&& sudo apt-get install -y php7.4-gd 
&& sudo apt-get install -y php7.4-zip 
&& sudo apt-get install -y php7.4-imagick 
&& sudo apt-get install -y php7.4-dom 
&& sudo apt-get install -y php7.4-tidy 
&& sudo apt-get install -y php7.4-bcmath 

Khởi động lại apache và kiểm tra :

apachectl -t 
apachectl -k restart

Cài đặt Virtual Host Apache2 để kiểm tra PHP7.4

cd /etc/apache/sites-available/
nano default.conf
<VirtualHost *:80>

# Admin email, Server Name (domain name), and any aliases
       ServerName domain.com
       ServerAlias www.domain.com

# Index file and Document Root (where the public files are located)
       DirectoryIndex index.html index.php
       DocumentRoot /var/www/html/test/

<Directory /var/www/html/test/>

       Options Indexes FollowSymLinks
       AllowOverride All
       Require all granted

</Directory>

#set version php apply cho website
<FilesMatch .php$>
       SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://thanhnh.id.vn/"
</FilesMatch>

# Log file locations
       LogLevel warn
       ErrorLog /var/log/apache/error.log
       CustomLog /var/log/apache/access.log combined

</VirtualHost>

Tạo 1 file index.php trong /var/www/html/test/

nano /var/www/html/test/index.php

Thêm trong file index.php như sau

<?php
   
phpinfo();
   
?> 

Kiểm tra apache và khởi động lại apache2

apachectl -t
apachectl -k restart

Mở trình duyệt và kiểm tra :

Kết luận:

  • Tóm tắt các bước đã thực hiện và đưa ra một số hướng dẫn cơ bản về cách tiếp tục với việc cấu hình thêm hoặc triển khai ứng dụng web trên môi trường Apache và PHP vừa thiết lập.

Lợi ích bài viết:

  • Giúp người đọc dễ dàng thiết lập môi trường phát triển web trên máy chủ Linux.
  • Đảm bảo môi trường ổn định và tương thích với các ứng dụng yêu cầu PHP 7.4.

Bài viết này rất hữu ích cho những người mới bắt đầu cũng như những người đã có kinh nghiệm muốn cài đặt một môi trường web server ổn định và hiện đại.

Install Nginx

Cài đặt phiên bản mới nhất của Nginx trên ubuntu

Update Ubuntu :

sudo apt update && sudo apt upgrade -y

Gỡ bỏ cài đặt cấu hình cũ của Nginx (nếu có):

sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old

Cài đặt và nâng cấp Nginx Repository

sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

Tải về và cài Nginx GPG key để xác nhận gói

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor 
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Xác thực key :

gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

Import Nginx stable Repository :

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] 
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" 
| sudo tee /etc/apt/sources.list.d/nginx.list

Import Nginx Mainline Repository:

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] 
http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" 
| sudo tee /etc/apt/sources.list.d/nginx.list

Cài đặt gói APT hướng đến phiên bản Nginx hoặc các phiên bản mặc định khác của PPA’s :

echo -e "Package: *nPin: origin nginx.orgnPin: release o=nginxnPin-Priority: 900n" 
| sudo tee /etc/apt/preferences.d/99nginx

Cải đặt Nginx :

sudo apt update
sudo apt install nginx

Khởi động của nginx :

systemctl start nginx
systemctl enable nginx

Kiểm tra hoạt động của nginx :

systemctl status nginx
nginx -t

Vậy là đã hoàn thành !

Apache-Php

PHP là một ngôn ngữ lập trình phổ biến và mạnh mẽ, được sử dụng rộng rãi để phát triển các ứng dụng web động. Khám phá các tính năng, công cụ và tài nguyên học PHP để xây dựng các trang web và ứng dụng hiệu quả.

Apache2 trên Ubuntu 20.04+: giám sát và quan sát hệ thống cho quản trị viên

Apache2 trên Ubuntu 20.04+: giám sát và quan sát hệ thống cho quản trị viên

Apache2 trên Ubuntu 20.04+ giám sát và quan sát hệ thống cho quản trị viên

Việc giám sát và quan sát Apache2 trên nền tảng Ubuntu 20.04 trở nên quan trọng để đảm bảo khả dụng, hiệu suất và an toàn cho các ứng dụng web của bạn. Bài viết này trình bày các khía cạnh thực tiễn cho quản trị hệ thống, từ kiến trúc cốt lõi đến các biện pháp cấu hình tối ưu và phương pháp giám sát phù hợp với môi trường sản xuất. Nội dung được xây dựng dựa trên các tài liệu kỹ thuật hiện có và tập trung vào cách khai thác các directive và mô hình xử lý hiện có của Apache2 Version 2.4 để hỗ trợ công tác vận hành và bảo trì trên Ubuntu 20.04+.

Kiến trúc và khái niệm cốt lõi

Kiến trúc Apache2 cho phiên bản 2.4 gồm nhiều thành phần có thể điều chỉnh nhằm tối ưu hóa khả năng phục vụ các kết nối đồng thời. Một sự khác biệt quan trọng là việc dùng Multi Processing Module MPM để xử lý luồng công việc và kết nối. MPM event là một biến thể của MPM worker có mục tiêu tiêu thụ threads chỉ cho các kết nối đang có xử lý thực sự, trong khi các kết nối khác được quản lý bởi các listener thread, nhờ đó các worker threads có thể phục vụ yêu cầu mới nhanh hơn. Đây là một mô hình kết nối bất đồng bộ giúp giảm yếu tố thận thùng và tối ưu hóa xử lý đồng thời. Để dùng MPM event, cấu hình biên dịch cho httpd cần được thiết kế với tham số –with-mpm=event khi biên dịch chương trình, sau đó là quá trình biên dịch và cài đặt.

Trong cơ chế vận hành, Apache2 duy trì một control process và các process con, mỗi process con sẽ tạo ra một số lượng server thread cố định để xử lý yêu cầu và một listener thread tiếp nhận kết nối. Việc tách biệt giữa các giai đoạn nhận kết nối và xử lý chính giúp giảm chi phí khởi tạo tài nguyên cho mỗi kết nối và cải thiện khả năng xử lý đồng thời, đặc biệt khi lưu lượng cao hoặc có nhiều kết nối KeepAlive. Các yếu tố như AsyncRequestWorkerFactor và cách quản lý KeepAlive đều liên quan trực tiếp đến hiệu năng và khả năng chịu tải của hệ thống.

Để quản trị viên có thể theo dõi tiến trình và hiệu suất, Apache còn cung cấp các chỉ số và cơ chế trực quan thông qua sử dụng mod_status và Scoreboard. Việc theo dõi trạng thái các kết nối bất động và tổng số kết nối đang hoạt động giúp nhận diện bottleneck và điều chỉnh tham số cho phù hợp với tải thực tế.

Yêu cầu và chuẩn bị cài đặt

Trên Ubuntu 20.04+ hoặc các bản phân phối tương thích, bạn sẽ bắt đầu từ việc cài đặt Apache2 và đảm bảo các cấu hình an toàn cho server root cùng các thư mục liên quan. Trong ngữ cảnh bảo mật và ổn định, cần chú ý quản lý quyền trên các thư mục và tập tin quan trọng, đảm bảo chỉ root mới có thể chỉnh sửa các thành phần cốt lõi và các đường dẫn quan trọng của ServerRoot. Các bước cụ thể có thể được cân nhắc như sau:

  • Đảm bảo đúng quyền và sở hữu trên thư mục ServerRoot và các thư mục con như bin, conf, logs, đảm bảo rằng chúng chỉ có thể được sửa bởi root và các người dùng được cấu hình phù hợp trên hệ thống.
  • Tập tin thực thi httpd nên được bảo vệ nghiêm ngặt để ngăn sửa đổi trái phép và ngăn lưu đè lên log hoặc các tệp hệ thống quan trọng.
  • Khái niệm về Server Side Includes SSI và các rủi ro dẫn đến tải hệ thống và các vấn đề bảo mật liên quan đến SSI cần được cân nhắc trong môi trường chia sẻ và có nhiều người dùng.

Trong thực tế, các thiết lập cụ thể về nhận diện và xử lý kết nối cần được điều chỉnh dựa trên tải và đặc thù ứng dụng. Đối với Linux và các hệ điều hành có hỗ trợ AcceptFilter, bạn có thể cấu hình để offload một phần xử lý nhận kết nối cho kernel hoặc các cơ chế OS, nhằm giảm gánh nặng cho Apache. Phần này sẽ được trình bày kỹ hơn trong phần cấu hình.

Cấu hình chính cho giám sát và tối ưu hóa

Để đảm bảo khả năng giám sát và quan sát hệ thống, bạn cần chú ý đến một số directive cốt lõi và các cơ chế tối ưu hóa sẵn có trong Apache 2.4. Dưới đây là danh sách các khái niệm và directive quan trọng có liên quan trực tiếp đến giám sát và vận hành hệ thống:

  • TimeOut và KeepAlive: TimeOut xác định thời gian một client có thể mất để gởi yêu cầu. TimeOut có thể được giảm xuống mức thích hợp để giảm thiểu tình trạng DoS. KeepAlive cho phép giữ mở kết nối để tái sử dụng và giảm chi phí thiết lập lại kết nối, tuy nhiên việc giữ lại quá mức có thể ảnh hưởng đến hiệu suất. KeepAliveTimeout có thể được giả lập để tối ưu giữa khả năng phục hồi và hiệu suất.
  • Limit các yêu cầu và dữ liệu đầu vào: LimitRequestBody, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine và LimitXMLRequestBody được thiết kế để giới hạn nguồn lực tiêu thụ từ phần mô tả của client. Việc cấu hình các giới hạn này giúp hạn chế rủi ro từ dữ liệu đầu vào không hợp lệ hoặc cố tình nhồi dữ liệu lớn.
  • AcceptFilter và tối ưu hóa nhận kết nối: AcceptFilter giúp offload một phần xử lý cho kernel hay các thành phần hệ điều hành, dựa trên nền tảng OS. Ví dụ trên Linux có thể chọn AcceptFilter http data hoặc dataready, và trên Windows hoặc FreeBSD có các tùy chọn khác nhau. Việc bật AcceptFilter có thể giúp giảm tải cho Apache trong các môi trường có lưu lượng cao.
  • Async và MaxRequestWorkers: MPM event hỗ trợ xử lý bất đồng bộ và có tham số AsyncRequestWorkerFactor để điều chỉnh lượng công việc bất đồng bộ. MaxRequestWorkers quyết định số lượng kết nối đồng thời được phục vụ. Việc điều chỉnh các tham số này giúp tối ưu khả năng phục vụ và quản lý nguồn lực khi tải cao.
  • Scoreboard và quản trị tiến trình: Scoreboard cho biết trạng thái của các tiến trình và worker threads. Trong trường hợp scoreboard đầy hoặc các tiến trình đang ở trạng thái Graceful, bạn có thể nhận diện các bottleneck và tối ưu hóa lộ trình xử lý trong thời gian bảo trì hoặc khởi động lại.
  • Path và quản lý đường dẫn cài đặt: Chính sách URI và PATH_INFO thông qua AcceptPathInfo cho phép xác định cách xử lý các trailing path sau file thực thi, ảnh hưởng đến khả năng chạy script và bảo mật của đường dẫn.

Ví dụ cấu hình cho các directive phổ biến

TimeOut 5
KeepAlive On
KeepAliveTimeout 5
MaxRequestWorkers 150
AsyncRequestWorkerFactor 2
AcceptFilter http data
AcceptPathInfo On
ExtendedStatus On
ScoreBoardFile /var/log/apache2/status

Trong thực tế, các giá trị trên chỉ là ví dụ và cần được điều chỉnh dựa trên tải thực tế, tính sẵn có của phần cứng và đặc thù ứng dụng. Hãy cân nhắc đến khía cạnh an toàn khi cho phép PATH_INFO hoặc bất kỳ dạng dữ liệu đầu vào nào và luôn giám sát tác động lên nguồn lực hệ thống.

An ninh và bảo mật khi giám sát

An toàn là thành phần không thể tách rời của quá trình giám sát và vận hành. Các nguyên tắc bảo mật cơ bản liên quan đến quyền truy cập và cách Apache tương tác với hệ điều hành có thể ảnh hưởng lớn đến độ tin cậy của hệ thống. Một số biện pháp có thể tham khảo dựa trên tài liệu an toàn cho Apache 2.4:

  • Giữ ServerRoot và các thư mục quan trọng ở quyền và sở hữu đúng. Trong hoạt động bình thường, Apache được khởi động bởi người dùng root và sau đó chuyển sang người dùng được chỉ định bởi directive User để phục vụ các lượt truy cập. Đảm bảo rằng các thư mục và các tập tin trong ServerRoot chỉ có quyền write bởi root và các cấp cha con của chúng cũng vậy. Việc cho phép người dùng phi root chỉnh sửa các tập tin liên quan đến chạy chương trình có thể mở nguy cơ bị tấn công.
  • Nghỉ ngơi hoặc giảm thiểu rủi ro từ SSI. SSI có thể phát sinh tải trên máy chủ và các rủi ro bảo mật liên quan đến thực thi CGI hoặc các script dưới quyền của người dùng. Xem xét nhu cầu và ảnh hưởng trước khi bật SSI trong môi trường chia sẻ.
  • Config và giới hạn đầu vào từ phía client để giảm nguy cơ DoS và các hình thức tấn công qua dữ liệu đầu vào. Kết hợp với tường lửa và các cấu hình kernel phù hợp để hạn chế số luồng đồng thời từ một địa chỉ IP hay mạng nhất định.
  • Áp dụng AcceptFilter và các tối ưu OS để giảm tải cho Apache và tăng khả năng chịu tải trong các môi trường có lưu lượng cao.

Đối với hệ thống Linux, những khuyến nghị về AcceptFilter và offloading xử lý cho kernel có thể mở rộng khả năng đáp ứng và giảm tải cho máy chủ. Việc quản trị đúng các đường dẫn tài nguyên và đảm bảo quyền truy cập an toàn đóng vai trò then chốt trong việc duy trì tính toàn vẹn của hệ thống trong quá trình giám sát và vận hành.

Hiệu năng và tối ưu hóa

Hiệu năng của Apache2 phụ thuộc vào cách cấu hình MPM và cách quản trị tài nguyên. Các giải pháp tối ưu phổ biến bao gồm:

  • Chọn MPM event hoặc worker với cách phân bổ thread và process hợp lý, nhằm tối ưu hóa CPU và RAM. Sự chuyển đổi sang mô hình event giúp giảm chi phí cho mỗi kết nối và tăng khả năng phục vụ đồng thời.
  • Giảm thời gian chờ đợi cho từng yêu cầu bằng TimeOut và KeepAlive phù hợp với tải. Việc giảm KeepAlive và KeepAliveTimeout đối với các site dễ bị DoS có thể giúp giảm gánh nặng cho hệ thống, nhưng đi kèm với đánh đổi hiệu suất cho các site có nhiều CGI hoặc long running scripts.
  • Kiểm soát phạm vi và độ khắt khe của giới hạn đầu vào với các directive LimitRequestBody và các giới hạn khác để ngăn tình trạng tốn tài nguyên do dữ liệu từ client gửi lên.
  • Hướng tới OS level offloading cho việc xử lý nhận kết nối bằng AcceptFilter, nhằm tối ưu hóa luồng xử lý và giảm thiểu chi phí từ kernel.

Đồng thời hãy theo dõi sự thay đổi và cập nhật phần mềm. Apache có lịch sử bảo mật tốt, nhưng sự cố có thể phát sinh từ mã thêm hoặc hệ điều hành đi kèm. Vì vậy, việc cập nhật và tham gia danh sách thông báo từ Apache HTTP Server là điều được khuyến nghị để duy trì an ninh và tính ổn định của hệ thống.

Giám sát và observability

Khả năng quan sát hệ thống là yếu tố quyết định để duy trì vận hành liên tục. Các yếu tố cần theo dõi gồm:

  • Trạng thái và hiệu suất qua trang status của mod_status. Trang trạng thái cho phép xem thông tin về số kết nối đang chờ xử lý, số worker và các thông tin liên quan đến Async connections. Việc này cho phép nhận diện sớm các bottleneck và điều chỉnh tham số cho phù hợp.
  • Scoreboard và trạng thái của các tiến trình. Scoreboard cho biết trạng thái của các tiến trình và các worker threads, giúp bạn nhận diện các tình huống Graceful hoặc các vòng lặp xử lý đang chiếm dụng tài nguyên.
  • Quan sát log và nhật ký hệ thống. Việc theo dõi log là căn bản để nhận diện các sự kiện bất thường, lỗi và các xung đột khi chạy các module hoặc CGI script. Đảm bảo quyền ghi log được quản lý đúng cách để tránh bị sửa đổi trái phép.
  • Kiểm tra và đánh giá biểu đồ và dữ liệu từ các directive liên quan đến giới hạn và thời gian phản hồi nhằm đảm bảo rằng các phạm vi cấu hình đang phù hợp với tải thực tế.

Để thực hiện giám sát hiệu quả, bạn có thể bậtExtendedStatus để có thêm dữ liệu chi tiết tham gia vào mod_status và giữ nguyên chế độ theo dõi trong quá trình vận hành. Việc theo dõi quy mô và hiệu suất cần được thực hiện liên tục và kết hợp với các cảnh báo khi có sự cố. Trong đó hãy chú ý tới thời gian phản hồi và số lượng kết nối đồng thời để điều chỉnh tham số cho phù hợp với tải.

Kiểm tra và xác nhận vận hành

Kiểm tra cấu hình và xác nhận vận hành là bước quan trọng trước khi đẩy hệ thống vào sản xuất. Những bước kiểm tra cơ bản gồm:

  • Kiểm tra syntax và cú pháp cấu hình bằng cách kiểm tra đúng các directive đã bật và đảm bảo không có lỗi biên dịch hoặc cú pháp. Theo dõi các log để nhận diện cảnh báo hoặc lỗi liên quan đến cấu hình.
  • Kiểm tra khả năng xử lý kết nối đồng thời và qua mod_status để xem số lượng kết nối đang hoạt động và tình trạng các worker. Theo dõi bằng cách xem thông tin liên quan đến Async connections và MaxRequestWorkers.
  • Đảm bảo tính bảo mật của đường dẫn ServerRoot và các thư mục liên quan bằng cách kiểm tra quyền viết và quyền truy cập của non-root users. Theo dõi các log để đảm bảo không có thay đổi trái phép nào diễn ra.
  • Kiểm tra khả năng offloading nhận kết nối và tiến trình xử lý của kernel khi được kích hoạt AcceptFilter trên hệ thống Linux. Đảm bảo AcceptFilter hoạt động đúng theo các giá trị bạn đã cấu hình và theo dõi các log hệ thống khi cần thiết.

Trong quá trình vận hành, hãy bảo đảm hệ thống được theo dõi một cách liên tục và có kế hoạch sao lưu cấu hình cũng như sao lưu dữ liệu logs để có thể phục hồi nhanh chóng khi gặp sự cố. Việc tham gia danh sách thông báo của Apache và cập nhật kịp thời là yếu tố then chốt để duy trì an toàn và ổn định cho hệ thống.

Checklist vận hành ngắn gọn

  • Xác định mô hình MPM phù hợp với tải và yêu cầu ứng dụng
  • Cấu hình TimeOut, KeepAlive và các giới hạn đầu vào cho một phiên bản an toàn
  • Bật và cấu hình AcceptFilter cho hệ điều hành đang sử dụng, đặc biệt trên Linux
  • Bật ExtendedStatus và theo dõi mod_status để giám sát trạng thái và hiệu suất
  • Theo dõi log và đảm bảo quyền ghi, không cho phép sửa đổi trái phép
  • Đảm bảo quyền truy cập đúng trên ServerRoot và các thư mục quan trọng
  • Với các thay đổi cấu hình, kiểm tra syntax và xác nhận vận hành trước khi đưa vào sản xuất
  • Chuẩn bị kế hoạch sao lưu cấu hình và dữ liệu log

Kết luận ngắn

Việc giám sát và quan sát hệ thống Apache2 trên Ubuntu 20.04+ đòi hỏi sự cân bằng giữa hiệu năng và an toàn. Bằng cách áp dụng các nguyên tắc quản trị nguồn lực, tối ưu hóa thông qua MPM event, và thiết lập đúng các directive như TimeOut, KeepAlive, và các giới hạn đầu vào, bạn có thể duy trì hệ thống ổn định ngay cả khi đối mặt với lưu lượng cao. Việc tận dụng công cụ giám sát như mod_status và Scoreboard hợp cùng với các biện pháp bảo mật cơ bản sẽ giúp quản trị viên nhanh chóng nhận diện và xử lý các sự cố, từ đó đảm bảo dịch vụ web luôn sẵn sàng cho người dùng cuối.

Hardening php.ini cho Shared Hosting: Bảo mật và Tối ưu Apache & PHP-FPM trên Ubuntu 20.04+

Hardening php.ini cho Shared Hosting: Bảo mật và Tối ưu Apache & PHP-FPM trên Ubuntu 20.04+

Hardening php.ini cho Shared Hosting: Bảo mật và Tối ưu Apache & PHP-FPM trên Ubuntu 20.04+

Document này trình bày cách harden php.ini cho môi trường Shared Hosting chạy trên stack Apache và PHP-FPM trên Ubuntu 20.04+. Nội dung tập trung vào quản lý cấu hình PHP và OPcache thông qua php.ini để tăng cứng an ninh và tối ưu hiệu suất, phù hợp với hệ thống chia sẻ tài nguyên và yêu cầu bảo mật nghiêm ngặt.

Giới thiệu

Trong mô hình Shared Hosting, PHP được vận hành giữa Apache hoặc Nginx và PHP-FPM. Việc cấu hình và làm cứng php.ini đóng vai trò then chốt để giảm thiểu rủi ro từ dữ liệu người dùng và tối ưu hiệu suất phục vụ cùng lúc nhiều người dùng. Các yếu tố liên quan tập trung vào cách PHP xử lý dữ liệu người dùng, bảo mật báo cáo lỗi và đặc biệt tối ưu hóa thông qua OPcache. Tài liệu tham khảo choOPcache và các tham số PHP được trình bày trong phạm vi Runtime Configuration của PHP.

Kiến trúc và khái niệm cốt lõi

php.ini là nơi định hình hành vi của PHP tại thời điểm chạy. Các tùy chọn trong php.ini cho phép điều chỉnh cách PHP xử lý dữ liệu người dùng, cách quản lý tài nguyên, và cách tối ưu hiệu suất thông qua OPcache. Trong phần Open Cache (OPcache), các tham số như opcache.enable, opcache.memory_consumption, opcache.validate_timestamps và các tham số liên quan khác đóng vai trò chính trong việc quyết định cách PHP biên dịch và lưu trữ mã nguồn dưới dạng opcode để tăng tốc thực thi.

OPcache là một phần cấu hình runtime của PHP và có nhiều tùy chọn để tinh chỉnh. Những tham số này được mô tả chi tiết trong tài liệu Runtime Configuration, cho thấy cách opcache.enable, opcache.memory_consumption, opcache.validate_timestamps và các tham số khác ảnh hưởng đến hành vi của hệ thống PHP tại runtime. Việc bật OPcache và thiết lập đúng các tham số giúp giảm tải CPU và tăng tốc đáp ứng cho các request đồng thời. Nguồn tham khảo cho các tham số OPcache và cách chúng được mô tả trong php.ini được trình bày trong phần phụ lục của tài liệu này.

Yêu cầu và chuẩn bị

Đối với Ubuntu 20.04+, hệ thống áp dụng stack Apache và PHP-FPM cho môi trường Shared Hosting. Trong khối tài liệu này khuyến nghị bật OPcache và tùy biến các tham số liên quan ở mức phù hợp với tải trọng và giới hạn tài nguyên của máy chủ, sao cho vừa đảm bảo an toàn vừa tối ưu hiệu suất phục vụ nhiều tài khoản hosting cùng lúc. Nhắc lại rằng OPcache là một phần của runtime configuration và có các tham số có thể được bật/tắt và điều chỉnh thông qua php.ini, với các tham số chủ đạo được liệt kê và mô tả trong phần cấu hình OPcache của tài liệu này.

Cấu hình chính cho php.ini

Một phần cấu hình hardening cho php.ini tập trung vào OPcache và các tham số liên quan đến hành vi runtime. Dưới đây là danh sách các tham số OPcache quan trọng và giá trị tham khảo dựa trên tài liệu Runtime Configuration. Hãy áp dụng chúng vào php.ini của PHP-FPM (hoặc thông qua các pool cấu hình nếu phù hợp với hệ thống của bạn).

opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.max_wasted_percentage=5
opcache.use_cwd=1
opcache.validate_timestamps=1
opcache.revalidate_freq=2
opcache.save_comments=1
opcache.fast_shutdown=0
opcache.file_cache_consistency_checks=1
opcache.lockfile_path /tmp
opcache.opt_debug_level=0
opcache.jit disable
opcache.jit_buffer_size 64M

Ghi chú về các tham số:
– opcache.enable=1: Bật OPcache để lưu trữ và phục hồi opcode, giúp tăng tốc xử lý các yêu cầu PHP.
– opcache.enable_cli=0: Tắt OPcache cho CLI, tránh rò rỉ bộ nhớ và tăng tính ổn định cho các tác vụ dòng lệnh nếu có.
– opcache.memory_consumption=128: Dung lượng bộ nhớ dùng cho opcode cache, sử dụng 128 MB làm mặc định cho môi trường có tải trung bình đến cao.
– opcache.interned_strings_buffer=8: Dung lượng bộ nhớ cho các chuỗi nội dung được interned, giúp tối ưu tham chiếu chuỗi trong quá trình biên dịch.
– opcache.max_accelerated_files=10000: Giới hạn số lượng file PHP được cache để đáp ứng số lượng file code được tải đồng thời.
– opcache.max_wasted_percentage=5: Tỉ lệ phần trăm tối đa của bộ nhớ cache có thể tạm thời bị loại bỏ do thiếu mã nguồn hợp lệ.
– opcache.use_cwd=1: Tối ưu hóa caching theo thư mục làm việc hiện tại để tránh cache chung cho toàn bộ hệ thống.
– opcache.validate_timestamps=1: Theo dõi sự thay đổi timestamp của files để làm mới cache khi có thay đổi.
– opcache.revalidate_freq=2: Số lần lược bỏ cache hợp lệ trước khi làm mới khi có thay đổi file với tần suất thấp.
– opcache.save_comments=1: Lưu lại các nhận xét trong opcode để hỗ trợ debugging và tooling.
– opcache.fast_shutdown=0: Tắt chế độ shutdown nhanh để đảm bảo an toàn khi xử lý nhiều request đồng thời.
– opcache.file_cache_consistency_checks=1: Bật kiểm tra tính nhất quán cho cache file ở cấp độ hệ thống.
– opcache.lockfile_path /tmp: Định vị đường dẫn lockfile cho OPcache để hỗ trợ đồng bộ hóa truy cập cache trong môi trường đa tiến trình.
– opcache.opt_debug_level=0: Thiết lập mức debug tối thiểu cho OPcache để cân bằng giữa hiệu suất và khả năng chẩn đoán.
– opcache.jit=disable và opcache.jit_buffer_size=64M: Vô hiệu hóa JIT hoặc tinh chỉnh khi cần, phù hợp cho môi trường chia sẻ với PHP-FPM.

Những giá trị trên là tham khảo từ tài liệu Runtime Configuration và có thể điều chỉnh tùy theo phiên bản PHP đang chạy và tải trọng thực tế. Trong quá trình triển khai, nên bắt đầu với các giá trị an toàn và theo dõi hiệu suất, sau đó tinh chỉnh dần dần.

Bảo mật và thực hành an toàn liên quan đến php.ini

Các khía cạnh an ninh liên quan đến PHP có thể được ảnh hưởng bởi php.ini ở nhiều mức độ. Các nội dung sau đây dựa trên phân tích của tài liệu liên quan đến bảo mật và cấu hình PHP:

  • Quản lý dữ liệu người dùng và xử lý dữ liệu người nộp: php.ini có vai trò quyết định cách PHP xử lý dữ liệu người dùng, vì vậy nên giới hạn các cơ chế nhận dữ liệu và đảm bảo xác thực người dùng ở mức ứng dụng. Đảm bảo các tham số như báo cáo lỗi được kiểm soát để không làm lộ thông tin nhạy cảm ra bên ngoài.
  • Bảo mật báo cáo lỗi: Thiết lập sao cho lỗi hệ thống không bị hiển thị công khai, và log được ghi lại cho phân tích sự cố sau này. Yếu tố này nằm ở mục giới thiệu an ninh tổng thể và ảnh hưởng tới chuyển đổi cấu hình php.ini theo hướng an toàn.
  • Quản lý dữ liệu nhúng và tải lên tệp: PHP có cơ chế xử lý file uploads và dữ liệu người dùng; php.ini được dùng để giới hạn kích thước tải lên và các tham số liên quan tới xử lý dữ liệu người dùng.
  • Ẩn thông tin và giảm fingerprint hệ thống: trong khía cạnh an ninh, ẩn thông tin về môi trường thực thi cũng là mục tiêu có thể được cân nhắc thông qua php.ini và cấu hình máy chủ.

Những nguyên tắc này được mô tả trong tài liệu Security Introduction đi kèm với tài liệu Runtime Configuration và được áp dụng đồng bộ với các tham số OPcache ở trên để tối ưu cả bảo mật lẫn hiệu suất trong môi trường shared hosting.

Hiệu suất và tối ưu hóa

OPcache đóng vai trò then chốt trong tối ưu hiệu suất của PHP khi chạy trên PHP-FPM và Apache. Việc bật OPcache và tinh chỉnh các tham số liên quan có thể giảm tải CPU và cải thiện thời gian đáp ứng cho nhiều người dùng cùng lúc. Trong tài liệu Runtime Configuration, OPcache được trình bày với các tham số có thể điều chỉnh và ảnh hưởng trực tiếp đến cách PHP biên dịch và lưu trữ opcode. Việc tối ưu dựng lên từ các tham số như bộ nhớ cache, số file được cache, thời gian làm mới cache và cách thức xử lý các file có thể tạm thời ảnh hưởng tới hiệu suất theo từng trường hợp cụ thể.

Đối với môi trường Ubuntu 20.04+ chạy Apache và PHP-FPM, việc tối ưu hóa OPcache nên cân nhắc các yếu tố sau:

  • Dung lượng bộ nhớ cho OPcache phụ thuộc tải trọng và giới hạn tài nguyên. Với số lượng file code và số request đồng thời, việc tăng memory_consumption có thể cải thiện hiệu suất, lưu ý không vượt quá giới hạn RAM có sẵn để tránh swapping.
  • Kiểm soát thời gian làm mới cache và theo dõi timestamp để cân bằng giữa tính đồng bộ và hiệu suất. Tham số validate_timestamps và revalidate_freq cho phép bạn xác định tần suất làm mới khi có sự thay đổi mã nguồn.
  • Khung chữ ký và cấu hình JIT (Just-In-Time compilation) có thể được tắt hoặc bật tùy phiên bản và workload. Trong môi trường chia sẻ, khởi đầu với chế độ disable JIT là an toàn, và kích hoạt khi có nhu cầu tối ưu hóa thêm.

Việc áp dụng các tham số OPcache như đã nêu sẽ giúp tối ưu hiệu suất cho các ứng dụng chạy trên PHP-FPM và phục vụ đồng thời nhiều tài khoản hosting mà không làm tăng rủi ro bảo mật. Đây là một trong các bước then chốt trong quá trình hardening php.ini cho môi trường shared hosting.

Giám sát và quan sát hiệu suất

Việc theo dõi trạng thái hoạt động của OPcache và PHP là cần thiết để xác định hiệu suất và mức độ ổn định của hệ thống. Trong thực tiễn, hãy theo dõi các chỉ số liên quan đến OPcache và log lớp runtime để có thể điều chỉnh cấu hình khi tải trọng thay đổi. Các tham số OPcache được mô tả ở mục trên là cơ sở để bạn thiết lập và so sánh khi phân tích hiệu suất hệ thống, đồng thời kết hợp với các biện pháp bảo mật đã đề cập ở phần trước.

Kiểm tra và xác thực cấu hình

Để xác nhận rằng cấu hình php.ini đã được áp dụng đúng, bạn có thể thực hiện các bước sau đây, dựa trên các tham số OPcache đã thiết lập ở trên:

  • Xác nhận OPcache đang được bật và các tham số chính đang có hiệu lực bằng cách kiểm tra cấu hình runtime của PHP thông qua các công cụ quản trị hoặc bằng cách xem các tệp log phù hợp của PHP-FPM và Apache.
  • Kiểm tra tính hợp lệ của các file code và thời gian làm mới cache, đảm bảo rằng hệ thống sẽ làm mới đúng theo thiết lập revalidate_freq và validate_timestamps để đảm bảo rằng các bản vá và cập nhật mã nguồn được phản ánh kịp thời.
  • Đảm bảo rằng các tham số bảo mật liên quan đến báo cáo lỗi và ghi log được áp dụng đúng cách để ngăn rò rỉ thông tin nhạy cảm ra bên ngoài.

Những thực hành trên đều dựa trên nguyên tắc được mô tả trong tài liệu Runtime Configuration và Security Introduction và áp dụng một cách nhất quán với hệ thống Apache và PHP-FPM trên Ubuntu 20.04+.

Checklist vận hành cuối cùng

    <li Xác định phiên bản PHP đang chạy và đường dẫn tới php.ini cho PHP-FPM và Apache để áp dụng cấu hình đúng cho mỗi pool hoặc vhost nếu cần. <li Bật OPcache và áp dụng các tham số đã liệt kê ở mục Cấu hình chính. <li Giới hạn và định lượng tải: thiết lập memory_consumption phù hợp với RAM sẵn có và tải trọng tối đa dự kiến. <li Thiết lập revalidate_freq và validate_timestamps để cân bằng giữa tính đúng đắn của cache và hiệu suất. <li Đảm bảo an toàn báo cáo lỗi và không hiển thị thông tin nhạy cảm cho người dùng. <li Theo dõi hiệu suất sau khi triển khai và điều chỉnh tham số OPcache theo nhu cầu.

Kết luận

Hardening php.ini cho môi trường Shared Hosting là một phần quan trọng của quy trình quản trị hệ thống. Việc bật và tối ưu OPcache thông qua các tham số trong php.ini không chỉ giúp cải thiện hiệu suất phục vụ nhiều tài khoản mà còn góp phần tăng cường bảo mật bằng cách quản lý cách PHP xử lý và cache mã nguồn. Với Ubuntu 20.04+ và stack Apache cùng PHP-FPM, bạn có thể áp dụng các tham số OPcache được mô tả ở đây và điều chỉnh dựa trên tải trọng thực tế của máy chủ. Hãy duy trì một chu kỳ kiểm tra cấu hình và hiệu suất để đảm bảo hệ thống luôn ở trạng thái an toàn và tối ưu nhất cho người dùng cuối.

Cài đặt Apache2.4 với PHP 7.4

Giới thiệu

Apache HTTP Server, thường được gọi là Apache, là một trong những máy chủ web phổ biến nhất trên thế giới. Nó là phần mềm mã nguồn mở, miễn phí và có khả năng phục vụ nội dung web với hiệu suất cao, được sử dụng rộng rãi bởi các doanh nghiệp, tổ chức và cá nhân để lưu trữ các trang web và ứng dụng trực tuyến.

PHP, viết tắt của “Hypertext Preprocessor,” là một ngôn ngữ lập trình kịch bản phía server mạnh mẽ và linh hoạt, được sử dụng chủ yếu cho phát triển web. Phiên bản PHP 7.4 mang lại nhiều cải tiến về hiệu năng và một loạt các tính năng mới, giúp tối ưu hóa các ứng dụng web.

Trong bài viết này, chúng ta sẽ hướng dẫn cách cài đặt Apache phiên bản 2.4 cùng với PHP phiên bản 7.4 trên hệ điều hành Ubuntu. Đây là một cấu hình phổ biến, được sử dụng trong nhiều dự án web từ nhỏ đến lớn, cho phép bạn triển khai các ứng dụng PHP một cách nhanh chóng và hiệu quả.

Hướng dẫn này sẽ bao gồm các bước cài đặt chi tiết, từ việc cập nhật hệ thống, cài đặt Apache và PHP, cho đến việc kiểm tra để đảm bảo mọi thứ hoạt động ổn định. Bài viết này dành cho những ai đang bắt đầu tìm hiểu về quản trị server web hoặc muốn cài đặt một môi trường phát triển PHP trên máy chủ của mình.

Cài đặt Apache2.4

Cập nhật hệ thống :

apt update
apt upgrade -y

Cài đặt Apache2 :

apt install apache2 -y
systemctl enable apache2
systemctl start apache2 
systemctl status apache2

Cài đặt các gói cơ bản thường dùng của PHP7.4 :

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
apt-get install php7.4-fpm
#Kiểm tra phiên bản của php
php -v

Cài đặt các extension PHP & Tích hợp PHP 7.4 với Apache

sudo apt-get install libapache2-mod-php7.4 -y 
&& sudo apt-get install -y php7.4-mcrypt 
&& sudo apt-get install -y php7.4-mbstring 
&& sudo apt-get install -y php7.4-mysqlnd 
&& sudo apt-get install -y php7.4-soap 
&& sudo apt-get install -y php7.4-curl 
&& sudo apt-get install -y php7.4-gd 
&& sudo apt-get install -y php7.4-zip 
&& sudo apt-get install -y php7.4-imagick 
&& sudo apt-get install -y php7.4-dom 
&& sudo apt-get install -y php7.4-tidy 
&& sudo apt-get install -y php7.4-bcmath 

Khởi động lại apache và kiểm tra :

apachectl -t 
apachectl -k restart

Cài đặt Virtual Host Apache2 để kiểm tra PHP7.4

cd /etc/apache/sites-available/
nano default.conf
<VirtualHost *:80>

# Admin email, Server Name (domain name), and any aliases
       ServerName domain.com
       ServerAlias www.domain.com

# Index file and Document Root (where the public files are located)
       DirectoryIndex index.html index.php
       DocumentRoot /var/www/html/test/

<Directory /var/www/html/test/>

       Options Indexes FollowSymLinks
       AllowOverride All
       Require all granted

</Directory>

#set version php apply cho website
<FilesMatch .php$>
       SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://thanhnh.id.vn/"
</FilesMatch>

# Log file locations
       LogLevel warn
       ErrorLog /var/log/apache/error.log
       CustomLog /var/log/apache/access.log combined

</VirtualHost>

Tạo 1 file index.php trong /var/www/html/test/

nano /var/www/html/test/index.php

Thêm trong file index.php như sau

<?php
   
phpinfo();
   
?> 

Kiểm tra apache và khởi động lại apache2

apachectl -t
apachectl -k restart

Mở trình duyệt và kiểm tra :

Kết luận:

  • Tóm tắt các bước đã thực hiện và đưa ra một số hướng dẫn cơ bản về cách tiếp tục với việc cấu hình thêm hoặc triển khai ứng dụng web trên môi trường Apache và PHP vừa thiết lập.

Lợi ích bài viết:

  • Giúp người đọc dễ dàng thiết lập môi trường phát triển web trên máy chủ Linux.
  • Đảm bảo môi trường ổn định và tương thích với các ứng dụng yêu cầu PHP 7.4.

Bài viết này rất hữu ích cho những người mới bắt đầu cũng như những người đã có kinh nghiệm muốn cài đặt một môi trường web server ổn định và hiện đại.

Tổng hợp cài đặt PHP Ubuntu các phiên bản

Giới thiệu

Cài đặt PHP trên Ubuntu là một bước thiết yếu để xây dựng và triển khai các ứng dụng web. Với mỗi phiên bản Ubuntu khác nhau, quy trình cài đặt có thể có những điểm khác biệt nhỏ. Bài viết này sẽ hướng dẫn chi tiết từng bước để bạn có thể dễ dàng thiết lập PHP trên các phiên bản Ubuntu phổ biến như 18.04, 20.04, và 22.04. Dù bạn là người mới bắt đầu hay đã có kinh nghiệm, hướng dẫn này sẽ giúp bạn cài đặt PHP một cách nhanh chóng và hiệu quả.

Cài đặt PHP-FPM các phiên bản

PHP-FPM5.6 :

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php

sudo apt install php5.6 php5.6-fpm -y

sudo apt-get install -y php5.6-mcrypt 
&& sudo apt-get install -y php5.6-mbstring 
&& sudo apt-get install -y php5.6-mysqlnd 
&& sudo apt-get install -y php5.6-soap 
&& sudo apt-get install -y php5.6-curl 
&& sudo apt-get install -y php5.6-gd 
&& sudo apt-get install -y php5.6-zip 
&& sudo apt-get install -y php5.6-imagick 
&& sudo apt-get install -y php5.6-dom 
&& sudo apt-get install -y php5.6-tidy 
&& sudo apt-get install -y php5.6-bcmath 

#enable fcgi mode
sudo a2enmod actions alias proxy_fcgi fcgid
sudo service apache2 restart

systemctl enable php5.6-fpm && systemctl start php5.6-fpm

#check status
sudo systemctl status php5.6-fpm

PHP-FPM7.2 :

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php

sudo apt install php7.2 php7.2-fpm -y

sudo apt-get install libapache2-mod-php7.2 -y 
&& sudo apt-get install -y php7.2-mcrypt 
&& sudo apt-get install -y php7.2-mbstring 
&& sudo apt-get install -y php7.2-mysqlnd 
&& sudo apt-get install -y php7.2-soap 
&& sudo apt-get install -y php7.2-curl 
&& sudo apt-get install -y php7.2-gd 
&& sudo apt-get install -y php7.2-zip 
&& sudo apt-get install -y php7.2-imagick 
&& sudo apt-get install -y php7.2-dom 
&& sudo apt-get install -y php7.2-tidy 
&& sudo apt-get install -y php7.2-bcmath

#enable fcgi mode
	sudo a2enmod actions alias proxy_fcgi fcgid
        systemctl enable php7.2-fpm && systemctl start php7.2-fpm
	sudo service apache2 restart

#Check Status :
	sudo systemctl status php7.2-fpm

PHP-FPM7.4 :

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php

sudo apt install php7.4 php7.4-fpm -y

sudo apt-get install libapache2-mod-php7.4 -y 
&& sudo apt-get install php7.4-fpm -y 
&& sudo apt-get install -y php7.4-mcrypt 
&& sudo apt-get install -y php7.4-mbstring 
&& sudo apt-get install -y php7.4-mysqlnd 
&& sudo apt-get install -y php7.4-soap 
&& sudo apt-get install -y php7.4-curl 
&& sudo apt-get install -y php7.4-gd 
&& sudo apt-get install -y php7.4-zip 
&& sudo apt-get install -y php7.4-imagick 
&& sudo apt-get install -y php7.4-dom 
&& sudo apt-get install -y php7.4-tidy 
&& sudo apt-get install -y php7.4-bcmath 

#enable fcgi mode
	sudo a2enmod actions alias proxy_fcgi fcgid
        systemctl enable php7.4-fpm && systemctl start php7.4-fpm
	sudo service apache2 restart

#Check Status :
	sudo systemctl status php7.4-fpm

PHP-FPM8.0:

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php

sudo apt-get install -y php8.0 php8.0-fpm php8.0-mcrypt 
&& sudo apt-get install libapache2-mod-php8.0 -y 
&& sudo apt-get install -y php8.0-mbstring 
&& sudo apt-get install -y php8.0-mysqlnd 
&& sudo apt-get install -y php8.0-soap 
&& sudo apt-get install -y php8.0-curl 
&& sudo apt-get install -y php8.0-gd 
&& sudo apt-get install -y php8.0-zip 
&& sudo apt-get install -y php8.0-imagick 
&& sudo apt-get install -y php8.0-dom 
&& sudo apt-get install -y php8.0-tidy 
&& sudo apt-get install -y php8.0-bcmath php8.0-common php8.0-memcached php8.0-redis 
&& apt install -y php8.0-gmp

#enable fcgi mode
	sudo a2enmod actions alias proxy_fcgi fcgid
        systemctl enable php8.0-fpm && systemctl start php8.0-fpm
	sudo service apache2 restart

#Check Status :
	sudo systemctl status php8.0-fpm

PHP-FPM8.3

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php

sudo apt-get install -y php8.3 php8.3-fpm php8.3-mcrypt 
&& sudo apt-get install libapache2-mod-php8.3 -y 
&& sudo apt-get install -y php8.3-mbstring 
&& sudo apt-get install -y php8.3-mysqlnd 
&& sudo apt-get install -y php8.3-soap 
&& sudo apt-get install -y php8.3-curl 
&& sudo apt-get install -y php8.3-gd 
&& sudo apt-get install -y php8.3-zip 
&& sudo apt-get install -y php8.3-imagick 
&& sudo apt-get install -y php8.3-dom 
&& sudo apt-get install -y php8.3-tidy 
&& sudo apt-get install -y php8.3-bcmath php8.3-common php8.3-memcached php8.3-redis 
&& apt install -y php8.3-gmp

#enable fcgi mode
	sudo a2enmod actions alias proxy_fcgi fcgid
        systemctl enable php8.3-fpm && systemctl start php8.3-fpm
	sudo service apache2 restart

#Check Status :
	sudo systemctl status php8.3-fpm

Hoặc có thể sử dụng Ctrl+C + Ctrl+V cho các bạn lười :

apt install apache2 -y 
&& apt update 
&& sudo apt install software-properties-common -y 
&& sudo add-apt-repository ppa:ondrej/php 
&& sudo apt install php5.6 php5.6-fpm php7.2 php7.2-fpm php7.4 php7.4-fpm php8.0 php8.0-fpm  -y 
&& sudo a2enmod actions alias proxy_fcgi fcgid 
&& systemctl enable apache2 php5.6-fpm php7.4-fpm php7.2-fpm php8.0-fpm 
&& sudo apt-get install -y php7.2-mcrypt php7.2-mbstring php7.2-mysqlnd php7.2-soap php7.2-curl php7.2-gd php7.2-zip php7.2-imagick php7.2-dom php7.2-tidy libapache2-mod-php7.2 
&& sudo apt-get install -y php7.4-mcrypt php7.4-mbstring php7.4-mysqlnd php7.4-soap php7.4-curl php7.4-gd php7.4-zip php7.4-imagick php7.4-dom php7.4-tidy libapache2-mod-php7.4 
&& sudo apt-get install -y php5.6-mcrypt php5.6-mbstring php5.6-mysqlnd php5.6-soap php5.6-curl php5.6-gd php5.6-zip php5.6-imagick php5.6-dom php5.6-tidy libapache2-mod-php5.6 
&& sudo apt-get install -y php8.0-mcrypt php8.0-mbstring php8.0-mysqlnd php8.0-soap php8.0-curl php8.0-gd php8.0-zip php8.0-imagick php8.0-dom php8.0-tidy libapache2-mod-php8.0 
&& systemctl start apache2 php5.6-fpm php7.2-fpm php7.4-fpm php8.0-fpm 
&& systemctl status apache2 php5.6-fpm php7.2-fpm php7.4-fpm php8.0-fpm 
&& a2enmod rewrite 
&& a2enmod headers 
&& for file in hosts; do cat "$file" >> /etc/hosts; done 
&& for file in ports.conf; do cat "$file" >> /etc/apache2/ports.conf; done 
&& cp ./conf/* /etc/apache2/sites-available/ 
&& cd /etc/apache2/sites-available/ 
&& a2ensite * 
&& apachectl configtest

Qua hướng dẫn này, bạn đã nắm được cách cài đặt PHP trên các phiên bản Ubuntu, từ cơ bản đến nâng cao. Việc thiết lập môi trường PHP chính xác là nền tảng quan trọng để phát triển và vận hành các ứng dụng web hiệu quả. Dù bạn sử dụng phiên bản Ubuntu nào, chỉ cần làm theo các bước hướng dẫn, bạn sẽ nhanh chóng có một môi trường PHP sẵn sàng cho mọi dự án của mình.

Authentication and Authorization Apache

Giới thiệu

Xác thực và phân quyền trong Apache đề cập đến quá trình xác minh danh tính của người dùng (Xác thực) và xác định quyền truy cập của họ đối với các tài nguyên (Phân quyền) trong môi trường máy chủ Apache. Apache cung cấp nhiều mô-đun khác nhau như mod_auth_basic, mod_auth_digest, và mod_authnz_ldap, cho phép quản lý việc truy cập dựa trên các phương thức xác thực cơ bản hoặc mã hóa hơn và tích hợp với các dịch vụ phân quyền bên ngoài như LDAP. Các mô-đun này giúp bảo vệ các phần khác nhau của website hoặc ứng dụng bằng cách yêu cầu người dùng đăng nhập và phân quyền truy cập dựa trên các thông tin xác thực được cung cấp.

1. Tạo file password

	sudo htpasswd -c /etc/apache2/.htpasswd <user_name> 
		#<user_name> : username

Server sẽ hỏi xác thực các thông tin và đặt file đó tại /etc/apache2/

Nếu chúng ta nhìn content trong file, ta sẽ thấy tài khoản và mật khẩu đã được mã hoá

	cat /etc/apache2/.htpasswd
		Output
		thanhnh:$apr1$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.
		another_user:$apr1$p1E9MeAf$kiAhneUwr.MhAE2kKGYHK.

2. Cấu hình Apache Password Authentication :

<VirtualHost *:80>
    ServerAdmin webmaster@thanhnh.id.vn
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory "/var/www/html">
        AuthType Basic
        AuthName "Restricted Content"
        AuthUserFile /etc/apache2/.htpasswd
        Require valid-user
    </Directory>
</VirtualHost>

AuthType Basic: Xác định loại xác thực được sử dụng. Trong trường hợp này, Basic là kiểu xác thực cơ bản, trong đó người dùng phải cung cấp tên người dùng và mật khẩu để truy cập tài nguyên.

AuthName "Restricted Content": Xác định tên của khu vực bảo vệ. Đây là thông báo mà trình duyệt sẽ hiển thị cho người dùng khi yêu cầu họ nhập thông tin xác thực. Trong ví dụ này, tên khu vực là “Restricted Content” (Nội dung hạn chế).

AuthUserFile /etc/apache2/.htpasswd: Chỉ định đường dẫn đến file chứa thông tin xác thực của người dùng. Tập tin .htpasswd lưu trữ các tên người dùng và mật khẩu được mã hóa. Đây là nơi Apache tra cứu thông tin xác thực để xác nhận người dùng.

Require valid-user: Quy định yêu cầu người dùng phải cung cấp thông tin xác thực hợp lệ để được phép truy cập vào tài nguyên. valid-user có nghĩa là bất kỳ người dùng nào có thông tin xác thực hợp lệ trong file .htpasswd đều có quyền truy cập.

Cấu hình khác với .htaccess file

##Access .htaccess file :
	AuthType Basic
	AuthName "Restricted Content"
	AuthUserFile /etc/apache2/.htpasswd
	Require valid-user
apachectl -t
apachectl -k restart

Trong tổng quan, xác thực và phân quyền trong Apache là những công cụ mạnh mẽ giúp bảo vệ tài nguyên và quản lý quyền truy cập trên máy chủ web. Bằng cách sử dụng các mô-đun như mod_auth_basic, mod_auth_digest, và mod_authnz_ldap, Apache cung cấp nhiều phương pháp linh hoạt để xác minh danh tính người dùng và đảm bảo chỉ những người dùng có quyền mới có thể truy cập vào các phần quan trọng của trang web hoặc ứng dụng. Việc cấu hình chính xác các mô-đun này giúp tăng cường bảo mật, duy trì sự riêng tư, và kiểm soát truy cập hiệu quả, đáp ứng các yêu cầu bảo mật trong môi trường máy chủ ngày nay.

Apache Virtual Host

Giới thiệu

Apache Virtual Host là một tính năng của máy chủ web Apache cho phép bạn chạy nhiều trang web trên cùng một máy chủ vật lý. Mỗi Virtual Host có thể có cấu hình riêng biệt như tên miền, thư mục gốc, cổng, và địa chỉ IP. Điều này giúp bạn dễ dàng quản lý nhiều trang web trên cùng một máy chủ, cho phép các trang web hoạt động độc lập và bảo mật tốt hơn. Virtual Host có thể được cấu hình để hoạt động dựa trên tên miền (Name-based Virtual Host) hoặc địa chỉ IP (IP-based Virtual Host).

Cài đặt Virtual Host :

cd /etc/apache2/sites-available
<VirtualHost *:80>

# Admin email, Server Name (domain name), and any aliases
ServerName mysite.com
ServerAlias www.mysite.com

# Index file and Document Root (where the public files are located)
DocumentRoot /home/mysite/
<Directory /home/mysite/>
        DirectoryIndex index.php
        Options -Indexes -ExecCGI +FollowSymLinks -SymLinksIfOwnerMatch
        AllowOverride All
        Require all granted
        allow from all
</Directory>

        Header set Access-Control-Allow-Origin "*"
        Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
        Header set Access-Control-Allow-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type"
        Header set Access-Control-Allow-Credentials "true"

#set version php apply cho website
<FilesMatch .php$>

SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://thanhnh.id.vn/"

</FilesMatch>

# Log file locations
LogLevel warn
ErrorLog /home/mysite/logs/error.log
CustomLog /home/mysite/logs/access.log combined

</VirtualHost>

Giải thích

1. Indexes

  • Mô tả: Khi Indexes được bật, nếu không có tệp index (như index.html), Apache sẽ tự động tạo và hiển thị danh sách các tệp trong thư mục đó.
<Directory /var/www/html>
    Options Indexes
</Directory>

2. FollowSymLinks

  • Mô tả: Cho phép Apache theo dõi các liên kết tượng trưng (symbolic links) để truy cập tệp hoặc thư mục mà liên kết tượng trưng trỏ tới.
<Directory /var/www/html>
    Options FollowSymLinks
</Directory>

3. ExecCGI

  • Mô tả: Cho phép thực thi các tệp CGI (Common Gateway Interface) trong thư mục. Thường được sử dụng cho các tập lệnh Perl hoặc Python
<Directory /var/www/cgi-bin>
    Options ExecCGI
    AddHandler cgi-script .cgi .pl .py
</Directory>

4. SymLinksIfOwnerMatch

  • Mô tả: Apache chỉ theo dõi các liên kết tượng trưng nếu chủ sở hữu của liên kết tượng trưng và mục tiêu là cùng một người. Điều này tăng cường bảo mật khi sử dụng symbolic links.
<Directory /var/www/html>
    Options FollowSymLinks SymLinksIfOwnerMatch
</Directory>

5. Includes

  • Mô tả: Cho phép xử lý các chỉ thị Server-Side Includes (SSI), giúp bạn chèn nội dung từ tệp khác vào tệp HTML.
<Directory /var/www/html>
    Options Includes
</Directory>

6. MultiViews

  • Mô tả: Cho phép Apache chọn phiên bản tệp dựa trên phần mở rộng. Ví dụ: nếu bạn yêu cầu một tệp tên file, Apache có thể trả về file.html hoặc file.php dựa trên cài đặt cấu hình.
<Directory /var/www/html>
    Options MultiViews
</Directory>

7. All

  • Mô tả: Bật tất cả các tùy chọn ngoại trừ MultiViews. Đây là tùy chọn mặc định nếu bạn không chỉ định tùy chọn nào khác.
<Directory /var/www/html>
    Options All
</Directory>

8. None

  • Mô tả: Vô hiệu hóa tất cả các tùy chọn cho thư mục. Điều này có thể hữu ích nếu bạn muốn khóa các quyền xử lý trong một thư mục cụ thể.
<Directory /var/www/html/private>
    Options None

Load Balancing Apache2, Nginx

Giới thiệu

Trong các hệ thống có lưu lượng truy cập cao, Load Balancing (cân bằng tải) là yếu tố cần thiết để đảm bảo hiệu suất và tính ổn định. nginx, với khả năng thiết lập Load Balancing mạnh mẽ, giúp phân phối lưu lượng truy cập giữa các server backend một cách đồng đều, giảm tải cho hệ thống và tăng cường trải nghiệm người dùng. Bài viết này sẽ hướng dẫn bạn chi tiết cách cấu hình Load Balancing với Apache2, giúp hệ thống của bạn hoạt động hiệu quả hơn.

Yêu cầu ở bài này

  • 2 Node xử lý
  • 1 Node Source Code
  • 1 Node Redis Cache
  • 1 Node MySql

1. Thiết lập sử dụng chung Share Source Code

Thiết lập sử dụng chung Share Source Code cho Load Balancing là một phương pháp tối ưu hóa việc quản lý mã nguồn trong hệ thống cân bằng tải. Trong kiến trúc Load Balancing, các máy chủ backend (backend servers) xử lý lưu lượng truy cập được phân phối đều từ Load Balancer. Để đảm bảo tính đồng nhất trong việc xử lý, các máy chủ này cần sử dụng chung một bộ mã nguồn (source code).

Mục đích của việc chia sẻ Source Code trong Load Balancing:

  1. Đảm bảo Tính Đồng Nhất:
    Tất cả các máy chủ backend sử dụng cùng một phiên bản mã nguồn, tránh tình trạng khác biệt giữa các máy chủ.
  2. Dễ Dàng Cập Nhật:
    Khi cần cập nhật hoặc triển khai phiên bản mới, bạn chỉ cần thực hiện trên một thư mục được chia sẻ thay vì cập nhật từng máy chủ riêng lẻ.
  3. Tăng Tính Hiệu Quả:
    Việc chia sẻ mã nguồn giúp giảm thiểu chi phí quản trị, nhất là với số lượng lớn máy chủ backend.

Cài đặt NFS Server ở nơi quản lý Source Code (Node Source Code)

sudo apt update
sudo apt install nfs-kernel-server

Tạo thư mục chia sẻ

sudo mkdir /var/nfs/general
sudo chown nobody:nogroup /var/nfs/general

Cấu hình NFS Export

sudo nano /etc/exports
/var/nfs/general 192.168.1.10(rw,sync,no_subtree_check) 192.168.1.11(rw,sync,no_subtree_check) 192.168.1.12(rw,sync,no_subtree_check)
  • Replace 192.168.1.10, 192.168.1.11, and 192.168.1.12 with the IP addresses of your load-balanced servers.
  • rw: Read/write permission.
  • sync: Ensures changes are written to disk before responses are sent.
  • no_subtree_check: Improves reliability.

Apply cấu hình

sudo exportfs -a
sudo systemctl restart nfs-kernel-server

Cấu hình FIrewall (Tuỳ chọn)

sudo ufw allow from 192.168.1.0/24 to any port nfs

Cấu hình NFS Clients (các node xử lý source code)

Cài đặt NFS Client

sudo apt update
sudo apt install nfs-common

Mount vào thư mục được chia sẻ ở trên

sudo mkdir /mnt/nfs/general
sudo mount 192.168.1.100:/var/nfs/general /mnt/nfs/general
  • Replace 192.168.1.100 with the IP address of your control server

Đảm bảo thư mục được Mount vĩnh viễn

sudo nano /etc/fstab

192.168.1.11:/var/nfs/general /mnt/nfs/general nfs rw,sync,hard,intr 0 0
192.168.1.12:/var/nfs/general /mnt/nfs/general nfs rw,sync,hard,intr 0 0

mount -a

Cấu hình nâng cao (optional)

192.168.1.11:/var/nfs/general /mnt/nfs/general nfs defaults,retry=5,timeo=14,hard,intr 0 0
  • retry=5: Tùy chọn này cố gắng kết nối lại với máy chủ NFS trong một số phút nhất định nếu kết nối bị mất.
  • timeo=14: Điều chỉnh khoảng thời gian chờ cho các yêu cầu NFS. Giá trị thấp hơn có nghĩa là phát hiện lỗi nhanh hơn.
  • hard: Điều này đảm bảo rằng máy khách sẽ tiếp tục cố gắng kết nối lại vô thời hạn cho đến khi máy chủ trực tuyến trở lại. Đối với các ứng dụng yêu cầu độ tin cậy, tùy chọn này được ưu tiên vì nó chờ máy chủ hoạt động trở lại
  • intr: Cho phép ngắt kết nối NFS, giúp ngăn máy khách không phản hồi trong thời gian máy chủ ngừng hoạt động.
  • Hard Mount (Khuyến nghị): Với tùy chọn cứng, nếu máy chủ NFS ngừng hoạt động, máy khách sẽ bị treo và tiếp tục cố gắng kết nối lại cho đến khi máy chủ trực tuyến trở lại. Điều này tốt hơn để đảm bảo tính toàn vẹn của dữ liệu vì nó tránh mất dữ liệu âm thầm nhưng có thể khiến các quy trình phải đợi cho đến khi máy chủ khả dụng trở lại.
  • Soft Mount: Với tùy chọn mềm, NFS sẽ cố gắng kết nối lại một vài lần và sau đó trả về lỗi nếu không thể kết nối với máy chủ. Điều này có thể gây mất dữ liệu nhưng có thể tốt hơn cho các ứng dụng ít quan trọng hơn.

Automatic Remount với systemd (optional)

Tạo mới 1 systemd

sudo nano /etc/systemd/system/remount-nfs.service
[Unit]
Description=Remount NFS on connection failure
After=network-online.target

[Service]
Type=oneshot
ExecStart=/bin/mount -a

[Install]
WantedBy=multi-user.target

Enable Service:

sudo systemctl enable remount-nfs.service

NGINX Reverse Proxy

Truy cập Virtual Host Nginx:

cd /etc/nginx/sites-available
nano virtualhost.conf
server {
        listen 80;
        listen [::]:80;
        server_name virtualhost;

        return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name virtualhost;

    ssl_certificate /etc/letsencrypt/live/virtualhost/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/virtualhost/privkey.pem;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

    #block Googlebot
    if ($http_user_agent ~ "Googlebot") {
        return 410;
    }

    location / {

        auth_basic           "Private’s Area";
        auth_basic_user_file /etc/nginx/.htpasswd;

        #access_log off;
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        proxy_set_header Accept-Encoding "";

        proxy_buffers 4 256k;
        proxy_buffer_size 128k;
        proxy_busy_buffers_size   256k;

        #1 hour timeout
        proxy_read_timeout 3600;
        #proxy_connect_timeout 600;
        #proxy_send_timeout 600;
        #send_timeout 600;
        proxy_pass http://virtualhost;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-SSL on;
        proxy_set_header X-Forwarded-Proto $scheme;
        # Add HSTS header with preload.
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    }
}

upstream virtualhost {
    ip_hash;

    # Primary servers
    server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
    server 192.168.1.12 max_fails=3 fail_timeout=30s;

    # Backup server
    server backup.example.com:80 backup;
}

Về cụ thể các thể loại Load Balancing, mình sẽ viết 1 bài riêng nhé

Load Balancing Nginx mang lại sự linh hoạt và hiệu quả trong việc quản lý lưu lượng truy cập lớn, đảm bảo hệ thống hoạt động ổn định và tối ưu. Với các tính năng mạnh mẽ như upstream, health checks, và khả năng hỗ trợ nhiều phương pháp cân bằng tải, Nginx là công cụ lý tưởng cho mọi ứng dụng web. Hãy áp dụng ngay hôm nay để cải thiện hiệu suất và khả năng mở rộng của hệ thống bạn!

Install Let's Encrypt in Nginx

Install Core

sudo snap install core; sudo snap refresh core

Remove old certbot

sudo apt-get remove certbot

Install Certbot

sudo snap install --classic certbot

Prepare the Certbot command

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Install your certificates…

sudo certbot --nginx

Or, just get a certificate

sudo certbot certonly --nginx

Test automatic renewal

sudo certbot renew --dry-run

Second way to install :

sudo apt install certbot python3-certbot-nginx

Check SSL Certificate :

openssl s_client –showcerts –connect WebServerURL:PortNumber

Auto Renew Certbot by Cron :

43 6 * * * certbot renew --post-hook "systemctl reload nginx"

Các câu lệnh cơ bản trong Docker

Giới thiệu

Docker là công cụ mạnh mẽ được sử dụng rộng rãi trong việc tạo và quản lý container phần mềm. Để làm việc hiệu quả với Docker, việc nắm rõ các câu lệnh cơ bản là điều không thể thiếu. Những lệnh này không chỉ giúp bạn quản lý container mà còn hỗ trợ triển khai và theo dõi ứng dụng một cách dễ dàng. Trong bài viết này, chúng ta sẽ cùng khám phá các câu lệnh cơ bản trong Docker để bạn có thể sử dụng công cụ này một cách thành thạo.

Các câu lệnh cơ bản như sau:

  liệt kê danh sách containers đang chạy.

docker ps

liệt kê danh sách tất cả các container kể cả đã stop.

docker ps -a

Tải một Docker image từ Docker Hub registry. Link của nó các bạn có thể vào Docker Hub để lấy. Hãy search từng image rồi vào chi tiết của chúng để xem.

docker pull

Được dung để tạo ra một image dựa trên một file Dockerfile. Thường dùng docker build . để build một image dựa trên Dockerfile trong thư mục hiện tại (dấu chấm). docker build -t “myimage:latest” . dùng để tạo một image và lưu image dưới tên được đặt.

docker build

Hiển thị danh sách image ở máy bạn.

docker images
docker images ls

Chạy một container từ một image, i. e. docker run myimage -it bash. Nếu không có image nào được tìm thấy thì Docker run sẽ download nó tự động ở Docker hub.

docker run

Hiển thị logs của một container mà bạn chỉ ra.

docker logs

Để tiếp tục show log được cập nhật them thì bạn chỉ cần dùng

docker logs -f mycontainer

Hiển thị danh sách volumes, cái này dùng để lưu trữ dữ liệu trong container, tránh trường hợp restart container thì mất dữ liệu.

docker volume ls

Liệt kê tất cả các network có sẵn

docker network ls

Vào một network. Nó giúp container giao tiếp được với một container khác qua tên thay vì IP.

docker network connect

 Loại bỏ một hoặc nhiều container. Ví dụ: docker rm mycontainer nhưng chắc chắn là container đang không ở trạng thái running.

docker rm

Xóa bỏ một hay nhiều image., xóa image tên là myimage nhưng phải đảm bảo không có container nào đang chạy sử dụng image này.

docker rmi
 docker rmi myimage

Stop một hay nhiều container. docker stop mycontainer stop 1 container trong khi docker stop $(docker ps -a -q) stop tất cả các container đang chạy. 

docker stop

Start một container đã được stop với trạng thái giữ nguyên.

docker start

Cập nhật một cài đặt container, nó đặc biệt hữu ích khi container của bạn lặp liên tục.

docker update --restart=no

Copy các file từ một container đang chạy ra ngoài host. docker cp :/etc/file . để copy /etc/file ra thư mục hiện tại.

docker cp

Một số kết hợp câu lệnh hữu ích:

  • Stop toàn bộ các container docker kill $(docker ps -q)
  • Xóa toàn bộ các container docker rm $(docker ps -a -q)
  • Xóa toàn bộ các image docker rmi $(docker images -q)
  • Xóa và stop một container bị lặp vô tận docker update –restart=no && docker stop
  • Chạy câu lệnh bên trong container docker exec -i -t /bin/bash – nếu không có bash thì dùng /bin/sh
  • Chạy bash với user root nếu container đang chạy với một user khác docker exec -i -t -u root /bin/bash

Hiểu rõ và sử dụng thành thạo các câu lệnh cơ bản trong Docker sẽ giúp bạn tối ưu hóa quá trình quản lý container, từ đó nâng cao hiệu quả làm việc. Dù bạn đang bắt đầu học Docker hay đã có kinh nghiệm, việc làm chủ những lệnh này sẽ mang lại nhiều lợi ích trong phát triển và triển khai ứng dụng. Hãy thực hành ngay hôm nay để thành thạo Docker!

Cấu trúc thư mục Linux

Giới thiệu :

Trong Linux, hệ thống tệp được tổ chức thành một cấu trúc cây với thư mục gốc (“/”) là điểm khởi đầu. Mỗi thư mục trong cấu trúc này có chức năng và mục đích riêng, giúp hệ điều hành và người dùng quản lý dữ liệu, cài đặt phần mềm và tài nguyên một cách hiệu quả.

Hệ thống file trong Linux

  • Trong hệ thống Linux, tất cả đều được cấu hình và coi như là file. Không chỉ bao gồm file text, ảnh, các chương trình biên dịch mà còn cả các thư mục, phân vùng và drive thiết bị phần cứng đều được hệ thống nhìn nhận như một file.
  • Tất cả các file và thư mục đều xuất hiện trong thư mục root, kể cả khi các thư mục còn lại được lưu trong các thiết bị vật lý khác nhau (trên ổ cứng khác, hoặc trên ổ cứng của máy tính khác)
  • Với nhân Linux, hệ thống file là phẳng. Nghĩa là – nó không là một cấu trúc phân cấp, phân biệt giữa các thư mục , tệp tin, hoặc các chương trình. Thay vào đó, kernel sử dụng khái niệm inode để đại diện cho từng file.
  • Mỗi inode chứa thông tin về một file bao gồm: số inode của nó (nhận dạng duy nhất trong hệ thống), các chủ sở hữu và nhóm liên kết với file, loại file (file thông thường, hay file link liên kết hay thư mục, …), quyền truy cập file, thời gian tạo file, kích thước tệp tin và địa chỉ nơi mà file được lưu trữ.
  • Dùng câu lệnh ls -li để xem thông tin một inode:
  • Khi liệt kê các inode, dùng lệnh ls, khi đó thông tin các inode được liệt kê ra và phân biệt các kiểu của inode theo màu. Sau đây là một số cách phân biệt kiểu file qua màu:

Cấu trúc thư mục trong Linux

Linux quản lý hệ thống trên một “hệ thống tệp tin” duy nhất, bắt đầu ở gốc là thư mục root (/) đây là thư mục ở cấp cao nhất. Cấu trúc cơ bản của hệ thống Linux như sau:

Trong đó:

  • / : là thư mục root, nơi mở đầu logic cho hệ thống file của Linux. Mọi đường dẫn tuyệt đối của bất kì file nào đều bắt đầu từ /. Thư mục / chứa toàn bộ hệ điều hành. Chỉ có người dùng root mới có quyền truy cập và thay đổi trong thư mục này. (phân biệt giữa / và /root)
  • /bin: User binaries – thư mục lưu trữ các file nhị phân chương trình thực thi của người dùng như: pwd, cat, cp, …
  • /sbin: Chứa đựng các file thực thi dạng nhị phân của các chương trình cơ bản giúp hệ thống hoạt động. Các chương trình trong /sbin thường được sử dụng cho mục đích là duy trì và quản trị hệ thống => dành cho người dùng admin quản trị hệ thống – người dùng root hoặc superuser.Một số chương trình trong thư mục này như: init, iptables, fdisk, …
  • /boot: boot loader file – Chứa các tệp tin khởi động và cả nhân kernel là vmlinuz.
  • /dev: Các file thiết bị – nơi lưu trữ các phân vùng ổ cứng, thiết bị ngoại vi như usb, ổ đĩa cắm ngoài hay bất cứ thiết bị nào được gán vào hệ thống.
    • Các hard drive thường được mount tại thư mục /dev/sda , usb mount trong /dev/sde ; các phân vùng trên ổ địa được phân ra /dev/sda1, /dev/sda2…
  • /etc: Chứa file cấu hình cho các chương trình hoạt động. Chúng thường là các tệp tin dạng text thường. Chức năng gần giống “Control panel” trong Windows. Các cấu hình trong /etc thường ảnh hưởng tới tất cả người dùng trong hệ thống.Trong /etc còn chứa các shell scripts dùng để khởi động hoặc tắt các chương trình khác. Ví dụ: /etc/resolve.conf, sysctl.conf, …
  • /home: thư mục chứa các file cá nhân của từng user.
  • /lib: Chứa các file library hỗ trợ cho các file thực binary. Mỗi khi cài đặt phần mềm trên Linux, các thư viện cũng tự động được download, và chúng hầu hết được bắt đầu với lib*.. Đây là các thư viện cơ bản mà Linux cần đề làm việc. Không giống như trong Windows, các thư viện có thể chia sẻ và dùng chung cho các chương trình khác nhau. Đó là một lợi ích trong hệ thống tệp tin của Linux.
  • /media: Chứa thư mục dùng để mount cho các thiết bị có thể gỡ bỏ, di chuyển khỏi hệ thống được như CDROM, floppy, …
  • /mnt: Chứa các thư mục dùng để system admin thực hiện quá trình mount. Như đã nói, hệ điều hành Linux coi tất cả là các file và lưu giữ trên một cây chung. Đây chính nơi tạo ra các thư mục để ‘gắn’ các phân vùng ổ đĩa cứng cũng như các thiết bị khác vào. Sau khi được mount vào đây, các thiết bị hay ổ cứng được truy cập từ đây như là một thư mục. Trong một số hệ điều hành, các ổ đĩa chưa được gắn sẵn vào hệ thống bởi fstab sẽ được gắn ở đây.
  • /opt: Tên thư mục này nghĩa là optional (tùy chọn), nó chứa các ứng dụng thêm vào từ các nhà cung cấp độc lập khác. Các ứng dụng này có thể được cài ở /opt hoặc một thư mục con của /opt
  • /proc: Chứa đựng thông tin về quá trình xử lý của hệ thống.Đây là một pseudo filesystem chứa đựng các thông tin về các process đang chạy.Đây là một virtual filesystem chứa đựng các thông tin tài nguyên hệ thống.Ví dụ: /proc/cpuinfo cung cấp cho ta thông số kỹ thuật của CPU. Để xem dùng lệnh cat: $cat /proc/cpuinfo
  • /root: Thư mục home của người dùng root.
  • /tmp: Thư mục lưu trữ các file tạm của hệ thống và các user. Các file lưu tại đây sẽ bị xóa khi hệ thống khởi động lại.
  • /usr: Chứa các file binary, library, tài liệu, source-code cho các chương trình.
    • /usr/bin chứa file binary cho các chương trình của user. Nếu như một user trong quá trình thực thi một lệnh ban đầu sẽ tìm kiếm trong /bin, nếu như không có thì sẽ tiếp tục nhìn vào /usr/bin. Ví dụ một số lệnh như at. awk, cc…
    • /usr/sbin chứa các file binary cho system administrator. Nếu như ta không tìm thấy các file system binary bên dưới /sbin thì ta có thể tìm ở trong /usr/sbin. Ví dụ một số lệnh như cron, sshd, useradd, userdel
    • /usr/lib chứa các file libraries cho /usr/bin và /usr/sbin
    • /usr/local dùng để chứa chương trình của các user, các chương trình này được cài đặt từ source. Ví dụ khi ta install apache từ source thì nó sẽ nằm ở vị trí là /usr/local/apache2
  • /var: Chứa đựng các file có sự thay đổi trong quá trình hoạt động của hệ điều hành cũng như các ứng dụng. Ví dụ:
    • Nhật ký của hệ thống /var/log
    • database file /var/lib
    • email /var/mail
    • Các hàng đợi in ấn: /var/spool
    • lock file: /var/lock
    • Các file tạm thời cần cho quá trình reboot: /var/tmp
    • Dữ liệu cho trang web: /var/www
  • /srv: Chứa dữ liệu liên quan đến các dịch vụ máy chủ như /srv/svs, chứa các dữ liệu liên quan đến CVS.

Kết bài

Hiểu rõ cấu trúc thư mục trong Linux không chỉ giúp bạn quản lý hệ thống hiệu quả hơn mà còn tăng cường khả năng bảo mật và tối ưu hóa hiệu suất làm việc. Mỗi thư mục trong Linux đều có nhiệm vụ riêng, giúp hệ điều hành hoạt động mượt mà và ổn định. Dù bạn là người mới làm quen với Linux hay là một quản trị viên hệ thống chuyên nghiệp, nắm vững cấu trúc thư mục sẽ là nền tảng quan trọng để sử dụng hệ điều hành này một cách hiệu quả và thành công.

Import & Export MySQL

Giới thiệu

Khi làm việc với cơ sở dữ liệu MySQL, việc xuất và nhập dữ liệu là những kỹ năng quan trọng giúp bạn sao lưu, di chuyển và chia sẻ dữ liệu một cách hiệu quả. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn các phương pháp để import (nhập) và export (xuất) dữ liệu trong MySQL. Bạn sẽ học cách sử dụng các công cụ và lệnh SQL để dễ dàng di chuyển dữ liệu giữa các cơ sở dữ liệu, sao lưu dữ liệu quan trọng và khôi phục dữ liệu khi cần thiết. Bài viết sẽ cung cấp hướng dẫn chi tiết từng bước, từ các lệnh cơ bản cho đến các tùy chọn nâng cao, giúp bạn thực hiện các thao tác này một cách chính xác và hiệu quả.

Export & Import in Command Line

EXPORT DATABASE :
	mysqldump -uUSERNAME -p DB_NAME > exported.sql

IMPORT DATABASE :
	mysqldump -u username -p database_name < data-dump.sql

Import & Export in Container Docker

EXPORT DATABASE in Docker:
	docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql

IMPORT DATABASE in Docker :
	docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql
	
docker run --name zabbix-server-mysql -t 
      -e DB_SERVER_HOST="mysql" 
      -e MYSQL_DATABASE="zabbixdb" 
      -e MYSQL_USER="zabbix" 
      -e MYSQL_PASSWORD="<password>" 
      -e MYSQL_ROOT_PASSWORD="<password>" 
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" 
      --network=zabbix-net 
      -p 10051:10051 
      --restart always 
      -d zabbix/zabbix-server-mysql:alpine-6.2-latest
	  

docker run --name zabbix-web-nginx-mysql -t 
      -e ZBX_SERVER_HOST="zabbix-server-mysql" 
      -e DB_SERVER_HOST="mysql" 
      -e MYSQL_DATABASE="zabbixdb" 
      -e MYSQL_USER="zabbix" 
      -e MYSQL_PASSWORD="<password>" 
      -e MYSQL_ROOT_PASSWORD="<password>" 
      --network=zabbix-net 
      -p 80:8080 
      --restart unless-stopped 
      -d zabbix/zabbix-web-nginx-mysql:alpine-6.2-latest

Cronjob auto backup

Create a cli file to run 
     nano auto-backup.sh

# (1) set up all the mysqldump variables
DATE=`date +"%d_%b_%Y_%H%M"`
SQLFILE=/home/database/mydatabase-${DATE}.sql
DATABASE=<database_name>
USER=<user_name>
PASSWORD=<password>

# (2) do the mysql database backup (dump)
sudo mysqldump -u ${USER} -p${PASSWORD} ${DATABASE}|gzip > ${SQLFILE}.gz

Enter Cronjob and set

crontab -e
##Database auto backup
15 3 * * * sh /home/database/cli/auto-backup.sh

Xoá backup cũ sau một khoảng thời gian

crontab -e
##Clear Database wordpress when file older than 7 days
0 0 * * * /usr/bin/find /home/database/ -name "*.sql.gz" -type f -mtime +7 -exec rm -f {} ;

Bonus

Install nano, update in Docker :
	docker exec -it zabbix-web-nginx-mysql --user=root bash
		apk add nano
		apk update 

Việc nắm vững các kỹ thuật import và export dữ liệu trong MySQL không chỉ giúp bạn quản lý cơ sở dữ liệu hiệu quả hơn mà còn đảm bảo tính an toàn và khả năng di động của dữ liệu quan trọng. Bằng cách áp dụng các lệnh và công cụ đã được giới thiệu, bạn có thể dễ dàng sao lưu, khôi phục và di chuyển dữ liệu giữa các hệ thống hoặc môi trường khác nhau. Hãy thực hành thường xuyên và làm quen với các tùy chọn khác nhau để tối ưu hóa quy trình làm việc của bạn. Đừng quên kiểm tra dữ liệu sau khi thực hiện các thao tác để đảm bảo mọi thứ hoạt động như mong muốn. Chúc bạn thành công trong việc quản lý dữ liệu MySQL của mình!

Tổng hợp cài đặt PHP Ubuntu các phiên bản

Giới thiệu

Cài đặt PHP trên Ubuntu là một bước thiết yếu để xây dựng và triển khai các ứng dụng web. Với mỗi phiên bản Ubuntu khác nhau, quy trình cài đặt có thể có những điểm khác biệt nhỏ. Bài viết này sẽ hướng dẫn chi tiết từng bước để bạn có thể dễ dàng thiết lập PHP trên các phiên bản Ubuntu phổ biến như 18.04, 20.04, và 22.04. Dù bạn là người mới bắt đầu hay đã có kinh nghiệm, hướng dẫn này sẽ giúp bạn cài đặt PHP một cách nhanh chóng và hiệu quả.

Cài đặt PHP-FPM các phiên bản

PHP-FPM5.6 :

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php

sudo apt install php5.6 php5.6-fpm -y

sudo apt-get install -y php5.6-mcrypt 
&& sudo apt-get install -y php5.6-mbstring 
&& sudo apt-get install -y php5.6-mysqlnd 
&& sudo apt-get install -y php5.6-soap 
&& sudo apt-get install -y php5.6-curl 
&& sudo apt-get install -y php5.6-gd 
&& sudo apt-get install -y php5.6-zip 
&& sudo apt-get install -y php5.6-imagick 
&& sudo apt-get install -y php5.6-dom 
&& sudo apt-get install -y php5.6-tidy 
&& sudo apt-get install -y php5.6-bcmath 

#enable fcgi mode
sudo a2enmod actions alias proxy_fcgi fcgid
sudo service apache2 restart

systemctl enable php5.6-fpm && systemctl start php5.6-fpm

#check status
sudo systemctl status php5.6-fpm

PHP-FPM7.2 :

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php

sudo apt install php7.2 php7.2-fpm -y

sudo apt-get install libapache2-mod-php7.2 -y 
&& sudo apt-get install -y php7.2-mcrypt 
&& sudo apt-get install -y php7.2-mbstring 
&& sudo apt-get install -y php7.2-mysqlnd 
&& sudo apt-get install -y php7.2-soap 
&& sudo apt-get install -y php7.2-curl 
&& sudo apt-get install -y php7.2-gd 
&& sudo apt-get install -y php7.2-zip 
&& sudo apt-get install -y php7.2-imagick 
&& sudo apt-get install -y php7.2-dom 
&& sudo apt-get install -y php7.2-tidy 
&& sudo apt-get install -y php7.2-bcmath

#enable fcgi mode
	sudo a2enmod actions alias proxy_fcgi fcgid
        systemctl enable php7.2-fpm && systemctl start php7.2-fpm
	sudo service apache2 restart

#Check Status :
	sudo systemctl status php7.2-fpm

PHP-FPM7.4 :

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php

sudo apt install php7.4 php7.4-fpm -y

sudo apt-get install libapache2-mod-php7.4 -y 
&& sudo apt-get install php7.4-fpm -y 
&& sudo apt-get install -y php7.4-mcrypt 
&& sudo apt-get install -y php7.4-mbstring 
&& sudo apt-get install -y php7.4-mysqlnd 
&& sudo apt-get install -y php7.4-soap 
&& sudo apt-get install -y php7.4-curl 
&& sudo apt-get install -y php7.4-gd 
&& sudo apt-get install -y php7.4-zip 
&& sudo apt-get install -y php7.4-imagick 
&& sudo apt-get install -y php7.4-dom 
&& sudo apt-get install -y php7.4-tidy 
&& sudo apt-get install -y php7.4-bcmath 

#enable fcgi mode
	sudo a2enmod actions alias proxy_fcgi fcgid
        systemctl enable php7.4-fpm && systemctl start php7.4-fpm
	sudo service apache2 restart

#Check Status :
	sudo systemctl status php7.4-fpm

PHP-FPM8.0:

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php

sudo apt-get install -y php8.0 php8.0-fpm php8.0-mcrypt 
&& sudo apt-get install libapache2-mod-php8.0 -y 
&& sudo apt-get install -y php8.0-mbstring 
&& sudo apt-get install -y php8.0-mysqlnd 
&& sudo apt-get install -y php8.0-soap 
&& sudo apt-get install -y php8.0-curl 
&& sudo apt-get install -y php8.0-gd 
&& sudo apt-get install -y php8.0-zip 
&& sudo apt-get install -y php8.0-imagick 
&& sudo apt-get install -y php8.0-dom 
&& sudo apt-get install -y php8.0-tidy 
&& sudo apt-get install -y php8.0-bcmath php8.0-common php8.0-memcached php8.0-redis 
&& apt install -y php8.0-gmp

#enable fcgi mode
	sudo a2enmod actions alias proxy_fcgi fcgid
        systemctl enable php8.0-fpm && systemctl start php8.0-fpm
	sudo service apache2 restart

#Check Status :
	sudo systemctl status php8.0-fpm

PHP-FPM8.3

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php

sudo apt-get install -y php8.3 php8.3-fpm php8.3-mcrypt 
&& sudo apt-get install libapache2-mod-php8.3 -y 
&& sudo apt-get install -y php8.3-mbstring 
&& sudo apt-get install -y php8.3-mysqlnd 
&& sudo apt-get install -y php8.3-soap 
&& sudo apt-get install -y php8.3-curl 
&& sudo apt-get install -y php8.3-gd 
&& sudo apt-get install -y php8.3-zip 
&& sudo apt-get install -y php8.3-imagick 
&& sudo apt-get install -y php8.3-dom 
&& sudo apt-get install -y php8.3-tidy 
&& sudo apt-get install -y php8.3-bcmath php8.3-common php8.3-memcached php8.3-redis 
&& apt install -y php8.3-gmp

#enable fcgi mode
	sudo a2enmod actions alias proxy_fcgi fcgid
        systemctl enable php8.3-fpm && systemctl start php8.3-fpm
	sudo service apache2 restart

#Check Status :
	sudo systemctl status php8.3-fpm

Hoặc có thể sử dụng Ctrl+C + Ctrl+V cho các bạn lười :

apt install apache2 -y 
&& apt update 
&& sudo apt install software-properties-common -y 
&& sudo add-apt-repository ppa:ondrej/php 
&& sudo apt install php5.6 php5.6-fpm php7.2 php7.2-fpm php7.4 php7.4-fpm php8.0 php8.0-fpm  -y 
&& sudo a2enmod actions alias proxy_fcgi fcgid 
&& systemctl enable apache2 php5.6-fpm php7.4-fpm php7.2-fpm php8.0-fpm 
&& sudo apt-get install -y php7.2-mcrypt php7.2-mbstring php7.2-mysqlnd php7.2-soap php7.2-curl php7.2-gd php7.2-zip php7.2-imagick php7.2-dom php7.2-tidy libapache2-mod-php7.2 
&& sudo apt-get install -y php7.4-mcrypt php7.4-mbstring php7.4-mysqlnd php7.4-soap php7.4-curl php7.4-gd php7.4-zip php7.4-imagick php7.4-dom php7.4-tidy libapache2-mod-php7.4 
&& sudo apt-get install -y php5.6-mcrypt php5.6-mbstring php5.6-mysqlnd php5.6-soap php5.6-curl php5.6-gd php5.6-zip php5.6-imagick php5.6-dom php5.6-tidy libapache2-mod-php5.6 
&& sudo apt-get install -y php8.0-mcrypt php8.0-mbstring php8.0-mysqlnd php8.0-soap php8.0-curl php8.0-gd php8.0-zip php8.0-imagick php8.0-dom php8.0-tidy libapache2-mod-php8.0 
&& systemctl start apache2 php5.6-fpm php7.2-fpm php7.4-fpm php8.0-fpm 
&& systemctl status apache2 php5.6-fpm php7.2-fpm php7.4-fpm php8.0-fpm 
&& a2enmod rewrite 
&& a2enmod headers 
&& for file in hosts; do cat "$file" >> /etc/hosts; done 
&& for file in ports.conf; do cat "$file" >> /etc/apache2/ports.conf; done 
&& cp ./conf/* /etc/apache2/sites-available/ 
&& cd /etc/apache2/sites-available/ 
&& a2ensite * 
&& apachectl configtest

Qua hướng dẫn này, bạn đã nắm được cách cài đặt PHP trên các phiên bản Ubuntu, từ cơ bản đến nâng cao. Việc thiết lập môi trường PHP chính xác là nền tảng quan trọng để phát triển và vận hành các ứng dụng web hiệu quả. Dù bạn sử dụng phiên bản Ubuntu nào, chỉ cần làm theo các bước hướng dẫn, bạn sẽ nhanh chóng có một môi trường PHP sẵn sàng cho mọi dự án của mình.

Configuration HTTP/2 NGINX

Open the configuration file for your domain:

sudo nano /etc/nginx/sites-available/your_domain

In the file, locate the listen variables associated with port 443:

...
    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl; 
...

The first one is for IPv6 connections. The second one is for all IPv4 connections. We will enable HTTP/2 for both.

...
    listen [::]:443 ssl http2 ipv6only=on; 
    listen 443 ssl http2; 
...

Test NGINX

sudo nginx -t

Removing Old and Insecure Cipher Suites

sudo nano /etc/nginx/sites-available/your_domain

Locate the line that includes the options-ssl-nginx.conf file and comment it out:

# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>

Below that line, add this line to define the allowed ciphers:

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Open the file /etc/nginx/snippets/ssl-params.conf in your text editor:

sudo nano /etc/nginx/snippets/ssl-params.conf

Locate the following line:

...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...

Modify it so it looks like this:

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Save the file and exit your editor.

sudo nginx -t
sudo systemctl reload nginx

Tối ưu hiệu năng MySQL

Giới thiệu

Tối ưu hóa hiệu năng MySQL là một yếu tố quan trọng để đảm bảo cơ sở dữ liệu của bạn hoạt động mượt mà và hiệu quả. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn các phương pháp và kỹ thuật để cải thiện hiệu suất của MySQL, từ việc tối ưu hóa cấu hình hệ thống đến việc điều chỉnh các truy vấn và chỉ mục. Với những mẹo và công cụ hữu ích, bài viết này sẽ giúp bạn nâng cao hiệu quả hoạt động của MySQL và giảm thiểu thời gian phản hồi của hệ thống.

Swappiness in MySQL

Swapping là tiến trình xuất hiện khi hệ thống phải sử dụng swap disk khi hết Ram. Hệ thống sẽ đưa các thông tin vào ổ đĩa. Mà ổ đĩa thì read chậm hơn ram rất nhiều

Default :vm.swappiness = 60
Disalbe by :
	sysctl -w vm.swappiness=0

Mysql query cache

Nếu bạn có nhiều truy vấn được lập đi lập lại data mà dữ liệu của bạn không thay đổi thường xuyên thì dùng query cache.Thường thì đa phần sẽ không hiểu được khái niệm nàyvà sẽ set giái trị gigabytes.
Websites lớn cần 256 -> 512MB . Còn nhỏ thì chỉ cần 64 – 128MB.

Chỉnh sửa trong my.cnf :

	query_cache_type=1
	query_cache_limit=256K
	query_cache_min_res_unit=2k
	query_cache_size = 64M

InnoDB file-per-table

Tại sao lại tối ưu thông số trên vì MySQL mặc định sử dụng InnoDB (storage engine). InnoDB cung cấp cho chung ta khả năng xử lý linh hoạt database những thông tin được lưu bên trong file .IDB.
Một lợi ít khác đó là nó cải thiện được tốc độ I/O trên VPS hoặc server của bạn.
Mặt định innodb_file_per_table được bật trên version 5.6

innodb_file_per_table=1

InnoDB buffer pool

Là vùng lưu trữ data và indexes trong bộ nhớ. Nó được sử dụng để lưu trữ dữ liệu thường xuyên truy cập trong bộ nhớ, và khi bạn đang chạy một máy chủ chuyên dụng hoặc máy ảo mà DB thường là bottleneck,và đây sẽ là phần chiếm nhiều ram nhất trong các ứng dụng mà bạn đang sử dụng. Do đó, chúng tôi cung cấp cho nó 50-70% của tất cả các RAM.
Có một bộ tài liệu hướng dẫn định dạng butter pool có sẵn trong MySQL docs.

innodb_buffer_pool_size = [Thông số ram]

Max connections

Max_connections sẽ thông báo với server bao nhiêu kết nối được cho phép. Quá nhiều kết nối thì sẽ làm cho Ram load cao, và nếu vượt quá thì MySQL sẽ treo tiến trình. Đối với những website vừa và nhỏ thì ta chỉ cần để max = 80 đến 200.
Còn website có lượng kết nối lớn thì khoản 200 đến 600 hoặc hơn tùy thuộc vào resource của server.

max_connections = 200

MySQL thread_cache_size

MySQL thread_cache_size cho chúng ta biết số lượng threads trên server sẽ được cache, cách tính như sau

	# mysql -e "show status like 'Threads_created';"
	# mysql -e "show status like 'Connections';"

Sau khi có 2 thông số thì tính được cache hit :

100 – ((Threads_created / Connections) * 100))

Đưa vào file my.cnf

thread_cache_size = [Thông số tìm được]

MySQL reverse DNS lookups

Mặc định thì MySQL thực hiện DNS lookup những IP connect tới. Với mỗi Client connect thì địa chỉ IP sẽ được kiểm tra và phân giải.Sau đó Hostname sẽ được phân giải và trả về IP. Điều này sẽ làm cho quá trình bị chậm trê khi DNS có vấn đề .Vậy ta nên tắt chức năng này để tăng khả năng phản hồi cho Server :

skip-name-resolve

MySQL idle connetions

Idle kết nối tiêu hao resource và có thể sẽ bị gián đoạn hoặc phải frefreshed. Giống như nhiều connect trong tình trạng “sleep” và trong thời gian dài. Để kiểm tra các kết nối trên ta thực hiện như sau :

mysqladmin processlist | grep "Sleep"

Command sẽ cho chúng ta thấy được các trạng thái Sleep, Khi php thực hiện truy vấn vào mysql mở kết nối sau đó query , loại bỏ xác thực và mở kết nối. Điều này sẽ làm được lưu trên memory cho đến khi thread không hoạt động.Đối với vấn đề này bạn cần kiểm tra lại source code và fix. Nếu bạn không fix thì bạn có thể thay đổi source code hoặc không biết cách sửa lỗi, vậy cách tạm thời hãy thay đổi thông số mặc định của nó xuống khoản 60.

wait_timeout=60

MySQL slow query logs

Logging query chậm có thể giúp bạn xác định các cơ sỡ dữ liệu và và debug

	slow-query-log=1
	slow-query-log-file=/var/lib/mysql/mysql-slow.log
	long_query_time = 1

Việc tối ưu hóa hiệu năng MySQL là một quá trình liên tục đòi hỏi sự chú ý và điều chỉnh thường xuyên để đạt được kết quả tốt nhất. Bằng cách áp dụng các kỹ thuật và phương pháp đã được đề cập trong bài viết này, bạn có thể cải thiện đáng kể tốc độ và hiệu quả của cơ sở dữ liệu của mình. Hãy luôn theo dõi hiệu suất hệ thống, điều chỉnh các cấu hình và tối ưu hóa các truy vấn để đảm bảo cơ sở dữ liệu hoạt động ổn định và nhanh chóng.

Support

Bảo mật và Hardening Grafana trên Docker: Hướng dẫn cho Sysadmin

Bảo mật và Hardening Grafana trên Docker: Hướng dẫn cho Sysadmin

Grafana chạy trong Docker mang lại sự linh hoạt cho triển khai giám sát và phân tích telemetry ở quy mô doanh nghiệp. Tuy nhiên, để đảm bảo hệ thống vận hành an toàn và đáng tin cậy, việc hardening và bảo mật Grafana trên môi trường container cần được xem trọng. Bài viết này trình bày các khuyến nghị, thực hành tốt nhất và các bước triển khai bảo mật Grafana khi chạy trên Docker, với tham chiếu từ tài liệu Grafana và các khuyến nghị bảo mật chung cho hệ thống container.

Giới thiệu và khi nào nên áp dụng

Đối với các tổ chức triển khai Grafana trên Docker để theo dõi hệ thống, có nhiều yếu tố bảo mật cần cân nhắc trước khi đưa vào vận hànhProduction. Grafana cung cấp các tùy chọn xác thực đa dạng (LDAP, SAML, OAuth2) và khả năng tích hợp với các giải pháp quản lý bí mật như HashiCorp Vault, Google Cloud KMS, AWS KMS và Azure Key Vault để bảo vệ khóa và bí mật cơ sở dữ liệu. Việc hardening nên bắt đầu từ cấu hình xác thực, quản lý bí mật, hạn chế truy cập và thiết lập kênh TLS cho giao tiếp giữa Grafana và client hoặc giữa Grafana với nguồn dữ liệu.

Kiến trúc cơ bản và các yếu tố bảo mật cốt lõi

  • Grafana chạy trong Docker thường làm việc với một cơ sở dữ liệu nội bộ và các nguồn dữ liệu từ bên ngoài (Prometheus, OpenTelemetry, các nguồn SQL, v.v.). Việc bảo vệ bí mật và quản lý ai có quyền truy cập vào Grafana là bắt buộc.
  • Grafana hỗ trợ xác thực từ nhiều nguồn ngoài (LDAP, SAML, OAuth2) và có khả năng quản lý người dùng/nhóm thông qua RBAC, LBAC và các cơ chế cấp phát người dùng.
  • Bảo mật dữ liệu bí mật và khóa: Grafana cho phép mã hóa bí mật trong cơ sở dữ liệu và tích hợp với các kho bí mật/khóa an toàn như Google Cloud KMS, HashiCorp Vault, AWS KMS và Azure Key Vault.
  • Giao tiếp bảo mật: thiết lập HTTPS/TLS cho Grafana và/hoặc qua reverse proxy để đảm bảo truyền tải dữ liệu an toàn giữa client, Grafana và các nguồn dữ liệu.

Yêu cầu và chuẩn bị trước khi triển khai

  • Hệ điều hành và môi trường: sẵn sàng một máy chủ Linux (điển hình Ubuntu 20.04+ hoặc hệ CentOS tương thích) cho chạy Docker. Đảm bảo Docker được cập nhật và có hỗ trợ networking phù hợp cho Grafana và các nguồn dữ liệu.
  • Chứng chỉ TLS: chuẩn bị chứng chỉ TLS hợp lệ cho Grafana hoặc cho reverse proxy để phục vụ HTTPS. Grafana có thể được cấu hình qua reverse proxy để TLS termination hoặc thiết lập TLS trực tiếp tại Grafana theo hướng dẫn từ tài liệu “Set up HTTPS”.
  • Bí mật và khóa: xác định chiến lược quản lý bí mật cho Grafana (ví dụ: lưu trữ bí mật trong Vault hoặc KMS), đặc biệt khi Grafana lưu trữ khóa và các bí mật liên quan đến dữ liệu nguồn và cài đặt xác thực.
  • Quản lý xác thực: lựa chọn phương thức xác thực phù hợp với tổ chức (LDAP cho danh tính nội bộ, SAML cho SSO qua IdP, hoặc OAuth/OIDC cho tích hợp với nhà cung cấp OAuth2).
  • Quản trị quyền và RBAC: định nghĩa vai trò, nhóm và quyền truy cập vào dashboard, folder và data source theo nguyên tắc tối thiểu đặc quyền.

Cấu hình bảo mật và hardening Grafana trên Docker

Phần này tập trung vào các cấp độ cấu hình quan trọng để harden Grafana khi chạy trên Docker, dựa trên các hướng dẫn bảo mật và tính năng được Grafana hỗ trợ.

1. Chọn và cấu hình các phương thức xác thực

Grafana hỗ trợ nhiều phương thức xác thực ngoài. Bạn có thể chọn một hoặc kết hợp các phương thức sau để đáp ứng yêu cầu tổ chức:

  • LDAP: đồng bộ danh tính từ hệ thống thư mục doanh nghiệp.
  • SAML: SSO qua Service Provider (SP) và Identity Provider (IdP) với khả năng khôi phục và bảo vệ phiên làm việc.
  • OAuth/OIDC: xác thực qua các nhà cung cấp OAuth2/OIDC (ví dụ Google, Entra ID, GitHub, Okta, v.v.).

Theo tài liệu Grafana, các tùy chọn LDAP, SAML và OAuth2 được nêu rõ trong các mô-đun cấu hình bảo mật và quản lý xác thực. Việc triển khai xác thực ngoài giúp cô lập quản trị người dùng, giảm thiểu việc lưu trữ mật khẩu trong Grafana và tăng cường kiểm soát truy cập.

Khuyến nghị thực hành:

  • Đánh giá khung xác thực phù hợp với tổ chức (ví dụ tích hợp LDAP cho danh tính nội bộ hoặc SSO qua IdP với SAML).
  • Tách biệt quyền truy cập quản trị khỏi tài khoản người dùng bình thường và áp dụng RBAC để điều tiết quyền quản trị dashboard, thư mục, nguồn dữ liệu.
  • Kiểm tra và đảm bảo các cấu hình xác thực được đồng bộ với nguồn dữ liệu người dùng và tổ chức quản trị danh tính.

2. Bảo mật dữ liệu bí mật và khóa

Grafana cho phép mã hóa bí mật cơ sở dữ liệu và tích hợp với các kho bí mật/khóa an toàn. Bạn nên cấu hình để bí mật (ví dụ khóa, chứng chỉ, khóa truy cập) được lưu và quản lý bởi một hệ thống lưu trữ bí mật ngoài Grafana:

  • Google Cloud KMS
  • HashiCorp Vault
  • AWS KMS
  • Azure Key Vault

Ví dụ tham khảo (không phải cú pháp trực tiếp từ tài liệu Grafana, nhưng phản ánh nguyên tắc triển khai):

// Cấu hình tham khảo cho provider mã hóa bí mật (điểm cốt lõi là chỉ định nguồn lưu trữ bí mật ngoài Grafana)
secret_storage_provider = Vault
vault_address = https://vault.example.com
vault_auth_method = token
vault_token = <token>

Đảm bảo các kết nối đến kho bí mật được bảo mật (TLS) và trợ giúp xác thực mạnh mẽ cho vault/kms.

3. Thiết lập TLS và HTTPS

Để bảo vệ dữ liệu khi người dùng truy cập Grafana, hãy thiết lập TLS cho giao tiếp giữa người dùng và Grafana. Grafana có thể được triển khai qua reverse proxy để xử lý TLS hoặc cấu hình TLS trực tiếp theo hướng dẫn “Set up HTTPS” trong tài liệu Grafana. Việc này giúp bảo vệ dữ liệu đăng nhập và các truy vấn tới nguồn dữ liệu khi di chuyển trên mạng.

Gợi ý thực hành:

  • Sử dụng chứng chỉ TLS hợp lệ và được tin cậy.
  • Định kỳ gia hạn chứng chỉ và tự động làm mới khi có thể.
  • Định cấu hình plugin/người dùng proxy để chỉ cho phép TLS và chặn TLS versions yếu.

4. Quản trị truy cập và RBAC/LBAC

Grafana hỗ trợ RBAC (quản lý vai trò và quyền) và LBAC (Label Based Access Control) để phân quyền truy cập vào dashboard, thư mục và nguồn dữ liệu. Áp dụng RBAC/LBAC giúp giới hạn người dùng chỉ với các tài nguyên cần thiết và giảm thiểu rủi ro lạm quyền trên hệ thống Docker.

Theo tài liệu Grafana, việc thiết lập quyền và phân quyền là một phần quan trọng của bảo mật và quản trị hệ thống Grafana.

5. Cấu hình nâng cao bảo mật và quản lý truy cập

Bạn có thể cấu hình việc cấp phát người dùng và nhóm bằng SCIM để đồng bộ danh sách người dùng với hệ thống quản trị danh tính, đồng thời đảm bảo các quy trình cấp phát/thu hồi tài khoản được tự động hoá. Grafana cung cấp các tùy chọn liên quan đến quản trị người dùng, nhóm và quyền qua API và giao diện quản trị.

Khuyến nghị: kết nối Grafana với SCIM để tự động đồng bộ danh sách người dùng và nhóm, đồng thời quản lý vai trò và quyền truy cập một cách nhất quán.

6. Bảo vệ và quản lý log, audit

Việc theo dõi và ghi nhận sự kiện bảo mật là một phần thiết yếu của vận hành an toàn. Grafana cho phép xuất日志 và audit các hoạt động liên quan đến hệ thống. Bạn nên bật và định tuyến logs đến hệ thống quản lý log an toàn, đồng thời đảm bảo có cơ chế kiểm tra và phân tích các sự kiện bảo mật khi cần.

7. Zuất triển và kiểm tra tính sẵn sàng bảo mật

Để đảm bảo độ tin cậy của hệ thống bảo mật, hãy thực hiện các bước kiểm thử sau:

  • Kiểm tra khả năng đăng nhập qua các provider được cấu hình (LDAP, SAML, OAuth2) và xác nhận hoạt động SSO khi cần.
  • Kiểm tra kết nối TLS và xác thực chứng chỉ ở cả phía Grafana và nguồn dữ liệu.
  • Kiểm tra cấp phát quyền và RBAC/LBAC cho người dùng và nhóm, đảm bảo quyền tối thiểu phù hợp với vai trò.
  • Kiểm tra tích hợp với kho bí mật (Vault/KMS) và xác thực máy chủ bí mật.
  • Kiểm tra log và audit để phát hiện bất thường và vận hành đúng quy trình incident response.

Cấu hình Docker và thực hành vận hành an toàn

Để vận hành Grafana an toàn trong Docker, cần cân nhắc các thực hành container security cơ bản, đồng thời áp dụng các khuyến nghị từ tài liệu Grafana về bảo mật và hardening. Dưới đây là các yếu tố đáng xem xét, dựa trên các khuyến nghị tổng quát và các mục trong tài liệu Grafana:

  • Chạy Grafana bằng phiên bản Docker image được duy trì, theo dõi các bản vá và cập nhật bảo mật từ nhà cung cấp Grafana.
  • Kiểm soát truy cập máy chủ Docker, giới hạn quyền truy cập vào host và mạng liên quan đến Grafana.
  • Thiết lập TLS cho giao tiếp người dùng và các kết nối đến nguồn dữ liệu, và cân nhắc dùng reverse proxy để quản lý TLS và chứng chỉ.
  • Quản lý bí mật ngoài Grafana, thông qua Vault/Cloud KMS hoặc tương tự, và tránh lưu trữ bí mật nhạy cảm trong container.
  • Thiết lập auditing/logging và định tuyến logs sang hệ thống quản trị logs tập trung.

Ví dụ thực hành và minh họa triển khai (khung tham chiếu)

Dựa trên các hướng dẫn và tính năng được Grafana công bố, dưới đây là khung tham chiếu cho một triển khai Grafana an toàn trên Docker. Lưu ý: các tham số chi tiết có thể thay đổi tùy theo phiên bản Grafana và môi trường vận hành. Bạn nên tham khảo tài liệu cập nhật khi triển khai:

// Sơ đồ triển khai tham khảo (không phải cú pháp cấu hình chính thức)
- Grafana chạy trong Docker, nằm sau reverse proxy (người dùng truy cập qua HTTPS)
- Xác thực qua một hoặc nhiều provider: LDAP/SAML/OAuth2
- Bí mật và khóa được lưu trữ ngoài Grafana (Vault/KMS)
- RBAC/LBAC được cấu hình cho người dùng và nhóm
- SCIM được bật để đồng bộ người dùng từ IdP
- Logs được gửi tới hệ thống quản trị logs và audit

Để kiểm tra nhanh sau triển khai, bạn có thể thực hiện các bước sau:

  1. Kiểm tra TLS: curl -I https://grafana.example.com và xác nhận trả về mã 200/301 với TLS được thiết lập đúng.
  2. Kiểm tra xác thực: thực hiện đăng nhập bằng tài khoản được cấp từ IdP và xác nhận hệ thống ghi nhận sự kiện đăng nhập.
  3. Kiểm tra quyền: đăng nhập bằng tài khoản thuộc nhóm có quyền truy cập dashboard và xác nhận không thể truy cập các tài nguyên ngoài phạm vi được cấp.
  4. Kiểm tra bí mật: xác thực rằng bí mật được Vault/KMS cấp phát và Grafana có thể truy cập khi cần.

Đo lường hiệu suất và giám sát an toàn

Ngoài bảo mật, hiệu suất và tính sẵn sàng là yếu tố quan trọng. Grafana và hệ sinh thái của nó cung cấp các công cụ để giám sát và kiểm tra hiệu suất dưới tải cao:

  • Đánh giá và thực hiện các bài kiểm tra tải để đảm bảo phản hồi và thời gian truy cập ở mức chấp nhận được, đặc biệt khi có nhiều người dùng hoặc nhiều nguồn dữ liệu đồng thời kết nối.
  • Kết nối Grafana với các nguồn dữ liệu và kiểm soát truy vấn để tránh ảnh hưởng đến nguồn dữ liệu gốc.
  • Giám sát an toàn, audit và log để nhanh chóng nhận diện và xử lý các sự kiện bảo mật hoặc bất thường.

Kiểm tra, xác thực và đánh giá sau khi triển khai

Quy trình kiểm tra sau triển khai nên bao gồm:
– Xác thực tích hợp với IdP và các provider xác thực đã chọn.
– Kiểm tra TLS ở cả phía người dùng và phía nguồn dữ liệu.
– Kiểm tra quyền truy cập và RBAC/LBAC theo vai trò thực tế.
– Kiểm tra tích hợp với kho bí mật và cơ chế quản lý khóa.
– Kiểm tra log và audit để đảm bảo ghi nhận đầy đủ các sự kiện bảo mật.

Checklist vận hành cuối cùng

  • Grafana được cập nhật và chạy bằng Docker image được duy trì.
  • TLS/HTTPS được thiết lập và chứng chỉ được gia hạn định kỳ.
  • Xác thực ngoài được cấu hình và đồng bộ với IdP/LDAP/OAuth2.
  • Bí mật và khóa được lưu trữ an toàn ngoài Grafana (Vault/KMS) và Grafana có quyền truy cập đúng.
  • Quyền truy cập người dùng, nhóm và dashboard được quản lý bằng RBAC/LBAC, với nguyên tắc tối đa đặc quyền.
  • SCIM được bật (nếu có) để đồng bộ danh sách người dùng từ IdP.
  • Logging và audit được định tuyến tới hệ thống quản trị logs và có kế hoạch phản ứng sự cố.

Kết luận

Hardening Grafana trong Docker là quá trình liên tục và cần kết hợp giữa xác thực an toàn, quản lý bí mật, bảo mật mạng và giám sát vận hành. Việc cấu hình đúng các lựa chọn xác thực, bảo vệ bí mật và quản lý quyền truy cập sẽ giúp giảm thiểu rủi ro an ninh và tăng tính sẵn sàng cho môi trường quan trọng của bạn. Bởi Grafana cung cấp hỗ trợ cho LDAP, SAML và OAuth2, cùng với khả năng tích hợp bí mật với Vault/KMS và khả năng bảo mật qua TLS, tổ chức có thể thiết lập một nền tảng giám sát an toàn trên Docker mà vẫn linh hoạt cho quy mô và nhu cầu ngày càng tăng.

MySQL

SQL (Structured Query Language) là một ngôn ngữ chuẩn dùng để tương tác và quản lý dữ liệu trong các hệ quản trị cơ sở dữ liệu quan hệ (RDBMS), như MySQL, PostgreSQL, SQL Server, và Oracle.

 

MariaDB/MySQL Performance Tuning: Tối ưu hóa InnoDB Buffer Pool cho RAM lớn trên CentOS

MariaDB/MySQL Performance Tuning: Tối ưu hóa InnoDB Buffer Pool cho RAM lớn trên CentOS

Giới thiệu

Trong môi trường sản xuất chạy MariaDB hoặc MySQL, tối ưu hóa InnoDB Buffer Pool là một trong những hoạt động quan trọng nhất để tận dụng RAM lớn và đảm bảo hiệu năng ổn định cho các workload có lượng dữ liệu và truy vấn lớn. Buffer Pool là vùng nhớ được engine InnoDB dùng để lưu trữ dữ liệu và index đang được truy cập, giúp giảm I/O đĩa và tăng tốc độ trả kết quả truy vấn. Khi RAM trên máy chủ đủ lớn, việc điều chỉnh kích thước và cấu hình Buffer Pool có thể mang lại hiệu suất xử lý đáng kể, đặc biệt trên hệ thống CentOS/khác tương thích. Tài liệu tham khảo liên quan đến tối ưu hóa bộ nhớ đệm và đặc biệt là InnoDB Buffer Pool được đề cập trong tài liệu tối ưu hóa của MariaDB và tài liệu tối ưu hóa của MySQL.

Kiến thức cốt lõi và kiến trúc liên quan đến InnoDB Buffer Pool

InnoDB Buffer Pool là khu vực nhớ được InnoDB dùng để nắm giữ dữ liệu và các trang chỉ mục (index pages) đang được truy cập. Mục tiêu của Buffer Pool là tối ưu hóa tỷ lệ truy cập dữ liệu từ RAM thay vì phải đọc từ đĩa vật lý, từ đó giảm độ trễ và tăng thông lượng. Khi RAM lớn và workload đòi hỏi, việc phân bổ Buffer Pool thành nhiều khu vực (buffer pool instances) có thể cải thiện đồng thời truy cập từ nhiều CPU. Các tài liệu liên quan nhắc tới tầm quan trọng của Buffers, Caches và Threads cũng như cách tối ưu hóa tác động của các yếu tố này lên hiệu năng tổng thể của hệ thống. Ngoài ra, các hướng dẫn liên quan đến tối ưu hóa I/O và cấu hình lưu trữ của InnoDB đều được đề cập trong các tài liệu tham khảo của MySQL và MariaDB.

Trong cấu trúc của InnoDB, Buffer Pool không chỉ lưu dữ liệu mà còn lưu các trang thuộc chỉ mục, dữ liệu đã ghi và các trang được truy cập gần đây theo nguyên tắc LRU. Khi RAM được cấp đủ lớn, việc tăng kích thước Buffer Pool và chia nó thành nhiều phiên bản (buffer pool instances) có thể giảm contention ở cấp cơ sở dữ liệu và tăng đồng thời thông lượng cho các multi-core hệ thống. Tuy nhiên, việc cấp quá nhiều RAM cho Buffer Pool có thể gây ra hiệu ứng ngược, khiến hệ điều hành không còn đủ RAM cho các tác vụ nền hoặc các tiến trình khác. Do đó, quá trình tối ưu cần căn cứ vào tổng RAM, đặc điểm workload và yêu cầu độ trễ mục tiêu.

Chuẩn bị và xem xét hệ thống trước khi điều chỉnh

Trước khi điều chỉnh, hãy thực hiện các bước chuẩn bị cơ bản để đảm bảo an toàn và có thể kiểm tra được tác động của thay đổi:

  • Xác định tổng RAM và trạng thái sử dụng bộ nhớ của hệ thống. Sử dụng các lệnh như free -h và top -bn1 để có cái nhìn tổng quan về memory và swap. Đối với CentOS/điểm đến tương thích, hãy ghi nhận lượng RAM có sẵn dành cho cơ sở dữ liệu và các tiến trình hệ thống.
  • Xác định phiên bản MariaDB/MySQL đang chạy và đường dẫn tới tệp cấu hình. Thông thường tệp cấu hình nằm ở /etc/my.cnf hoặc /etc/mysql/my.cnf, hoặc các tệp cấu hình bổ sung trong thư mục /etc/my.cnf.d/ (điều này phụ thuộc phân phối và gói cài đặt).
  • <liLưu trữ và sao lưu cấu hình trước khi thay đổi. Việc quay lại cấu hình cũ là bảo đảm nếu có sự cố khi cân chỉnh Buffer Pool. <liXác định workload và mục tiêu hiệu năng. Nếu workload chủ yếu đọc dữ liệu, Buffer Pool kích thước lớn có thể mang lại lợi ích lớn; với workload ghi nhiều, cần cân nhắc thêm tới kích thước log và cách flush dữ liệu ra đĩa.

Cấu hình chính cho InnoDB Buffer Pool trên CentOS

Theo khuyến nghị chung trong tài liệu tối ưu hóa InnoDB và các phần liên quan, mục tiêu là đảm bảo Buffer Pool đủ lớn để chứa tập dữ liệu làm việc nóng (working set) và giảm thiểu IO đĩa, đồng thời không chiếm quá mức RAM cho hệ điều hành và các process khác. Đối với hệ thống có RAM lớn và dành riêng cho database, bạn có thể xem xét tăng kích thước Buffer Pool và phân bổ số lượng buffer pool instances phù hợp với số lõi CPU để tối ưu hoá đồng thời truy cập. Việc chia Buffer Pool thành nhiều instances có thể giúp giảm contention giữa các worker threads khi hệ thống có lưu lượng truy cập cao.

Dưới đây là các nguyên tắc và các biến cấu hình liên quan hay được đề cập trong tài liệu tối ưu hóa InnoDB. Bạn có thể áp dụng chúng như một khung tham khảo để xây dựng cấu hình phù hợp với hệ thống của mình. Lưu ý rằng các giá trị xuất hiện trong ví dụ là minh hoạ và cần được điều chỉnh dựa trên tổng RAM và workload thực tế.

[mysqld]
# Kích thước Buffer Pool cho InnoDB
innodb_buffer_pool_size = 64G
# Số lượng buffer pool instances (nên điều chỉnh theo number of CPU cores và RAM)
innodb_buffer_pool_instances = 8
# Kích thước log InnoDB để tối ưu I/O liên quan tới buffer pool
innodb_log_file_size = 4G
innodb_log_files_in_group = 2

Ghi chú:

  • innodb_buffer_pool_size nên được cân nhắc dựa trên tổng RAM của hệ thống và mức độ dành cho hệ điều hành. Trong môi trường riêng biệt cho cơ sở dữ liệu, Buffer Pool chiếm phần lớn RAM nhằm giảm IO đĩa và tăng thông lượng đọc/ghi dữ liệu.
  • <liinnodb_buffer_pool_instances nên được xác định dựa trên số lõi CPU và kích thước Buffer Pool. Mục tiêu là phân tách vùng nhớ để giảm contention giữa các luồng truy cập đồng thời. <liinnodb_log_file_size và số lượng nhóm log InnoDB có thể ảnh hưởng tới I/O và thời gian phục hồi. Điều chỉnh chúng song song với Buffer Pool để tối ưu chu kỳ flush và checkpoint.

Bên cạnh Buffer Pool, các yếu tố liên quan khác của InnoDB cần được xem xét để tối ưu hóa hiệu năng trên hệ thống RAM lớn, bao gồm tối ưu hóa I/O của đĩa và cấu hình log. Tài liệu đề cập đến các phần như tối ưu hoá I/O đĩa cho InnoDB và tối ưu hoá cấu hình InnoDB nói chung, nhằm cải thiện hiệu suất đọc/ghi và thời gian phản hồi. Bạn có thể tham khảo phần liên quan để điều chỉnh các tham số khác nếu workload của bạn đòi hỏi.

Ví dụ thực hành trên CentOS

Dưới đây là một quy trình thực hành thực tế để áp dụng tối ưu InnoDB Buffer Pool trên CentOS hoặc hệ điều hành tương thích, kèm theo các lệnh kiểm tra và xác thực cơ bản:

  1. Kiểm tra tổng quan hệ thống và xác định nhu cầu RAM cho database:
free -h
lscpu | grep -E "^Architecture|^CPU|^Socket|^Core|^Thread|^MHz"
  1. Sao lưu cấu hình hiện tại và tệp cấu hình MySQL/MariaDB:
cp /etc/my.cnf /etc/my.cnf.bak.$(date +%F-%T)
# Nếu có tệp cấu hình bổ sung, sao lưu thêm các tệp trong /etc/my.cnf.d/
  1. Chỉnh sửa tệp cấu hình để cập nhật Buffer Pool và các tham số liên quan. Ví dụ với MariaDB/MySQL ở CentOS, có thể thêm hoặc cập nhật các dòng sau trong phần [mysqld]:
[mysqld]
innodb_buffer_pool_size = 64G
innodb_buffer_pool_instances = 8
innodb_log_file_size = 4G
innodb_log_files_in_group = 2
  1. Khởi động lại dịch vụ để áp dụng cấu hình:
systemctl restart mariadb
systemctl status mariadb -l
  1. Xác nhận cấu hình đã được áp dụng và hiệu năng được cải thiện:
mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_instances';"
  1. Kiểm tra trạng thái và hiệu năng thời gian thực:
SHOW ENGINE INNODB STATUS\G
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_free';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';

Trong quá trình vận hành, theo dõi các chỉ số trên sẽ cho biết Buffer Pool có đang hoạt động như mong muốn hay không. Nếu buffer pool quá lớn so với RAM còn lại dành cho hệ điều hành và các process, hệ thống có thể bắt đầu swap và hiệu năng sẽ suy giảm. Ngược lại, nếu buffer pool quá nhỏ, workload sẽ phải đọc từ đĩa nhiều hơn và làm giảm thông lượng. Việc điều chỉnh là một quá trình lặp, dựa trên dữ liệu giám sát thực tế.

Bảo mật và an toàn khi tối ưu hóa

Khi thay đổi cấu hình liên quan đến bộ nhớ và I/O, cần đảm bảo quyền truy cập hợp lệ và không cấp quyền rộng rãi cho người dùng không đáng tin cậy. Cấu hình này ảnh hưởng đến toàn bộ tiến trình của máy chủ cơ sở dữ liệu và có thể ảnh hưởng đến thời gian hồi cứu (recovery) và bảo vệ dữ liệu trong trường hợp xảy ra mất điện hoặc hệ thống khởi động lại. Để giảm thiểu rủi ro, luôn sao lưu cấu hình và kiểm tra kỹ lưỡng trên môi trường staging trước khi áp dụng cho hệ thống sản xuất.

Hiệu năng và giám sát liên tục

Buffer Pool là thành phần then chốt trong hiệu năng InnoDB. Khi RAM lớn, mục tiêu là dựa vào kích thước Buffer Pool để giảm IO đĩa và tăng tốc độ truy vấn. Tuy vậy, bạn cần cân nhắc giữa kích thước Buffer Pool và RAM dành cho hệ điều hành, cũng như các tiến trình hệ thống khác. Các tài liệu (của MariaDB và MySQL) nhấn mạnh vai trò của Buffer Pool và các yếu tố liên quan như tối ưu hóa I/O, tối ưu hóa cấu hình biến và monitoring để có thể đánh giá và điều chỉnh đúng cách.

Để giám sát hiệu năng và đảm bảo chúng ta đạt được mục tiêu, sử dụng các công cụ và phương pháp sau đây:

  • Giám sát kích thước Buffer Pool và số lượng trang được chứa bằng cách tra cứu các biến và trạng thái liên quan trong MySQL/MariaDB và InnoDB Status.
  • Kích hoạt và theo dõi performance_schema để có cái nhìn về hoạt động của các câu truy vấn và tài nguyên DB.
  • Theo dõi hoạt động IO và thời gian phản hồi qua các chỉ số về IO và log liên quan tới InnoDB.

Validation và kiểm tra hiệu năng

Để xác nhận rằng việc tối ưu Buffer Pool mang lại hiệu năng như mong đợi, thực hiện các bước kiểm tra sau:

  • So sánh thời gian đáp ứng trước và sau khi điều chỉnh với các truy vấn điển hình của workload thực tế.
  • Đánh giá thông lượng (throughput) và tổng số IO từ hệ điều hành và từ InnoDB.
  • Kiểm tra sự ổn định của memory usage và số lần swap nếu có; tối ưu Buffer Pool nếu thấy hệ thống bắt đầu swap quá nhiều.

Kết luận và checklist vận hành

Tối ưu hóa InnoDB Buffer Pool cho RAM lớn trên CentOS là một quá trình cân bằng giữa kích thước bộ nhớ dành cho InnoDB và nhu cầu của hệ điều hành cùng các process. Sử dụng các biến cấu hình như innodb_buffer_pool_size và innodb_buffer_pool_instances một cách thận trọng, kết hợp với việc tối ưu log và I/O, sẽ mang lại sự cải thiện về thông lượng và thời gian đáp ứng cho hầu hết các workload có dung lượng dữ liệu lớn. Hãy thực hiện các bước kiểm tra, giám sát và điều chỉnh một cách có hệ thống để đảm bảo an toàn, ổn định và hiệu quả cho môi trường sản xuất.

Danh sách vận hành cuối cùng

    <li Xác định tổng RAM và workload để xác định kích thước Buffer Pool phù hợp. <li Sao lưu cấu hình và chuẩn bị quy trình khôi phục cấu hình. <li Cập nhật các tham số innodb_buffer_pool_size và innodb_buffer_pool_instances phù hợp với hệ thống. <li Khởi động lại dịch vụ và xác nhận cấu hình đã được áp dụng. <li Giám sát InnoDB Status và performance_schema để đánh giá hiệu năng và điều chỉnh thêm nếu cần. <li Thực hiện kiểm tra định kỳ và cập nhật cấu hình theo thay đổi workload hoặc phần cứng.

Kết thúc

Bài viết này cung cấp khung tham khảo dựa trên các nguyên tắc tối ưu hóa Buffer Pool đã được thảo luận trong tài liệu tối ưu hóa của MariaDB và MySQL. Việc áp dụng cần được điều chỉnh theo đặc thù của hệ thống, workload và ngân sách phần cứng của bạn. Luôn ưu tiên xác nhận bằng các thử nghiệm thực tế và giám sát liên tục để duy trì hiệu năng ổn định và an toàn dữ liệu.

Một số MySQL Command Line

Giới thiệu

MySQL Command Line là công cụ mạnh mẽ và linh hoạt cho việc quản lý cơ sở dữ liệu, từ thao tác đơn giản đến các tác vụ phức tạp. Trong bài viết này, chúng ta sẽ khám phá một số lệnh MySQL hữu ích mà bạn có thể sử dụng trực tiếp từ dòng lệnh. Cho dù bạn là người mới bắt đầu hay một chuyên gia quản trị cơ sở dữ liệu, việc nắm vững các lệnh này sẽ giúp bạn làm việc hiệu quả hơn, tiết kiệm thời gian và tối ưu hóa hiệu suất hệ thống. Hãy cùng bắt đầu với những lệnh cơ bản nhất và tiến đến những lệnh nâng cao hơn để quản lý và điều hành cơ sở dữ liệu MySQL của bạn.

USER COMMAND

Danh sách tất cả người dùng trên máy chủ cơ sở dữ liệu:
	mysql> Select user from mysql.user;  

Xem thêm thông tin về bảng người dùng:
	mysql> DESC user; 

Truy vấn host, account_locked, password_expired của người dùng:
	mysql> SELECT user, host, account_locked, password_expired FROM user;  

Hiển thị người dùng hiện tại:
	mysql> Select user();  
	mysql> Select current_user();
	
Xem người dùng hiện tại đang đăng nhập vào máy chủ cơ sở dữ liệu:
	mysql> SELECT user, host, db, command FROM information_schema.processlist;

Tạo Người Dùng Mới:
	CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';
	CREATE USER 'sammy'@'thanhnh.id.vn' IDENTIFIED BY 'password';

Cấp Quyền Cho Người Dùng:
	GRANT PRIVILEGE ON database.table TO 'username'@'host';
	GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'thanhnh.id.vn' WITH GRANT OPTION;

Thu hồi quyền:
	REVOKE type_of_permission ON database_name.table_name FROM 'username'@'host';

Xem lại các quyền hiện tại của người dùng:
	SHOW GRANTS FOR 'username'@'host';
	
Xóa Người Dùng:
	DROP USER user [, user] ....
	DROP USER 'jeffrey'@'thanhnh.id.vn';

LIST PRIVILEGES :

SELECT: Quyền cho phép người dùng truy vấn và lấy dữ liệu từ một bảng hoặc một tập hợp bảng.

INSERT: Cho phép người dùng thêm dữ liệu mới vào bảng.

UPDATE: Cho phép người dùng sửa đổi dữ liệu hiện có trong bảng.

DELETE: Cho phép người dùng xóa dữ liệu khỏi bảng.

CREATE: Cho phép người dùng tạo các đối tượng mới trong cơ sở dữ liệu, chẳng hạn như bảng, chỉ mục, hoặc cơ sở dữ liệu mới.

ALTER: Cho phép người dùng thay đổi cấu trúc của các đối tượng trong cơ sở dữ liệu, chẳng hạn như thêm cột mới vào bảng hoặc thay đổi kiểu dữ liệu của một cột.

DROP: Cho phép người dùng xóa các đối tượng khỏi cơ sở dữ liệu, chẳng hạn như xóa bảng, chỉ mục hoặc cơ sở dữ liệu.

GRANT: Cho phép người dùng cấp quyền cho người dùng khác.

REVOKE: Cho phép người dùng thu hồi quyền mà họ đã cấp cho người dùng khác.

EXECUTE: Cho phép người dùng thực thi các stored procedures và functions trong cơ sở dữ liệu.

INDEX: Cho phép người dùng tạo và xóa chỉ mục trên các bảng.

REFERENCES: Cho phép người dùng tạo các khóa ngoại (foreign key) liên kết bảng này với bảng khác.

LOCK TABLES: Cho phép người dùng khóa bảng để ngăn chặn các thao tác khác trong quá trình họ làm việc với bảng đó.

SHOW VIEW: Cho phép người dùng xem định nghĩa của một view (một bảng ảo được tạo từ kết quả của một truy vấn SELECT).

TRIGGER: Cho phép người dùng tạo và quản lý các triggers, là các hành động tự động được thực hiện khi có sự kiện xảy ra trong cơ sở dữ liệu.

TABLE Command :

Hiển thị cơ sở dữ liệu:
	SHOW DATABASES;

Tạo cơ sở dữ liệu mới có tên là ‘myfirstdb’:
	mysql> CREATE DATABASE myfirstdb;

Tạo cơ sở dữ liệu với các tùy chọn:
	mysql> CREATE DATABASE myfirstdb character set utf8 collate utf8_bin;

QUERRY DATABASE SIZE:

SELECT table_schema "mydatabasename",
        ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" 
FROM information_schema.tables 
GROUP BY table_schema; 

SQL AUTO INCREMENT :

CREATE TABLE Persons (
    Personid int NOT NULL AUTO_INCREMENT,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    PRIMARY KEY (Personid)
);

Default auto_increment = 1 and will increment by 1 for each new record, if want auto_increment start with another value, use this :
	ALTER TABLE Persons AUTO_INCREMENT=100;

Trên đây là một số lệnh cơ bản và nâng cao trong MySQL Command Line giúp bạn quản lý cơ sở dữ liệu một cách hiệu quả. Việc nắm vững các lệnh này không chỉ giúp bạn thực hiện các tác vụ quản trị dễ dàng hơn mà còn tối ưu hóa hiệu suất và bảo mật cho hệ thống. Hãy thực hành thường xuyên để làm quen với các lệnh này, và đừng ngần ngại khám phá thêm các tùy chọn và tính năng khác của MySQL để khai thác tối đa tiềm năng của công cụ này trong công việc của bạn.

Import & Export MySQL

Giới thiệu

Khi làm việc với cơ sở dữ liệu MySQL, việc xuất và nhập dữ liệu là những kỹ năng quan trọng giúp bạn sao lưu, di chuyển và chia sẻ dữ liệu một cách hiệu quả. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn các phương pháp để import (nhập) và export (xuất) dữ liệu trong MySQL. Bạn sẽ học cách sử dụng các công cụ và lệnh SQL để dễ dàng di chuyển dữ liệu giữa các cơ sở dữ liệu, sao lưu dữ liệu quan trọng và khôi phục dữ liệu khi cần thiết. Bài viết sẽ cung cấp hướng dẫn chi tiết từng bước, từ các lệnh cơ bản cho đến các tùy chọn nâng cao, giúp bạn thực hiện các thao tác này một cách chính xác và hiệu quả.

Export & Import in Command Line

EXPORT DATABASE :
	mysqldump -uUSERNAME -p DB_NAME > exported.sql

IMPORT DATABASE :
	mysqldump -u username -p database_name < data-dump.sql

Import & Export in Container Docker

EXPORT DATABASE in Docker:
	docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql

IMPORT DATABASE in Docker :
	docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql
	
docker run --name zabbix-server-mysql -t 
      -e DB_SERVER_HOST="mysql" 
      -e MYSQL_DATABASE="zabbixdb" 
      -e MYSQL_USER="zabbix" 
      -e MYSQL_PASSWORD="<password>" 
      -e MYSQL_ROOT_PASSWORD="<password>" 
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" 
      --network=zabbix-net 
      -p 10051:10051 
      --restart always 
      -d zabbix/zabbix-server-mysql:alpine-6.2-latest
	  

docker run --name zabbix-web-nginx-mysql -t 
      -e ZBX_SERVER_HOST="zabbix-server-mysql" 
      -e DB_SERVER_HOST="mysql" 
      -e MYSQL_DATABASE="zabbixdb" 
      -e MYSQL_USER="zabbix" 
      -e MYSQL_PASSWORD="<password>" 
      -e MYSQL_ROOT_PASSWORD="<password>" 
      --network=zabbix-net 
      -p 80:8080 
      --restart unless-stopped 
      -d zabbix/zabbix-web-nginx-mysql:alpine-6.2-latest

Cronjob auto backup

Create a cli file to run 
     nano auto-backup.sh

# (1) set up all the mysqldump variables
DATE=`date +"%d_%b_%Y_%H%M"`
SQLFILE=/home/database/mydatabase-${DATE}.sql
DATABASE=<database_name>
USER=<user_name>
PASSWORD=<password>

# (2) do the mysql database backup (dump)
sudo mysqldump -u ${USER} -p${PASSWORD} ${DATABASE}|gzip > ${SQLFILE}.gz

Enter Cronjob and set

crontab -e
##Database auto backup
15 3 * * * sh /home/database/cli/auto-backup.sh

Xoá backup cũ sau một khoảng thời gian

crontab -e
##Clear Database wordpress when file older than 7 days
0 0 * * * /usr/bin/find /home/database/ -name "*.sql.gz" -type f -mtime +7 -exec rm -f {} ;

Bonus

Install nano, update in Docker :
	docker exec -it zabbix-web-nginx-mysql --user=root bash
		apk add nano
		apk update 

Việc nắm vững các kỹ thuật import và export dữ liệu trong MySQL không chỉ giúp bạn quản lý cơ sở dữ liệu hiệu quả hơn mà còn đảm bảo tính an toàn và khả năng di động của dữ liệu quan trọng. Bằng cách áp dụng các lệnh và công cụ đã được giới thiệu, bạn có thể dễ dàng sao lưu, khôi phục và di chuyển dữ liệu giữa các hệ thống hoặc môi trường khác nhau. Hãy thực hành thường xuyên và làm quen với các tùy chọn khác nhau để tối ưu hóa quy trình làm việc của bạn. Đừng quên kiểm tra dữ liệu sau khi thực hiện các thao tác để đảm bảo mọi thứ hoạt động như mong muốn. Chúc bạn thành công trong việc quản lý dữ liệu MySQL của mình!

Tối ưu hiệu năng MySQL

Giới thiệu

Tối ưu hóa hiệu năng MySQL là một yếu tố quan trọng để đảm bảo cơ sở dữ liệu của bạn hoạt động mượt mà và hiệu quả. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn các phương pháp và kỹ thuật để cải thiện hiệu suất của MySQL, từ việc tối ưu hóa cấu hình hệ thống đến việc điều chỉnh các truy vấn và chỉ mục. Với những mẹo và công cụ hữu ích, bài viết này sẽ giúp bạn nâng cao hiệu quả hoạt động của MySQL và giảm thiểu thời gian phản hồi của hệ thống.

Swappiness in MySQL

Swapping là tiến trình xuất hiện khi hệ thống phải sử dụng swap disk khi hết Ram. Hệ thống sẽ đưa các thông tin vào ổ đĩa. Mà ổ đĩa thì read chậm hơn ram rất nhiều

Default :vm.swappiness = 60
Disalbe by :
	sysctl -w vm.swappiness=0

Mysql query cache

Nếu bạn có nhiều truy vấn được lập đi lập lại data mà dữ liệu của bạn không thay đổi thường xuyên thì dùng query cache.Thường thì đa phần sẽ không hiểu được khái niệm nàyvà sẽ set giái trị gigabytes.
Websites lớn cần 256 -> 512MB . Còn nhỏ thì chỉ cần 64 – 128MB.

Chỉnh sửa trong my.cnf :

	query_cache_type=1
	query_cache_limit=256K
	query_cache_min_res_unit=2k
	query_cache_size = 64M

InnoDB file-per-table

Tại sao lại tối ưu thông số trên vì MySQL mặc định sử dụng InnoDB (storage engine). InnoDB cung cấp cho chung ta khả năng xử lý linh hoạt database những thông tin được lưu bên trong file .IDB.
Một lợi ít khác đó là nó cải thiện được tốc độ I/O trên VPS hoặc server của bạn.
Mặt định innodb_file_per_table được bật trên version 5.6

innodb_file_per_table=1

InnoDB buffer pool

Là vùng lưu trữ data và indexes trong bộ nhớ. Nó được sử dụng để lưu trữ dữ liệu thường xuyên truy cập trong bộ nhớ, và khi bạn đang chạy một máy chủ chuyên dụng hoặc máy ảo mà DB thường là bottleneck,và đây sẽ là phần chiếm nhiều ram nhất trong các ứng dụng mà bạn đang sử dụng. Do đó, chúng tôi cung cấp cho nó 50-70% của tất cả các RAM.
Có một bộ tài liệu hướng dẫn định dạng butter pool có sẵn trong MySQL docs.

innodb_buffer_pool_size = [Thông số ram]

Max connections

Max_connections sẽ thông báo với server bao nhiêu kết nối được cho phép. Quá nhiều kết nối thì sẽ làm cho Ram load cao, và nếu vượt quá thì MySQL sẽ treo tiến trình. Đối với những website vừa và nhỏ thì ta chỉ cần để max = 80 đến 200.
Còn website có lượng kết nối lớn thì khoản 200 đến 600 hoặc hơn tùy thuộc vào resource của server.

max_connections = 200

MySQL thread_cache_size

MySQL thread_cache_size cho chúng ta biết số lượng threads trên server sẽ được cache, cách tính như sau

	# mysql -e "show status like 'Threads_created';"
	# mysql -e "show status like 'Connections';"

Sau khi có 2 thông số thì tính được cache hit :

100 – ((Threads_created / Connections) * 100))

Đưa vào file my.cnf

thread_cache_size = [Thông số tìm được]

MySQL reverse DNS lookups

Mặc định thì MySQL thực hiện DNS lookup những IP connect tới. Với mỗi Client connect thì địa chỉ IP sẽ được kiểm tra và phân giải.Sau đó Hostname sẽ được phân giải và trả về IP. Điều này sẽ làm cho quá trình bị chậm trê khi DNS có vấn đề .Vậy ta nên tắt chức năng này để tăng khả năng phản hồi cho Server :

skip-name-resolve

MySQL idle connetions

Idle kết nối tiêu hao resource và có thể sẽ bị gián đoạn hoặc phải frefreshed. Giống như nhiều connect trong tình trạng “sleep” và trong thời gian dài. Để kiểm tra các kết nối trên ta thực hiện như sau :

mysqladmin processlist | grep "Sleep"

Command sẽ cho chúng ta thấy được các trạng thái Sleep, Khi php thực hiện truy vấn vào mysql mở kết nối sau đó query , loại bỏ xác thực và mở kết nối. Điều này sẽ làm được lưu trên memory cho đến khi thread không hoạt động.Đối với vấn đề này bạn cần kiểm tra lại source code và fix. Nếu bạn không fix thì bạn có thể thay đổi source code hoặc không biết cách sửa lỗi, vậy cách tạm thời hãy thay đổi thông số mặc định của nó xuống khoản 60.

wait_timeout=60

MySQL slow query logs

Logging query chậm có thể giúp bạn xác định các cơ sỡ dữ liệu và và debug

	slow-query-log=1
	slow-query-log-file=/var/lib/mysql/mysql-slow.log
	long_query_time = 1

Việc tối ưu hóa hiệu năng MySQL là một quá trình liên tục đòi hỏi sự chú ý và điều chỉnh thường xuyên để đạt được kết quả tốt nhất. Bằng cách áp dụng các kỹ thuật và phương pháp đã được đề cập trong bài viết này, bạn có thể cải thiện đáng kể tốc độ và hiệu quả của cơ sở dữ liệu của mình. Hãy luôn theo dõi hiệu suất hệ thống, điều chỉnh các cấu hình và tối ưu hóa các truy vấn để đảm bảo cơ sở dữ liệu hoạt động ổn định và nhanh chóng.

Cài đặt MySQL, MariaDB trên Ubuntu

Giới thiệu

Cài đặt MySQL và MariaDB trên Ubuntu là một bước quan trọng để thiết lập một cơ sở dữ liệu mạnh mẽ và hiệu quả cho các ứng dụng và dịch vụ của bạn. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn từng bước để cài đặt cả MySQL và MariaDB trên hệ điều hành Ubuntu. Bạn sẽ tìm hiểu cách thực hiện cài đặt từ các kho lưu trữ chính thức, cấu hình cơ bản và các bước kiểm tra để đảm bảo rằng cơ sở dữ liệu của bạn hoạt động đúng cách. Dù bạn đang sử dụng MySQL hay MariaDB, hướng dẫn này sẽ giúp bạn thiết lập môi trường cơ sở dữ liệu ổn định và sẵn sàng cho các nhiệm vụ phát triển và quản lý.

Install MySQL 5.7

Add MySQL 5.7 APT Repository :

wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb

Install the repository :

sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb

Update the APT repository :

sudo apt update

Nếu bạn gặp lỗi ” signature couldn’t be verified ” hãy import lại GPG key :

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29

Chạy lại apt update

Kiểm tra lại MySQL repository :

sudo apt-cache policy mysql-server

Install MySQL 5.7 :

sudo apt install -f mysql-client=5.7* mysql-community-server=5.7* mysql-server=5.7* -y

INSTALL MySQL 8.0

Install MySQL 8.0:

apt -y install mysql-server-8.0

Verify :

sudo mysql_secure_installation
[sudo] password for toor: 

Securing the MySQL server deployment.

Enter password for user root: 

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
Using existing password for root.

Estimated strength of the password: 0 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'thanhnh.id.vn'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done! 

MariaDB 11.4.x

sudo apt-get install apt-transport-https curl
sudo mkdir -p /etc/apt/keyrings
sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'

Sau khi đã Import Key, copy và paste dòng dưới vào /etc/apt/sources.list.d (for instance /etc/apt/sources.list.d/mariadb.sources):

# MariaDB 11.4 repository list - created 2024-09-02 14:54 UTC
# https://mariadb.org/download/
X-Repolib-Name: MariaDB
Types: deb
# deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
# URIs: https://deb.mariadb.org/11.4/ubuntu
URIs: https://vn-mirrors.vhost.vn/mariadb/repo/11.4/ubuntu
Suites: focal
Components: main main/debug
Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp

Install MariaDB :

sudo apt-get update
sudo apt-get install mariadb-server

Việc cài đặt MySQL và MariaDB trên Ubuntu không chỉ cung cấp cho bạn một nền tảng cơ sở dữ liệu mạnh mẽ mà còn giúp bạn bắt đầu nhanh chóng với các dự án phát triển và quản lý dữ liệu. Đừng quên kiểm tra và cập nhật hệ thống thường xuyên để duy trì sự ổn định và bảo mật !

MySQL : Replicate Master - Master

Giới thiệu.

Thiết lập MySQL Master-Master Replication là một trong những giải pháp hiệu quả để đảm bảo tính khả dụng cao và đồng bộ hóa dữ liệu giữa hai máy chủ cơ sở dữ liệu. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách cài đặt và cấu hình hệ thống sao chép Master-Master trong MySQL, giúp bạn có thể đồng bộ dữ liệu theo cả hai chiều giữa các máy chủ với Master-Master Replication

  1. Cấu hình Master Database 1 à Database 2
	sudo nano /etc/mysql/my.cnf
		bind-address = 0.0.0.0

Thay đổi tiếp theo đề cập đến các server-id :

	[mysqld]
	server-id = 1				# Đặt ID cho server mysql 
	log_bin = /var/log/mysql/mysql-bin.log	# khai báo lưu trữ binlog

Tạo User trên Master 1 . User này sẽ truy cập vào Master 1 và lấy binlog về :

	mysql1@ubuntu:~$  mysql -u root -p
	Password:
	mysql> CREATE USER 'Username'@'IP_Slave_Server' IDENTIFIED BY 'password';
	Query OK, 0 rows affected (0.00 sec)

Cấp quyền Replication cho nó :

mysql> GRANT REPLICATION SLAVE ON *.* TO 'Username'@'IP_Slave_Server';

Xem thông tin Master Server :

	mysql> show master status;
	+------------------+----------+--------------+------------------+-------------------+
	| File                         | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
	+------------------+----------+--------------+------------------+-------------------+
	| mysql-bin.000005 |      154 |              |                  |                   |
	+------------------+----------+--------------+------------------+-------------------+
	1 row in set (0.00 sec)

Save lại thông tin “mysql-bin.000005” và Position “154“, 2 thông tin còn lại là Binlog_Do_DBBinlog_Ignore_DB để chỉ định DB nào được replicate và DB nào không được replicate

Trên MySQL 2 -Slave 1 ( sẽ là Master 2) :

Cấu hình file config Mysql 2 :

	server-id = 2
	log_bin = /var/log/mysql/mysql-bin.log

Save lại và restart lại Mysql Server

        systemctl stop mysql && systemctl start mysql

Khai báo Slave 1 để replicate data từ Master 1

	$ mysql -u root -p
	Password:

	mysql> STOP SLAVE;                                  #Tắt Slave trước khi khai báo
	Query OK, 0 rows affected, 1 warning (0.00 sec)

	mysql> CHANGE MASTER TO
		-> MASTER_HOST='IP_Master_Server',                 #Khai ip master1 server
		-> MASTER_USER='Username',                               #Username dành cho Slave 1 tạo ở trên
		-> MASTER_PASSWORD='password',                     #Password của nó, tất nhiên rồi @@
		-> MASTER_PORT=3307,                                          #Port của Master_Server nhé, vì đã đổi rồi nên là 3307. Nếu chưa đổi thì ko cần khai chỗ này. 
		-> MASTER_LOG_FILE='mysql-bin.000005',           #Thông tin file binlog lụm được từ Master 1 status
		-> MASTER_LOG_POS=154;                                      # Thông tin position tương ứng
	Query OK, 0 rows affected, 2 warnings (0.01 sec)

	mysql> START SLAVE;                                                          #Sau khi khai báo xong thì khởi động lại Slave
	Query OK, 0 rows affected (0.00 sec)

Sau khi Start Slave thì check status:

mysql> show slave status G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.17.3.111
                  Master_User: repliuser
                  Master_Port: 3307
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 154
               Relay_Log_File: ubuntu-relay-bin.000005
                Relay_Log_Pos: 367
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 788
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: b05dfbb5-1463-11e7-8601-000c29042d55
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

Check xem có đúng không, nếu không :

	stop slave ;
	reset slave ;

Cấu hình Master 2 – Slave 2

Tạo Username và gán quyền Replication :

	$ mysql -u root -p
	Password:

	mysql> CREATE USER 'Username'@'IP_Slave_Server' IDENTIFIED BY 'password';
	Query OK, 0 rows affected (0.00 sec)

	mysql> GRANT REPLICATION SLAVE ON *.* TO 'Username'@'IP_Slave_Server';
	Query OK, 0 rows affected (0.00 sec)

Lấy thông tin của Master :

	$ mysql -u root -p
	Password:

	mysql> STOP SLAVE;                                                            #Tắt Slave trước khi khai báo
	Query OK, 0 rows affected, 1 warning (0.00 sec)

	mysql> CHANGE MASTER TO
		-> MASTER_HOST='IP_Master_Server',                          #Khai ip master2 server
		-> MASTER_USER='Username',                                        #Username dành cho Slave 2 tạo ở trên
		-> MASTER_PASSWORD='password', 
		-> MASTER_PORT=3308,
		-> MASTER_LOG_FILE='mysql-bin.000005',                   #Thông tin file binlog lụm được từ Master 2 status
		-> MASTER_LOG_POS=154;                                              # Thông tin position tương ứng
	Query OK, 0 rows affected, 2 warnings (0.01 sec)

	mysql> START SLAVE;                                                           #Sau khi khai báo xong thì khởi động lại Slave
	Query OK, 0 rows affected (0.00 sec)

Check status của Slave 2:

	mysql> show slave status G;
	*************************** 1. row ***************************
				   Slave_IO_State: Waiting for master to send event
					  Master_Host: 172.17.3.112
					  Master_User: repliuser
					  Master_Port: 3308
					Connect_Retry: 60
				  Master_Log_File: mysql-bin.000001
			  Read_Master_Log_Pos: 792
				   Relay_Log_File: ubuntu-relay-bin.000005
					Relay_Log_Pos: 320
			Relay_Master_Log_File: mysql-bin.000001
				 Slave_IO_Running: Yes
				Slave_SQL_Running: Yes
	......
	Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
	......
	1 row in set (0.01 sec)

Bonus

LOG SLAVE UPDATE WHEN RUN SLAVE OF SLAVE :

Cập nhật trong /etc/mysql/my.cnf

log_slave_updates=ON
sync_binlog=1
sync_relay_log=1
relay_log_purge=ON
relay_log_recovery=ON

MySQL Master-Master Replication mang lại nhiều lợi ích cho các hệ thống cơ sở dữ liệu lớn, đặc biệt là khả năng đảm bảo tính toàn vẹn và đồng bộ dữ liệu giữa các máy chủ. Khi cấu hình đúng cách, hệ thống này sẽ giúp giảm tải cho cơ sở dữ liệu và tăng tính sẵn sàng, giúp doanh nghiệp hoạt động liên tục mà không gặp gián đoạn. Để đạt hiệu quả tốt nhất, bạn cần thường xuyên kiểm tra và theo dõi các vấn đề có thể phát sinh trong quá trình đồng bộ.

Multi-Node MySQL

Giới thiệu

Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

https://mariadb.com/kb/en/galera-cluster

Phần 1: Giới thiệu về Multi-node MySQL: Cách Hoạt Động và Ứng Dụng

MySQL:

  • MySQL InnoDB Cluster cung cấp một giải pháp tăng tính sẵn sàng cao hoàn chỉnh cho MySQL.
  • MySQL Shell bao gồm AdminAPI cho phép dễ dàng cấu hình và quản trị một nhóm với ít nhất ba máy chủ MySQL, hoạt động như một InnoDB Cluster.
  • Mỗi máy chủ MySQL chạy MySQL Group Replication, cung cấp cơ chế sao chép dữ liệu trong InnoDB Cluster, với khả năng chuyển đổi dự phòng được tích hợp.
  • Trong trường hợp xảy ra lỗi không mong muốn của một máy chủ, cluster sẽ tự động cấu hình lại.
  • Trong chế độ single-primary mặc định, InnoDB cluster có một máy chủ đọc ghi – primary instance. Nhiều máy chủ thứ cấp secondary instance là bản sao của primary instance.
  • Nếu lỗi xảy ra ở máy chủ chính primary instance, một máy phụ secondary instance sẽ tự động được chuyển đổi vai trò thành primary instance.
  • MySQL Router tự động phát hiện điều này và chuyển tiếp các kết nối đến bản chính mới. Tính năng nâng cao cũng cho phép cấu hình một cluster có nhiều primary instance.
  • MySQL Router có thể tự động chuyển đổi cấu hình dựa trên cluster đã triển khai, đảm bảo kết nối đến các máy chủ không bị gián đoạn khi có máy chủ xảy ra sự cố.

MariaDB:

  • Galera Cluster hỗ trợ tốt nhất với innoDB
  • Có thể có các bảng MYiSAM hoặc MEMORY nhưng không nhận được bản sao đồng bộ sang các nút khác, chỉ có thể làm được với innoDB
  • Cách Galera đồng bộ dữ liệu bản sao, yêu cầu RollBack phải khả thi kể cả đang COMMIT. Các keys trùng lặp sẽ là vấn đề khi cho phép ghi vào tất cả các nodes
  • NDB thực hiện cách tiếp cận khác ( Tính nhất quán cuối cùng ). Các keys trùng lặp có thể xâm nhập vào hệ thống nhưng client sẽ phải cung cấp thuật toán để khắc phục
  • MYiSAM không có cách nào để thực hiện RollBack vì phụ thuộc vào bảng khóa phía trước. Khóa các bảng trên node khác sẽ gây ra vấn đề và không hiệu quả
  • Galera có thể hoạt động hiệu quả ngay cả trong WAN nhờ hành động COMMIT đơn lẻ trên từng node

Một số thông tin cần chú ý

Binary Log Purging

MySql Binary Log là một cơ chế của MySql dùng để lưu trữ các thay đổi của dữ liệu dưới dạng một file log.Tất cả các thay đổi sẽ được lưu thêm vào (append only) vào một file log được đánh số thứ tự.Mỗi thay đổi được đặc trưng bởi hai tham số: file log được ghi vào vị trí offset trên file log.

  • Mysql 8.0 : Binary Log tự động xoá ( binlog_expire_logs_seconds )
  • Version trước 8.0.1 Không tự động xoá binary log ( defaults =0 )
  • Version 8.0.1 -> 8.0.4 Xoá binary log sau 30 ngày ( defaults = 30 )
  • Version sau 8.0.10 xoá binary log sau 30 ngày ( defaults = 2592000 và default value expire_log_days = 0 )

Thay đổi trên từng host :

SET GLOBAL expire_logs_days = 10;

Tóm lại

Multi-node MySQL là lựa chọn lý tưởng cho những doanh nghiệp và tổ chức cần hệ thống cơ sở dữ liệu mạnh mẽ, ổn định và có khả năng mở rộng linh hoạt. Việc triển khai giải pháp này không chỉ giúp giảm thiểu tải cho máy chủ mà còn tối ưu hóa tốc độ xử lý và bảo đảm sự an toàn dữ liệu. Nếu bạn đang tìm kiếm cách tối ưu hóa hệ thống cơ sở dữ liệu của mình, Multi-node MySQL chính là giải pháp đáng để cân nhắc.

Xem thêm

Hướng Dẫn Cài Đặt MySQL và MySQL Shell: Bước Đầu Để Tạo Cluster

Giới thiệu

Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

https://mariadb.com/kb/en/galera-cluster

Phần 2 : Cài đặt MySQL và MySQL Shell

Trước khi tạo MySQL Cluster, bạn cần thực hiện các bước pre-checking và chuẩn bị hệ thống để đảm bảo mọi thành phần hoạt động trơn tru. Bài viết này sẽ hướng dẫn bạn cách kiểm tra phần cứng, mạng và cấu hình phần mềm cần thiết.

Cài đặt MySQL

Installing MySQL with APT

sudo apt-get install mysql-server

Installing MySQL with Yum

#Update
sudo yum update

Tải MySQL 8.0 RPM file

curl -sSLO https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm

Check Sum bản MySQL RPM vừa tải xuống

md5sum mysql80-community-release-el7-5.noarch.rpm

So sánh với Website tại : https://dev.mysql.com/downloads/repo/yum/

Output
e2bd920ba15cd3d651c1547661c60c7c  mysql80-community-release-el7-5.noarch.rpm

Cài đặt package vừa tải

sudo yum install mysql-server

Khởi động MySQL :

##CENTOS
sudo systemctl start mysqld
##UBUNTU
sudo systemctl start mysql

Cài đặt MySQL Shell

Làm theo các bước được đưa ra trong Thêm MySQL APT Repository, chú ý đặc biệt đến các điểm sau:

sudo apt-get update
sudo apt-get install mysql-shell

Nếu bạn đã có MySQL APT repository như một kho phần mềm trên hệ thống của mình, hãy thực hiện các bước sau:

sudo apt-get update
sudo apt-get install mysql-apt-config
sudo apt-get install mysql-shell

Cài đặt MySQL Shell với MySQL Yum Repository

sudo yum install mysql-shell

Đối với các hệ thống có hỗ trợ dnf, hãy làm như sau:

sudo dnf install mysql-shell

Tóm lại

Việc cài đặt MySQL và MySQL Shell là nền tảng vững chắc để bắt đầu xây dựng MySQL Cluster. Sau khi hoàn thành cài đặt, bạn đã sẵn sàng để tiến hành các bước tiếp theo như kiểm tra hệ thống và tạo cluster.

Xem thêm

Pre-checking và Chuẩn Bị Hệ Thống Trước Khi Tạo MySQL Cluster

Giới thiệu

Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

https://mariadb.com/kb/en/galera-cluster

Phần 3 : Pre-checking và Chuẩn Bị Hệ Thống Trước Khi Tạo MySQL Cluster

Trước khi tạo MySQL Cluster, bạn cần thực hiện các bước pre-checking và chuẩn bị hệ thống để đảm bảo mọi thành phần hoạt động trơn tru. Bài viết này sẽ hướng dẫn bạn cách kiểm tra phần cứng, mạng và cấu hình phần mềm cần thiết.

Kiểm tra các thông số và chuẩn bị

Cấu hình 3 host với thông số :

node 0 : 192.168.33.20/24 ‘cluster’@’%’ apt install mysql-server mysql-shell(8.0)

node 1 : 192.168.33.21/24 ‘cluster’@’%’ apt install mysql-server mysql-shell(8.0)

node 2 : 192.168.33.22/24 ‘cluster’@’%’ apt install mysql-server mysql-shell(8.0)

Phân Quyền cho InnoDB Cluster :

GRANT CREATE USER, FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SELECT, SHUTDOWN, SUPER ON *.* TO 'cluster'@'%' WITH GRANT OPTION;
GRANT DELETE, INSERT, UPDATE ON mysql.* TO 'cluster'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata.* TO 'cluster'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_bkp.* TO 'cluster'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_previous.* TO 'cluster'@'%' WITH GRANT OPTION;

Chuẩn bị trên các host 1, 2 ,3 các cấu hình như sau

nano /etc/mysql/mysql.conf.d/my.cnf

Host 1:

#innodb-1
binlog_checksum = NONE
enforce_gtid_consistency = ON
gtid_mode	= ON
log_slave_updates	 = ON
master_info_repository   = TABLE
relay_log_info_repository	= TABLE
server_id	= 55554
transaction_write_set_extraction	= XXHASH64
disable_log_bin
log_bin	= ON

Host 2:

#innodb-2
binlog_checksum = NONE
enforce_gtid_consistency = ON
gtid_mode	= ON
log_slave_updates	 = ON
master_info_repository   = TABLE
relay_log_info_repository	= TABLE
server_id	= 55555
transaction_write_set_extraction	= XXHASH64
disable_log_bin
log_bin	= ON

Host 3:

#innodb-3
binlog_checksum = NONE
enforce_gtid_consistency = ON
gtid_mode	= ON
log_slave_updates	 = ON
master_info_repository   = TABLE
relay_log_info_repository	= TABLE
server_id	= 55557
transaction_write_set_extraction	= XXHASH64
disable_log_bin
log_bin	= ON

Trên Mysql Shell đặt tham số và connect để config từng host

Đặt các tham số :

var c1 = 'cluster@192.168.33.20:3306'
var c2 = 'cluster@192.168.33.21:3306'
var c3 = 'cluster@192.168.33.22:3306'

Connect từng host và kiểm tra :

Host 1 : 
    shell.connect(c1)
    dba.configureInstance('cluster@192.168.33.20')
Host 2 :
    shell.connect(c2)
    dba.configureInstance('cluster@192.168.33.21')
Host 3 :
    shell.connect(c3)
    dba.configureInstance('cluster@192.168.33.22')

Kiểm tra trạng thái tiêu chuẩn từng host :

Host 1 :
	dba.configureInstance('cluster@192.168.33.20:3306')           -> Status : Ok là đạt
Host 2 :
	dba.checkInstanceConfiguration('cluster@192.168.33.21:3306'); -> status OK 
Host 3 :
	dba.checkInstanceConfiguration('cluster@thanhnh.id.vn:3306'); 	  -> status OK

Tóm lại

Hoàn thành bước pre-checking và chuẩn bị hệ thống giúp bạn tránh các lỗi không mong muốn khi thiết lập MySQL Cluster. Đây là bước quan trọng để bảo đảm hệ thống hoạt động ổn định và hiệu quả.

Xem thêm

Tạo MySQL Cluster và Tham Gia Group

Giới thiệu

Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

https://mariadb.com/kb/en/galera-cluster

Phần 4: Tạo MySQL Cluster và Tham Gia Group: Hướng Dẫn Từng Bước

MySQL Cluster giúp mở rộng quy mô và đảm bảo tính toàn vẹn của dữ liệu bằng cách phân phối trên nhiều nút. Bài viết này sẽ hướng dẫn bạn cách tạo MySQL Cluster và tham gia vào nhóm (group) bằng MySQL Shell.

Đặt tham số:

var c1 = 'cluster@192.168.33.20:3306'
var c2 = 'cluster@192.168.33.21:3306'
var c3 = 'cluster@192.168.33.22:3306'

Host 1: Connect vào host và tạo Cluster

shell.connect(c1)
var cluster = dba.createCluster('groupa');

Connect từng Cluster vào Group

cluster.addInstance(c2) -> Incremental (I)
cluster.addInstance(c3) -> Incremental (I)

Cài đặt bầu chọn Node chính và Node phụ

Bầu chọn node nào sẽ làm node chính, node phụ. Với những môi trường thiếu tài nguyên thì đây là một cách để tối ưu tài nguyên phần cứng. Tuy nhiên, khuyến nghị nhà cung cấp nên là các host tương đồng như nhau về mặt tài nguyên để đảm bảo hệ thống chạy thông suốt

  • Member Weight : 0 -> 100
  • Default 50 !
  • Member Weight càng cao -> Primary

Có 3 cách như sau:

Cách 1:

dba.createCluster('cluster1', {memberWeight:35})
var mycluster = dba.getCluster()
mycluster.addInstance('icadmin@ic2', {memberWeight:25})
mycluster.addInstance('icadmin@ic3', {memberWeight:50})

Cách 2:

Kiểm tra trên các node : sử dụng Heavy Weight . Heavy Weight càng CAO -> PRIMARY

mysql> select member_host,member_state,member_role,member_version from performance_schema.replication_group_members;

Kiểm tra Server Weight trên các node:

[root@innodb1 ~]# mysql -e "select @@hostname, @@group_replication_member_weightG"
[root@innodb2 ~]# mysql -e "select @@hostname, @@group_replication_member_weightG"
[root@innodb3 ~]# mysql -e "select @@hostname, @@group_replication_member_weightG"

Set trên host muốn đặt làm Primary node:

mysql> set global group_replication_member_weight = 70;
## Default : 50

Cách 3:

Sử dụng group_replication_set_as_primary. Tại host muốn làm Primary:

Show UUID:

mysql> show global variables like 'server_uu%';

Set primary:

mysql> select group_replication_set_as_primary('c5aed435-d58d-11ea-bb26-5254004d77d3');

Kiểm tra lại:

mysql> select member_host,member_state,member_role,member_version from performance_schema.replication_group_members;

Tóm lại

Sau khi hoàn thành việc tạo cluster và tham gia group, hệ thống của bạn đã sẵn sàng xử lý lượng lớn dữ liệu với độ tin cậy cao. Tiếp theo, hãy đảm bảo rằng bạn cấu hình MySQL Router để tối ưu hóa kết nối.

Xem thêm

Cài Đặt và Cấu Hình MySQL Router: Kết Nối Cluster An Toàn

Giới thiệu

Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

https://mariadb.com/kb/en/galera-cluster

Phần 5 : Cài Đặt và Cấu Hình MySQL Router – Kết Nối Cluster An Toàn

MySQL Router là công cụ quan trọng giúp điều hướng kết nối giữa các ứng dụng và cluster. Trong bài viết này, chúng ta sẽ tìm hiểu cách cài đặt và cấu hình MySQL Router để đảm bảo kết nối an toàn và tối ưu giữa các nút trong cluster.

Cài đặt MySQL Router

Sử dụng APT Package Manager(Ubuntu):

sudo dpkg -i mysql-apt-config_0.8.30-1_all.deb

Update  APT repository:

sudo apt-get update

Install  MySQL Router:

sudo apt-get install mysql-router-community

Sử dụng RPM packages (CentOS):

install the MySQL Yum repository as described

sudo rpm -Uvh mysql84-community-release-el7-1.noarch.rpm

Cấu hình tuỳ chọn thay đổi phiên bản 8.4 hoặc 8.0

 sudo yum-config-manager --disable mysql-8.4-lts-community
 sudo yum-config-manager --enable  mysql80-community

 sudo yum-config-manager --disable mysql-tools-8.4-lts-community
 sudo yum-config-manager --enable  mysql-tools-community

 Install MySQL Router

sudo yum install mysql-router-community

Cấu hình MySQL Router:

Tạo folder

mkdir /etc/mysqlrouter/mysql-router

Cấu hình sử dụng bootstrap

 mysqlrouter --bootstrap cluster@192.168.33.20:3306 --directory /etc/mysqlrouter/mysql-router --user=root

Output như sau


# Bootstrapping MySQL Router instance at '/etc/mysqlrouter/mysql-router'...

Error: It appears that a router instance named '' has been previously configured in this host. If that instance no longer exists, use the --force option to overwrite it.
root@dbrouter:/etc/mysqlrouter# mysqlrouter --bootstrap cluster@192.168.33.20:3306 --directory /etc/mysqlrouter/mysql-router --user=root --force
Please enter MySQL password for cluster: 
# Bootstrapping MySQL Router instance at '/etc/mysqlrouter/mysql-router'...

- Creating account(s) (only those that are needed, if any)
- Verifying account (using it to run SQL queries that would be run by Router)
- Storing account in keyring
- Adjusting permissions of generated files
- Creating configuration /etc/mysqlrouter/mysql-router/mysqlrouter.conf

# MySQL Router configured for the InnoDB Cluster 'groupa'

After this MySQL Router has been started with the generated configuration

    $ mysqlrouter -c /etc/mysqlrouter/mysql-router/mysqlrouter.conf

InnoDB Cluster 'bestprice' can be reached by connecting to:

## MySQL Classic protocol

- Read/Write Connections: thanhnh.id.vn:6446
- Read/Only Connections:  thanhnh.id.vn:6447

## MySQL X protocol

- Read/Write Connections: thanhnh.id.vn:6448
- Read/Only Connections:  thanhnh.id.vn:6449

-----------------------
Create a systemd service file to start the mysql router :
    nano /etc/systemd/system/mysqlrouter-cluster.service
----------------------- ## Paste to config file
[Unit]

Description=MySQL Router

After=syslog.target

After=network.target
 

[Service]

Type=simple

User=root

Group=root

PIDFile=/etc/mysqlrouter/mysql-router/mysqlrouter.pid

ExecStart=/bin/bash -c "/usr/bin/mysqlrouter -c /etc/mysqlrouter/mysql-router/mysqlrouter.conf"

 
Restart=on-failure

RestartPreventExitStatus=1

PrivateTmp=true
 
[Install]

WantedBy=multi-user.target

Khởi động lại MySQL Router:

systemctl daemon-reload
systemctl start mysqlrouter-groupa
systemctl status mysqlrouter-groupa

Tóm lại

Với MySQL Router, bạn đã hoàn thành việc kết nối các ứng dụng với MySQL Cluster một cách an toàn và hiệu quả. Để đảm bảo hệ thống hoạt động trơn tru, hãy tiếp tục theo dõi và tối ưu hóa cluster của bạn.

Xem thêm

Giám Sát Hiệu Suất MySQL Cluster: Các Công Cụ và Phương Pháp Hiệu Quả

Giới thiệu

Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

https://mariadb.com/kb/en/galera-cluster

Phần 6: Giám Sát Hiệu Suất MySQL Cluster – Các Công Cụ và Phương Pháp Hiệu Quả

Giám sát hiệu suất là yếu tố quyết định để đảm bảo MySQL Cluster hoạt động ổn định và hiệu quả. Bài viết này giới thiệu các công cụ và phương pháp giám sát hiệu suất của MySQL Cluster thông qua MySQL Shell.

Trên Mysql Shell:

var cluster = dba.getCluster()
cluster.describe()
cluster.status()

Các thông tin hiện ra như sau:

STATUS:

  • OK : Online và có thể hỗ trợ n node sập
  • OK_PARTIAL : Giống OK nhưng có một hoặc nhiều server chưa sẵn sàng là active members
  • OK_NO_TOLERANCE : Cluster chưa sẵn sàng để sập
  • OK_NO_TOLERANCE_PARTIAL : Cluster chưa sẵn sàng để sập và cluster có vài thành viên trong tình trạng offline , recovering, error, unreachable
  • NO_QUORUM : Member ko thể thực hiện những bản ghi Write
  • OFFLINE : offline
  • UNREACHABLE : Không có kết nối tới online members
  • UNKNOWN : Không có kết nối tới online members
  • FENCED_WRITES : cluster gặp vấn đề trong traffic ghi (WRITE)

TOPOLOGY:

  • ONLINE : online
  • OFFLINE : offline
  • RECOVERING : đang đồng bộ với cluster trước khi online
  • UNREACHABLE : Mất kết nối
  • ERROR : Lỗi trong khi khôi phục hoặc apply những transactions mới
    * : Khi Srv ERROR, super_read_only sẽ set ON. Để thoát ERROR, sẽ phải thủ công cấu hình super_read_only=OFF
  • MISSING: Host đang là một phần trong cluster nhưng không có tại thời điểm hiện tại
  • MySQL Shell sử dụng state để biểu thị Instances được đăng kí trong metadata, nhưng ko thể tìm thấy ở trong cluster view

Để hiện thị nhiều hơn thông tin

Cluster.status({'extended':value})
  • 0 : Tắt những thông tin cơ bản ( defaults )
  • 1 : Bao gồm những thông tin về phiên bản, giao tiếp, UUIDS, Vai trò của thành viên và cluster được báo cáo bởi GRoup Replication
  • 2 : Bao gồm những thông tin về tiến trình transactions bởi kết nối và áp dụng
  • 3 : Nhiều data cụ thể hơn về hiệu năng replication bởi từng member cluster.

Tóm lại

Giám sát hiệu suất thường xuyên giúp bạn nắm bắt kịp thời các vấn đề tiềm ẩn, từ đó tối ưu hóa hệ thống. Đừng quên sử dụng các công cụ phù hợp để giữ MySQL Cluster của bạn ở trạng thái tốt nhất.

Phần trước

Xem tiếp

Cấu Hình MySQL Shell Qua Command Line: Các Lệnh Quan Trọng Bạn Cần Biết

Giới thiệu

Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

https://mariadb.com/kb/en/galera-cluster

Phần 7: Cấu Hình MySQL Shell Qua Command Line – Các Lệnh Quan Trọng Bạn Cần Biết

MySQL Shell là công cụ mạnh mẽ giúp quản lý và cấu hình hệ thống cơ sở dữ liệu thông qua command line. Bài viết này sẽ giới thiệu những lệnh quan trọng trong MySQL Shell mà bạn cần biết để quản lý hiệu quả.

Command line to configureInstance:

dba.configureInstance()

dba.createCluster()

Cluster.addInstance()

Cluster.removeInstance()

Cluster.rejoinInstance()
	
dba.checkInstanceConfiguration()
	
dba.configureInstance() 

Dừng replication trên Slave:

STOP SLAVE;

Khởi động lại replication trên Slave:

START SLAVE;

Hiển thị trạng thái replication:

SHOW SLAVE STATUSG;

Đồng bộ master với slave:

RESET SLAVE ALL;

MySQL Group Replication

Cài đặt Plugin Group Replication:

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

Khởi động Group Replication trên mỗi node:

START GROUP_REPLICATION;

MySQL Shell cho InnoDB Cluster

Truy cập MySQL Shell:

mysqlsh --uri root@thanhnh.id.vn

Tạo một Cluster mới:

dba.createCluster('myCluster');

Thêm các node vào Cluster:

cluster = dba.getCluster('myCluster');
cluster.addInstance('root@node_ip:3306');

Kiểm tra trạng thái Cluster:

cluster.status();

Restoring and Rebooting Cluster

Trong trường hợp Instances không thể kết nối lại sau khi sập thì

Cluster.rejoinInstance(instance)

Nếu instance super_read_only=on thì bạn cần chắc chắn rằng AdminAPI có thể set super_read_only=OFF. Trong trường hợp Instances không có cấu hình kết dính ( persisted ), khi restart instance sẽ không tự động join lại. Như vậy sẽ phải thủ công để rejoinInstance(instance)

Trong trường hợp server_UUID thay đổi thì sẽ phải remove và thêm lại thủ công với option force

cluster.removeInstance("root@instanceWithOldUUID:3306", {force: true})

cluster.rescan()

Reboot Cluster

var cluster = dba.rebootClusterFromCompleteOutage()
  • Nếu toàn bộ members có cùng GTID, thì member đang kết nối sẽ là Primary
  • Nếu members đang RECOVERING hoặc ERROR và toàn bộ member khác OFFLINE hoặc ERROR
  • rebootClusterFromCompleteOutage() sẽ stop Group Replication, Nếu Group Replication fail to stop, command sẽ bị dừng và hiển thị Lỗi

Tóm lại

Việc nắm vững các lệnh command line trong MySQL Shell sẽ giúp bạn quản lý hệ thống cơ sở dữ liệu một cách dễ dàng và linh hoạt. Hãy áp dụng những lệnh này để tối ưu hiệu quả quản trị.

Phần trước

Xem tiếp

Khắc Phục Lỗi Thường Gặp Và Mẹo Sử Dụng MySQL Shell Hiệu Quả

Giới thiệu

Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

https://mariadb.com/kb/en/galera-cluster

Phần 8: Khắc Phục Lỗi Thường Gặp Và Mẹo Sử Dụng MySQL Shell Hiệu Quả

Trong quá trình sử dụng MySQL Shell, người dùng thường gặp phải một số lỗi phổ biến. Bài viết này sẽ cung cấp các mẹo hữu ích và giải pháp khắc phục nhanh chóng, giúp bạn làm chủ MySQL Shell hiệu quả hơn.

Lỗi Libreadline7

Trong một số trường hợp ( ubuntu 20.04 ) gặp trình trạng install mysql-shell sẽ dẫn đến lỗi thiếu thư viện libreadline7. Để tránh trường hợp xảy ra lỗi thì đây sẽ là giải pháp đơn giản để khắc phục

sudo nano /etc/apt/sources.list

Add to bottom:

deb http://cz.archive.ubuntu.com/ubuntu bionic main

Update repository:

sudo apt update

Install Libreadline7:

 apt install libreadline7 -y

Cluster error

Không remove hoặc delete table vì super_read_only=on

Turn off group_replication:

STOP GROUP_REPLICATION;

Turn off super_read_only:

SET GLOBAL read_only = OFF;

Delete, remove table, database:

Turn on super_read_only:

SET GLOBAL read_only = ON;

Turn on group_replication:

START GROUP_REPLICATION;

Gặp vấn đề với các table MyISAM

Do MySQL InnoDB Cluster chỉ hoạt động với table type innodb nên ta cần convert toàn bộ table MyISAM về InnoDB

List toàn bộ table myISAM ( Thực hiện trên host khác chạy độc lập), có 2 cách:

Cách 1:

    mysql -u root -p

    SET @DATABASE_NAME = 'name_of_your_db';

    SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statements
    FROM    information_schema.tables AS tb
    WHERE   table_schema = @DATABASE_NAME
    AND     `ENGINE` = 'MyISAM'
    AND     `TABLE_TYPE` = 'BASE TABLE'
    ORDER BY table_name DESC;

Tuy nhiên cách trên sẽ gặp lỗi những table, field date formart. Cách 2 sẽ xử lý triệt để

Cách 2:

List toàn bộ table MyISAM

    SELECT table_name FROM INFORMATION_SCHEMA.TABLES
    WHERE engine = 'MyISAM' 

Convert toàn bộ sang InnoDB với options ignore lỗi formart

    SET SQL_MODE='ALLOW_INVALID_DATES';

    ALTER TABLE <Table> ENGINE=InnoDB;

Sau đó convert table và import vào hệ thống innodb Cluster

    mysql -u root -h thanhnh.id.vn -P 6446 -p 
    create table database character set utf8 collate utf8_bin;
    create user 'database'@'%' identified by 'password';
    Grant all privileges on database.* to 'database'@'%';
    use database;
    source <path-to-database>

Bằng cách nắm vững những mẹo khắc phục lỗi trong MySQL Shell, bạn có thể giải quyết vấn đề nhanh chóng và duy trì hiệu suất làm việc ổn định. Hãy lưu lại những mẹo này để tối ưu hóa trải nghiệm của bạn.

Tham khảo các bài viết trước

Authentication and Authorization Apache

Giới thiệu

Xác thực và phân quyền trong Apache đề cập đến quá trình xác minh danh tính của người dùng (Xác thực) và xác định quyền truy cập của họ đối với các tài nguyên (Phân quyền) trong môi trường máy chủ Apache. Apache cung cấp nhiều mô-đun khác nhau như mod_auth_basic, mod_auth_digest, và mod_authnz_ldap, cho phép quản lý việc truy cập dựa trên các phương thức xác thực cơ bản hoặc mã hóa hơn và tích hợp với các dịch vụ phân quyền bên ngoài như LDAP. Các mô-đun này giúp bảo vệ các phần khác nhau của website hoặc ứng dụng bằng cách yêu cầu người dùng đăng nhập và phân quyền truy cập dựa trên các thông tin xác thực được cung cấp.

1. Tạo file password

	sudo htpasswd -c /etc/apache2/.htpasswd <user_name> 
		#<user_name> : username

Server sẽ hỏi xác thực các thông tin và đặt file đó tại /etc/apache2/

Nếu chúng ta nhìn content trong file, ta sẽ thấy tài khoản và mật khẩu đã được mã hoá

	cat /etc/apache2/.htpasswd
		Output
		thanhnh:$apr1$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.
		another_user:$apr1$p1E9MeAf$kiAhneUwr.MhAE2kKGYHK.

2. Cấu hình Apache Password Authentication :

<VirtualHost *:80>
    ServerAdmin webmaster@thanhnh.id.vn
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory "/var/www/html">
        AuthType Basic
        AuthName "Restricted Content"
        AuthUserFile /etc/apache2/.htpasswd
        Require valid-user
    </Directory>
</VirtualHost>

AuthType Basic: Xác định loại xác thực được sử dụng. Trong trường hợp này, Basic là kiểu xác thực cơ bản, trong đó người dùng phải cung cấp tên người dùng và mật khẩu để truy cập tài nguyên.

AuthName "Restricted Content": Xác định tên của khu vực bảo vệ. Đây là thông báo mà trình duyệt sẽ hiển thị cho người dùng khi yêu cầu họ nhập thông tin xác thực. Trong ví dụ này, tên khu vực là “Restricted Content” (Nội dung hạn chế).

AuthUserFile /etc/apache2/.htpasswd: Chỉ định đường dẫn đến file chứa thông tin xác thực của người dùng. Tập tin .htpasswd lưu trữ các tên người dùng và mật khẩu được mã hóa. Đây là nơi Apache tra cứu thông tin xác thực để xác nhận người dùng.

Require valid-user: Quy định yêu cầu người dùng phải cung cấp thông tin xác thực hợp lệ để được phép truy cập vào tài nguyên. valid-user có nghĩa là bất kỳ người dùng nào có thông tin xác thực hợp lệ trong file .htpasswd đều có quyền truy cập.

Cấu hình khác với .htaccess file

##Access .htaccess file :
	AuthType Basic
	AuthName "Restricted Content"
	AuthUserFile /etc/apache2/.htpasswd
	Require valid-user
apachectl -t
apachectl -k restart

Trong tổng quan, xác thực và phân quyền trong Apache là những công cụ mạnh mẽ giúp bảo vệ tài nguyên và quản lý quyền truy cập trên máy chủ web. Bằng cách sử dụng các mô-đun như mod_auth_basic, mod_auth_digest, và mod_authnz_ldap, Apache cung cấp nhiều phương pháp linh hoạt để xác minh danh tính người dùng và đảm bảo chỉ những người dùng có quyền mới có thể truy cập vào các phần quan trọng của trang web hoặc ứng dụng. Việc cấu hình chính xác các mô-đun này giúp tăng cường bảo mật, duy trì sự riêng tư, và kiểm soát truy cập hiệu quả, đáp ứng các yêu cầu bảo mật trong môi trường máy chủ ngày nay.

Lưu, Nạp Images Docker

Giới thiệu

Trong hệ sinh thái Docker, images đóng vai trò cốt lõi, là nền tảng để tạo và triển khai các container. Biết cách lưu và nạp images Docker không chỉ giúp bạn quản lý dự án dễ dàng mà còn đảm bảo tính linh hoạt khi làm việc trên nhiều môi trường khác nhau. Bài viết này sẽ hướng dẫn bạn từng bước cách thực hiện lưu và nạp images Docker một cách chính xác và hiệu quả.

1. Lưu Container thành images

Để lưu một Container thành Image trong Docker, bạn cần sử dụng lệnh docker commit. Dưới đây là các bước chi tiết:

Lệnh docker commit được sử dụng để tạo một Image từ Container đang chạy hoặc đã dừng.

docker commit [OPTIONS] <container_id> <repository_name>:<tag>

ví dụ: Giả sử bạn có một Container với ID abc123 và muốn lưu nó thành Image tên là my-image với tag v1.0:

docker commit abc123 my-image:v1.0
  • <container_id>: ID hoặc tên của Container mà bạn muốn lưu.
  • <repository_name>:<tag>: Tên và tag cho Image mới.

    Kiểm tra:

    docker images

    Tùy chọn bổ sung với docker commit

    Thêm lời nhắn mô tả (-m): Bạn có thể thêm lời nhắn để mô tả Image:

    docker commit -m "Snapshot of my container" abc123 my-image:v1.0

    Chỉ định tác giả (-a): Bạn có thể chỉ định thông tin tác giả:

    docker commit -a "Your Name <your.email@example.com>" abc123 my-image:v1.0

    Giữ trạng thái không dừng Container: Nếu bạn không muốn dừng Container trước khi commit, bạn có thể tạo snapshot của Container khi nó đang chạy.

    2. Lưu Images ra file

    Trong Docker, bạn có thể lưu trữ (save) một Image ra file và sau đó nạp lại (load) Image từ file

    Cú pháp:

    docker save -o <tên_file>.tar <tên_image>:<tag>

    Exp :

    Giả sử bạn có một Image tên là my-app với tag v1.0:

    docker save -o my-app-v1.0.tar my-app:v1.0

    -o: Chỉ định đường dẫn và tên file đầu ra.

    File my-app-v1.0.tar sẽ được tạo trong thư mục hiện tại.

    Nạp Image từ file

    docker load -i <tên_file>.tar

    Ví dụ

    Nạp lại Image từ file my-app-v1.0.tar:

    docker load -i my-app-v1.0.tar
    • -i: Chỉ định đường dẫn file đầu vào.
    • Sau khi nạp, Image sẽ xuất hiện trong danh sách Images (docker images).

    Kiểm tra images

    docker images

    Lưu ý

    • Dung lượng lớn: Nếu Container của bạn chứa nhiều dữ liệu, Image được tạo sẽ có kích thước lớn.
    • Không tối ưu: Image được tạo bằng docker commit không có file Dockerfile, do đó khó quản lý hoặc xây dựng lại.
    • Tốt nhất: Sử dụng Dockerfile để tạo Image khi triển khai lâu dài. Dùng docker commit trong trường hợp cần snapshot nhanh.

    Lưu và nạp images Docker là kỹ năng quan trọng giúp bạn quản lý các dự án Docker dễ dàng hơn. Việc thành thạo các thao tác này không chỉ tối ưu hóa công việc mà còn giúp bạn xử lý linh hoạt trong các tình huống thực tế. Hãy bắt đầu thực hành ngay hôm nay để làm chủ công cụ Docker một cách hiệu quả!

    Quá trình khởi động linux

    Giới thiệu

    Quá trình khởi động Linux là một chuỗi các bước cần thiết để hệ điều hành Linux có thể tải lên và sẵn sàng sử dụng. Từ lúc nhấn nút nguồn đến khi giao diện người dùng xuất hiện, Linux trải qua nhiều giai đoạn quan trọng bao gồm BIOS, Bootloader, Kernel và khởi động các dịch vụ hệ thống. Hiểu rõ quá trình này giúp chúng ta khám phá sâu hơn về cách Linux hoạt động, hỗ trợ giải quyết sự cố và tối ưu hóa hệ thống hiệu quả hơn.

    1. Power-on

    • BIOS (một phần mềm được nhúng (embedded) vào các chip PROM, EPROM hay các bộ nhớ flash nằm trên các bo mạch chủ) là chương trình được chạy đầu tiên khi bạn nhấn nút nguồn hoặc nút reset trên máy tính của mình. BIOS thực hiện một công việc gọi là POST (Power-on Self-test) nhằm kiểm tra các thông số và trạng thái của các phần cứng máy tính khác nhau như là bộ nhớ, CPU, thiết bị lưu trữ, card mạng, …
    • Đồng thười, BIOS cũng cho phép bạn thay đổi các thiết lập, cấu hình của nó.
    • Nếu quá trình POST thành công, thì sau đó BIOS sẽ cố gắng tìm kiếm và khởi chạy (boot) một hệ điều hành được chứa trong các thiết bị lưu trữ như ổ cứng, CD/DVD, USB, … Thứ tự tìm kiếm có thể được thay đổi bởi người dùng.

    2. Master Boot Record (MBR)

    • Sector đầu tiên (được đánh số 0) của một thiết bị lưu trữ dữ liệu được gọi là MBR, thường sector 0 này có kích thước là 512 byte. Sau khi BIOS xác định được thiết bị lưu trữ nào sẽ được ư tiên để tìm kiếm đầu tiên thì thực chất BIOS sẽ đọc trong MBR của thiết bị này để nạp vào bộ nhớ một chương trình rất nhỏ (dưới 512 byte). Chương trình nhỏ này sẽ định vị và khởi động boot loader – đây là chương trình chịu trách nhiệm cho việc tìm và nạp nhân (kernel) của hệ điều hành.

    3. Boot loader

    • Có 2 loại bootloader phổ biến trên linux là GRUB và LILO(tiền thân của Grub). Cả 2 chương trình này đều có chung mục đích: cho phép bạn lựa chọn một trong các hệ điều hành có trên máy tính để khởi động, sau đó chúng sẽ nạp kernel của hệ điều hành đó vao bộ nhớ và chuyển quyền điều khiển máy tính cho kernel này.
    • Grub hay LILO đều có thể khởi động cho cả Linux và Windows, nhưng ngược lại các bootloader trên Windows (như NTLDR, BOOTMGR) thì không hỗ trợ khởi động cho các hệ điều hành Linux. Trong thế giới Linux, các bôt loader cũng có thể nạp thêm các ramdisk hoặc các INITRD.

    4. Linux kernel được nạp và khởi chạy

    Bootloader nạp một phiên bản dạng nén của Linux kernel, và ngay lập tức nó tự giải nén và tự cài đặt mình lên đỉnh bộ nhớ hệ thống – nơi mà nó sẽ nằm ở đó cho đến khi bạn tắt máy.

    5. Các script trong INITRD được thực thi

    • Một vấn đề mà những người viết script đa mục đích phải đối mặt là: không thể nào đoán trước được chính xác cấu trúc máy tính của người sẽ sử dụng bản Linux của họ… Máy tính của người dùng có những thành phần linh kiện nào.
    • Các INITRD cung cấp một giải pháp: một tập các chương trình nhỏ sẽ được thực thi khi kernel vừa mới được khởi chạy. Các chương trình nhỏ này sẽ dò quyets phần cứng của hệ thống và xác định xem kernel cần được hỗ trợ thêm những gì dể có thể quản lý được các phần cứng đó. Chương trình INITRD có thể nạp thêm vào kernel các module bổ trợ. Khi chương trình INITRD kết thúc thì quá trình khởi động Linux sẽ tiếp diễn.

    6. Chương trình init được thực thi

    • Khi kernel được khởi chạy xong, nó triệu gọi duy nhất một chương trình tên là init.
    • Tiến trình này có tên PID = 1, init là cha của tất cả các tiến trình khác mà có trên hệ thống linux này. Do tính chất cực kỳ quan trọng này mà init sẽ không bao giờ bị chết (khi sử dụng lệnh kill) và không được phép chết.
    • Sau đó, init sẽ xem trong file /etc/inittab để biết được nó cần làm gì tiếp theo như: dựa vào runlevel mặc định để thực thi các script khởi động (initscript) tương ứng trong thư mục /etc/rc.d

    7. Các initscript được thực thi dựa trên runlevel được chọn

    • Nếu kiểm tra trong file /etc/inittab, bạn sẽ thấy nó bao gồm hầu hết các đặc tả, chỉ dẫn để cạy các chương trình nào đó. Các script có tên bắt đầu bằng kí tự S sẽ được thực thi, bằng cách này, init sẽ khởi động tất cả các hệ thống con (subsystem) hoặc các dịch vụ (daemon) để tạo thành một hệ thống linux hoạt động hoàn chỉnh.
    • Tại thời điểm này, về cơ bản Linux đã khởi động xong, init cũng hoàn thành vai trò của mình: tạm thời, nó sẽ “ngủ” (ở trạng thái chờ đợi) cho tới khi có chương trình nào đó chị chết hoặc cần được khởi động lại. Tất cả các hoạt động của hệ thống bây giờ sẽ được thực hiện bởi các daemon khác nhau.

    8. Đăng nhập với giao diện đồ họa

    • Subsystem cuối cùng được init khởi động lên là XWindow, đây là một hệ thống cung cấp giao diện đồ họa cho người dùng (GUI) của Linux.

    9. Khi người dùng đăng nhập thành công vào hệ thống

    • Một chương trình shell (bashshcsh, …) sẽ được bắt đầu.
    • Tất cả các chương trình mà bạn chạy và mọi thao tác khác mà bạn thực hiện trong suốt phiên làm việc sẽ được thực hiện bởi shell đó hoặc bởi chương trình khác mà được shell khởi động.
    • Khi bạn đăng xuất, shell đó và tất cả các tiến trình con của nó sẽ kết thúc. Sau đó, init sẽ “thức tỉnh” và bắt đầu một lời nhắc nhở đăng nhập mới.
    • Toàn bộ quá trình khởi động của hệ thống Linux được minh họa như hình sau



    Tóm lại :

    Quá trình khởi động Linux không chỉ đơn thuần là việc nạp hệ điều hành, mà còn là một quy trình phức tạp đảm bảo hệ thống hoạt động chính xác và ổn định. Nắm rõ từng giai đoạn trong quá trình khởi động giúp bạn quản lý và khắc phục sự cố hệ thống hiệu quả, đồng thời cải thiện hiệu suất. Dù bạn là người dùng cá nhân hay quản trị viên, việc hiểu biết về quá trình khởi động Linux sẽ là công cụ hữu ích trong việc khai thác tối đa sức mạnh của hệ điều hành mã nguồn mở này.

    Hide server nginx, apache in Respone Header

    Solution 1 : Use the 3rd-party “Headers More” Module :

    Upgrade nginx-common and nginx-extras :

    sudo apt-get install nginx-common
    sudo apt-get install nginx-extras

    Configuration nginx.conf

    nano /etc/nginx/nginx.conf
    ##Add this one :
    load_module modules/ngx_http_headers_more_filter_module.so;
    http {
        ...
           more_clear_headers Server;
        ...
    }

    Test Nginx

    nginx -t
    service nginx reload

    Solution 2 : Install and Compile new module Headers-More-Nginx-Module

    Download your version nginx :

    wget http://nginx.org/download/nginx-1.12.2.tar.gz

    Decompress your nginx.tar :

    tar -xvzf nginx-1.12.2.tar.gz 

    Download the source code of the dynamic module we need to compile :

    git clone https://github.com/openresty/headers-more-nginx-module.git

    Go to Nginx File

    cd ~/nginx1.12.2

    Compile and run source :

    ./configure --with-compat --add-dynamic-module=../headers-more-nginx-module
    make modules 

    In objs directory the “module.so” file will be created, copy the file to nginx modules directory :

    sudo cp objs/ngx_http_headers_more_filter_module.so /usr/lib/nginx/modules

    Let nginx know about the newly compiled module, add the following line in your nginx.conf file :

    load_module modules/ngx_http_headers_more_filter_module.so;

    And in the HTTP block of the engine.conf, add :

    server_tokens off;
    more_set_headers 'Server: Thanhnh';
    // or 
    more_set_header Server;

    Linux

    Quản trị Linux là quá trình quản lý và vận hành hệ thống máy chủ và máy tính chạy trên nền tảng hệ điều hành Linux. Đây là một công việc quan trọng và phức tạp, đòi hỏi kiến thức sâu về cấu trúc hệ thống, quản lý người dùng, cài đặt và cấu hình phần mềm, bảo mật hệ thống, cùng với việc giám sát và khắc phục sự cố. Với ưu điểm là một hệ điều hành mã nguồn mở, Linux đem lại sự linh hoạt cao, chi phí thấp, và khả năng tùy chỉnh lớn, giúp nó trở thành lựa chọn phổ biến trong môi trường doanh nghiệp, các trung tâm dữ liệu, và đặc biệt trong lĩnh vực công nghệ thông tin. Người quản trị Linux cần am hiểu về dòng lệnh, quyền truy cập, và các công cụ quản lý hệ thống để duy trì sự ổn định, bảo mật và hiệu suất cao cho hệ thống, đảm bảo hoạt động trơn tru và đáp ứng yêu cầu của người dùng.

    Linux System Hardening: Chiến lược cấu hình Firewall với NFTables/IPtables trên Ubuntu 20.04+

    Linux System Hardening: Chiến lược cấu hình Firewall với NFTables/IPtables trên Ubuntu 20.04+

    Giới thiệu

    Linux System Hardening là quá trình củng cố an toàn hệ thống Linux bằng cách áp dụng các thực hành và chuẩn mực bảo mật được công nhận. Với nền tảng Ubuntu 20.04 trở lên, chiến lược cấu hình tường lửa và quản lý lưu lượng mạng thông qua NFTables hoặc IPTables đóng vai trò then chốt trong lớp phòng thủ phía biên. Bài viết này trình bày cách tiếp cận thực tế và có thể triển khai được, đồng thời tham chiếu các chuẩn bảo mật đáng tin cậy như CIS Benchmarks cho Ubuntu và các công cụ xác thực, quét tuân thủ để đảm bảo hệ thống vận hành an toàn trong production.

    Trong khuôn khổ tài liệu, chúng ta tập trung vào các khía cạnh thực tiễn: cách thiết lập và giám sát cấu hình kernel nhằm hạn chế rủi ro từ mạng, cách tham gia các chuẩn bảo mật và các hoạt động kiểm thử xác thực nhằm giảm thiểu sự lệ thuộc vào các cài đặt thủ công dễ bị bỏ sót. Nội dung dựa trên nguồn tài liệu được xác thực, đồng thời giữ nguyên tính thực tiễn cho quản trị viên hệ thống và đội ngũ bảo mật.

    Kiến trúc và khái niệm cốt lõi

    Khung làm việc và vai trò của sysctl trong hardening

    Sysctl là một cơ chế để cấu hình một số khía cạnh của kernel ở thời gian chạy, và thư mục /proc/sys/ cho phép quản trị viên thực hiện cấu hình mà không cần công cụ đặc thù. Thực hành này đặc biệt hữu ích trong công tác hardening hệ thống, cho phép tinh chỉnh hành vi mạng và tài nguyên hệ thống một cách linh hoạt. Quá trình khám phá và áp dụng các tham số mạng thường bắt đầu bằng việc liệt kê toàn bộ tham số có thể điều chỉnh thông qua sysctl và sau đó áp dụng các thay đổi theo đúng yêu cầu bảo mật.

    Tài liệu tham khảo cho khung này nhấn mạnh rằng việc điều chỉnh kernel từ run-time thông qua sysctl là một phần của quá trình bảo mật, và /proc/sys/ chứa nhiều subdir liên quan đến mạng, hệ thống tập tin, quản lý bộ nhớ và các yếu tố khác. Do đó, để thực thi chiến lược firewall và cứng hóa mạng, cần hiểu cách các tham số này tương tác với lưu lượng và hành vi bảo mật của hệ thống.

    Vai trò của CIS Benchmarks và chuẩn bảo mật cho Ubuntu

    Trong khuôn khổ hardening hệ thống Ubuntu, CIS (Center for Internet Security) cung cấp tập hợp các chuẩn cấu hình an toàn cho Ubuntu Linux. Các chuẩn này được cập nhật liên quan đến phiên bản Ubuntu 20.04 LTS và các phiên bản kế tiếp, kèm theo các công cụ kiểm tra tự động như CIS Build Kits và CIS-CAT Pro để tự động hoá đánh giá tuân thủ. Các chuẩn bảo mật này đóng vai trò làm khung tham chiếu cho việc thiết kế và triển khai firewall, quản lý quyền truy cập, và kiểm tra cấu hình hệ thống so với baseline an toàn đã được cộng đồng và CIS xác nhận.

    Ngoài các hướng dẫn cấu hình, CIS Benchmarks cung cấp các công cụ hỗ trợ tự động hoá đánh giá và kiểm tra tuân thủ. Điều này cho phép đội ngũ vận hành rà soát nhanh chóng các thiết lập firewall, cấu hình kernel và các biện pháp bảo mật liên quan đến mạng để đảm bảo hệ thống luôn ở trạng thái an toàn và ghi nhận được. Việc sử dụng CIS Benchmarks và các Build Kits tương ứng giúp đội ngũ bảo mật và quản trị viên có một tiêu chuẩn kiểm tra nhất quán khi triển khai firewall trên Ubuntu 20.04+.

    Yêu cầu và chuẩn bị

    Khảo sát môi trường và nền tảng

    Với nền tảng Ubuntu 20.04 LTS và các bản vá mới hơn, chiến lược hardening nên được thiết kế để tương thích với các công cụ và chuẩn bảo mật đã được công nhận. Việc xác nhận nền tảng trước khi bắt đầu triển khai firewall và các biện pháp bảo mật là bước căn bản nhằm đảm bảo các quy tắc và công cụ được áp dụng đúng ngữ cảnh và phù hợp với phiên bản hệ điều hành.

    Chuẩn bị công cụ và nguồn tham khảo

    Đối với hoạt động hardening và kiểm tra tuân thủ, việc tham khảo CIS Ubuntu Linux Benchmarks là rất quan trọng. CIS Benchmarks cho Ubuntu Linux bao gồm các gợi ý cấu hình an toàn và tối ưu cho hệ thống, và có sẵn dưới dạng các tài nguyên như CIS Build Kits và CIS-CAT Pro để tự động hoá đánh giá. Việc tiếp cận các bộ công cụ này giúp đội ngũ vận hành thiết lập baseline an toàn cho firewall, ghi nhận các thay đổi và theo dõi sự tuân thủ theo thời gian.

    Chuẩn bị công cụ kiểm tra và đánh giá tuân thủ

    Ngoài CIS, các hoạt động quét và kiểm tra tuân thủ có thể được thực hiện thông qua các công cụ quét và chuẩn SCAP. Quá trình rà soát cấu hình hệ thống, lỗ hổng, và sự phù hợp với baseline có thể được hỗ trợ bởi các công cụ như SCAP Workbench hoặc các giải pháp tương tự. Các bước này giúp đảm bảo rằng các thay đổi cấu hình firewall và các tham số kernel được rà soát và xác nhận theo chuẩn bảo mật hiện hành.

    Cấu hình và triển khai thực tiễn

    Do giới hạn về nguồn tài liệu gốc, phần này trình bày khung làm việc và nguyên tắc triển khai ở mức thực tiễn, cùng với cách áp dụng chuẩn từ CIS Benchmarks và các công cụ xác thực để đảm bảo tính tuân thủ. Lưu ý rằng nội dung này nhấn mạnh cách tiếp cận, không phải hướng dẫn chi tiết từng lệnh hay quy tắc cụ thể mà có thể thay đổi theo từng môi trường và phiên bản phát hành.

    Phác thảo chiến lược firewall và quản lý tuyến lưu lượng

    Khi xây dựng chiến lược firewall cho Ubuntu 20.04+, mục tiêu là đảm bảo biên bảo vệ ở mức phù hợp, đồng thời cho phép các dịch vụ cần thiết hoạt động mà không phơi bày hệ thống trước các rủi ro. Việc sử dụng các chuẩn cấu hình từ CIS Benchmarks cho Ubuntu giúp xác định baseline cho các tham số liên quan đến mạng, logging, và quản lý truy cập. Các nguyên tắc chung bao gồm thiết lập chính sách mặc định nghiêm ngặt, ghi nhận đầy đủ và giám sát quá trình thay đổi cấu hình, đồng thời đảm bảo khả năng khôi phục khi cần.

    Quản lý cấu hình kernel và tham số mạng

    Trong quá trình hardening, quản trị viên có thể xem và thay đổi các tham số kernel liên quan đến mạng thông qua sysctl. Các tham số này nằm trong các subdir của /proc/sys/ và có thể ảnh hưởng đến cách hệ thống xử lý lưu lượng và các cơ chế bảo vệ mạng. Việc sử dụng sysctl cho run-time tuning cho phép kiểm tra nhanh và áp dụng các thay đổi nếu cần thiết để tăng cường bảo mật mạng và hạn chế các vector tấn công phổ biến.

    Đối với các tham số mạng và hệ thống, quản trị viên nên bắt đầu từ việc liệt kê các tham số có thể điều chỉnh và xác định những tham số có ảnh hưởng trực tiếp đến an toàn của mạng và hệ thống. Sau khi xác định các tham số cần tối ưu, có thể áp dụng thay đổi ở thời gian chạy và theo dõi tác động của chúng, đồng thời ghi lại các thay đổi để phục vụ cho quá trình audit và tuân thủ.

    Triển khai và tuân thủ baseline

    Quá trình triển khai firewall và cấu hình hệ thống nên được đồng bộ với baseline bảo mật được xác nhận từ CIS Benchmarks cho Ubuntu. Điều này giúp đảm bảo rằng thiết lập firewall, các tham số mạng và các biện pháp kiểm soát truy cập đã được kiểm tra và xác nhận phù hợp với chuẩn công nhận. Sử dụng CIS Build Kits và CIS-CAT Pro hỗ trợ đánh giá tự động và theo dõi tuân thủ theo thời gian.

    Cách tiếp cận bằng công cụ kiểm tra và quét

    Trong khuôn khổ kiểm tra và xác thực, các công cụ SCAP và SCAP Workbench có thể được sử dụng để quét cấu hình hệ thống và đánh giá tuân thủ baseline. Các kết quả từ SCAP có thể được so sánh với chuẩn CIS hoặc các baseline nội bộ để phát hiện chênh lệch và lên kế hoạch remediate. Bên cạnh đó, các công cụ như AIDE hoặc các giải pháp kiểm tra integrity có thể được triển khai để đảm bảo tính toàn vẹn của hệ thống sau khi áp dụng firewall và thay đổi cấu hình.

    Ví dụ thực tiễn và diễn tập

    Trong khuôn khổ tài liệu, ta sẽ nêu các hướng dẫn thực tế chung về xác nhận và kiểm tra cấu hình bảo mật, đồng thời chỉ ra cách tiếp cận chuẩn để đảm bảo sự tuân thủ và sẵn sàng cho sản xuất.

    • Kiểm tra và đánh giá trạng thái hệ thống trước khi triển khai firewall: xác nhận phiên bản Ubuntu, tình trạng vá an toàn, và cấu hình baseline cho mạng.
    • Khởi tạo và xác nhận khung baseline bảo mật bằng CIS Benchmarks cho Ubuntu 20.04+ và Build Kits liên quan.
    • Thực hiện quét tuân thủ và cấu hình theo SCAP với SCAP Workbench hoặc công cụ tương tự; ghi nhận các báo cáo và theo dõi remediation.
    • Kiểm tra run-time và sự phù hợp của tham số kernel liên quan đến mạng bằng sysctl: liệt kê tham số, áp dụng thay đổi và xác nhận bằng sysctl -a.

    Dưới đây là các ví dụ cú pháp tham khảo mang tính khái quát và được dùng để minh họa quá trình làm việc:

    sysctl -a
    sysctl -w <tên_tham_số>=<giá_trị>

    Những lệnh trên cho phép quản trị viên xem toàn bộ tham số hiện có và áp dụng các thay đổi ở thời gian chạy. Sau khi thực hiện, có thể xác nhận lại bằng cách liệt kê tham số cần xem lại để đảm bảo thay đổi đã có hiệu lực.

    Đối với kiểm tra baseline và tuân thủ, hãy tham khảo các tài nguyên như CIS Benchmarks cho Ubuntu 20.04 và các Build Kits tương ứng. Quá trình này có thể được hỗ trợ bởi các công cụ kiểm tra tự động, giúp đội ngũ vận hành nhanh chóng nhận diện các cấu hình bất hợp lý so với chuẩn đã công nhận.

    Bảo mật, hiệu suất và giám sát

    Hardening không chỉ là thiết lập một vài tham số. Nó còn là việc cân bằng giữa bảo mật và hiệu suất, đảm bảo mạng vẫn đáp ứng yêu cầu dịch vụ mà không mở cửa cho rủi ro. Việc giám sát liên tục và kiểm tra tuân thủ là phần thiết yếu để duy trì tình trạng an toàn của hệ thống theo thời gian.

    Những khía cạnh sau đây là cần xem xét khi vận hành firewall và các biện pháp kernel-tuning trên Ubuntu 20.04+:

    • Đồng bộ với các chuẩn bảo mật: CIS Benchmarks cho Ubuntu và các biện pháp kiểm tra tự động để đảm bảo baseline luôn được duy trì qua các cập nhật và thay đổi môi trường.
    • Audit và giám sát: sử dụng các công cụ quét và kiểm tra tuân thủ để theo dõi sự xuất hiện của các thay đổi cấu hình không được chấp thuận và đánh giá ảnh hưởng lên bảo mật.
    • Hiệu suất và tài nguyên: kiểm tra tác động của các tham số mạng và quy tắc firewall đối với thông lượng và độ trễ, đảm bảo dịch vụ vẫn hoạt động ổn định.
    • Khôi phục khẩn cấp và ghi nhận: duy trì sổ nhật ký thay đổi và sẵn sàng cho việc phục hồi khi cần thiết, đồng thời ghi nhận các bước remediation cho audit trail.

    Kiểm tra, validates và vận hành

    Việc kiểm tra và xác thực là một phần không thể thiếu của chu kỳ vận hành hệ thống. Theo nguồn tài liệu tham khảo, CIS Benchmarks và SCAP cho phép tổ chức thực hiện các bước kiểm tra baseline một cách có hệ thống, từ đó phát hiện và khắc phục kịp thời các điểm yếu. Các hoạt động kiểm tra có thể bao gồm:

    • Đánh giá tuân thủ baseline cho Ubuntu 20.04+ bằng CIS Build Kits và CIS-CAT Pro để đảm bảo firewall và cấu hình liên quan đến mạng đã tuân thủ chuẩn.
    • Quét cấu hình và lỗ hổng bằng các công cụ SCAP hoặc SCAP Workbench; so sánh với baseline và lập kế hoạch remediation nếu có sự chênh lệch.
    • Kiểm tra tính toàn vẹn hệ thống bằng các công cụ như AIDE và các biện pháp bảo mật tích hợp khác để đảm bảo không có thay đổi trái phép sau khi cấu hình firewall được triển khai.

    Trong thực tế, khung kiểm tra có thể được tích hợp vào quy trình CI/CD hoặc quy trình vận hành hàng ngày để đảm bảo rằng mọi thay đổi trong cấu hình mạng, firewall và kernel được kiểm tra và xác nhận trước khi đưa vào sản xuất.

    Checklist vận hành cuối bài viết

    • Xác định và xác nhận nền tảng Ubuntu 20.04+ và các bản vá liên quan.
    • Áp dụng baseline bảo mật từ CIS Benchmarks cho Ubuntu và ghi nhận bằng Build Kits hoặc công cụ kiểm tra tương đương.
    • Định nghĩa chiến lược firewall ở mức high-level và sử dụng sysctl để tinh chỉnh các tham số kernel liên quan đến mạng khi cần.
    • Thực hiện quét tuân thủ và đánh giá cấu hình bằng SCAP Workbench hoặc công cụ tương đương; ghi nhận kết quả và remediation.
    • Kiểm tra và đảm bảo sự toàn vẹn hệ thống sau khi thay đổi cấu hình, sử dụng AIDE và các công cụ kiểm tra tích hợp khác.
    • Xây dựng quy trình ghi nhận thay đổi, backup cấu hình và khôi phục hệ thống khi xảy ra sự cố.

    Kết luận

    Chiến lược cấu hình firewall và các biện pháp hardening trên Ubuntu 20.04+ nên được xây dựng trên nền tảng chuẩn mực và kiểm tra tuân thủ. Việc sử dụng CIS Benchmarks cho Ubuntu, cùng với công cụ quét và đánh giá tự động, giúp vận hành viên gia tăng đáng kể khả năng nhận diện và khắc phục các rủi ro bảo mật liên quan đến firewall và lưu lượng mạng. Đồng thời, việc quản lý thông qua sysctl và các tham số kernel cho phép tinh chỉnh hành vi hệ thống theo nhu cầu bảo mật mà vẫn đảm bảo tính sẵn sàng và hiệu suất dịch vụ.

    Tìm hiểu Distro và các bản phân phối Linux

    Giới thiệu distro

    • Distro là từ viết tắt thay thế cho Linux Distribution – bản phân phối của Linux – là một hệ điều hành được tập hợp từ nhiều phần mềm dựa trên nhân Linux (Linux Kernel) và thường có một hệ thống quản lý các gói tin.
    • Thành phần: Một bản distro điển hình bao gồm: một kernel Linux, các công cụ và thư viện GNU, các phần mềm thêm vào, phần document, một hệ thống window system (mà phần lớn là sử dụng X Window System – hệ thống cửa sổ dùng để hiển thị đồ họa Bitmap), window manager và desktop environment.
    • Hiện tại, có khoảng 600 bản distro tồn tại, với gần 500 trong số đó phát triển tích cực, liên tục được sửa đổi và cải thiện. Bởi sự sẵn có của số lượng lớn phần mềm, distro khá là đa dạng về hình thức – phù hợp với từ desktop, server, laptop, netbooks, điện thoại di động, máy tính bảng cũng như môi trường tối thiếu thường để sử dụng trong các hệ thống nhúng.
    • Có nhiều bản phân phối thương mại như Fedora (Red hat), OpenSUSE (SUSE), Ubuntu (Canonical Ltd); và hoàn toàn phân phối dựa vào cộng đồng như Debian, Slackware, Gentoo hay Arch Linux.

    Loại hình và xu hướng phát triển

    Nói chung, các bản phân phối Linux thể là:

    • – Thương mại hoặc phi thương mại
    • – Thiết kế cho người dùng doanh nghiệp, người dùng chuyên nghiệp hay cho người dùng gia đình.
    • – Hỗ trợ nhiều nền tảng phần cứng, hoặc nền tảng riêng, thậm chí đến mức chứng nhận bởi các nhà cung cấp nền tảng.
    • – Thiết kế cho máy chủ, máy tính cá nhân, hoặc cho thiết bi nhúng.
    • – Mục đích chung hoặc có chuyên môn cao về phía các chức năng máy cụ thể (ví dụ: tường lửa, router mạng, và điện toán cụm).
    • – Nhắm đến nhóm người dùng cụ thể, ví dụ thông qua việc quốc tế và bản địa hóa ngôn ngữ, hoặc thông qua bao gồm nhiều sản phẩm âm nhạc hoặc các gói tính toán khoa học.
    • – Xây dựng chủ yếu cho an ninh, khả năng sử dụng, tính di động, hoặc toàn diện.

    Các nhánh distro phổ biến

    • Là một bản phân phối phi thương mại và là một trong những bản phân phối ra đời sớm nhất, duy trì bởi một cộng đồng phát triển tình nguyện với một cam kết mạnh mẽ cho nguyên tắc phần mềm miễn phí và quản lý dự án dân chủ.
    • Có 3 dạng khác nhau:
      • Phiên bản ổn định mà người dùng được khuyến khích sử dụng.
      • Phiên bản không ổn định.
      • Phiên bản thử nghiệm cho những ai mong muốn có được phần mềm mới nhất.
    • Hệ thống gói quản lý phần mềm sử dụng:
      • dpkg  cài đặt các gói phần mềm .deb
      • apt cài đặt phần mềm từ các kho trên mạng.

    Debian có chính sách nghiêm ngặt đối với chất lượng các gói và bản phát hành cũng như tiến trình phát triển và kiểm tra mở. Cách này giúp cho việc nâng cấp các bản phát hành cũng như việc đặt hay gỡ bỏ dễ dàng hơn.

    • Có khá nhiều distro phát triển dựa trên distro Debian như: Raspbian, Knoppix, Astra Linux, Kali Linux, … và phổ biến nhất là nhánh Ubuntu

    Ubuntu

    – Do công ty Canonical phân phối chỉ mới xuất hiện vào quý 3/2004 và không lâu sau đó HĐH này đã trở nên phổ biến, uy tín về chất lượng và dễ dàng sử dụng.

    – Dựa trên hệ thống quản lý gói mạnh mẽ APT của Debian, nhắm đến đối tượng người dùng đầu cuối, nhỏ gọn chỉ với 1 đĩa cài đặt. Người dùng Ubuntu có thể cảm nhận được sự tự do, tùy biến cao trong sử dụng, quản lý hệ thống.

    – Theo thống kê của trang Distrowatch, cho đến hiện nay Ubuntu là distro phổ biến nhất với khoảng hơn 2.000 lượt người truy cập/ngày.

    – Cứ 6 tháng, Ubuntu sẽ ra bản phát hành mới, còn với các phiên bản Long Term Support (LTS) thì việc cập nhật trình bảo mật sẽ từ 3 đến 5 năm.

    – Cách đặt tên của Ubuntu theo định dạng YY.MM trong đó YY là năm phát hành và MM là tháng phát hành.

    – Ubuntu sử dụng giao diện đồ họa thân thiện GNOME, hướng đến sự đơn giản hóa trong quá trình sử dụng. Ngoài ra, Ubuntu còn có bộ ứng dụng văn phòng OpenOffice, trình duyệt Firefox, trình gửi tin nhắn tức thời Pidgin, trình biên tập đồ họa GIMP…

    • Ngoài Ubuntu, các nhà phát triển còn sản sinh ra các distro mang hơi hướng tương tự Ubuntu như KubuntuXubuntu và LunbuntuLinux Mint. Các distro này chủ yếu khác biệt với Ubuntu ở giao diện màn hình.

    Fedora

    • Là một bản phân phối cộng đồng được “đỡ đầu” bởi một công ty của Mỹ – Red Hat. Nó được tạo ra nhằm kiểm thử các công nghệ cho một bản phân phối thương mại khác của Red Hat – nơi mà các phần mềm nguồn mở mới được tạo lập, phát triển và kiểm thử trong môi trường cộng đồng trước khi được đưa vào Red Hat Enterprise Linux.
    • Chu kì ra phiên bản mới của Fedora là 6 tháng. Phiên bản mới với các tính năng bảo mật mà các chuyên gia đánh giá khá tốt.
    • Có thể nâng cấp lên phiên bản mới mà không cần cài đặt lại.
    • Dùng yum để quản lý các gói phần mềm định dạng .rpm
    • Fedora có thể dùng cho máy tính để bàn và máy trạm, thậm chí máy chủ; dành cho những người mới tiếp cận PMTDNM hay những người đã có nhiều kinh nghiệm.
    • 2 distro phổ biến nhất được phát triển dựa trên Fedora là Red Hat Enterprise Linux – với đối tượng hướng tới là các doanh nghiệp và công ty lớn (tất nhiên là có tính phí) ; và CentOS – free và hướng tới đối tượng là người sử dụng cá nhân.

    Các nhóm Distro phổ biến

    • Linux có hàng trăm bản distro khác nhau đủ để phù hợp với nhu cầu của nhiều đối tượng sử dụng: từ người mới bắt đầu tới những người đã có hiểu biết chuyên sâu.
      • Với người sử dụng cá nhân thì các distro phổ biến là: Ubuntu, Linux Mint, Arch Linux, CentOS, Fedora, openSuSE …
      • Với đối tượng sử dụng là hệ thống sever có thể kể đến như là : Red Hat Enterprise Linux, Ubuntu Server, CentOS, SUSE Enterprise Linux..
    • Dựa trên các quy tắc, định hướng cũng như là mục tiêu mà Linux chia các distro phổ biến thành 4 nhóm:
      • Nhóm 1:
        • Nhắm vào người dùng am hiểu về hệ thống Linux. Hầu hết phương thức xây dựng và cấu hình hệ thống đều phải thực hiện qua môi trường dòng lệnh.
        • Đặc điểm: cấu trúc gọn nhẹ, uyển chuyển để có thể xây dựng một hệ thống hoàn toàn tuân theo ý của mình.
        • Các distro tiêu biểu: Arch, Gentoo, Slackware.
      • Nhóm 2:
        • Nhắm vào những người dùng am hiểu hệ thống, tuy nhiên cung cấp nhiều công cụ hơn cho những người chưa thật sự hiểu rõ hoàn toàn về Linux.
        • Nhóm này tương đối thân thiện với người dùng mới bắt đầu hơn nhóm 1. Tuy nhiên, các distro nhóm này lại có một quy trình phát triển và kiểm tra chất lượng các gói phần mềm cực kì khắt khe so với các distro còn lại.
        • Để trở thành một lập trình viên chính thức của Debian hay Fedora cần phải có thời gian đóng góp khá dài, và phải được chứng nhận bởi các lập trình viên khác. Do vậy, môi trường để lập trình và nghiên cứu ở 2 distro này khá tốt.
        • Distro tiêu biểu: Debian và Fedora.
      • Nhóm 3:
        • Chủ yếu nhắm vào thị trường doanh nghiệp, cơ quan, thị trường máy chủ… Các dòng distro này có nhiều đặc tính phù hợp cho mảng thị trường đòi hỏi sự ổn định cao như: thời gian ra phiên bản mới thường khá lâu, 3 – 5 năm tùy distro
        • Ít sử dụng các công nghệ mới nhất, thường tập trung phát triển các công nghệ lâu đời và đáng tin cậy.
        • Distro tiêu biểu: Centos, RHEL, SUSE EL…
      • Nhóm 4:
        • Nhắm đến người dùng cuối và người mới bắt đầu sử dụng Linux.
        • Đặc tính của các distro này là thời gian phát hành ngắn, ứng dụng liên tục các công nghệ mới với nhiều công cụ đồ họa để cấu hình hệ thống, thiết kế với mục đích dễ dùng, dễ làm quen, không cần đọc tài liệu đối với người mới.
        • Distro tiêu biểu: Ubuntu, Open SUSE, Linux Mint.

    Tổng quan lại: Các distro của Linux được mô tả như hình sau:

    Tài liệu tham khảo

    Cấu trúc thư mục Linux

    Giới thiệu :

    Trong Linux, hệ thống tệp được tổ chức thành một cấu trúc cây với thư mục gốc (“/”) là điểm khởi đầu. Mỗi thư mục trong cấu trúc này có chức năng và mục đích riêng, giúp hệ điều hành và người dùng quản lý dữ liệu, cài đặt phần mềm và tài nguyên một cách hiệu quả.

    Hệ thống file trong Linux

    • Trong hệ thống Linux, tất cả đều được cấu hình và coi như là file. Không chỉ bao gồm file text, ảnh, các chương trình biên dịch mà còn cả các thư mục, phân vùng và drive thiết bị phần cứng đều được hệ thống nhìn nhận như một file.
    • Tất cả các file và thư mục đều xuất hiện trong thư mục root, kể cả khi các thư mục còn lại được lưu trong các thiết bị vật lý khác nhau (trên ổ cứng khác, hoặc trên ổ cứng của máy tính khác)
    • Với nhân Linux, hệ thống file là phẳng. Nghĩa là – nó không là một cấu trúc phân cấp, phân biệt giữa các thư mục , tệp tin, hoặc các chương trình. Thay vào đó, kernel sử dụng khái niệm inode để đại diện cho từng file.
    • Mỗi inode chứa thông tin về một file bao gồm: số inode của nó (nhận dạng duy nhất trong hệ thống), các chủ sở hữu và nhóm liên kết với file, loại file (file thông thường, hay file link liên kết hay thư mục, …), quyền truy cập file, thời gian tạo file, kích thước tệp tin và địa chỉ nơi mà file được lưu trữ.
    • Dùng câu lệnh ls -li để xem thông tin một inode:
    • Khi liệt kê các inode, dùng lệnh ls, khi đó thông tin các inode được liệt kê ra và phân biệt các kiểu của inode theo màu. Sau đây là một số cách phân biệt kiểu file qua màu:

    Cấu trúc thư mục trong Linux

    Linux quản lý hệ thống trên một “hệ thống tệp tin” duy nhất, bắt đầu ở gốc là thư mục root (/) đây là thư mục ở cấp cao nhất. Cấu trúc cơ bản của hệ thống Linux như sau:

    Trong đó:

    • / : là thư mục root, nơi mở đầu logic cho hệ thống file của Linux. Mọi đường dẫn tuyệt đối của bất kì file nào đều bắt đầu từ /. Thư mục / chứa toàn bộ hệ điều hành. Chỉ có người dùng root mới có quyền truy cập và thay đổi trong thư mục này. (phân biệt giữa / và /root)
    • /bin: User binaries – thư mục lưu trữ các file nhị phân chương trình thực thi của người dùng như: pwd, cat, cp, …
    • /sbin: Chứa đựng các file thực thi dạng nhị phân của các chương trình cơ bản giúp hệ thống hoạt động. Các chương trình trong /sbin thường được sử dụng cho mục đích là duy trì và quản trị hệ thống => dành cho người dùng admin quản trị hệ thống – người dùng root hoặc superuser.Một số chương trình trong thư mục này như: init, iptables, fdisk, …
    • /boot: boot loader file – Chứa các tệp tin khởi động và cả nhân kernel là vmlinuz.
    • /dev: Các file thiết bị – nơi lưu trữ các phân vùng ổ cứng, thiết bị ngoại vi như usb, ổ đĩa cắm ngoài hay bất cứ thiết bị nào được gán vào hệ thống.
      • Các hard drive thường được mount tại thư mục /dev/sda , usb mount trong /dev/sde ; các phân vùng trên ổ địa được phân ra /dev/sda1, /dev/sda2…
    • /etc: Chứa file cấu hình cho các chương trình hoạt động. Chúng thường là các tệp tin dạng text thường. Chức năng gần giống “Control panel” trong Windows. Các cấu hình trong /etc thường ảnh hưởng tới tất cả người dùng trong hệ thống.Trong /etc còn chứa các shell scripts dùng để khởi động hoặc tắt các chương trình khác. Ví dụ: /etc/resolve.conf, sysctl.conf, …
    • /home: thư mục chứa các file cá nhân của từng user.
    • /lib: Chứa các file library hỗ trợ cho các file thực binary. Mỗi khi cài đặt phần mềm trên Linux, các thư viện cũng tự động được download, và chúng hầu hết được bắt đầu với lib*.. Đây là các thư viện cơ bản mà Linux cần đề làm việc. Không giống như trong Windows, các thư viện có thể chia sẻ và dùng chung cho các chương trình khác nhau. Đó là một lợi ích trong hệ thống tệp tin của Linux.
    • /media: Chứa thư mục dùng để mount cho các thiết bị có thể gỡ bỏ, di chuyển khỏi hệ thống được như CDROM, floppy, …
    • /mnt: Chứa các thư mục dùng để system admin thực hiện quá trình mount. Như đã nói, hệ điều hành Linux coi tất cả là các file và lưu giữ trên một cây chung. Đây chính nơi tạo ra các thư mục để ‘gắn’ các phân vùng ổ đĩa cứng cũng như các thiết bị khác vào. Sau khi được mount vào đây, các thiết bị hay ổ cứng được truy cập từ đây như là một thư mục. Trong một số hệ điều hành, các ổ đĩa chưa được gắn sẵn vào hệ thống bởi fstab sẽ được gắn ở đây.
    • /opt: Tên thư mục này nghĩa là optional (tùy chọn), nó chứa các ứng dụng thêm vào từ các nhà cung cấp độc lập khác. Các ứng dụng này có thể được cài ở /opt hoặc một thư mục con của /opt
    • /proc: Chứa đựng thông tin về quá trình xử lý của hệ thống.Đây là một pseudo filesystem chứa đựng các thông tin về các process đang chạy.Đây là một virtual filesystem chứa đựng các thông tin tài nguyên hệ thống.Ví dụ: /proc/cpuinfo cung cấp cho ta thông số kỹ thuật của CPU. Để xem dùng lệnh cat: $cat /proc/cpuinfo
    • /root: Thư mục home của người dùng root.
    • /tmp: Thư mục lưu trữ các file tạm của hệ thống và các user. Các file lưu tại đây sẽ bị xóa khi hệ thống khởi động lại.
    • /usr: Chứa các file binary, library, tài liệu, source-code cho các chương trình.
      • /usr/bin chứa file binary cho các chương trình của user. Nếu như một user trong quá trình thực thi một lệnh ban đầu sẽ tìm kiếm trong /bin, nếu như không có thì sẽ tiếp tục nhìn vào /usr/bin. Ví dụ một số lệnh như at. awk, cc…
      • /usr/sbin chứa các file binary cho system administrator. Nếu như ta không tìm thấy các file system binary bên dưới /sbin thì ta có thể tìm ở trong /usr/sbin. Ví dụ một số lệnh như cron, sshd, useradd, userdel
      • /usr/lib chứa các file libraries cho /usr/bin và /usr/sbin
      • /usr/local dùng để chứa chương trình của các user, các chương trình này được cài đặt từ source. Ví dụ khi ta install apache từ source thì nó sẽ nằm ở vị trí là /usr/local/apache2
    • /var: Chứa đựng các file có sự thay đổi trong quá trình hoạt động của hệ điều hành cũng như các ứng dụng. Ví dụ:
      • Nhật ký của hệ thống /var/log
      • database file /var/lib
      • email /var/mail
      • Các hàng đợi in ấn: /var/spool
      • lock file: /var/lock
      • Các file tạm thời cần cho quá trình reboot: /var/tmp
      • Dữ liệu cho trang web: /var/www
    • /srv: Chứa dữ liệu liên quan đến các dịch vụ máy chủ như /srv/svs, chứa các dữ liệu liên quan đến CVS.

    Kết bài

    Hiểu rõ cấu trúc thư mục trong Linux không chỉ giúp bạn quản lý hệ thống hiệu quả hơn mà còn tăng cường khả năng bảo mật và tối ưu hóa hiệu suất làm việc. Mỗi thư mục trong Linux đều có nhiệm vụ riêng, giúp hệ điều hành hoạt động mượt mà và ổn định. Dù bạn là người mới làm quen với Linux hay là một quản trị viên hệ thống chuyên nghiệp, nắm vững cấu trúc thư mục sẽ là nền tảng quan trọng để sử dụng hệ điều hành này một cách hiệu quả và thành công.

    Quá trình khởi động linux

    Giới thiệu

    Quá trình khởi động Linux là một chuỗi các bước cần thiết để hệ điều hành Linux có thể tải lên và sẵn sàng sử dụng. Từ lúc nhấn nút nguồn đến khi giao diện người dùng xuất hiện, Linux trải qua nhiều giai đoạn quan trọng bao gồm BIOS, Bootloader, Kernel và khởi động các dịch vụ hệ thống. Hiểu rõ quá trình này giúp chúng ta khám phá sâu hơn về cách Linux hoạt động, hỗ trợ giải quyết sự cố và tối ưu hóa hệ thống hiệu quả hơn.

    1. Power-on

    • BIOS (một phần mềm được nhúng (embedded) vào các chip PROM, EPROM hay các bộ nhớ flash nằm trên các bo mạch chủ) là chương trình được chạy đầu tiên khi bạn nhấn nút nguồn hoặc nút reset trên máy tính của mình. BIOS thực hiện một công việc gọi là POST (Power-on Self-test) nhằm kiểm tra các thông số và trạng thái của các phần cứng máy tính khác nhau như là bộ nhớ, CPU, thiết bị lưu trữ, card mạng, …
    • Đồng thười, BIOS cũng cho phép bạn thay đổi các thiết lập, cấu hình của nó.
    • Nếu quá trình POST thành công, thì sau đó BIOS sẽ cố gắng tìm kiếm và khởi chạy (boot) một hệ điều hành được chứa trong các thiết bị lưu trữ như ổ cứng, CD/DVD, USB, … Thứ tự tìm kiếm có thể được thay đổi bởi người dùng.

    2. Master Boot Record (MBR)

    • Sector đầu tiên (được đánh số 0) của một thiết bị lưu trữ dữ liệu được gọi là MBR, thường sector 0 này có kích thước là 512 byte. Sau khi BIOS xác định được thiết bị lưu trữ nào sẽ được ư tiên để tìm kiếm đầu tiên thì thực chất BIOS sẽ đọc trong MBR của thiết bị này để nạp vào bộ nhớ một chương trình rất nhỏ (dưới 512 byte). Chương trình nhỏ này sẽ định vị và khởi động boot loader – đây là chương trình chịu trách nhiệm cho việc tìm và nạp nhân (kernel) của hệ điều hành.

    3. Boot loader

    • Có 2 loại bootloader phổ biến trên linux là GRUB và LILO(tiền thân của Grub). Cả 2 chương trình này đều có chung mục đích: cho phép bạn lựa chọn một trong các hệ điều hành có trên máy tính để khởi động, sau đó chúng sẽ nạp kernel của hệ điều hành đó vao bộ nhớ và chuyển quyền điều khiển máy tính cho kernel này.
    • Grub hay LILO đều có thể khởi động cho cả Linux và Windows, nhưng ngược lại các bootloader trên Windows (như NTLDR, BOOTMGR) thì không hỗ trợ khởi động cho các hệ điều hành Linux. Trong thế giới Linux, các bôt loader cũng có thể nạp thêm các ramdisk hoặc các INITRD.

    4. Linux kernel được nạp và khởi chạy

    Bootloader nạp một phiên bản dạng nén của Linux kernel, và ngay lập tức nó tự giải nén và tự cài đặt mình lên đỉnh bộ nhớ hệ thống – nơi mà nó sẽ nằm ở đó cho đến khi bạn tắt máy.

    5. Các script trong INITRD được thực thi

    • Một vấn đề mà những người viết script đa mục đích phải đối mặt là: không thể nào đoán trước được chính xác cấu trúc máy tính của người sẽ sử dụng bản Linux của họ… Máy tính của người dùng có những thành phần linh kiện nào.
    • Các INITRD cung cấp một giải pháp: một tập các chương trình nhỏ sẽ được thực thi khi kernel vừa mới được khởi chạy. Các chương trình nhỏ này sẽ dò quyets phần cứng của hệ thống và xác định xem kernel cần được hỗ trợ thêm những gì dể có thể quản lý được các phần cứng đó. Chương trình INITRD có thể nạp thêm vào kernel các module bổ trợ. Khi chương trình INITRD kết thúc thì quá trình khởi động Linux sẽ tiếp diễn.

    6. Chương trình init được thực thi

    • Khi kernel được khởi chạy xong, nó triệu gọi duy nhất một chương trình tên là init.
    • Tiến trình này có tên PID = 1, init là cha của tất cả các tiến trình khác mà có trên hệ thống linux này. Do tính chất cực kỳ quan trọng này mà init sẽ không bao giờ bị chết (khi sử dụng lệnh kill) và không được phép chết.
    • Sau đó, init sẽ xem trong file /etc/inittab để biết được nó cần làm gì tiếp theo như: dựa vào runlevel mặc định để thực thi các script khởi động (initscript) tương ứng trong thư mục /etc/rc.d

    7. Các initscript được thực thi dựa trên runlevel được chọn

    • Nếu kiểm tra trong file /etc/inittab, bạn sẽ thấy nó bao gồm hầu hết các đặc tả, chỉ dẫn để cạy các chương trình nào đó. Các script có tên bắt đầu bằng kí tự S sẽ được thực thi, bằng cách này, init sẽ khởi động tất cả các hệ thống con (subsystem) hoặc các dịch vụ (daemon) để tạo thành một hệ thống linux hoạt động hoàn chỉnh.
    • Tại thời điểm này, về cơ bản Linux đã khởi động xong, init cũng hoàn thành vai trò của mình: tạm thời, nó sẽ “ngủ” (ở trạng thái chờ đợi) cho tới khi có chương trình nào đó chị chết hoặc cần được khởi động lại. Tất cả các hoạt động của hệ thống bây giờ sẽ được thực hiện bởi các daemon khác nhau.

    8. Đăng nhập với giao diện đồ họa

    • Subsystem cuối cùng được init khởi động lên là XWindow, đây là một hệ thống cung cấp giao diện đồ họa cho người dùng (GUI) của Linux.

    9. Khi người dùng đăng nhập thành công vào hệ thống

    • Một chương trình shell (bashshcsh, …) sẽ được bắt đầu.
    • Tất cả các chương trình mà bạn chạy và mọi thao tác khác mà bạn thực hiện trong suốt phiên làm việc sẽ được thực hiện bởi shell đó hoặc bởi chương trình khác mà được shell khởi động.
    • Khi bạn đăng xuất, shell đó và tất cả các tiến trình con của nó sẽ kết thúc. Sau đó, init sẽ “thức tỉnh” và bắt đầu một lời nhắc nhở đăng nhập mới.
    • Toàn bộ quá trình khởi động của hệ thống Linux được minh họa như hình sau



    Tóm lại :

    Quá trình khởi động Linux không chỉ đơn thuần là việc nạp hệ điều hành, mà còn là một quy trình phức tạp đảm bảo hệ thống hoạt động chính xác và ổn định. Nắm rõ từng giai đoạn trong quá trình khởi động giúp bạn quản lý và khắc phục sự cố hệ thống hiệu quả, đồng thời cải thiện hiệu suất. Dù bạn là người dùng cá nhân hay quản trị viên, việc hiểu biết về quá trình khởi động Linux sẽ là công cụ hữu ích trong việc khai thác tối đa sức mạnh của hệ điều hành mã nguồn mở này.

    Các lệnh Linux cơ bản (Phần 1)

    Giới thiệu

    Linux là một hệ điều hành mạnh mẽ, được sử dụng rộng rãi trong các máy chủ, hệ thống nhúng và các ứng dụng phát triển phần mềm. Để khai thác tối đa khả năng của Linux, việc nắm vững các lệnh cơ bản là điều cần thiết. Trong bài viết này, chúng ta sẽ tìm hiểu về những lệnh Linux cơ bản nhất mà mọi người dùng Linux đều nên biết để quản lý tập tin, thư mục và hệ thống một cách hiệu quả.

    File Commands :

    ls – Liệt kê tập tin và thư mục

    • Ý nghĩa: Hiển thị danh sách các tập tin và thư mục trong thư mục hiện tại.
    • Cách dùng:
    ls
    ls -l      # Hiển thị chi tiết với quyền truy cập, kích thước, ngày tháng
    ls -a      # Hiển thị tất cả các tập tin, bao gồm các tập tin ẩn
    ls -lh     # Hiển thị kích thước tập tin với định dạng dễ đọc (KB, MB, GB)

    cd – Thay đổi thư mục làm việc

    • Ý nghĩa: Di chuyển đến thư mục khác.
    • Cách dùng:
    cd /path/to/directory    # Di chuyển đến thư mục chỉ định
    cd ..                    # Di chuyển lên một thư mục cấp cao hơn
    cd ~                     # Di chuyển đến thư mục home của người dùng

    pwd – Hiển thị thư mục hiện tại

    • Ý nghĩa: In ra đường dẫn tuyệt đối của thư mục hiện tại.
    • Cách dùng
    pwd

    cp – Sao chép tập tin hoặc thư mục

    • Ý nghĩa: Sao chép một tập tin hoặc thư mục từ vị trí này sang vị trí khác.
    • Cách dùng
    cp file1.txt file2.txt          # Sao chép file1.txt thành file2.txt
    cp -r dir1/ dir2/               # Sao chép thư mục dir1 sang thư mục dir2

    mv – Di chuyển hoặc đổi tên tập tin/thư mục

    • Ý nghĩa: Di chuyển tập tin/thư mục hoặc đổi tên nó.
    • Cách dùng
    mv file1.txt /newpath/         # Di chuyển file1.txt vào thư mục mới
    mv oldname.txt newname.txt     # Đổi tên file từ oldname.txt sang newname.txt

    rm – Xóa tập tin hoặc thư mục

    • Ý nghĩa: Xóa tập tin hoặc thư mục.
    • Cách dùng
    rm file1.txt           # Xóa tập tin file1.txt
    rm -r dir1/            # Xóa thư mục dir1 và các tập tin trong đó
    rm -f file1.txt        # Xóa mà không có thông báo xác nhận

    cat – Hiển thị nội dung tập tin

    • Ý nghĩa: Hiển thị nội dung của một hoặc nhiều tập tin lên màn hình.
    • Cách dùng
    cat file1.txt                # Hiển thị nội dung của file1.txt
    cat file1.txt file2.txt      # Hiển thị nội dung của cả hai tập tin

    more – Hiển thị nội dung tập tin theo trang

    • Ý nghĩa: Hiển thị nội dung của tập tin theo từng trang để dễ đọc hơn.
    • Cách dùng
    more file1.txt

    head – Hiển thị các dòng đầu của tập tin

    • Ý nghĩa: Hiển thị các dòng đầu tiên của một tập tin (mặc định là 10 dòng).
    • Cách dùng
    head file1.txt              # Hiển thị 10 dòng đầu tiên của file1.txt
    head -n 20 file1.txt        # Hiển thị 20 dòng đầu tiên của file1.txt

    tail – Hiển thị các dòng cuối của tập tin

    • Ý nghĩa: Hiển thị các dòng cuối cùng của một tập tin (mặc định là 10 dòng).
    • Cách dùng
    tail file1.txt              # Hiển thị 10 dòng cuối của file1.txt
    tail -n 20 file1.txt        # Hiển thị 20 dòng cuối cùng của file1.txt

    ln – Tạo liên kết đến tập tin

    • Ý nghĩa: Tạo liên kết cứng (hard link) hoặc liên kết mềm (symbolic link) đến một tập tin.
    • Cách dùng
    ln file1.txt link1.txt        # Tạo liên kết cứng
    ln -s file1.txt link1.txt     # Tạo liên kết mềm (symbolic link)

    chmod – Thay đổi quyền truy cập tập tin

    • Ý nghĩa: Thay đổi quyền truy cập (read, write, execute) cho tập tin hoặc thư mục.
    • Cách dùng
    chmod 755 file1.txt           # Cấp quyền đọc, ghi, thực thi cho chủ sở hữu và đọc, thực thi cho người dùng khác
    chmod u+x file1.txt           # Thêm quyền thực thi cho chủ sở hữu

    chown – Thay đổi chủ sở hữu và nhóm của tập tin

    • Ý nghĩa: Thay đổi chủ sở hữu hoặc nhóm của tập tin hoặc thư mục.
    • Cách dùng
    chown user:group file1.txt   # Thay đổi chủ sở hữu và nhóm của tập tin

    stat – Hiển thị thông tin chi tiết về tập tin

    • Ý nghĩa: Hiển thị thông tin chi tiết của tập tin, bao gồm quyền, kích thước, thời gian tạo/sửa đổi.
    • Cách dùng
    stat file1.txt

    Việc làm quen với các lệnh Linux cơ bản sẽ giúp bạn thao tác và quản lý hệ thống một cách dễ dàng và nhanh chóng. Mặc dù Linux có rất nhiều lệnh mạnh mẽ và linh hoạt, nhưng việc thành thạo các lệnh cơ bản là bước đầu tiên để bạn có thể tận dụng tối đa các tính năng mà hệ điều hành này mang lại. Hãy tiếp tục khám phá và thực hành để nâng cao kỹ năng sử dụng Linux của bạn!

    Các lệnh Linux cơ bản (Phần 2)

    Giới thiệu

    Linux là một hệ điều hành mạnh mẽ, được sử dụng rộng rãi trong các máy chủ, hệ thống nhúng và các ứng dụng phát triển phần mềm. Để khai thác tối đa khả năng của Linux, việc nắm vững các lệnh cơ bản là điều cần thiết. Trong bài viết này, chúng ta sẽ tìm hiểu về những lệnh Linux cơ bản nhất mà mọi người dùng Linux đều nên biết để quản lý tập tin, thư mục và hệ thống một cách hiệu quả.

    KẾT NỐI SSH

    • ssh user@host – kết nối đến host với user
    • ssh -p port user@host – kết nối có chỉ ra port

    CÀI ĐẶT SOFTWARE

    • ./configure
      make
      make install

    LỆNH VỀ MẠNG – NETWORK

    • ping host – ping đến host
    • dig domain – lấy thông tin DNS cho domain
    • wget file – tải file
    • curl –head url – xem phần header của URL

    THÔNG TIN HỆ THỐNG

    • date – ngày/tháng giờ hiện tại
    • cal – lịch tháng hiện tại
    • uptime – thời gian hệ thống hoạt động (kể từ khi khởi động)
    • w – xem các user đang online trong hệ thống
    • whoami – tài khoản đang đăng nhập
    • uname -a – thông tin hệ thống linux
    • cat /proc/cpuinfo – thông tin CPU
    • cat /proc/meminfo – thông tin bộ nhớ
    • df – thông tin đĩa cứng
    • df -BM – thông tin đĩa cứng
    • du – thông tin thư mục
    • du -sh – thông tin thư mục
    • du –max-depth=1 -B M |sort -rn – thông tin thư mục, xếp theo dung lượng
    • free – thông tin bộ nhớ trống và swap

    TÌM KIẾM – SEARCHING

    • grep ‘word’ file1 file2 … – tìm kiếm ‘word’ trong file1, file2 …
    • grep -rnw ‘/path/to/somewhere/’ -e ‘word’ – tìm kiếm các file chứa ‘word’ trong thư mục
    • locate “*.png” – tìm vị trí theo tên file

    PROCESS

    • top – các tiến trình đang chạy
    • ps -aux – các tiến trình đang chạy
    • kill -9 PID – dừng tiến trình PID
    • killall [process name] – dừng tiến trình

    FILE PERMISSION

    • chmod octal file – thay đổi permission
      octal con số bát phân (1)(2)(3) thể hiện permision (rwx == read-write-execute)
    • chmod 775 file – rw cho owner, rx cho group/world
    • chmod 777 file – file rwx cho tất các các user
    • chmod -R 755 directory-name/ – thiết lập cho toàn thư mục
    • chown -R owner:group file/directory – đổi owner|group của file

    NÉN FILE

    • tar -cvf /tenfilenen.tar /thu-muc-can-nen – nén thư mực vào .tar
    • tar -xvf file-nen.tar – giải nén file .tar
    • gzip file – nén file thành file.gz
    • gzip -d file.gz – giải nén file.gz

    Cài đặt Composer, NVM, Node.js Linux

    Giới thiệu :

    Composer, NVM và Node.js là những công cụ phát triển phổ biến được sử dụng trong nhiều dự án phần mềm hiện nay. Composer giúp quản lý các thư viện PHP, NVM hỗ trợ quản lý các phiên bản Node.js, và Node.js là nền tảng cho việc phát triển các ứng dụng web mạnh mẽ. Việc cài đặt và cấu hình đúng cách những công cụ này trên hệ điều hành Linux sẽ giúp bạn tạo ra một môi trường phát triển mạnh mẽ và linh hoạt. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách cài đặt Composer, NVM và Node.js trên Linux một cách chi tiết.

    Tìm hiểu cơ bản nodeJS, NVM, Pm2, Composer

    1. Node.js

    • Node.js là một nền tảng JavaScript được phát triển trên động cơ V8 của Google Chrome. Nó cho phép chạy JavaScript bên ngoài trình duyệt, điều này có nghĩa là bạn có thể xây dựng các ứng dụng máy chủ, ứng dụng web hoặc các công cụ dòng lệnh bằng JavaScript.
    • Tính năng nổi bật: Node.js sử dụng mô hình bất đồng bộ, không chặn (non-blocking) và sự kiện (event-driven), giúp xử lý các yêu cầu đồng thời một cách hiệu quả, lý tưởng cho các ứng dụng web thời gian thực hoặc các ứng dụng cần tương tác nhanh.

    2. NVM (Node Version Manager)

    • NVM là một công cụ dòng lệnh giúp bạn quản lý nhiều phiên bản Node.js trên cùng một hệ thống. Nó cho phép bạn dễ dàng cài đặt, thay đổi và chuyển đổi giữa các phiên bản Node.js khác nhau mà không cần phải thay đổi cấu hình hệ thống.
    • Lý do sử dụng: Khi làm việc với nhiều dự án khác nhau, mỗi dự án có thể yêu cầu một phiên bản Node.js khác nhau. NVM giúp bạn dễ dàng chuyển đổi giữa các phiên bản Node mà không gặp phải vấn đề tương thích.

    3. PM2

    • PM2 là một trình quản lý tiến trình cho Node.js, giúp bạn dễ dàng chạy, giám sát và quản lý các ứng dụng Node.js trong môi trường sản xuất. Nó cho phép bạn giữ các ứng dụng Node.js chạy liên tục và tự động khởi động lại khi ứng dụng gặp sự cố.
    • Tính năng nổi bật:
      • Quản lý tiến trình: PM2 giúp bạn chạy ứng dụng Node.js trong nền và giám sát chúng.
      • Khởi động lại tự động: PM2 sẽ tự động khởi động lại ứng dụng nếu có sự cố.
      • Quản lý logs: PM2 cho phép bạn dễ dàng xem và quản lý log của ứng dụng.
      • Cluster mode: PM2 hỗ trợ chạy ứng dụng Node.js trong chế độ phân tán (cluster), giúp tận dụng tối đa các lõi CPU.

    4. Composer

    • Composer là một công cụ quản lý thư viện (dependency manager) cho PHP. Nó giúp bạn quản lý các thư viện mà dự án của bạn phụ thuộc vào, tự động tải về và cài đặt các thư viện này từ các kho lưu trữ (như Packagist).
    • Tính năng nổi bật:
      • Quản lý phụ thuộc: Composer giúp quản lý và cài đặt các thư viện cần thiết cho ứng dụng PHP của bạn.
      • Cập nhật thư viện: Composer có thể tự động cập nhật các thư viện khi có phiên bản mới.
      • Autoloading: Composer cung cấp tính năng autoloading, giúp tự động tải các lớp PHP khi cần thiết mà không cần phải gọi thủ công.

    Cài đặt NodeJS phiên bản cố định :

    NodeJS v16.x:

    curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - &&
    sudo apt-get install -y nodejs
    
    ## AS root :
    curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
    apt-get install -y nodejs

    NodeJS v18.x:

    curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&
    sudo apt-get install -y nodejs
    
    ##As root :
    curl -fsSL https://deb.nodesource.com/setup_18.x | bash - &&
    	apt-get install -y nodejs

    NodeJS LTS newest:

    curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - &&
    sudo apt-get install -y nodejs
    
    ##As root:
    curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - &&
    	apt-get install -y nodejs

    Cài đặt NodeJS bằng NVM (Node Version Manager)

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
    source ~/.bashrc
    nvm list-remote

    List Remote sẽ trả về rất nhiều phiên bản, sau đó chỉ cần chọn phiên bản cần cài :

    Output
    . . .
           v20.15.0   (LTS: Iron)
           v20.15.1   (LTS: Iron)
           v20.16.0   (LTS: Iron)
           v20.17.0   (LTS: Iron)
           v20.18.0   (Latest LTS: Iron)
            v21.0.0
            v21.0.0
            v21.1.0
            v21.2.0
            v21.3.0
            v21.4.9
            v21.5.0
            v21.6.0
            v21.6.1
            v21.6.2
            v21.7.0
            v21.7.1
            v21.7.2
            v21.7.3
            v22.0.0
            v22.1.0
            v22.2.0
            v22.3.0
            v22.4.0
            v22.4.1
            v22.5.0
            v22.5.1
            v22.6.0
            v22.7.0
            v22.8.0
            v22.9.0
    nvm install v20.18.0
    nvm use 20.18.0 ##Switch Version of Node will use

    Cài đặt Composer

    Downloading Composer:
        cd ~
        curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
        HASH=`curl -sS https://composer.github.io/installer.sig`
        php -r "if (hash_file('SHA384', '/tmp/composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
        sudo php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer

    Test composer

    composer

    Cài đặt PM2 :

    sudo npm i -g pm2

    Testing command với node project :

    pm2 --name c1 start "PORT=3400 node build/server.js"
    pm2 --name c2 start "PORT=3401 node build/server.js"

    Sau khi cài đặt thành công Composer, NVM và Node.js, bạn sẽ có một môi trường phát triển mạnh mẽ để làm việc với các dự án PHP và JavaScript trên Linux. Việc sử dụng các công cụ này sẽ giúp bạn quản lý các thư viện và phiên bản dễ dàng hơn, đồng thời hỗ trợ tối ưu cho các ứng dụng web của mình. Hy vọng rằng với hướng dẫn này, bạn sẽ nhanh chóng thiết lập được môi trường phát triển lý tưởng cho công việc của mình trên hệ điều hành Linux.

    Tối ưu hiệu năng Zabbix trên Ubuntu 22.04+: Chiến lược cho môi trường production

    Tối ưu hiệu năng Zabbix trên Ubuntu 22.04+: Chiến lược cho môi trường production

    Giới thiệu

    Bài viết này trình bày chiến lược tối ưu hóa hiệu năng cho Zabbix trên Ubuntu 22.04+ trong môi trường production. Với mô hình triển khai hiện đại, Zabbix cho phép phân tán tải bằng cách kết hợp máy chủ, agent và các máy chủ proxy được phân bổ ở nhiều vị trí, đồng thời tận dụng các tính năng an ninh và tối ưu hóa hiệu suất có sẵn trong hệ sinh thái Zabbix. Nội dung tập trung vào các khía cạnh kiến trúc, cài đặt, cấu hình tối ưu, triển khai thực tế và quy trình vận hành để đảm bảo hiệu năng ổn định và có thể mở rộng.

    Kiến trúc và khái niệm cốt lõi

    Hiệu năng của hệ thống giám sát phụ thuộc vào cách bạn sắp đặt các thành phần chính của Zabbix và cách chúng giao tiếp với nhau:

    • Zabbix server: Thành phần xử lý chính, nhận dữ liệu từ các agent/proxy, thực thi các biểu thức cảnh báo và lưu trữ lịch sử.
    • Agent: Thực thi trên các máy chủ/máy đích để cung cấp dữ liệu giám sát cho server hoặc proxy.
    • Proxy: Lưu trữ và đệm dữ liệu ở mức trung gian; giúp phân tán tải và tăng khả năng mở rộng cho hệ thống ở quy mô lớn.
    • Java gateway (nếu có): Thành phần bổ sung cho các trường hợp tích hợp Java.
    • High availability (HA): Môi trường production thường yêu cầu cơ chế sẵn sàng cao cho server và/hoặc proxy để giảm thời gian ngừng dịch vụ và mất dữ liệu trong khi bảo toàn hiệu suất hoạt động.
    • Distributed monitoring: Khả năng giám sát phân tán qua multiple proxies và sự đồng bộ cấu hình giữa các thành phần, giúp mở rộng quy mô và tăng tính resilience.
    • Encryption: Bảo mật kết nối giữa các thành phần thông qua các cơ chế mã hóa và khóa chia sẻ (TLS/PSK theo tài liệu Zabbix).

    Chuẩn bị và cài đặt trên Ubuntu 22.04+

    Đối với nền tảng ubuntu-22.04-plus, Zabbix có thể cài đặt từ các gói Debian/Ubuntu. Quá trình này bao gồm cài đặt các thành phần cần thiết và cấu hình ban đầu để có thể đi vào vận hành. Khi triển khai cho production, bạn có thể cân nhắc sử dụng một hoặc nhiều proxy để phân tán tải và thiết lập cơ chế giao tiếp an toàn giữa server và proxy.

    Yêu cầu và chuẩn bị

    • Hệ điều hành: Ubuntu 22.04+ (64-bit) hoặc các bản phân phối tương thích khác được hỗ trợ.
    • Môi trường chạy Zabbix server và frontend (web server và môi trường PHP) đủ đáp ứng tải giám sát dự kiến.
    • Sơ đồ mạng cho phép kết nối giữa Zabbix server, proxies và agents.

    Cài đặt từ gói Debian/Ubuntu

    Quá trình cài đặt từ gói đóng gói cho Debian/Ubuntu được mô tả trong tài liệu Zabbix. Dưới đây là các bước thực tế ở mức khung tham khảo cho hệ thống Ubuntu 22.04+:

    sudo apt update
    sudo apt install -y zabbix-server zabbix-frontend-php zabbix-agent
    

    Trong trường hợp bạn mở rộng với mô hình phân tán, có thể thêm zabbix-proxy hoặc các thành phần khác theo nhu cầu, sau đó khởi động và bật tự động các dịch vụ:

    sudo systemctl enable --now zabbix-server zabbix-agent

    Kiểm tra trạng thái dịch vụ để đảm bảo các thành phần đang hoạt động bình thường:

    systemctl status zabbix-server
    systemctl status zabbix-agent

    Cấu hình ban đầu và liên kết với cơ sở dữ liệu

    Với mô hình cài đặt từ gói, bạn sẽ cần cấu hình kết nối cơ sở dữ liệu và tích hợp với giao diện web. Trong các bài hướng dẫn chi tiết của Zabbix, các bước này được mô tả rõ ràng cho từng ngữ cảnh cài đặt (cơ sở dữ liệu và phiên bản frontend). Đối với mục tiêu tối ưu hóa hiệu năng ở production, bạn có thể xem xét việc tách biệt cơ sở dữ liệu và tối ưu đường dẫn truy vấn giữa server và cơ sở dữ liệu.

    Cấu hình tối ưu hiệu năng cho production

    Để tối ưu hiệu năng cho Zabbix trên Ubuntu 22.04+, tập trung vào các nguyên tắc sau đây, được hỗ trợ bởi các khía cạnh kiến trúc của Zabbix và các chức năng phân tán/điện tử của hệ thống:

    Phân tán tải và sử dụng proxies

    • Sử dụng proxy ở các vùng địa lý hoặc phân khu dữ liệu để thu thập dữ liệu từ các hosts và gửi lên server ở cấp cao hơn. Distributed monitoring giúp giảm tải cho Zabbix server, đồng thời tăng tốc độ xử lý và đảm bảo tính sẵn sàng cao.
    • Thiết lập đồng bộ cấu hình giữa server và proxies để đảm bảo các rule, templates và discovery được áp dụng nhất quán trên toàn hệ thống.

    Quản lý ha và redundancy

    • Áp dụng cơ chế High availability cho các thành phần then chốt (server và/hoặc proxy) để giảm thiểu thời gian gián đoạn dịch vụ khi thay đổi hoặc gặp sự cố.
    • Thiết kế topology sao cho proxy có thể hoạt động độc lập khi server gặp sự cố, và dữ liệu được đồng bộ khi khôi phục.

    Bảo mật và mã hóa liên lạc

    Đảm bảo liên lạc giữa các thành phần được bảo mật bằng các cơ chế mã hóa. Zabbix hỗ trợ Encryption với các hình thức:

    • Sử dụng chứng chỉ (certificates) để thiết lập TLS giữa các thành phần.
    • Sử dụng khóa chia sẻ trước (PSK) khi thiết lập kết nối giữa các thành phần.

    Làm chủ vòng đời và hiệu suất truy vấn

    • Cân nhắc số lượng poller, trappers và các yếu tố xử lý liên quan trong Zabbix server để phù hợp với tải mong đợi. Các yếu tố này được đề cập trong khung quản trị chung của tài liệu Zabbix và có thể được điều chỉnh thông qua cấu hình phù hợp với môi trường của bạn.
    • Sử dụng template và discovery để tinh gọn dữ liệu thu thập được, tránh tạo quá nhiều item tĩnh ngoài phạm vi cần thiết.

    Cấu hình và triển khai thực tế

    Để vận hành trên môi trường production, hãy cân nhắc các kịch bản triển khai phổ biến sau:

    Mô hình một server, nhiều proxy

    Đối với quy mô vừa và lớn, bạn có thể triển khai một Zabbix server duy nhất phối hợp với nhiều proxy ở các khu vực khác nhau. Server chịu trách nhiệm tổng hợp dữ liệu, trong khi proxies đảm bảo thu thập dữ liệu và gửi về server. Quá trình đồng bộ cấu hình giữa server và proxies được hỗ trợ để đảm bảo tính nhất quán.

    Mô hình HA cho server hoặc proxy

    Trong môi trường yêu cầu mức sẵn sàng cao, xem xét triển khai các giải pháp HA cho server và/hoặc proxy. Tài liệu Zabbix mô tả rõ ràng khái niệm HA ở các thành phần khác nhau của hệ thống.

    Tiêu chuẩn hóa và quản trị cấu hình

    Quản lý cấu hình từ một nguồn duy nhất và sử dụng các template, discovery rule, và prototypes để tự động hóa việc mở rộng giám sát, giảm thiểu công sức vận hành và tránh sai lệch cấu hình giữa các máy chủ và proxy.

    An ninh thông tin và quản trị access

    Đảm bảo quyền truy cập phù hợp cho người dùng và nhóm người dùng, đồng thời áp dụng cơ chế bảo mật liên lạc như đã nêu ở phần Encryption và chuẩn bị khóa và chứng chỉ cho hệ thống.

    <h2 Cấu hình chi tiết cho hành động và giám sát hiệu năng

    Trong tài liệu Zabbix có phần Quickstart và phần khám phá (Discovery) cũng như các công cụ quản trị khác. Đây là cơ sở để bạn thiết lập các yếu tố nhằm tối ưu hóa hiệu năng:

    • Quickstart hướng dẫn cách đăng nhập, thêm host, tạo item và trigger để có được nền tảng giám sát nhanh chóng và có thể mở rộng sau này.
    • Discovery và low-level discovery (LLD) cho tự động phát hiện và đưa ra các prototypes cho item, trigger và graph, giúp giảm thời gian vận hành và tăng hiệu quả quản trị.
    • Templates và template groups để chuẩn hóa cách giám sát cho các hệ thống khác nhau, đồng thời dễ dàng nhân rộng khi mở rộng hạ tầng.
    <h2 Ví dụ triển khai thực tế

    Dưới đây là một bối cảnh minh họa cho việc tối ưu hiệu năng trên quy mô trung bình đến lớn:

    • Một Zabbix server chịu trách nhiệm tổng hợp và phân tích dữ liệu từ các proxies ở 3 khu vực, mỗi proxy đảm nhận dữ liệu từ 10–50 hosts tùy khu vực.
    • Sử dụng TLS cho liên lạc giữa server và proxies; sử dụng PSK cho kết nối giữa các thành phần khi cần thiết.
    • Thiết lập discovery rules và item prototypes để tự động mở rộng giám sát mà không phụ thuộc vào việc cấu hình thủ công từng host.
    <h2 Bảo mật và quản trị quyền truy cập

    Trong các triển khai production, cần thực hiện các biện pháp bảo mật được Zabbix nêu trong phần Encryption:

    • Thiết lập chứng chỉ (certificates) để mã hóa liên lạc giữa các thành phần.
    • Sử dụng khóa chia sẻ trước (PSK) cho các thiết lập liên lạc giữa server và proxy khi phù hợp.
    <h2 Giám sát và observability

    Để đảm bảo hệ thống hoạt động ổn định, cần theo dõi các chỉ số liên quan đến hiệu năng và sức khỏe của Zabbix runtime, cũng như trạng thái của các thành phần trong kiến trúc phân tán. Việc kiểm tra các log, trạng thái dịch vụ và sự sẵn sàng của front-end (web interface) là các hoạt động vận hành hàng ngày. Bạn có thể dựa vào các phần Quickstart và các phần cấu hình trong tài liệu Zabbix để thiết lập các báo cáo và cảnh báo phù hợp với nhu cầu và SLAs của tổ chức.

    <h2 Validation và kiểm tra vận hành

    Để xác thực hoạt động tối ưu của hệ thống sau khi triển khai, thực hiện theo các bước sau:

    1. Kiểm tra trạng thái của các dịch vụ Zabbix: server, agent và proxy nếu có.
      systemctl status zabbix-server
      systemctl status zabbix-agent
      systemctl status zabbix-proxy <if_used>
    2. Đăng nhập vào giao diện web và xác nhận các host đã được liệt kê đúng theo cấu hình.
    3. Tạo mới một host và một item đơn giản, rồi xác nhận item chạy và dữ liệu được lưu trữ.
    4. Kiểm tra discovery và templates để đảm bảo tự động hóa đang hoạt động đúng như mong đợi.
    5. Kiểm tra cơ chế gửi thông báo khi có sự cố (media types, actions) phù hợp với quy trình vận hành.
    <h2 Final operational checklist
    • Kiểm tra topology và sự có mặt của server và proxies (nếu có) trong hệ thống phân tán.
    • Đảm bảo TLS/PSK được thiết lập cho các kết nối giữa các thành phần và tuân thủ chính sách bảo mật của bạn.
    • Đảm bảo Discovery và Templates đang được áp dụng đúng cho các hệ thống mới và đang mở rộng.
    • Theo dõi các log của Zabbix để kịp thời phát hiện sự cố và điều chỉnh cấu hình nếu cần.
    • Rà soát cấu hình và vận hành hàng tuần để đảm bảo không có lỗ hổng cấu hình và hiệu suất đáp ứng nhu cầu.
    <h2 Kết luận

    Việc tối ưu hiệu năng Zabbix trên Ubuntu 22.04+ liên quan đến thiết kế kiến trúc phân tán, sử dụng proxy để phân tải, áp dụng bảo mật mạnh mẽ và tận dụng các công cụ tự động hóa như discovery, templates và low-level discovery. Bằng cách kết hợp các yếu tố này với quản trị và vận hành chuẩn mực, bạn có thể đạt được hiệu năng giám sát ổn định và khả năng mở rộng phù hợp cho môi trường production của mình. Hướng dẫn và các khuyến nghị ở trên dựa trên các khía cạnh được mô tả trong tài liệu Zabbix 7.4 và các phần liên quan, và được trình bày ở mức khung thực tiễn cho hệ thống Ubuntu 22.04+.

    Các lệnh Linux cơ bản (Phần 1)

    Giới thiệu

    Linux là một hệ điều hành mạnh mẽ, được sử dụng rộng rãi trong các máy chủ, hệ thống nhúng và các ứng dụng phát triển phần mềm. Để khai thác tối đa khả năng của Linux, việc nắm vững các lệnh cơ bản là điều cần thiết. Trong bài viết này, chúng ta sẽ tìm hiểu về những lệnh Linux cơ bản nhất mà mọi người dùng Linux đều nên biết để quản lý tập tin, thư mục và hệ thống một cách hiệu quả.

    File Commands :

    ls – Liệt kê tập tin và thư mục

    • Ý nghĩa: Hiển thị danh sách các tập tin và thư mục trong thư mục hiện tại.
    • Cách dùng:
    ls
    ls -l      # Hiển thị chi tiết với quyền truy cập, kích thước, ngày tháng
    ls -a      # Hiển thị tất cả các tập tin, bao gồm các tập tin ẩn
    ls -lh     # Hiển thị kích thước tập tin với định dạng dễ đọc (KB, MB, GB)

    cd – Thay đổi thư mục làm việc

    • Ý nghĩa: Di chuyển đến thư mục khác.
    • Cách dùng:
    cd /path/to/directory    # Di chuyển đến thư mục chỉ định
    cd ..                    # Di chuyển lên một thư mục cấp cao hơn
    cd ~                     # Di chuyển đến thư mục home của người dùng

    pwd – Hiển thị thư mục hiện tại

    • Ý nghĩa: In ra đường dẫn tuyệt đối của thư mục hiện tại.
    • Cách dùng
    pwd

    cp – Sao chép tập tin hoặc thư mục

    • Ý nghĩa: Sao chép một tập tin hoặc thư mục từ vị trí này sang vị trí khác.
    • Cách dùng
    cp file1.txt file2.txt          # Sao chép file1.txt thành file2.txt
    cp -r dir1/ dir2/               # Sao chép thư mục dir1 sang thư mục dir2

    mv – Di chuyển hoặc đổi tên tập tin/thư mục

    • Ý nghĩa: Di chuyển tập tin/thư mục hoặc đổi tên nó.
    • Cách dùng
    mv file1.txt /newpath/         # Di chuyển file1.txt vào thư mục mới
    mv oldname.txt newname.txt     # Đổi tên file từ oldname.txt sang newname.txt

    rm – Xóa tập tin hoặc thư mục

    • Ý nghĩa: Xóa tập tin hoặc thư mục.
    • Cách dùng
    rm file1.txt           # Xóa tập tin file1.txt
    rm -r dir1/            # Xóa thư mục dir1 và các tập tin trong đó
    rm -f file1.txt        # Xóa mà không có thông báo xác nhận

    cat – Hiển thị nội dung tập tin

    • Ý nghĩa: Hiển thị nội dung của một hoặc nhiều tập tin lên màn hình.
    • Cách dùng
    cat file1.txt                # Hiển thị nội dung của file1.txt
    cat file1.txt file2.txt      # Hiển thị nội dung của cả hai tập tin

    more – Hiển thị nội dung tập tin theo trang

    • Ý nghĩa: Hiển thị nội dung của tập tin theo từng trang để dễ đọc hơn.
    • Cách dùng
    more file1.txt

    head – Hiển thị các dòng đầu của tập tin

    • Ý nghĩa: Hiển thị các dòng đầu tiên của một tập tin (mặc định là 10 dòng).
    • Cách dùng
    head file1.txt              # Hiển thị 10 dòng đầu tiên của file1.txt
    head -n 20 file1.txt        # Hiển thị 20 dòng đầu tiên của file1.txt

    tail – Hiển thị các dòng cuối của tập tin

    • Ý nghĩa: Hiển thị các dòng cuối cùng của một tập tin (mặc định là 10 dòng).
    • Cách dùng
    tail file1.txt              # Hiển thị 10 dòng cuối của file1.txt
    tail -n 20 file1.txt        # Hiển thị 20 dòng cuối cùng của file1.txt

    ln – Tạo liên kết đến tập tin

    • Ý nghĩa: Tạo liên kết cứng (hard link) hoặc liên kết mềm (symbolic link) đến một tập tin.
    • Cách dùng
    ln file1.txt link1.txt        # Tạo liên kết cứng
    ln -s file1.txt link1.txt     # Tạo liên kết mềm (symbolic link)

    chmod – Thay đổi quyền truy cập tập tin

    • Ý nghĩa: Thay đổi quyền truy cập (read, write, execute) cho tập tin hoặc thư mục.
    • Cách dùng
    chmod 755 file1.txt           # Cấp quyền đọc, ghi, thực thi cho chủ sở hữu và đọc, thực thi cho người dùng khác
    chmod u+x file1.txt           # Thêm quyền thực thi cho chủ sở hữu

    chown – Thay đổi chủ sở hữu và nhóm của tập tin

    • Ý nghĩa: Thay đổi chủ sở hữu hoặc nhóm của tập tin hoặc thư mục.
    • Cách dùng
    chown user:group file1.txt   # Thay đổi chủ sở hữu và nhóm của tập tin

    stat – Hiển thị thông tin chi tiết về tập tin

    • Ý nghĩa: Hiển thị thông tin chi tiết của tập tin, bao gồm quyền, kích thước, thời gian tạo/sửa đổi.
    • Cách dùng
    stat file1.txt

    Việc làm quen với các lệnh Linux cơ bản sẽ giúp bạn thao tác và quản lý hệ thống một cách dễ dàng và nhanh chóng. Mặc dù Linux có rất nhiều lệnh mạnh mẽ và linh hoạt, nhưng việc thành thạo các lệnh cơ bản là bước đầu tiên để bạn có thể tận dụng tối đa các tính năng mà hệ điều hành này mang lại. Hãy tiếp tục khám phá và thực hành để nâng cao kỹ năng sử dụng Linux của bạn!

    Apache Virtual Host

    Giới thiệu

    Apache Virtual Host là một tính năng của máy chủ web Apache cho phép bạn chạy nhiều trang web trên cùng một máy chủ vật lý. Mỗi Virtual Host có thể có cấu hình riêng biệt như tên miền, thư mục gốc, cổng, và địa chỉ IP. Điều này giúp bạn dễ dàng quản lý nhiều trang web trên cùng một máy chủ, cho phép các trang web hoạt động độc lập và bảo mật tốt hơn. Virtual Host có thể được cấu hình để hoạt động dựa trên tên miền (Name-based Virtual Host) hoặc địa chỉ IP (IP-based Virtual Host).

    Cài đặt Virtual Host :

    cd /etc/apache2/sites-available
    <VirtualHost *:80>
    
    # Admin email, Server Name (domain name), and any aliases
    ServerName mysite.com
    ServerAlias www.mysite.com
    
    # Index file and Document Root (where the public files are located)
    DocumentRoot /home/mysite/
    <Directory /home/mysite/>
            DirectoryIndex index.php
            Options -Indexes -ExecCGI +FollowSymLinks -SymLinksIfOwnerMatch
            AllowOverride All
            Require all granted
            allow from all
    </Directory>
    
            Header set Access-Control-Allow-Origin "*"
            Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
            Header set Access-Control-Allow-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type"
            Header set Access-Control-Allow-Credentials "true"
    
    #set version php apply cho website
    <FilesMatch .php$>
    
    SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://thanhnh.id.vn/"
    
    </FilesMatch>
    
    # Log file locations
    LogLevel warn
    ErrorLog /home/mysite/logs/error.log
    CustomLog /home/mysite/logs/access.log combined
    
    </VirtualHost>

    Giải thích

    1. Indexes

    • Mô tả: Khi Indexes được bật, nếu không có tệp index (như index.html), Apache sẽ tự động tạo và hiển thị danh sách các tệp trong thư mục đó.
    <Directory /var/www/html>
        Options Indexes
    </Directory>
    

    2. FollowSymLinks

    • Mô tả: Cho phép Apache theo dõi các liên kết tượng trưng (symbolic links) để truy cập tệp hoặc thư mục mà liên kết tượng trưng trỏ tới.
    <Directory /var/www/html>
        Options FollowSymLinks
    </Directory>

    3. ExecCGI

    • Mô tả: Cho phép thực thi các tệp CGI (Common Gateway Interface) trong thư mục. Thường được sử dụng cho các tập lệnh Perl hoặc Python
    <Directory /var/www/cgi-bin>
        Options ExecCGI
        AddHandler cgi-script .cgi .pl .py
    </Directory>

    4. SymLinksIfOwnerMatch

    • Mô tả: Apache chỉ theo dõi các liên kết tượng trưng nếu chủ sở hữu của liên kết tượng trưng và mục tiêu là cùng một người. Điều này tăng cường bảo mật khi sử dụng symbolic links.
    <Directory /var/www/html>
        Options FollowSymLinks SymLinksIfOwnerMatch
    </Directory>

    5. Includes

    • Mô tả: Cho phép xử lý các chỉ thị Server-Side Includes (SSI), giúp bạn chèn nội dung từ tệp khác vào tệp HTML.
    <Directory /var/www/html>
        Options Includes
    </Directory>

    6. MultiViews

    • Mô tả: Cho phép Apache chọn phiên bản tệp dựa trên phần mở rộng. Ví dụ: nếu bạn yêu cầu một tệp tên file, Apache có thể trả về file.html hoặc file.php dựa trên cài đặt cấu hình.
    <Directory /var/www/html>
        Options MultiViews
    </Directory>

    7. All

    • Mô tả: Bật tất cả các tùy chọn ngoại trừ MultiViews. Đây là tùy chọn mặc định nếu bạn không chỉ định tùy chọn nào khác.
    <Directory /var/www/html>
        Options All
    </Directory>

    8. None

    • Mô tả: Vô hiệu hóa tất cả các tùy chọn cho thư mục. Điều này có thể hữu ích nếu bạn muốn khóa các quyền xử lý trong một thư mục cụ thể.
    <Directory /var/www/html/private>
        Options None

    Development

    Chia sẻ dữ liệu giữa Docker Host và Container

    Giới thiệu

    Việc chia sẻ dữ liệu giữa Docker Host và Container là một trong những tính năng hữu ích, cho phép bạn đồng bộ hóa và quản lý thông tin một cách hiệu quả trong môi trường Docker. Nhờ đó, dữ liệu có thể dễ dàng được cập nhật, lưu trữ và sử dụng giữa hệ thống chủ và các container. Trong bài viết này, chúng ta sẽ khám phá các phương pháp chia sẻ dữ liệu phổ biến như VolumeBind Mounts, cùng các bước thực hiện chi tiết để bạn áp dụng vào công việc một cách thuận tiện.

    Container – ánh xạ thư mục máy Host:

    docker run -it -v /home/sitesdata:/home/data ubuntu

    Lúc này, dữ liệu trên thư mục /home/sitesdata/ của máy Host thì trong container có thể truy cập, cập nhật sửa đổi … thông qua đường dẫn /home/data

    Chia sẻ dữ liệu giữa các Container :

    Có container với id hoặc name là container_first, trong đó nó có mount thư mục Host vào. Giờ chạy, tạo container khác cũng nhận thư mục chia sẻ dữ liệu như container_first

    docker run -it --volumes-from container_first ubuntu

    Bạn đã tạo ra một Container nhận thư mục chia sẻ như container có ID hoặc tên là container_first tạo trước đó.

    Quản lý các ổ đĩa với docker volume

    Liệt kê danh sách các ổ đĩa:

    docker volume ls

    Tạo một ổ đĩa:

    docker volume create name_volume

    Xem thông tin chi tiết về đĩa:

    docker volume inspect name_volume

    Xóa một ổ đĩa:

    docker volume rm name_volume

    Mount một ổ đĩa vào container (–mount)

    # Tạo ổ đĩa có tên firstdisk
    docker volume create firstdisk

    Mount ổ đĩa vào container, container truy cập tại /home/firstdisk

    docker run -it --mount source=firstdisk,target=/home/firstdisk  ubuntu

    Gán ổ đĩa vào container khi tạo container (-v)

    docker volume create --opt device=path_in_host --opt type=none --opt o=bind  volumename

    Xóa tất cả các ổ đĩa không được sử dụng bởi container nào:

    docker volume prune

    Chia sẻ dữ liệu giữa Docker Host và Container là một kỹ thuật quan trọng, giúp tối ưu hóa quá trình làm việc với Docker. Bằng cách sử dụng Volume hoặc Bind Mounts, bạn có thể quản lý dữ liệu một cách linh hoạt và hiệu quả. Hãy áp dụng ngay các kiến thức này vào dự án của bạn để tận dụng tối đa sức mạnh của Docker trong việc phát triển và triển khai ứng dụng!

    Cài đặt MySQL, MariaDB trên Ubuntu

    Giới thiệu

    Cài đặt MySQL và MariaDB trên Ubuntu là một bước quan trọng để thiết lập một cơ sở dữ liệu mạnh mẽ và hiệu quả cho các ứng dụng và dịch vụ của bạn. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn từng bước để cài đặt cả MySQL và MariaDB trên hệ điều hành Ubuntu. Bạn sẽ tìm hiểu cách thực hiện cài đặt từ các kho lưu trữ chính thức, cấu hình cơ bản và các bước kiểm tra để đảm bảo rằng cơ sở dữ liệu của bạn hoạt động đúng cách. Dù bạn đang sử dụng MySQL hay MariaDB, hướng dẫn này sẽ giúp bạn thiết lập môi trường cơ sở dữ liệu ổn định và sẵn sàng cho các nhiệm vụ phát triển và quản lý.

    Install MySQL 5.7

    Add MySQL 5.7 APT Repository :

    wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb

    Install the repository :

    sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb

    Update the APT repository :

    sudo apt update

    Nếu bạn gặp lỗi ” signature couldn’t be verified ” hãy import lại GPG key :

    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29

    Chạy lại apt update

    Kiểm tra lại MySQL repository :

    sudo apt-cache policy mysql-server

    Install MySQL 5.7 :

    sudo apt install -f mysql-client=5.7* mysql-community-server=5.7* mysql-server=5.7* -y

    INSTALL MySQL 8.0

    Install MySQL 8.0:

    apt -y install mysql-server-8.0

    Verify :

    sudo mysql_secure_installation
    [sudo] password for toor: 
    
    Securing the MySQL server deployment.
    
    Enter password for user root: 
    
    VALIDATE PASSWORD COMPONENT can be used to test passwords
    and improve security. It checks the strength of password
    and allows the users to set only those passwords which are
    secure enough. Would you like to setup VALIDATE PASSWORD component?
    
    Press y|Y for Yes, any other key for No: Y
    
    There are three levels of password validation policy:
    
    LOW    Length >= 8
    MEDIUM Length >= 8, numeric, mixed case, and special characters
    STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file
    
    Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
    Using existing password for root.
    
    Estimated strength of the password: 0 
    Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y
    
    New password: 
    
    Re-enter new password: 
    
    Estimated strength of the password: 100 
    Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
    By default, a MySQL installation has an anonymous user,
    allowing anyone to log into MySQL without having to have
    a user account created for them. This is intended only for
    testing, and to make the installation go a bit smoother.
    You should remove them before moving into a production
    environment.
    
    Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
    Success.
    
    
    Normally, root should only be allowed to connect from
    'thanhnh.id.vn'. This ensures that someone cannot guess at
    the root password from the network.
    
    Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
    Success.
    
    By default, MySQL comes with a database named 'test' that
    anyone can access. This is also intended only for testing,
    and should be removed before moving into a production
    environment.
    
    
    Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
     - Dropping test database...
    Success.
    
     - Removing privileges on test database...
    Success.
    
    Reloading the privilege tables will ensure that all changes
    made so far will take effect immediately.
    
    Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
    Success.
    
    All done! 

    MariaDB 11.4.x

    sudo apt-get install apt-transport-https curl
    sudo mkdir -p /etc/apt/keyrings
    sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'

    Sau khi đã Import Key, copy và paste dòng dưới vào /etc/apt/sources.list.d (for instance /etc/apt/sources.list.d/mariadb.sources):

    # MariaDB 11.4 repository list - created 2024-09-02 14:54 UTC
    # https://mariadb.org/download/
    X-Repolib-Name: MariaDB
    Types: deb
    # deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
    # URIs: https://deb.mariadb.org/11.4/ubuntu
    URIs: https://vn-mirrors.vhost.vn/mariadb/repo/11.4/ubuntu
    Suites: focal
    Components: main main/debug
    Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp

    Install MariaDB :

    sudo apt-get update
    sudo apt-get install mariadb-server

    Việc cài đặt MySQL và MariaDB trên Ubuntu không chỉ cung cấp cho bạn một nền tảng cơ sở dữ liệu mạnh mẽ mà còn giúp bạn bắt đầu nhanh chóng với các dự án phát triển và quản lý dữ liệu. Đừng quên kiểm tra và cập nhật hệ thống thường xuyên để duy trì sự ổn định và bảo mật !

    Các lệnh Linux cơ bản (Phần 2)

    Giới thiệu

    Linux là một hệ điều hành mạnh mẽ, được sử dụng rộng rãi trong các máy chủ, hệ thống nhúng và các ứng dụng phát triển phần mềm. Để khai thác tối đa khả năng của Linux, việc nắm vững các lệnh cơ bản là điều cần thiết. Trong bài viết này, chúng ta sẽ tìm hiểu về những lệnh Linux cơ bản nhất mà mọi người dùng Linux đều nên biết để quản lý tập tin, thư mục và hệ thống một cách hiệu quả.

    KẾT NỐI SSH

    • ssh user@host – kết nối đến host với user
    • ssh -p port user@host – kết nối có chỉ ra port

    CÀI ĐẶT SOFTWARE

    • ./configure
      make
      make install

    LỆNH VỀ MẠNG – NETWORK

    • ping host – ping đến host
    • dig domain – lấy thông tin DNS cho domain
    • wget file – tải file
    • curl –head url – xem phần header của URL

    THÔNG TIN HỆ THỐNG

    • date – ngày/tháng giờ hiện tại
    • cal – lịch tháng hiện tại
    • uptime – thời gian hệ thống hoạt động (kể từ khi khởi động)
    • w – xem các user đang online trong hệ thống
    • whoami – tài khoản đang đăng nhập
    • uname -a – thông tin hệ thống linux
    • cat /proc/cpuinfo – thông tin CPU
    • cat /proc/meminfo – thông tin bộ nhớ
    • df – thông tin đĩa cứng
    • df -BM – thông tin đĩa cứng
    • du – thông tin thư mục
    • du -sh – thông tin thư mục
    • du –max-depth=1 -B M |sort -rn – thông tin thư mục, xếp theo dung lượng
    • free – thông tin bộ nhớ trống và swap

    TÌM KIẾM – SEARCHING

    • grep ‘word’ file1 file2 … – tìm kiếm ‘word’ trong file1, file2 …
    • grep -rnw ‘/path/to/somewhere/’ -e ‘word’ – tìm kiếm các file chứa ‘word’ trong thư mục
    • locate “*.png” – tìm vị trí theo tên file

    PROCESS

    • top – các tiến trình đang chạy
    • ps -aux – các tiến trình đang chạy
    • kill -9 PID – dừng tiến trình PID
    • killall [process name] – dừng tiến trình

    FILE PERMISSION

    • chmod octal file – thay đổi permission
      octal con số bát phân (1)(2)(3) thể hiện permision (rwx == read-write-execute)
    • chmod 775 file – rw cho owner, rx cho group/world
    • chmod 777 file – file rwx cho tất các các user
    • chmod -R 755 directory-name/ – thiết lập cho toàn thư mục
    • chown -R owner:group file/directory – đổi owner|group của file

    NÉN FILE

    • tar -cvf /tenfilenen.tar /thu-muc-can-nen – nén thư mực vào .tar
    • tar -xvf file-nen.tar – giải nén file .tar
    • gzip file – nén file thành file.gz
    • gzip -d file.gz – giải nén file.gz

    Load Balancing Apache2, Nginx

    Giới thiệu

    Trong các hệ thống có lưu lượng truy cập cao, Load Balancing (cân bằng tải) là yếu tố cần thiết để đảm bảo hiệu suất và tính ổn định. nginx, với khả năng thiết lập Load Balancing mạnh mẽ, giúp phân phối lưu lượng truy cập giữa các server backend một cách đồng đều, giảm tải cho hệ thống và tăng cường trải nghiệm người dùng. Bài viết này sẽ hướng dẫn bạn chi tiết cách cấu hình Load Balancing với Apache2, giúp hệ thống của bạn hoạt động hiệu quả hơn.

    Yêu cầu ở bài này

    • 2 Node xử lý
    • 1 Node Source Code
    • 1 Node Redis Cache
    • 1 Node MySql

    1. Thiết lập sử dụng chung Share Source Code

    Thiết lập sử dụng chung Share Source Code cho Load Balancing là một phương pháp tối ưu hóa việc quản lý mã nguồn trong hệ thống cân bằng tải. Trong kiến trúc Load Balancing, các máy chủ backend (backend servers) xử lý lưu lượng truy cập được phân phối đều từ Load Balancer. Để đảm bảo tính đồng nhất trong việc xử lý, các máy chủ này cần sử dụng chung một bộ mã nguồn (source code).

    Mục đích của việc chia sẻ Source Code trong Load Balancing:

    1. Đảm bảo Tính Đồng Nhất:
      Tất cả các máy chủ backend sử dụng cùng một phiên bản mã nguồn, tránh tình trạng khác biệt giữa các máy chủ.
    2. Dễ Dàng Cập Nhật:
      Khi cần cập nhật hoặc triển khai phiên bản mới, bạn chỉ cần thực hiện trên một thư mục được chia sẻ thay vì cập nhật từng máy chủ riêng lẻ.
    3. Tăng Tính Hiệu Quả:
      Việc chia sẻ mã nguồn giúp giảm thiểu chi phí quản trị, nhất là với số lượng lớn máy chủ backend.

    Cài đặt NFS Server ở nơi quản lý Source Code (Node Source Code)

    sudo apt update
    sudo apt install nfs-kernel-server

    Tạo thư mục chia sẻ

    sudo mkdir /var/nfs/general
    sudo chown nobody:nogroup /var/nfs/general

    Cấu hình NFS Export

    sudo nano /etc/exports
    /var/nfs/general 192.168.1.10(rw,sync,no_subtree_check) 192.168.1.11(rw,sync,no_subtree_check) 192.168.1.12(rw,sync,no_subtree_check)
    • Replace 192.168.1.10, 192.168.1.11, and 192.168.1.12 with the IP addresses of your load-balanced servers.
    • rw: Read/write permission.
    • sync: Ensures changes are written to disk before responses are sent.
    • no_subtree_check: Improves reliability.

    Apply cấu hình

    sudo exportfs -a
    sudo systemctl restart nfs-kernel-server

    Cấu hình FIrewall (Tuỳ chọn)

    sudo ufw allow from 192.168.1.0/24 to any port nfs

    Cấu hình NFS Clients (các node xử lý source code)

    Cài đặt NFS Client

    sudo apt update
    sudo apt install nfs-common

    Mount vào thư mục được chia sẻ ở trên

    sudo mkdir /mnt/nfs/general
    sudo mount 192.168.1.100:/var/nfs/general /mnt/nfs/general
    • Replace 192.168.1.100 with the IP address of your control server

    Đảm bảo thư mục được Mount vĩnh viễn

    sudo nano /etc/fstab
    
    192.168.1.11:/var/nfs/general /mnt/nfs/general nfs rw,sync,hard,intr 0 0
    192.168.1.12:/var/nfs/general /mnt/nfs/general nfs rw,sync,hard,intr 0 0
    
    mount -a

    Cấu hình nâng cao (optional)

    192.168.1.11:/var/nfs/general /mnt/nfs/general nfs defaults,retry=5,timeo=14,hard,intr 0 0
    • retry=5: Tùy chọn này cố gắng kết nối lại với máy chủ NFS trong một số phút nhất định nếu kết nối bị mất.
    • timeo=14: Điều chỉnh khoảng thời gian chờ cho các yêu cầu NFS. Giá trị thấp hơn có nghĩa là phát hiện lỗi nhanh hơn.
    • hard: Điều này đảm bảo rằng máy khách sẽ tiếp tục cố gắng kết nối lại vô thời hạn cho đến khi máy chủ trực tuyến trở lại. Đối với các ứng dụng yêu cầu độ tin cậy, tùy chọn này được ưu tiên vì nó chờ máy chủ hoạt động trở lại
    • intr: Cho phép ngắt kết nối NFS, giúp ngăn máy khách không phản hồi trong thời gian máy chủ ngừng hoạt động.
    • Hard Mount (Khuyến nghị): Với tùy chọn cứng, nếu máy chủ NFS ngừng hoạt động, máy khách sẽ bị treo và tiếp tục cố gắng kết nối lại cho đến khi máy chủ trực tuyến trở lại. Điều này tốt hơn để đảm bảo tính toàn vẹn của dữ liệu vì nó tránh mất dữ liệu âm thầm nhưng có thể khiến các quy trình phải đợi cho đến khi máy chủ khả dụng trở lại.
    • Soft Mount: Với tùy chọn mềm, NFS sẽ cố gắng kết nối lại một vài lần và sau đó trả về lỗi nếu không thể kết nối với máy chủ. Điều này có thể gây mất dữ liệu nhưng có thể tốt hơn cho các ứng dụng ít quan trọng hơn.

    Automatic Remount với systemd (optional)

    Tạo mới 1 systemd

    sudo nano /etc/systemd/system/remount-nfs.service
    [Unit]
    Description=Remount NFS on connection failure
    After=network-online.target
    
    [Service]
    Type=oneshot
    ExecStart=/bin/mount -a
    
    [Install]
    WantedBy=multi-user.target

    Enable Service:

    sudo systemctl enable remount-nfs.service

    NGINX Reverse Proxy

    Truy cập Virtual Host Nginx:

    cd /etc/nginx/sites-available
    nano virtualhost.conf
    server {
            listen 80;
            listen [::]:80;
            server_name virtualhost;
    
            return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name virtualhost;
    
        ssl_certificate /etc/letsencrypt/live/virtualhost/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/virtualhost/privkey.pem;
    
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;
    
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    
        #block Googlebot
        if ($http_user_agent ~ "Googlebot") {
            return 410;
        }
    
        location / {
    
            auth_basic           "Private’s Area";
            auth_basic_user_file /etc/nginx/.htpasswd;
    
            #access_log off;
            access_log /var/log/nginx/access.log;
            error_log /var/log/nginx/error.log;
    
            proxy_set_header Accept-Encoding "";
    
            proxy_buffers 4 256k;
            proxy_buffer_size 128k;
            proxy_busy_buffers_size   256k;
    
            #1 hour timeout
            proxy_read_timeout 3600;
            #proxy_connect_timeout 600;
            #proxy_send_timeout 600;
            #send_timeout 600;
            proxy_pass http://virtualhost;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-SSL on;
            proxy_set_header X-Forwarded-Proto $scheme;
            # Add HSTS header with preload.
            add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
        }
    }
    
    upstream virtualhost {
        ip_hash;
    
        # Primary servers
        server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
        server 192.168.1.12 max_fails=3 fail_timeout=30s;
    
        # Backup server
        server backup.example.com:80 backup;
    }

    Về cụ thể các thể loại Load Balancing, mình sẽ viết 1 bài riêng nhé

    Load Balancing Nginx mang lại sự linh hoạt và hiệu quả trong việc quản lý lưu lượng truy cập lớn, đảm bảo hệ thống hoạt động ổn định và tối ưu. Với các tính năng mạnh mẽ như upstream, health checks, và khả năng hỗ trợ nhiều phương pháp cân bằng tải, Nginx là công cụ lý tưởng cho mọi ứng dụng web. Hãy áp dụng ngay hôm nay để cải thiện hiệu suất và khả năng mở rộng của hệ thống bạn!

    Zabbix Monitoring

    Giới thiệu

    Trong thế giới công nghệ hiện đại, việc giám sát hệ thống và ứng dụng đóng vai trò thiết yếu trong việc duy trì hiệu suất và độ tin cậy. Zabbix Monitoring là một công cụ mã nguồn mở mạnh mẽ, cho phép bạn theo dõi tài nguyên, hiệu suất và sức khỏe của toàn bộ hệ thống, từ các server vật lý đến môi trường đám mây. Với tính năng mạnh mẽ, Zabbix hỗ trợ quản trị viên dễ dàng phát hiện và xử lý các vấn đề trước khi chúng trở thành sự cố lớn.

    Zabbix là một giải pháp giám sát hạ tầng (mã nguồn mở) cấp độ doanh nghiệp (high-level enterprise) cực kỳ mạnh mẽ và phổ biến. Chính vì vậy đội ngũ phát triển của Zabbix thường xuyên bổ xung thêm nhiều tính năng, template và hỗ trợ nhiều service mới trong các bản cập nhật để bắt kịp tốc độ “sinh sôi” SaaS của những “ông lớn” công nghệ.

    Tuy nhiên, với một đòn đau từ Red Hat (ngưng hỗ trợ CentOS 7 đến hết 30/6/2024 và CentOS 8 đến hết năm 2021) nhằm mục đích ép một lượng lớn người dùng chuyển sang bản OS trên nền tảng cloud (bản quyền).

    Bài viết này sử dụng :

    • Ubuntu Server 20.04
    • Zabbix 5.4
    • PHP 7.4
    • Nginx 1.8
    • MariaDB 10.0

    Cài đặt LEMP STACK ( Nginx Web Server, PHP7.4, PHP7.4-FPM, MARIADB)

    1. Cài đặt nginx
    2. Zabbix 5.4 yêu cầu chạy trên web server nên ta cần cập nhật ubuntu và cài đặt nginx
    $ sudo apt update
    $ sudo apt install nginx
    •  Sau khi quá trình cài đặt nginx server hoàn tất, bạn khởi động Nginx, kích hoạt Nginx (tự động khởi động khi hệ thống reboot) và kiểm tra trạng thái Nginx bằng những tập lệnh bên dưới.
    $ sudo systemctl start nginx
    $ sudo systemctl enable nginx
    $ sudo systemctl status nginx
    • Cấu hình tường lửa cho phép HTTP & HTTPS đi qua bằng tập lệnh dưới đây
    $ sudo ufw allow 80/tcp
    $ sudo ufw allow 443/tcp
    $ sudo ufw reload
    • Kiểm tra lại hoạt động của nginx bằng http(s)://IP-Address/
    • Cài đặt PHP7 hỗ trợ cho nginx.
      • Kích hoạt PPA cho PHP trên trên hệ thống Ubuntu bằng tập lệnh sau :
    $ sudo apt-get install software-properties-common
    $ sudo add-apt-repository ppa:ondrej/php
    • Server của bạn đã được thiết lập để cài đặt PHP từ PPA repository. Sử dụng một trong những lệnh bên dưới để cài đặt PHP 7.0, PHP 7.1, PHP 7.2 hoặc PHP 7.3:
    $ sudo apt-get update
    ## Install PHP 7.4
    $ sudo apt-get install -y php7.4
    $ sudo php -v
    • Kiểm tra cài đặt PHP modules.

    Sau khi cài đặt một phiên bản PHP 7.x trên server, bạn có thể sử dụng lệnh bên dưới để tìm những PHP modules có sẵn trong gói PPA repository:

    $ sudo apt-cache search php7*
    • Cài đặt module cần thiết cho Zabbix
    $ sudo apt-get install php7.4-mysql php7.4-curl php7.4-json php7.4-cgi php7.4-xsl
    • Kiểm tra hoạt động của PHP
    $ sudo systemctl status php7.4-fpm
    • Mở file cấu hình Nginx mặc định /etc/nginx/sites-available/default bằng lệnh sau:
    # nano /etc/nginx/sites-available/default

    Để Nginx server có thể xử lý được các file kịch bản PHP (fastcgi script), bạn cần tìm đến giá trị location trong server block và thêm những dòng như bên dưới.

    location ~ .php$ {
             include snippets/fastcgi-php.conf;
    #       # With php-fpm (or other unix sockets):
             fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    #       # With php-cgi (or other tcp sockets):
    #       fastcgi_pass 127.0.0.1:9000;
    }
    • Để xem toàn bộ hệ thống PHP trên ubuntu, ta tạo file php.info trong Nginx Document Root, khởi động lại nginx và php-fpm rồi mở trình duyệt truy cập.
    $ sudo echo "<?php phpinfo();?>" > /var/www/html/info.php 
    $ sudo systemctl restart nginx 
    $ sudo systemctl restart php7.3-fpm

    Http://<ip-address>/info.php

    • Cài đặt và cấu hình Maria Database.

    8.1 Cài đặt thêm repository vào hệ thống :

    $ sudo apt-get install software-properties-common

    8.2 Thực thi lệnh để thêm Repsitory Key vào hệ thống :

    $ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

    8.3 Sau khi thêm Repository Key vào hệ thống, ta add URL Repository URL vào hệ thống :

    sudo add-apt-repository 'deb [arch=amd64] http://mirror.zol.co.zw/mariadb/repo/10.3/ubuntu bionic main'

    8.4. Thực thi cài đặt Maria Database

    $ sudo apt update
    
    $ sudo apt -y install mariadb-server mariadb-client

    8.5. Kiểm tra trạng thái MariaDB

    8.6. Kiểm tra trạng thái Database

    $ sudo mysql -u root -p
    MariaDB > show databases;
    • Bật chạy nền cho nginx, php, mariadb
    $ sudo systemctl enable mariadb 
    $ sudo systemctl enable nginx
    $ sudo systemctl enable php7.4-fpm
    • Cài đặt Zabbix-Server, Zabbix-PHP-Frontend, Zabbix-Agent

    10.1 Cài đặt Zabbix Repository

    wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.4-1%2Bfocal_all.deb
    dpkg -i zabbix-release_5.0-1+focal_all.deb
    apt update

    10.2 Cài đặt Zabbix Server, Zabbix PHP Frontend

    # apt install zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-sql-scripts zabbix-agent
    1. Tạo Database lưu trữ dữ liệu Zabbix

    11.1 Bạn cần tạo một RDBMS database để lưu trữ dữ liệu của Zabbix. Truy cập vào MySQL/MariaDB. khởi tạo một Zabbix database và gán quyền quản lý database cho một user bằng cách thực thi lần lượt những lệnh sau:

    # mysql -u root -p
    
    MariaDB [(none)]> create database zabbixdb character set utf8 collate utf8_bin;
    MariaDB [(none)]> grant all privileges on zabbixdb.* to 'zabbixuser'@'thanhnh.id.vn' identified by 'your_password';
    MariaDB [(none)]> flush privileges;
    MariaDB [(none)]> exit

    11.2 Import cấu trúc Zabbix Server vào Maria DB

    # zcat /usr/share/doc/zabbix-sql-scripts/mysql/create.sql.gz | mysql -uzabbix -p zabbix

         11.3 Mở File cấu hình Zabbix-Server và thiết lập tham số

    # nano  /etc/zabbix/zabbix_server.conf

    Tìm và điều chỉnh các giá trị kết nối database như DBHost, DBName, DBUser  DBPassword trong file zabbix_server.conf tương tự như hình ảnh bên dưới.

    11.4 Khởi động lại Zabbix Server để áp dụng các thiết lập

    # systemct restart zabbix-server

    11.5 Mở File Zabbix Agent để thiết lập Listen Port

    # nano  /etc/zabbix/zabbix_agentd.conf

    11.6 Khởi động lại Zabbix Agent để áp dụng các thiết lập

    # systemctl restart zabbix-agent

    11.7 Tạo một Virtual Host để Nginx có thể hosting với Zabbix với domain. Tạo một file nano /etc/sites-available/zabbix.conf

    server {
    
        listen       81;
    
        server_name  zabbix.domain.local;
        #charset koi8-r;
        access_log  /var/log/nginx/zabbix.domain.local.access.log;
        error_log  /var/log/nginx/zabbix.domain.local.error.log;
    
        location / {
            root   /usr/share/zabbix/;
            index  index.php index.html index.htm;
         # include the "?$args" part so non-default permalinks doesn't break when using query string
            try_files $uri $uri/ /index.php?$args;
        }
    
        location ~ .php$ {
            root   /usr/share/zabbix/;
            fastcgi_index  index.php;
            # With php-fpm (or other unix sockets):
            fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
            fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
            fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
            include        fastcgi_params;
        }
    }

    11.8 Kế đến, tạo một symbolic link từ /etc/nginx/sites-available/zabbix.conf tới /etc/nginx/sites-enable/zabbix.conf

    ln -s /etc/nginx/sites-available/zabbix.conf /etc/nginx/sites-enabled/
    1.  Khởi động lại Nginx
    systemctl restart nginx
    1.  Mở web cài đặt : http://<ip-address>:81

    Bấm Next, kiểm tra các điều kiện của PHP. Nếu sai, hãy chỉnh sửa trong file

      sudo nano /etc/php/7.4/fpm/php.ini

    1. Sau khi kiểm tra các cài đặt thành công, bấm Next để tiếp tục cài đặt.

    Kiểm tra các cài đặt khớp với các cài đặt ở trên rồi bấm Next để Zabbix connect với Database.

    Đăng nhập với :

             Username : Admin

             Password  : zabbix

    Vậy đã hoàn thành cài đặt Zabbix Monitoring 5.4 trên Ubuntu 20.04

    Zabbix Monitoring không chỉ là công cụ giám sát mạnh mẽ mà còn là trợ thủ đắc lực giúp bạn duy trì hiệu suất tối ưu và đảm bảo tính ổn định cho hệ thống. Bằng cách triển khai Zabbix một cách hiệu quả, bạn có thể chủ động phát hiện và giải quyết các vấn đề kịp thời. Hãy bắt đầu khám phá Zabbix Monitoring ngay hôm nay để nâng cao năng lực quản lý hệ thống của bạn!

    Tối ưu nén file Nginx

    Mô tả

    Tối ưu nén file Nginx là một phương pháp quan trọng nhằm cải thiện hiệu suất và tốc độ tải trang web. Bằng cách sử dụng các kỹ thuật nén như Gzip hoặc Brotli, Nginx có thể giảm kích thước của các tệp tin trước khi chúng được gửi tới trình duyệt của người dùng. Điều này không chỉ giúp tiết kiệm băng thông mà còn giảm thời gian tải trang, nâng cao trải nghiệm người dùng và tối ưu hóa tài nguyên máy chủ. Để triển khai hiệu quả, cần cấu hình đúng các tham số nén và đảm bảo các loại tệp tin cần thiết được nén, đồng thời kiểm tra hiệu suất để đảm bảo không ảnh hưởng đến hoạt động của hệ thống.

    Phần 1 : Tối ưu với Gzip

    Mở file cấu hình Nginx:

    Thường thì file này nằm ở đường dẫn /etc/nginx/nginx.conf hoặc /etc/nginx/conf.d/default.conf.

    Thêm hoặc chỉnh sửa các dòng cấu hình gzip:

    Thêm các dòng sau vào block http trong file cấu hình:

    http {
        gzip on; 
        gzip_comp_level 5;
        gzip_min_length 256; 
        gzip_buffers 16 8k; 
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_proxied any; 
        gzip_vary on; 
    }
    

    Bật nén Gzip.

    gzip on;
    gzip_static  on;
    

    Bật nén cho cả HTTP/1.0 và HTTP/1.1.

    gzip_http_version  1.1;
    

    Mức độ nén (1-9). 5 là một sự cân bằng hoàn hảo giữa size và mức sử dụng CPU, cung cấp khoảng 75% giảm kích thước cho hầu hết các tệp ASCII (gần như giống hệt mức độ 9).

    gzip_comp_level    5;
    

    Không nén bất cứ thứ gì đã nhỏ và không có khả năng giảm kích thước nhiều nếu có. (mặc định là 20 byte, điều này không hợp lý vì thường dẫn đến tệp lớn hơn sau khi nén)

    gzip_min_length 256;

    Nén dữ liệu ngay cả đối với các client kết nối với chúng ta qua proxy, được xác định bởi header “Via” (cần thiết cho CloudFront).

    gzip_proxied any;

    **Yêu cầu proxy lưu trữ cả phiên bản đã nén và không nén của tài nguyên bất cứ khi nào tiêu đề khả năng Accept-Encoding của client thay đổi; **

    • Tránh vấn đề khi một client không có khả năng gzip (rất hiếm ngày nay) sẽ hiển thị ký tự lộn xộn nếu proxy của họ đưa cho họ phiên bản đã nén.
    gzip_vary          on;
    

    Nén tất cả các đầu ra được gắn nhãn với một trong các MIME-types sau.

    # text/html luôn được nén bởi HttpGzipModule
    gzip_types
    application/atom+xml
    application/javascript
    application/json
    application/rss+xml
    application/vnd.ms-fontobject
    application/x-font-ttf
    application/x-web-app-manifest+json
    application/xhtml+xml
    application/xml
    font/opentype
    image/svg+xml
    image/x-icon
    text/css
    text/plain
    text/x-component;

    Test lại nginx :

    nginx -t 
    service nginx restart

    Phần 2 : Tối ưu nginx với nén Brotli

    Chuẩn bị package cần thiết :

    apt-get update -y
    apt-get install dpkg-dev curl gnupg2 build-essential zlib1g-dev libpcre3 libpcre3-dev unzip -y

    Tải nginx và Source Brotli

    Tải nginx :

    cd ~
    wget https://nginx.org/download/nginx-1.18.0.tar.gz
    tar zxvf nginx-1.18.0.tar.gz

    Tải Brotli :

    git clone https://github.com/google/ngx_brotli.git
    cd ~/ngx_brotli
    git submodule update --init

    Biên dịch :

    cd ~/nginx-1.18.0
    ./configure --with-compat --add-dynamic-module=../ngx_brotli
    make modules
    sudo cp ./objs/*.so /usr/lib/nginx/modules
    

    Sửa lại nginx.conf :

    cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
    nano /etc/nginx/nginx.conf

    Sau khi mở file nginx.conf bạn thêm vào 2 đoạn sau ở đầu file

    load_module modules/ngx_http_brotli_filter_module.so;
    load_module modules/ngx_http_brotli_static_module.so;

    Test Nginx và khởi động lại :

    nginx -t
    service nginx reload

    Thêm cấu hình Brotli vào vhost nginx :

    /etc/nginx/sites-available/example.conf
    brotli on;
    brotli_comp_level 6;
    brotli_static on;
    brotli_types application/atom+xml application/javascript application/json application/vnd.api+json application/rss+xml
                 application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype
                 application/x-font-ttf application/x-javascript application/xhtml+xml application/xml
                 font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon
                 image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;

    brotli_static

    • Cú pháp: brotli_static on|off|always
    • Mặc định: off
    • Ngữ cảnh: http, server, location
    • Mô tả: Bật hoặc tắt kiểm tra sự tồn tại của các tệp tin đã nén sẵn với phần mở rộng .br. Với giá trị always, tệp tin đã nén sẵn sẽ được sử dụng trong mọi trường hợp, không cần kiểm tra xem máy khách có hỗ trợ hay không.

    brotli

    • Cú pháp: brotli on|off
    • Mặc định: off
    • Ngữ cảnh: http, server, location, if
    • Mô tả: Bật hoặc tắt nén đáp ứng ngay tại thời điểm phản hồi.

    brotli_types

    • Cú pháp: brotli_types <mime_type> [..]
    • Mặc định: text/html
    • Ngữ cảnh: http, server, location
    • Mô tả: Bật nén đáp ứng ngay tại thời điểm phản hồi cho các loại MIME chỉ định thêm ngoài text/html. Giá trị đặc biệt * khớp với bất kỳ loại MIME nào. Các phản hồi với loại MIME text/html luôn được nén.

    brotli_buffers

    • Cú pháp: brotli_buffers <number> <size>
    • Mặc định: 32 4k|16 8k
    • Ngữ cảnh: http, server, location
    • Mô tả: Đã lỗi thời, bỏ qua.

    brotli_comp_level

    • Cú pháp: brotli_comp_level <level>
    • Mặc định: 6
    • Ngữ cảnh: http, server, location
    • Mô tả: Thiết lập mức độ chất lượng (nén) của nén Brotli ngay tại thời điểm phản hồi. Các giá trị chấp nhận trong khoảng từ 0 đến 11.

    brotli_window

    • Cú pháp: brotli_window <size>
    • Mặc định: 512k
    • Ngữ cảnh: http, server, location
    • Mô tả: Thiết lập kích thước cửa sổ Brotli. Các giá trị chấp nhận bao gồm: 1k, 2k, 4k, 8k, 16k, 32k, 64k, 128k, 256k, 512k, 1m, 2m, 4m, 8m16m.

    brotli_min_length

    • Cú pháp: brotli_min_length <length>
    • Mặc định: 20
    • Ngữ cảnh: http, server, location
    • Mô tả: Thiết lập độ dài tối thiểu của phản hồi sẽ được nén. Độ dài này chỉ được xác định từ trường tiêu đề phản hồi Content-Length.

    Source :

    TÌm hiểu thêm :

    MySQL : Replicate Master - Master

    Giới thiệu.

    Thiết lập MySQL Master-Master Replication là một trong những giải pháp hiệu quả để đảm bảo tính khả dụng cao và đồng bộ hóa dữ liệu giữa hai máy chủ cơ sở dữ liệu. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách cài đặt và cấu hình hệ thống sao chép Master-Master trong MySQL, giúp bạn có thể đồng bộ dữ liệu theo cả hai chiều giữa các máy chủ với Master-Master Replication

    1. Cấu hình Master Database 1 à Database 2
    	sudo nano /etc/mysql/my.cnf
    		bind-address = 0.0.0.0

    Thay đổi tiếp theo đề cập đến các server-id :

    	[mysqld]
    	server-id = 1				# Đặt ID cho server mysql 
    	log_bin = /var/log/mysql/mysql-bin.log	# khai báo lưu trữ binlog

    Tạo User trên Master 1 . User này sẽ truy cập vào Master 1 và lấy binlog về :

    	mysql1@ubuntu:~$  mysql -u root -p
    	Password:
    	mysql> CREATE USER 'Username'@'IP_Slave_Server' IDENTIFIED BY 'password';
    	Query OK, 0 rows affected (0.00 sec)

    Cấp quyền Replication cho nó :

    mysql> GRANT REPLICATION SLAVE ON *.* TO 'Username'@'IP_Slave_Server';

    Xem thông tin Master Server :

    	mysql> show master status;
    	+------------------+----------+--------------+------------------+-------------------+
    	| File                         | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    	+------------------+----------+--------------+------------------+-------------------+
    	| mysql-bin.000005 |      154 |              |                  |                   |
    	+------------------+----------+--------------+------------------+-------------------+
    	1 row in set (0.00 sec)

    Save lại thông tin “mysql-bin.000005” và Position “154“, 2 thông tin còn lại là Binlog_Do_DBBinlog_Ignore_DB để chỉ định DB nào được replicate và DB nào không được replicate

    Trên MySQL 2 -Slave 1 ( sẽ là Master 2) :

    Cấu hình file config Mysql 2 :

    	server-id = 2
    	log_bin = /var/log/mysql/mysql-bin.log

    Save lại và restart lại Mysql Server

            systemctl stop mysql && systemctl start mysql

    Khai báo Slave 1 để replicate data từ Master 1

    	$ mysql -u root -p
    	Password:
    
    	mysql> STOP SLAVE;                                  #Tắt Slave trước khi khai báo
    	Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    	mysql> CHANGE MASTER TO
    		-> MASTER_HOST='IP_Master_Server',                 #Khai ip master1 server
    		-> MASTER_USER='Username',                               #Username dành cho Slave 1 tạo ở trên
    		-> MASTER_PASSWORD='password',                     #Password của nó, tất nhiên rồi @@
    		-> MASTER_PORT=3307,                                          #Port của Master_Server nhé, vì đã đổi rồi nên là 3307. Nếu chưa đổi thì ko cần khai chỗ này. 
    		-> MASTER_LOG_FILE='mysql-bin.000005',           #Thông tin file binlog lụm được từ Master 1 status
    		-> MASTER_LOG_POS=154;                                      # Thông tin position tương ứng
    	Query OK, 0 rows affected, 2 warnings (0.01 sec)
    
    	mysql> START SLAVE;                                                          #Sau khi khai báo xong thì khởi động lại Slave
    	Query OK, 0 rows affected (0.00 sec)

    Sau khi Start Slave thì check status:

    mysql> show slave status G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 172.17.3.111
                      Master_User: repliuser
                      Master_Port: 3307
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000005
              Read_Master_Log_Pos: 154
                   Relay_Log_File: ubuntu-relay-bin.000005
                    Relay_Log_Pos: 367
            Relay_Master_Log_File: mysql-bin.000005
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: 
              Replicate_Ignore_DB: 
               Replicate_Do_Table: 
           Replicate_Ignore_Table: 
          Replicate_Wild_Do_Table: 
      Replicate_Wild_Ignore_Table: 
                       Last_Errno: 0
                       Last_Error: 
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 154
                  Relay_Log_Space: 788
                  Until_Condition: None
                   Until_Log_File: 
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File: 
               Master_SSL_CA_Path: 
                  Master_SSL_Cert: 
                Master_SSL_Cipher: 
                   Master_SSL_Key: 
            Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error: 
                   Last_SQL_Errno: 0
                   Last_SQL_Error: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 1
                      Master_UUID: b05dfbb5-1463-11e7-8601-000c29042d55
                 Master_Info_File: /var/lib/mysql/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
                      Master_Bind: 
          Last_IO_Error_Timestamp: 
         Last_SQL_Error_Timestamp: 
                   Master_SSL_Crl: 
               Master_SSL_Crlpath: 
               Retrieved_Gtid_Set: 
                Executed_Gtid_Set: 
                    Auto_Position: 0
             Replicate_Rewrite_DB: 
                     Channel_Name: 
               Master_TLS_Version: 
    1 row in set (0.00 sec)

    Check xem có đúng không, nếu không :

    	stop slave ;
    	reset slave ;

    Cấu hình Master 2 – Slave 2

    Tạo Username và gán quyền Replication :

    	$ mysql -u root -p
    	Password:
    
    	mysql> CREATE USER 'Username'@'IP_Slave_Server' IDENTIFIED BY 'password';
    	Query OK, 0 rows affected (0.00 sec)
    
    	mysql> GRANT REPLICATION SLAVE ON *.* TO 'Username'@'IP_Slave_Server';
    	Query OK, 0 rows affected (0.00 sec)

    Lấy thông tin của Master :

    	$ mysql -u root -p
    	Password:
    
    	mysql> STOP SLAVE;                                                            #Tắt Slave trước khi khai báo
    	Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    	mysql> CHANGE MASTER TO
    		-> MASTER_HOST='IP_Master_Server',                          #Khai ip master2 server
    		-> MASTER_USER='Username',                                        #Username dành cho Slave 2 tạo ở trên
    		-> MASTER_PASSWORD='password', 
    		-> MASTER_PORT=3308,
    		-> MASTER_LOG_FILE='mysql-bin.000005',                   #Thông tin file binlog lụm được từ Master 2 status
    		-> MASTER_LOG_POS=154;                                              # Thông tin position tương ứng
    	Query OK, 0 rows affected, 2 warnings (0.01 sec)
    
    	mysql> START SLAVE;                                                           #Sau khi khai báo xong thì khởi động lại Slave
    	Query OK, 0 rows affected (0.00 sec)

    Check status của Slave 2:

    	mysql> show slave status G;
    	*************************** 1. row ***************************
    				   Slave_IO_State: Waiting for master to send event
    					  Master_Host: 172.17.3.112
    					  Master_User: repliuser
    					  Master_Port: 3308
    					Connect_Retry: 60
    				  Master_Log_File: mysql-bin.000001
    			  Read_Master_Log_Pos: 792
    				   Relay_Log_File: ubuntu-relay-bin.000005
    					Relay_Log_Pos: 320
    			Relay_Master_Log_File: mysql-bin.000001
    				 Slave_IO_Running: Yes
    				Slave_SQL_Running: Yes
    	......
    	Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
    	......
    	1 row in set (0.01 sec)

    Bonus

    LOG SLAVE UPDATE WHEN RUN SLAVE OF SLAVE :

    Cập nhật trong /etc/mysql/my.cnf

    log_slave_updates=ON
    sync_binlog=1
    sync_relay_log=1
    relay_log_purge=ON
    relay_log_recovery=ON

    MySQL Master-Master Replication mang lại nhiều lợi ích cho các hệ thống cơ sở dữ liệu lớn, đặc biệt là khả năng đảm bảo tính toàn vẹn và đồng bộ dữ liệu giữa các máy chủ. Khi cấu hình đúng cách, hệ thống này sẽ giúp giảm tải cho cơ sở dữ liệu và tăng tính sẵn sàng, giúp doanh nghiệp hoạt động liên tục mà không gặp gián đoạn. Để đạt hiệu quả tốt nhất, bạn cần thường xuyên kiểm tra và theo dõi các vấn đề có thể phát sinh trong quá trình đồng bộ.

    Network trong Docker

    Giới thiệu

    Trong môi trường Docker, network đóng vai trò quan trọng trong việc kết nối và giao tiếp giữa các container. Hiểu rõ cách thiết lập và quản lý mạng không chỉ giúp các container tương tác hiệu quả mà còn đảm bảo tính bảo mật và hiệu suất của hệ thống. Bài viết này sẽ hướng dẫn bạn chi tiết về các loại mạng trong Docker, cách sử dụng chúng và cách tùy chỉnh để phù hợp với yêu cầu của dự án.

    Để liệt kê các network đang có:

    docker network ls

    Các network được tạo ra theo một driver nào đó như bridge, none, overlay, macvlan.

    • bridge : Dạng cầu, sử dụng khi nhiều Container đang chạy và giao tiếp với nhau
    • Host : Containers sẽ dùng mạng trực tiếp của máy host. Network configuration bên trong container đồng nhất với host.
    • None : Vô hiệu hóa mạng cho COntainer
    • Overlay : Overlay network là mạng có thể kết nối nhiều container trên các Docker Engine lại với nhau, trong môi trường cluster.
    • Macvlan : Gắn địa chỉ MAC cho container, hoạt động như thiết bị vật lý trong mạng

    Tạo Bridge network:

    docker network create --driver bridge name-network
    	
    docker network create --subnet 192.168.200.0/24 --ip-range 192.168.200.0/24 zabbix-net --driver bridge

    Kết nối Container với network :

    docker network connect name-network name-container

    Cấu hình IP tĩnh cho Container :

    docker run --net customnetwork --ip 172.20.0.10 -d container

    Port:

    Map Port Public với Port Container :

    docker run -p public-port:target-port/protocol ...
    • public-port : cổng public ra ngoài (ví dụ 80, 8080 …)
    • target-port : cổng bên trong container, cổng public-port sẽ ánh xạ vào cổng này.

    Network trong Docker là một thành phần không thể thiếu, giúp tạo ra sự linh hoạt trong việc kết nối các container và hệ thống bên ngoài. Bằng cách hiểu và sử dụng hiệu quả các loại mạng như Bridge, Host, hay Overlay, bạn có thể xây dựng một môi trường làm việc tối ưu và an toàn hơn. Hãy thực hành ngay hôm nay để nắm vững kiến thức về Docker networking và áp dụng thành công vào dự án của bạn!

    Docker

    Docker là công cụ mạnh mẽ giúp tạo, triển khai và quản lý các container phần mềm một cách hiệu quả. Tìm hiểu cách Docker đơn giản hóa quy trình phát triển ứng dụng!

    Tối ưu hóa Docker Image với Multi-stage Builds trên Ubuntu 20.04+: Chiến lược Hardening cho Production

    Tối ưu hóa Docker Image với Multi-stage Builds trên Ubuntu 20.04+: Chiến lược Hardening cho Production

    Giới thiệu

    Trong môi trường sản xuất hiện đại, tối ưu hóa Docker image và tăng cường an ninh cho container là yếu tố then chốt để đảm bảo hiệu năng, dễ bảo trì và tuân thủ quy trình vận hành. Đối với nền tảng Ubuntu 20.04 trở lên, chiến lược multi‑stage builds cung cấp một phương pháp hiệu quả để giảm kích thước hình ảnh, hạn chế surface area và cải thiện hardening cho production container. Bài viết này trình bày khung tham chiếu kỹ thuật cho sysadmins và đội DevOps muốn triển khai hình ảnh Docker được tối ưu và an toàn, đồng thời nêu ra các thực hành, mẫu Dockerfile và các bước kiểm thử, giám sát sau khi triển khai.

    Khái niệm cốt lõi và kiến trúc tổng quát

    Multi‑stage builds là kỹ thuật cho phép định nghĩa nhiều giai đoạn xây dựng trong một Dockerfile. Mỗi giai đoạn có một hình ảnh cơ sở riêng và có thể sao chép artefacts từ giai đoạn này sang giai đoạn khác. Mục tiêu chính là giữ lại các phần cần thiết cho runtime và loại bỏ phần phụ thuộc, công cụ build và mã nguồn khỏi image cuối cùng. Với Ubuntu 20.04 trở lên, bạn có thể tận dụng các base image tối giản ở giai đoạn runtime đồng thời giữ được tính tương thích và khả năng bảo trì của hệ thống.

    Kiến trúc điển hình với multi‑stage bao gồm các phần sau:

    • Stage builder (stage xây dựng): chứa các công cụ và thư viện cần để biên dịch, biên tập và đóng gói ứng dụng. Đây là nơi tập trung toàn bộ phụ thuộc phát triển và các file nguồn.
    • Stage runtime (stage chạy): hình ảnh nhẹ, chỉ chứa các phần mềm cần thiết cho chạy ứng dụng ở môi trường production. Không mang theo các công cụ build hay mã nguồn thô.
    • Quá trình sao chép artefacts từ stage builder sang stage runtime, chỉ sao chép các tệp cần thiết cho vận hành (binary, script, tài nguyên) và loại bỏ các dependences không cần thiết.

    Việc tách biệt giữa build và runtime giúp giảm kích thước image, giảm surface area tấn công và cải thiện khả năng nhận diện rủi ro. Đây là ý tưởng cốt lõi của hardening Docker image cho production trên nền tảng Ubuntu 20.04 và các hệ thống tương đương.

    Yêu cầu và chuẩn bị

    Trước khi bắt đầu, xác định rõ môi trường mục tiêu và phạm vi ứng dụng. Với nền tảng Ubuntu 20.04+, các khuyến nghị dưới đây sẽ hỗ trợ bạn xây dựng pipeline ổn định và an toàn:

    • Có Docker Engine được cài đặt trên máy chủ chạy Ubuntu 20.04 hoặc các phiên bản tương đương.
    • Sử dụng Dockerfile theo mẫu multi‑stage để tách biệt build và runtime.
    • Đảm bảo quyền truy cập và quản trị người dùng được kiểm soát chặt chẽ, ưu tiên chạy ứng dụng dưới tài khoản người dùng không phải root.
    • Xem xét tích hợp công cụ quét bảo mật và kiểm tra hình ảnh (image scanning) như một phần của chu trình CI/CD.
    • Thiết lập các công cụ giám sát và logging để đảm bảo khả năng vận hành và phát hiện sự cố.

    Trong phạm vi bài viết, chúng ta sẽ đi qua một quy trình thực hành với một Dockerfile mẫu và các bước kiểm thử đi kèm, phù hợp với nền tảng Ubuntu 20.04+.

    Cấu hình và mẫu Dockerfile với multi‑stage builds

    Ý tưởng cơ bản là sử dụng hai hoặc nhiều stage trong Dockerfile. Stage builder sẽ chứa các dependency cần thiết để biên dịch hoặc đóng gói, trong khi stage runtime sẽ chỉ chứa những gì cần thiết để chạy ứng dụng. Dưới đây là một mẫu Dockerfile minh họa cho một ứng dụng nền tảng Linux tổng quát mà có thể được điều chỉnh cho các ngôn ngữ phổ biến như Go, C/C++, hoặc Node.js. Lưu ý rằng các khung lược bỏ phụ thuộc ở stage runtime giúp giảm kích thước và tăng mức độ an toàn của hình ảnh.

    FROM ubuntu:20.04 AS builder
    RUN apt-get update && apt-get install -y --no-install-recommends \
        build-essential \
        pkg-config \
        && rm -rf /var/lib/apt/lists/*
    
    WORKDIR /src
    COPY . /src
    
    # Giả định build một binary ứng dụng
    RUN ./build-script.sh
    
    FROM ubuntu:20.04
    RUN apt-get update && apt-get install -y --no-install-recommends \
        ca-certificates \
        && rm -rf /var/lib/apt/lists/*
    
    # Sao chép artefacts từ stage builder
    COPY --from=builder /src/bin/app /usr/local/bin/app
    
    # Tạo người dùng và vận hành với non-root
    RUN groupadd -r appuser && useradd -r -g appuser appuser
    USER appuser
    
    ENTRYPOINT ['/usr/local/bin/app']
    

    Giải thích nhanh về cấu hình trên:

    • Stage builder cài đặt các công cụ cần thiết cho quá trình build và biên dịch.
    • Stage runtime dùng base image ubuntu:20.04 và chỉ bao gồm các dependency cần thiết để chạy ứng dụng, không mang theo công cụ build hay mã nguồn đầy đủ.
    • Các artefacts được sao chép từ stage builder sang stage runtime, điều này giúp loại bỏ các file nguồn và thư viện build khỏi image cuối cùng.
    • Quy trình chạy với user non-root nhằm giảm thiểu rủi ro bảo mật tại runtime.

    Điểm mấu chốt là chỉ sao chép những gì thực sự cần cho runtime và tránh mang toàn bộ mã nguồn hoặc công cụ biên dịch vào image sản xuất.

    Một ví dụ chi tiết cho Dockerfile cho ứng dụng Go hoặc ngôn ngữ biên dịch khác

    Đối với các dự án Go hoặc các ngôn ngữ biên dịch khác, mẫu Dockerfile có thể được điều chỉnh để tận dụng staged builds. Dưới đây là phiên bản tham khảo có thể áp dụng cho các dự án cần build và chạy ở runtime nghiêm ngặt:

    FROM ubuntu:20.04 AS builder
    RUN apt-get update && apt-get install -y --no-install-recommends \
        build-essential git ca-certificates \
        && rm -rf /var/lib/apt/lists/*
    
    WORKDIR /src
    COPY go.mod go.sum ./
    RUN go mod download
    COPY . .
    RUN go build -trimpath -o app ./cmd/app
    
    FROM ubuntu:20.04
    RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates
    RUN useradd -m -s /bin/bash appuser
    USER appuser
    COPY --from=builder /src/app /usr/local/bin/app
    ENTRYPOINT ["/usr/local/bin/app"]
    

    Trong mẫu trên, Go toolchain hoặc runtime build các dépendances ở stage builder. Stage runtime chỉ chứa binary đã biên dịch và các thư viện runtime cần thiết, giúp giảm thiểu kích thước và tăng tính bảo mật.

    Bảo mật và hardening cho Docker image với multi‑stage builds

    Bảo mật đóng vai trò then chốt trong production. Các biện pháp sau đây được khuyến nghị khi làm việc với multi‑stage builds trên Ubuntu 20.04+:

    • Sử dụng base image tối giản cho stage runtime; tránh mang theo các công cụ phát triển và thư viện không cần thiết.
    • Chạy ứng dụng ở chế độ non-root và cấp phát quyền tối thiểu cho hành động cần thiết, ví dụ tạo user riêng và gán quyền vào thư mục làm việc.
    • Sử dụng .dockerignore để loại trừ mã nguồn, dữ liệu nhị phân tạm thời và các file nhạy cảm khỏi quá trình build.
    • Hạn chế quyền truy cập mạng cho container nếu có thể, và cân nhắc áp dụng thiết lập seccomp, AppArmor hoặc SELinux tùy thuộc vào hạ tầng và mức độ ràng buộc bảo mật.
    • Đảm bảo việc cập nhật hình ảnh runtime được tích hợp trong chu trình CI/CD để nhận các bản vá bảo mật mới nhất.
    • Kiểm tra hạn mức và giới hạn tài nguyên cho container ở môi trường production để giảm thiểu tác động từ các cuộc tấn công từ chối dịch vụ hoặc lỗi vận hành.

    Những nguyên tắc này giúp tăng cường độ an toàn cho hình ảnh Docker và giảm nguy cơ bị khai thác từ các lỗ hổng có thể có trong các công cụ build hoặc dependencies không cần thiết ở runtime.

    Hiệu năng và tối ưu hoá hình ảnh

    Hiệu năng là một phần thiết yếu của vận hành hệ thống. Các thực hành tối ưu hoá bao gồm:

    • Chỉ giữ lại những artefacts cần thiết cho chạy ứng dụng ở stage runtime; loại bỏ file nguồn, build cache và các dependency không cần thiết.
    • Gộp các lệnh RUN hợp lý để tối ưu hoá số lượng layers và tận dụng cache của Docker trong quá trình build.
    • Chọn base image phù hợp với ứng dụng và tối giản các gói cài đặt. Ví dụ sử dụng các base image có kích thước nhỏ và có sẵn runtime cho Linux.
    • Đảm bảo hình ảnh ở trạng thái có thể lặp lại trong CI/CD và không phụ thuộc vào biến môi trường vượt quá phạm vi được kiểm soát.

    Với các áp dụng thực tế, bạn có thể kiểm tra kích thước hình ảnh và tối ưu hoá thêm bằng cách xem lịch sử từng layer và loại bỏ các layer không cần thiết. Quá trình này giúp giảm không chỉ dung lượng tải xuống mà còn thời gian triển khai và chi phí vận hành.

    Giám sát và observability cho container chạy ở production

    Việc giám sát và ghi nhận là phần không thể bỏ qua để duy trì chất lượng dịch vụ trong dài hạn. Các thực hành liên quan đến multi‑stage builds tập trung vào runtime ít hơn vào giai đoạn build:

    • Cấu hình Healthcheck cho container để xác định tình trạng hoạt động của ứng dụng và tự động tái khởi động khi cần thiết.
    • Ghi log ra stdout và stderr để tích hợp với hệ thống quản lý logs và phân tích logs tập trung.
    • Giải pháp theo dõi hiệu năng và sự cố ở mức hệ điều hành và ứng dụng, bao gồm giám sát tiêu thụ CPU, memory và I/O.
    • Áp dụng giới hạn tài nguyên cho container nhằm ngăn tình huống lún lõm tài nguyên khi có tải cao hoặc lỗ hổng bảo mật bị khai thác.

    Việc tích hợp Healthcheck và logging chuẩn giúp đội vận hành nhanh chóng xác định và xử lý sự cố, đồng thời cung cấp dữ liệu cho quá trình tối ưu hoá và bảo mật.

    Kiểm tra, xác thực và vận hành sau triển khai

    Để đảm bảo hình ảnh multi‑stage hoạt động đúng như mong đợi trên nền tảng Ubuntu 20.04+, tiến hành các bước kiểm tra sau trước khi đẩy lên môi trường production:

    • Xây dựng lại hình ảnh và xác nhận không còn các file build hoặc thư viện phát triển trong stage runtime.
    • Chạy container ở chế độ thử nghiệm với các trường hợp sử dụng thực tế của ứng dụng, kiểm tra chức năng và hiệu năng.
    • Kiểm tra tính khả dụng của các dịch vụ liên quan, xác thực logging và healthcheck hoạt động đúng cách.
    • Đánh giá bảo mật với các công cụ quét hình ảnh và xác thực rằng non‑root user được áp dụng và các quyền truy cập được giới hạn.
    • Ghi nhận và phân tích kích thước hình ảnh, thời gian tải xuống và thời gian khởi động để đánh giá hiệu quả tối ưu hóa.

    Ví dụ các lệnh kiểm tra có thể được thực hiện trong môi trường CI/CD và sau khi triển khai bao gồm kiểm tra kích thước image, xem lịch sử builder và xác nhận tài nguyên runtime được giới hạn phù hợp.

    Checklist vận hành và triển khai

    • Đảm bảo Dockerfile được thiết kế theo chuẩn multi‑stage và ubuntu:20.04 là base image cho cả stage build và stage runtime.
    • Áp dụng người dùng non‑root cho runtime và cấp quyền tối thiểu cho thư mục làm việc.
    • Sử dụng .dockerignore để loại bỏ mã nguồn và file nhạy cảm khỏi quá trình build.
    • Kiểm tra và giới hạn tài nguyên cho container ở production (CPU, memory, I/O).
    • Áp dụng Healthcheck và logging cho khả năng vận hành và phát hiện sự cố nhanh chóng.
    • Sử dụng quy trình CI/CD để tự động quét bảo mật và xác thực version của image trước khi triển khai.
    • Theo dõi kích thước và surface area của image sau mỗi lần tối ưu hóa và cập nhật dependency.

    Kết luận

    Kỹ thuật multi‑stage builds là một phần cốt lõi để tối ưu hóa kích thước và an ninh cho Docker image khi làm việc trên Ubuntu 20.04+. Bằng cách tách biệt stage build và stage runtime, bạn có thể giảm đáng kể surface area, loại bỏ công cụ phát triển và các file nguồn khỏi image sản xuất, đồng thời tăng cường khả năng kiểm soát an ninh và vận hành. Để đạt hiệu quả tối đa, hãy kết hợp chiến lược này với các thực tiễn bảo mật và quản trị container như chạy dưới non‑root, sử dụng .dockerignore, cấu hình healthcheck, và tích hợp CI/CD cho kiểm tra bảo mật và xác thực version trước khi đẩy lên production.

    Cài đặt Docker trên Linux

    Giới thiệu

    Docker đã trở thành một trong những công cụ hàng đầu trong lĩnh vực công nghệ phần mềm, đặc biệt là đối với các nhà phát triển và quản trị hệ thống. Với khả năng tạo và quản lý các container phần mềm, Docker không chỉ giúp tối ưu hóa quy trình phát triển mà còn đảm bảo tính linh hoạt, nhất quán trong môi trường triển khai. Vậy Docker là gì và tại sao nó lại quan trọng trong thế giới công nghệ hiện nay?

    Docker là một dự án mã nguồn mở giúp tự động triển khai các ứng dụng Linux và Windows vào trong các container ảo hóa. Các thay đổi được lưu trữ trong các Docker image, các lớp tệp hệ thống được tạo ra và lưu lại dựa theo từng lớp (layer). Điều này giúp cho Docker Image giảm dung lượng đáng kể so với máy ảo (VM).

    Các ứng dụng muốn chạy bằng Docker phải là ứng dụng chạy được trên Linux. Gần đây, Docker có hỗ trợ thêm việc chạy ứng dụng Windows trong các Windows container.

    Thành phần

    • Docker Engine: dùng để tạo ra Docker image và chạy Docker container.
    • Docker Hub: dịch vụ lưu trữ giúp chứa các Docker image.
    • Docker Machine: tạo ra các Docker engine trên máy chủ.
    • Docker Compose: chạy ứng dụng bằng cách định nghĩa cấu hình các Docker container thông qua tệp cấu hình
    • Docker image: một dạng tập hợp các tệp của ứng dụng, được tạo ra bởi Docker engine. Nội dung của các Docker image sẽ không bị thay đổi khi di chuyển. Docker image được dùng để chạy các Docker container.
    • Docker container: một dạng runtime của các Docker image, dùng để làm môi trường chạy ứng dụng.

    Cài đặt trên Linux

    Set up Docker’s apt repository

    # Add Docker's official GPG key:
    sudo apt-get update
    sudo apt-get install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    
    # Add the repository to Apt sources:
    echo 
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu 
      $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | 
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update

    Install Docker

    Latest Version :

    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

    Specific version :

    List all available versions :

    # List the available versions:
    apt-cache madison docker-ce | awk '{ print $3 }'
    
    5:27.3.1-1~ubuntu.24.04~noble
    5:27.3.0-1~ubuntu.24.04~noble
    ...

    Install specific version :

    VERSION_STRING=5:27.3.1-1~ubuntu.24.04~noble
    sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin

    Verify Docker :

    sudo docker run hello-world

    Dù bạn là người mới bắt đầu hay một chuyên gia trong lĩnh vực công nghệ, Docker mang đến những giải pháp mạnh mẽ và linh hoạt để đơn giản hóa quy trình phát triển và triển khai ứng dụng. Việc hiểu rõ và áp dụng Docker không chỉ giúp nâng cao hiệu suất làm việc mà còn mở ra những cơ hội phát triển lớn trong tương lai. Hãy bắt đầu khám phá Docker ngay hôm nay!

    Nguồn tham khảo :

    https://en.wikipedia.org/wiki/Docker_(software)

    https://docs.docker.com/engine/install/ubuntu

    Các câu lệnh cơ bản trong Docker

    Giới thiệu

    Docker là công cụ mạnh mẽ được sử dụng rộng rãi trong việc tạo và quản lý container phần mềm. Để làm việc hiệu quả với Docker, việc nắm rõ các câu lệnh cơ bản là điều không thể thiếu. Những lệnh này không chỉ giúp bạn quản lý container mà còn hỗ trợ triển khai và theo dõi ứng dụng một cách dễ dàng. Trong bài viết này, chúng ta sẽ cùng khám phá các câu lệnh cơ bản trong Docker để bạn có thể sử dụng công cụ này một cách thành thạo.

    Các câu lệnh cơ bản như sau:

      liệt kê danh sách containers đang chạy.

    docker ps

    liệt kê danh sách tất cả các container kể cả đã stop.

    docker ps -a

    Tải một Docker image từ Docker Hub registry. Link của nó các bạn có thể vào Docker Hub để lấy. Hãy search từng image rồi vào chi tiết của chúng để xem.

    docker pull

    Được dung để tạo ra một image dựa trên một file Dockerfile. Thường dùng docker build . để build một image dựa trên Dockerfile trong thư mục hiện tại (dấu chấm). docker build -t “myimage:latest” . dùng để tạo một image và lưu image dưới tên được đặt.

    docker build

    Hiển thị danh sách image ở máy bạn.

    docker images
    docker images ls

    Chạy một container từ một image, i. e. docker run myimage -it bash. Nếu không có image nào được tìm thấy thì Docker run sẽ download nó tự động ở Docker hub.

    docker run

    Hiển thị logs của một container mà bạn chỉ ra.

    docker logs

    Để tiếp tục show log được cập nhật them thì bạn chỉ cần dùng

    docker logs -f mycontainer

    Hiển thị danh sách volumes, cái này dùng để lưu trữ dữ liệu trong container, tránh trường hợp restart container thì mất dữ liệu.

    docker volume ls

    Liệt kê tất cả các network có sẵn

    docker network ls

    Vào một network. Nó giúp container giao tiếp được với một container khác qua tên thay vì IP.

    docker network connect

     Loại bỏ một hoặc nhiều container. Ví dụ: docker rm mycontainer nhưng chắc chắn là container đang không ở trạng thái running.

    docker rm

    Xóa bỏ một hay nhiều image., xóa image tên là myimage nhưng phải đảm bảo không có container nào đang chạy sử dụng image này.

    docker rmi
     docker rmi myimage

    Stop một hay nhiều container. docker stop mycontainer stop 1 container trong khi docker stop $(docker ps -a -q) stop tất cả các container đang chạy. 

    docker stop

    Start một container đã được stop với trạng thái giữ nguyên.

    docker start

    Cập nhật một cài đặt container, nó đặc biệt hữu ích khi container của bạn lặp liên tục.

    docker update --restart=no

    Copy các file từ một container đang chạy ra ngoài host. docker cp :/etc/file . để copy /etc/file ra thư mục hiện tại.

    docker cp

    Một số kết hợp câu lệnh hữu ích:

    • Stop toàn bộ các container docker kill $(docker ps -q)
    • Xóa toàn bộ các container docker rm $(docker ps -a -q)
    • Xóa toàn bộ các image docker rmi $(docker images -q)
    • Xóa và stop một container bị lặp vô tận docker update –restart=no && docker stop
    • Chạy câu lệnh bên trong container docker exec -i -t /bin/bash – nếu không có bash thì dùng /bin/sh
    • Chạy bash với user root nếu container đang chạy với một user khác docker exec -i -t -u root /bin/bash

    Hiểu rõ và sử dụng thành thạo các câu lệnh cơ bản trong Docker sẽ giúp bạn tối ưu hóa quá trình quản lý container, từ đó nâng cao hiệu quả làm việc. Dù bạn đang bắt đầu học Docker hay đã có kinh nghiệm, việc làm chủ những lệnh này sẽ mang lại nhiều lợi ích trong phát triển và triển khai ứng dụng. Hãy thực hành ngay hôm nay để thành thạo Docker!

    Lưu, Nạp Images Docker

    Giới thiệu

    Trong hệ sinh thái Docker, images đóng vai trò cốt lõi, là nền tảng để tạo và triển khai các container. Biết cách lưu và nạp images Docker không chỉ giúp bạn quản lý dự án dễ dàng mà còn đảm bảo tính linh hoạt khi làm việc trên nhiều môi trường khác nhau. Bài viết này sẽ hướng dẫn bạn từng bước cách thực hiện lưu và nạp images Docker một cách chính xác và hiệu quả.

    1. Lưu Container thành images

    Để lưu một Container thành Image trong Docker, bạn cần sử dụng lệnh docker commit. Dưới đây là các bước chi tiết:

    Lệnh docker commit được sử dụng để tạo một Image từ Container đang chạy hoặc đã dừng.

    docker commit [OPTIONS] <container_id> <repository_name>:<tag>

    ví dụ: Giả sử bạn có một Container với ID abc123 và muốn lưu nó thành Image tên là my-image với tag v1.0:

    docker commit abc123 my-image:v1.0
    • <container_id>: ID hoặc tên của Container mà bạn muốn lưu.
    • <repository_name>:<tag>: Tên và tag cho Image mới.

      Kiểm tra:

      docker images

      Tùy chọn bổ sung với docker commit

      Thêm lời nhắn mô tả (-m): Bạn có thể thêm lời nhắn để mô tả Image:

      docker commit -m "Snapshot of my container" abc123 my-image:v1.0

      Chỉ định tác giả (-a): Bạn có thể chỉ định thông tin tác giả:

      docker commit -a "Your Name <your.email@example.com>" abc123 my-image:v1.0

      Giữ trạng thái không dừng Container: Nếu bạn không muốn dừng Container trước khi commit, bạn có thể tạo snapshot của Container khi nó đang chạy.

      2. Lưu Images ra file

      Trong Docker, bạn có thể lưu trữ (save) một Image ra file và sau đó nạp lại (load) Image từ file

      Cú pháp:

      docker save -o <tên_file>.tar <tên_image>:<tag>

      Exp :

      Giả sử bạn có một Image tên là my-app với tag v1.0:

      docker save -o my-app-v1.0.tar my-app:v1.0

      -o: Chỉ định đường dẫn và tên file đầu ra.

      File my-app-v1.0.tar sẽ được tạo trong thư mục hiện tại.

      Nạp Image từ file

      docker load -i <tên_file>.tar

      Ví dụ

      Nạp lại Image từ file my-app-v1.0.tar:

      docker load -i my-app-v1.0.tar
      • -i: Chỉ định đường dẫn file đầu vào.
      • Sau khi nạp, Image sẽ xuất hiện trong danh sách Images (docker images).

      Kiểm tra images

      docker images

      Lưu ý

      • Dung lượng lớn: Nếu Container của bạn chứa nhiều dữ liệu, Image được tạo sẽ có kích thước lớn.
      • Không tối ưu: Image được tạo bằng docker commit không có file Dockerfile, do đó khó quản lý hoặc xây dựng lại.
      • Tốt nhất: Sử dụng Dockerfile để tạo Image khi triển khai lâu dài. Dùng docker commit trong trường hợp cần snapshot nhanh.

      Lưu và nạp images Docker là kỹ năng quan trọng giúp bạn quản lý các dự án Docker dễ dàng hơn. Việc thành thạo các thao tác này không chỉ tối ưu hóa công việc mà còn giúp bạn xử lý linh hoạt trong các tình huống thực tế. Hãy bắt đầu thực hành ngay hôm nay để làm chủ công cụ Docker một cách hiệu quả!

      Chia sẻ dữ liệu giữa Docker Host và Container

      Giới thiệu

      Việc chia sẻ dữ liệu giữa Docker Host và Container là một trong những tính năng hữu ích, cho phép bạn đồng bộ hóa và quản lý thông tin một cách hiệu quả trong môi trường Docker. Nhờ đó, dữ liệu có thể dễ dàng được cập nhật, lưu trữ và sử dụng giữa hệ thống chủ và các container. Trong bài viết này, chúng ta sẽ khám phá các phương pháp chia sẻ dữ liệu phổ biến như VolumeBind Mounts, cùng các bước thực hiện chi tiết để bạn áp dụng vào công việc một cách thuận tiện.

      Container – ánh xạ thư mục máy Host:

      docker run -it -v /home/sitesdata:/home/data ubuntu

      Lúc này, dữ liệu trên thư mục /home/sitesdata/ của máy Host thì trong container có thể truy cập, cập nhật sửa đổi … thông qua đường dẫn /home/data

      Chia sẻ dữ liệu giữa các Container :

      Có container với id hoặc name là container_first, trong đó nó có mount thư mục Host vào. Giờ chạy, tạo container khác cũng nhận thư mục chia sẻ dữ liệu như container_first

      docker run -it --volumes-from container_first ubuntu

      Bạn đã tạo ra một Container nhận thư mục chia sẻ như container có ID hoặc tên là container_first tạo trước đó.

      Quản lý các ổ đĩa với docker volume

      Liệt kê danh sách các ổ đĩa:

      docker volume ls

      Tạo một ổ đĩa:

      docker volume create name_volume

      Xem thông tin chi tiết về đĩa:

      docker volume inspect name_volume

      Xóa một ổ đĩa:

      docker volume rm name_volume

      Mount một ổ đĩa vào container (–mount)

      # Tạo ổ đĩa có tên firstdisk
      docker volume create firstdisk

      Mount ổ đĩa vào container, container truy cập tại /home/firstdisk

      docker run -it --mount source=firstdisk,target=/home/firstdisk  ubuntu

      Gán ổ đĩa vào container khi tạo container (-v)

      docker volume create --opt device=path_in_host --opt type=none --opt o=bind  volumename

      Xóa tất cả các ổ đĩa không được sử dụng bởi container nào:

      docker volume prune

      Chia sẻ dữ liệu giữa Docker Host và Container là một kỹ thuật quan trọng, giúp tối ưu hóa quá trình làm việc với Docker. Bằng cách sử dụng Volume hoặc Bind Mounts, bạn có thể quản lý dữ liệu một cách linh hoạt và hiệu quả. Hãy áp dụng ngay các kiến thức này vào dự án của bạn để tận dụng tối đa sức mạnh của Docker trong việc phát triển và triển khai ứng dụng!

      Network trong Docker

      Giới thiệu

      Trong môi trường Docker, network đóng vai trò quan trọng trong việc kết nối và giao tiếp giữa các container. Hiểu rõ cách thiết lập và quản lý mạng không chỉ giúp các container tương tác hiệu quả mà còn đảm bảo tính bảo mật và hiệu suất của hệ thống. Bài viết này sẽ hướng dẫn bạn chi tiết về các loại mạng trong Docker, cách sử dụng chúng và cách tùy chỉnh để phù hợp với yêu cầu của dự án.

      Để liệt kê các network đang có:

      docker network ls

      Các network được tạo ra theo một driver nào đó như bridge, none, overlay, macvlan.

      • bridge : Dạng cầu, sử dụng khi nhiều Container đang chạy và giao tiếp với nhau
      • Host : Containers sẽ dùng mạng trực tiếp của máy host. Network configuration bên trong container đồng nhất với host.
      • None : Vô hiệu hóa mạng cho COntainer
      • Overlay : Overlay network là mạng có thể kết nối nhiều container trên các Docker Engine lại với nhau, trong môi trường cluster.
      • Macvlan : Gắn địa chỉ MAC cho container, hoạt động như thiết bị vật lý trong mạng

      Tạo Bridge network:

      docker network create --driver bridge name-network
      	
      docker network create --subnet 192.168.200.0/24 --ip-range 192.168.200.0/24 zabbix-net --driver bridge

      Kết nối Container với network :

      docker network connect name-network name-container

      Cấu hình IP tĩnh cho Container :

      docker run --net customnetwork --ip 172.20.0.10 -d container

      Port:

      Map Port Public với Port Container :

      docker run -p public-port:target-port/protocol ...
      • public-port : cổng public ra ngoài (ví dụ 80, 8080 …)
      • target-port : cổng bên trong container, cổng public-port sẽ ánh xạ vào cổng này.

      Network trong Docker là một thành phần không thể thiếu, giúp tạo ra sự linh hoạt trong việc kết nối các container và hệ thống bên ngoài. Bằng cách hiểu và sử dụng hiệu quả các loại mạng như Bridge, Host, hay Overlay, bạn có thể xây dựng một môi trường làm việc tối ưu và an toàn hơn. Hãy thực hành ngay hôm nay để nắm vững kiến thức về Docker networking và áp dụng thành công vào dự án của bạn!

      Docker File

      Giới thiệu

      Dockerfile là một trong những thành phần quan trọng nhất trong Docker, cho phép bạn định nghĩa cách tạo Docker image một cách tự động và chính xác. Với Dockerfile, bạn có thể kiểm soát toàn bộ quy trình, từ việc cài đặt hệ điều hành, thêm phần mềm, cho đến cấu hình môi trường. Trong bài viết này, chúng ta sẽ tìm hiểu cách tạo và sử dụng Dockerfile hiệu quả để xây dựng và triển khai ứng dụng của bạn một cách nhanh chóng và tối ưu.


      FROMmọi Docker file đều có chỉ thị này, chỉ định image cơ sở
      COPY ADDsao chép dữ liệu
      ENVthiết lập biến môi trường
      RUNchạy các lệnh.
      VOLUMEgắn ổ đĩa, thư mục
      USERuser
      WORKDIRthư mục làm việc
      EXPOSEthiết lập cổng

      FROM

      Như trên đã nói, chỉ thị này chỉ ra image cơ sở để xây dựng nên image mới. Để xây dựng từ image nào đó thì bạn cần đọc document của Image đó để biết trong đó đang chứa gì, có thể chạy các lệnh gì trong đó … Ví dụ, nếu bạn chọn xây dựng từ image centos:laste thì bạn bắt đầu bằng hệ điều hành CentOS và bạn có thể cài đặt, cập nhật các gói với yum, ngược lại nếu bạn chọn ubuntu:latest thì trình quản lý gói của nó là APT …

      COPY và ADD

      Được dùng để thêm thư mục, file vào Image

      ADD thưmục_nguồn thư_mụcđích

      Trong đó thưmục_nguồn là thư mục ở máy chạy Dockerfile, chứa dữ liệu cần thêm vào. thư_mụcđích là nơi dữ liệu được thêm vào ở container.

      ENV

      Chỉ thị này dùng để thiết lập biến môi trường, như biến môi trường PATH …, tùy hệ thống hay ứng dụng yêu cầu biến môi trường nào thì căn cứ vào đó để thiết lập.

      ENV biến giá_trị

      RUN

      Thi hành các lệnh, tương tự bạn chạy lệnh shell trên OS từ terminal.

      RUN lệnh-và-tham-số-cần-chạy
      RUN ["lệnh", "tham số1", "tham số 2" ...]

      VOLUME

      Chỉ thi tạo một ổ đĩa chia sẻ được giữa các container.

      VOLUME /dir_vol

      USER

      Bạn thêm user được dùng khi chạy các lệnh ở chỉ thị RUN CMD WORKDIR.

      USER private

      WORKDIR

      Thiết lập thư mục làm việc hiện tại chi các chỉ thị CMD, ENTRYPOINT, ADD thi hành.

      WORKDIR path_current_dir

      EXPOSE

      Để thiết lập cổng mà container lắng nghe, cho phép các container khác trên cùng mạng liên lạc qua cổng này hoặc đỉ ánh xạ cổng host vào cổng này.

      EXPOSE port

      ENTRYPOINT, CMD

      Chạy lệnh trong chỉ thị này khi container được chạy.

      ENTRYPOINT commnad_script
      ENTRYPOINT ["command", "tham-số", ...]

      CMD ý nghĩa tương tự như ENTRYPOINT, khác là lệnh chạy bằng shell của container.

      CMD command param1 param2
      #Chú ý ở dạng sau của CMD thì nó lại là thiết lập tham số cho ENTRYPOINT
      CMD ["tham-số1", "tham-số2"]

      EXAMPLE :

      FROM ubuntu:20.04 
      
      RUN apt update && apt upgrade -y 
          && apt install nano -y 
          && apt install htop -y 
          && apt install nginx -y 
          && service nginx start
      
      ADD ./test.html /etc/nginx/sites-available/
      
      EXPOSE 80
      EXPOSE 8080
      EXPOSE 443
      
      ENTRYPOINT service nginx start && /bin/bash

      Dockerfile giúp tự động hóa và đơn giản hóa việc tạo Docker image, làm cho quá trình phát triển và triển khai trở nên nhất quán và dễ dàng hơn. Hiểu rõ cấu trúc và cách sử dụng Dockerfile sẽ giúp bạn tận dụng tối đa sức mạnh của Docker trong các dự án của mình. Hãy bắt đầu áp dụng ngay hôm nay để khám phá tiềm năng vô tận của Docker!

      Docker Compose

      Giới thiệu

      Trong các dự án sử dụng Docker, việc quản lý nhiều container có thể trở nên phức tạp. Đây là lúc Docker Compose phát huy tác dụng, giúp bạn dễ dàng cấu hình, triển khai và quản lý các container một cách nhất quán. Với tệp cấu hình docker-compose.yml, bạn có thể định nghĩa và tự động hóa toàn bộ hệ thống chỉ với vài dòng lệnh. Hãy cùng khám phá cách sử dụng Docker Compose để tối ưu hóa quy trình làm việc của bạn!


      File docker-compose.yml gần giống ý nghĩa với file Dockerfile đã tìm hiểu trong Sử dụng Dockerfile, là một file text, viết với định dạng YAML (Ain’t Markup Language, đọc nhanh định dạng Định dạng YML) là cấu hình để tử đó lệnh docker compose sinh ra và quản lý các service (container), các network, các ổ đĩa … cho một ứng dụng hoàn chỉnh.

      Các lệnh docker compose:

      Tạo và chạy các thành phần định nghĩa trong docker-compose.yml (các dịch vụ, image, container, mạng, đĩa …)

      docker-compose up

      Dừng và xóa: image, container, mạng, đĩa tạo ra bởi docker-compose up

      docker-compose down

      Theo dõi logs từ các dịch vụ

      docker-compose logs [SERVICES]

      Tuỳ chọn

      docker-compose up -d <ten-dich-vu>

      Lệnh này để chạy background

      Example

      Ở đây tôi sẽ ví dụ với một ứng dụng Zabbix hoàn chỉnh:

      version: '3'
      
      services:
        zabbix-server-mysql:
          image: zabbix-server-mysql:2023
          ports:
            - 10051:10051
          networks:
            zabbix-network:
              ipv4_address: 192.168.200.4
          restart: always
          environment:
            - DB_SERVER_HOST=mysql
            - MYSQL_DATABASE=zabbixdb
            - MYSQL_USER=zabbixuser
            - MYSQL_PASSWORD=password
            - MYSQL_ROOT_PASSWORD=password
            - ZBX_JAVAGATEWAY=zabbix-java-gateway
            - StartVMwareCollectors=5
      
        zabbix-web-nginx-mysql:
          image: zabbix-web-nginx-mysql:2023
          ports:
            - 80:8080
          environment:
            - ZBX_SERVER_HOST="zabbix-server-mysql"
            - DB_SERVER_HOST="mysql"
            - MYSQL_DATABASE="zabbixdb"
            - MYSQL_USER="zabbixuser"
            - MYSQL_PASSWORD="password"
            - MYSQL_ROOT_PASSWORD="password"
          networks:
            zabbix-network:
              ipv4_address: 192.168.200.5
          restart: always
        
        zabbix-java-gateway:
          image: zabbix/zabbix-java-gateway:2023
          networks:
            zabbix-network:
              ipv4_address: 192.168.200.3
          restart: always
        
        zabbix-agent:
          image: zabbix-agent2:2023
          networks:
            zabbix-network:
              ipv4_address: 192.168.200.6
          restart: always
      
      networks:
        zabbix-network:
          driver: bridge
          ipam:
           config:
             - subnet: 192.168.200.0/24
               gateway: 192.168.200.1

      Docker Compose là công cụ mạnh mẽ giúp đơn giản hóa việc triển khai và quản lý nhiều container, đặc biệt trong các ứng dụng phức tạp. Bằng cách sử dụng file docker-compose.yml, bạn có thể tiết kiệm thời gian và giảm thiểu lỗi cấu hình. Hãy bắt đầu áp dụng Docker Compose vào dự án của bạn để nâng cao hiệu suất và hiệu quả làm việc ngay hôm nay!

      Giám sát Container

      Giới thiệu

      Trong môi trường Docker, việc giám sát container là yếu tố quan trọng để đảm bảo hiệu suất và tính ổn định của hệ thống. Khi các ứng dụng được triển khai trong container, khả năng theo dõi tài nguyên, log, và hiệu suất giúp bạn kịp thời phát hiện và xử lý sự cố. Bài viết này sẽ giới thiệu các công cụ giám sát container phổ biến và hướng dẫn chi tiết cách triển khai giám sát hiệu quả trong Docker.

      Xem danh sách các Container

      Chỉ Container đang chạy

      docker ps
      • Hiển thị các Container đang chạy cùng thông tin như ID, tên, trạng thái, thời gian khởi chạy, cổng được ánh xạ, v.v.

      Tất cả Container (bao gồm cả Container đã dừng)

      docker ps -a

      Kiểm tra logs của Container

      Xem logs từ Container

      docker logs <container_id_or_name>
      • Hiển thị logs của một Container cụ thể.

      Theo dõi logs theo thời gian thực

      docker logs -f <container_id_or_name>

      Giới hạn số dòng logs

      docker logs --tail <number> <container_id_or_name>

      Kiểm tra trạng thái Container

      docker inspect <container_id_or_name>
      • Cung cấp thông tin chi tiết về Container như cấu hình mạng, volume, trạng thái, cổng, và môi trường.

      Theo dõi tài nguyên Container đang sử dụng

      Xem nhanh tài nguyên của một hoặc nhiều Container

      docker stats
      • Hiển thị việc sử dụng CPU, bộ nhớ, mạng, và I/O của tất cả Container đang chạy.

      Để theo dõi một Container cụ thể:

      docker stats <container_id_or_name>

      Kiểm tra tiến trình trong Container

      Liệt kê các tiến trình đang chạy bên trong Container

      docker top <container_id_or_name>

      Xem cấu hình mạng của Container

      docker network inspect <network_name>
      • Hiển thị chi tiết về mạng Docker và các Container đang kết nối với mạng đó.

      Kiểm tra thay đổi trong filesystem của Container

      docker port <container_id_or_name>
      
      • Hiển thị các cổng đang được ánh xạ từ Container ra host.

      Theo dõi sự kiện Docker

      docker events
      • Hiển thị các sự kiện trong Docker như Container khởi động, dừng, tạo mới, xóa, v.v.

      Ví dụ: Theo dõi các sự kiện liên quan đến Container cụ thể

      docker events --filter 'container=<container_id_or_name>'

      Kiểm tra tài nguyên hệ thống Docker

      docker system df
      • Hiển thị thông tin về việc sử dụng tài nguyên của Docker như dung lượng của images, containers, volumes

      Theo dõi realtime logs với cấu hình output format

      docker logs <container_id_or_name> --since <time>
      • Giám sát logs từ một khoảng thời gian cụ thể (time có thể là 10m, 2h, 2023-11-20T10:00:00).

      Kiểm tra restart policies

      docker inspect <container_id_or_name> --format '{{.HostConfig.RestartPolicy}}'
      • Hiển thị thông tin về chính sách restart được thiết lập cho Container.

      Giám sát container không chỉ giúp đảm bảo hệ thống hoạt động ổn định mà còn cung cấp những thông tin quan trọng để tối ưu hóa hiệu suất. Bằng cách sử dụng các công cụ như Prometheus, Grafana, hoặc các lệnh tích hợp sẵn của Docker, bạn có thể dễ dàng quản lý và theo dõi container của mình. Hãy áp dụng ngay hôm nay để nâng cao hiệu quả vận hành hệ thống Docker của bạn!

      Docker Plugin Hostnic

      Giới thiệu

      docker-plugin-hostnic là một plugin mạng cho Docker, được phát triển bởi Yunify, cho phép gắn trực tiếp một card mạng vật lý (NIC) của máy chủ vào container. Điều này giúp container có thể giao tiếp trực tiếp qua giao diện mạng của máy chủ mà không cần thông qua lớp mạng ảo hóa.

      Tính năng chính:

      • Gắn NIC trực tiếp:
        Plugin cho phép bạn chỉ định một NIC cụ thể từ máy chủ để gắn vào container.
      • Hiệu năng mạng cao:
        Bỏ qua các lớp ảo hóa mạng (bridge, overlay), giúp giảm độ trễ và tăng thông lượng mạng.
      • Cấu hình mạng đơn giản:
        Container sử dụng cấu hình mạng trực tiếp từ NIC của máy chủ mà không cần cấu hình phức tạp.

      Plugin yêu cầu Docker phiên bản 1.9 trở lên. Đảm bảo Docker của bạn tương thích bằng lệnh:

      docker --version

      Cài đặt plugin:

      docker pull qingcloud/docker-plugin-hostnic
      docker run -v /run/docker/plugins:/run/docker/plugins -v /etc/docker/hostnic:/etc/docker/hostnic --network host --privileged qingcloud/docker-plugin-hostnic docker-plugin-hostnic

      Tạo một mạng Docker sử dụng plugin hostnic:

      docker network create -d hostnic --subnet=192.168.1.0/24 --gateway 192.168.1.1 hostnic
      • --subnet: Phạm vi IP của mạng Docker.
      • --gateway: Cổng mặc định của mạng (thường là địa chỉ IP của NIC trên máy chủ).

      Khởi chạy một container sử dụng mạng hostnic:

      docker run -it --ip 192.168.1.5 --mac-address 52:54:0e:e5:00:f7 --network hostnic ubuntu:14.04 bash
      • --ip: Chỉ định địa chỉ IP cho container (nên nằm trong subnet đã tạo ở bước trên).
      • --mac-address: Chỉ định địa chỉ MAC cho container để tránh xung đột.

      Lưu ý quan trọng:

      1. IP và MAC phải duy nhất:
        Nếu bạn không chỉ định --ip, Docker sẽ tự động gán IP, nhưng bạn cần đảm bảo không có xung đột IP hoặc MAC trên mạng.
      2. Lưu cấu hình mạng:
        Các cấu hình mạng được lưu tại tệp /etc/docker/hostnic/config.json. Nếu plugin bị xóa hoặc khởi động lại, bạn có thể khôi phục cấu hình từ tệp này.
      3. Sử dụng cẩn thận với một NIC duy nhất:
        Nếu máy chủ chỉ có một NIC, việc gắn trực tiếp NIC này vào container có thể làm gián đoạn kết nối mạng của máy chủ.

      Tham khảo thêm:

      Cài đặt Composer, NVM, Node.js Linux

      Giới thiệu :

      Composer, NVM và Node.js là những công cụ phát triển phổ biến được sử dụng trong nhiều dự án phần mềm hiện nay. Composer giúp quản lý các thư viện PHP, NVM hỗ trợ quản lý các phiên bản Node.js, và Node.js là nền tảng cho việc phát triển các ứng dụng web mạnh mẽ. Việc cài đặt và cấu hình đúng cách những công cụ này trên hệ điều hành Linux sẽ giúp bạn tạo ra một môi trường phát triển mạnh mẽ và linh hoạt. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách cài đặt Composer, NVM và Node.js trên Linux một cách chi tiết.

      Tìm hiểu cơ bản nodeJS, NVM, Pm2, Composer

      1. Node.js

      • Node.js là một nền tảng JavaScript được phát triển trên động cơ V8 của Google Chrome. Nó cho phép chạy JavaScript bên ngoài trình duyệt, điều này có nghĩa là bạn có thể xây dựng các ứng dụng máy chủ, ứng dụng web hoặc các công cụ dòng lệnh bằng JavaScript.
      • Tính năng nổi bật: Node.js sử dụng mô hình bất đồng bộ, không chặn (non-blocking) và sự kiện (event-driven), giúp xử lý các yêu cầu đồng thời một cách hiệu quả, lý tưởng cho các ứng dụng web thời gian thực hoặc các ứng dụng cần tương tác nhanh.

      2. NVM (Node Version Manager)

      • NVM là một công cụ dòng lệnh giúp bạn quản lý nhiều phiên bản Node.js trên cùng một hệ thống. Nó cho phép bạn dễ dàng cài đặt, thay đổi và chuyển đổi giữa các phiên bản Node.js khác nhau mà không cần phải thay đổi cấu hình hệ thống.
      • Lý do sử dụng: Khi làm việc với nhiều dự án khác nhau, mỗi dự án có thể yêu cầu một phiên bản Node.js khác nhau. NVM giúp bạn dễ dàng chuyển đổi giữa các phiên bản Node mà không gặp phải vấn đề tương thích.

      3. PM2

      • PM2 là một trình quản lý tiến trình cho Node.js, giúp bạn dễ dàng chạy, giám sát và quản lý các ứng dụng Node.js trong môi trường sản xuất. Nó cho phép bạn giữ các ứng dụng Node.js chạy liên tục và tự động khởi động lại khi ứng dụng gặp sự cố.
      • Tính năng nổi bật:
        • Quản lý tiến trình: PM2 giúp bạn chạy ứng dụng Node.js trong nền và giám sát chúng.
        • Khởi động lại tự động: PM2 sẽ tự động khởi động lại ứng dụng nếu có sự cố.
        • Quản lý logs: PM2 cho phép bạn dễ dàng xem và quản lý log của ứng dụng.
        • Cluster mode: PM2 hỗ trợ chạy ứng dụng Node.js trong chế độ phân tán (cluster), giúp tận dụng tối đa các lõi CPU.

      4. Composer

      • Composer là một công cụ quản lý thư viện (dependency manager) cho PHP. Nó giúp bạn quản lý các thư viện mà dự án của bạn phụ thuộc vào, tự động tải về và cài đặt các thư viện này từ các kho lưu trữ (như Packagist).
      • Tính năng nổi bật:
        • Quản lý phụ thuộc: Composer giúp quản lý và cài đặt các thư viện cần thiết cho ứng dụng PHP của bạn.
        • Cập nhật thư viện: Composer có thể tự động cập nhật các thư viện khi có phiên bản mới.
        • Autoloading: Composer cung cấp tính năng autoloading, giúp tự động tải các lớp PHP khi cần thiết mà không cần phải gọi thủ công.

      Cài đặt NodeJS phiên bản cố định :

      NodeJS v16.x:

      curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - &&
      sudo apt-get install -y nodejs
      
      ## AS root :
      curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
      apt-get install -y nodejs

      NodeJS v18.x:

      curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&
      sudo apt-get install -y nodejs
      
      ##As root :
      curl -fsSL https://deb.nodesource.com/setup_18.x | bash - &&
      	apt-get install -y nodejs

      NodeJS LTS newest:

      curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - &&
      sudo apt-get install -y nodejs
      
      ##As root:
      curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - &&
      	apt-get install -y nodejs

      Cài đặt NodeJS bằng NVM (Node Version Manager)

      curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
      source ~/.bashrc
      nvm list-remote

      List Remote sẽ trả về rất nhiều phiên bản, sau đó chỉ cần chọn phiên bản cần cài :

      Output
      . . .
             v20.15.0   (LTS: Iron)
             v20.15.1   (LTS: Iron)
             v20.16.0   (LTS: Iron)
             v20.17.0   (LTS: Iron)
             v20.18.0   (Latest LTS: Iron)
              v21.0.0
              v21.0.0
              v21.1.0
              v21.2.0
              v21.3.0
              v21.4.9
              v21.5.0
              v21.6.0
              v21.6.1
              v21.6.2
              v21.7.0
              v21.7.1
              v21.7.2
              v21.7.3
              v22.0.0
              v22.1.0
              v22.2.0
              v22.3.0
              v22.4.0
              v22.4.1
              v22.5.0
              v22.5.1
              v22.6.0
              v22.7.0
              v22.8.0
              v22.9.0
      nvm install v20.18.0
      nvm use 20.18.0 ##Switch Version of Node will use

      Cài đặt Composer

      Downloading Composer:
          cd ~
          curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
          HASH=`curl -sS https://composer.github.io/installer.sig`
          php -r "if (hash_file('SHA384', '/tmp/composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
          sudo php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer

      Test composer

      composer

      Cài đặt PM2 :

      sudo npm i -g pm2

      Testing command với node project :

      pm2 --name c1 start "PORT=3400 node build/server.js"
      pm2 --name c2 start "PORT=3401 node build/server.js"

      Sau khi cài đặt thành công Composer, NVM và Node.js, bạn sẽ có một môi trường phát triển mạnh mẽ để làm việc với các dự án PHP và JavaScript trên Linux. Việc sử dụng các công cụ này sẽ giúp bạn quản lý các thư viện và phiên bản dễ dàng hơn, đồng thời hỗ trợ tối ưu cho các ứng dụng web của mình. Hy vọng rằng với hướng dẫn này, bạn sẽ nhanh chóng thiết lập được môi trường phát triển lý tưởng cho công việc của mình trên hệ điều hành Linux.

      Monitoring

      Trong quản lý hệ thống và ứng dụng, việc sử dụng công cụ monitor để theo dõi hiệu suất đóng vai trò vô cùng quan trọng. Các giải pháp monitor giúp bạn giám sát tài nguyên, xác định các vấn đề tiềm ẩn, và đảm bảo hệ thống luôn hoạt động ổn định. Từ việc giám sát CPU, RAM, và lưu trữ, đến theo dõi log và hiệu suất ứng dụng, monitor là chìa khóa giúp bạn tối ưu hóa quy trình làm việc.

      Prometheus Alertmanager: Thiết lập cảnh báo thông minh trên Ubuntu 20.04+

      [Thực chiến] Prometheus Alertmanager: Thiết lập cảnh báo thông minh trên Ubuntu 20.04+

      Giới thiệu và khi nào nên dùng Prometheus Alertmanager

      Prometheus Alertmanager là thành phần quản lý cảnh báo trong hệ sinh thái Prometheus. Vai trò của Alertmanager là nhận cảnh báo từ Prometheus, thực hiện tổ chức và định tuyến chúng tới các kênh thông báo phù hợp, đồng thời hỗ trợ gom nhóm, ẩn cảnh báo (inhibition) và quản lý thời gian cảnh báo một cách hiệu quả. Trong bối cảnh triển khai trên Ubuntu 20.04+ hoặc hệ thống tương đương, Alertmanager giúp giảm nhiễu cảnh báo bằng cách gom nhóm các cảnh báo liên quan và gửi thông báo tới đội ngũ vận hành đúng lúc và đúng kênh nói chuyện.

      Bản chất của Alertmanager là tập hợp các quy tắc định tuyến (routes), các receivers (kênh nhận thông báo), và các cơ chế tối ưu hóa như group_by, group_wait, group_interval và repeat_interval. Ngoài ra Alertmanager còn hỗ trợ quản lý tính sẵn có (High Availability), tích hợp nhiều kênh thông báo (email, Slack, PagerDuty, webhook, v.v.), và có thể làm việc phối hợp với các công cụ giám sát và thông báo khác như Prometheus và Pushgateway. Các nguyên tắc thiết kế được mô tả trong tài liệu Prometheus nhấn mạnh việc: giữ cho cảnh báo đơn giản, cảnh báo theo triệu chứng của sự cố người dùng, có liên kết tới các console cho nhanh chóng xác định nguyên nhân, và tránh cảnh báo khi không có hành động cần thực hiện.

      Kiến trúc và khái niệm cốt lõi

      Kiến trúc của hệ thống cảnh báo với Alertmanager xoay quanh vài khái niệm then chốt sau đây, được nêu rõ trong tài liệu của Prometheus:

      • Alerting và quy trình định tuyến: Alertmanager nhận cảnh báo từ Prometheus, sau đó phân bổ chúng theo các tuyến (route) và danh sách nhận (receivers). Các quy tắc gom nhóm (group_by, group_wait, group_interval) giúp hợp nhất nhiều cảnh báo liên quan thành một thông báo duy nhất để giảm nhiễu.
      • Những kênh nhận thông báo (notification integrations): Alertmanager có thể gửi cảnh báo qua nhiều kênh khác nhau như email, webhook, Slack hoặc các dịch vụ thông báo khác. Việc định tuyến có thể tùy biến dựa trên nhãn (labels) của cảnh báo để gửi tới đúng đội ngũ hoặc hệ thống liên quan.
      • Quản lý High Availability (HA): Đảm bảo dịch vụ cảnh báo luôn sẵn sàng bằng cách triển khai nhiều instance Alertmanager và phân phối tải hoặc bật chế độ HA theo thiết kế của hệ thống.
      • Templates và cấu hình thông báo: Alertmanager hỗ trợ các template thông báo để tùy biến nội dung và định dạng thông báo trước khi gửi tới receiver. Các tham chiếu template và ví dụ template được đưa ra nhằm giúp người vận hành điều chỉnh nội dung thông báo cho phù hợp với quy trình vận hành.
      • Quản trị và an ninh: Cấu hình có thể hỗ trợ xác thực và bảo mật khi trao đổi thông tin thông báo, cùng với khả năng phân quyền và quản lý các luồng cảnh báo nhạy cảm.

      Yêu cầu và tiền đề triển khai với Ubuntu 20.04+

      Để triển khai Prometheus Alertmanager trên nền Ubuntu 20.04+ (hoặc các hệ điều hành tương thích), cần lưu ý các yếu tố sau để đảm bảo vận hành ổn định và an toàn:

      • Hệ điều hành tối thiểu là Ubuntu 20.04 hoặc phiên bản tương thích với kernel và giao thức mạng hiện đại.
      • Prometheus đang hoạt động và có các rules cảnh báo được định nghĩa để gửi tới Alertmanager.
      • Kênh nhận thông báo (receivers) phải được định nghĩa rõ ràng và có quyền truy cập tới dịch vụ nhận thông báo (ví dụ máy chủ SMTP cho email hoặc endpoints của webhook).
      • Cân nhắc triển khai High Availability cho Alertmanager để đảm bảo khả năng sẵn sàng và giảm thiểu thời gian gián đoạn cảnh báo.
      • Cân nhắc an toàn mạng và bảo mật khi truyền nhận cảnh báo qua mạng, đặc biệt khi dùng HTTPS và xác thực cho các kênh nhận thông báo.

      Cài đặt và triển khai tổng quan

      Tài liệu nhấn mạnh vai trò của Alertmanager là quản lý cảnh báo một cách có tổ chức và cung cấp các kênh nhận thông báo linh hoạt. Đối với Ubuntu 20.04+, quy trình triển khai thường bao gồm cài đặt Alertmanager cùng với cấu hình để định tuyến cảnh báo tới kênh nhận phù hợp, sau đó kết nối với Prometheus để nhận các cảnh báo từ các rule được đánh giá trong Prometheus. Quá trình triển khai nên xem xét khả năng sẵn có (HA) và cơ chế quản lý cấu hình để dễ bảo trì trong môi trường sản xuất.

      Dưới đây là một khung minh họa cho cấu hình Alertmanager ở mức tối giản nhằm hình dung các khối cơ bản. Lưu ý đây là ví dụ tham khảo; nội dung thực tế nên được điều chỉnh cho phù hợp với quy trình vận hành và các kênh nhận được hỗ trợ trong tổ chức của bạn.

      global:
        resolve_timeout: 5m
      
      route:
        group_by: ['alertname']
        group_wait: 30s
        group_interval: 5m
        repeat_interval: 4h
        receiver: 'default-receiver'
      
      receivers:
      - name: 'default-receiver'
        email_configs:
        - to: 'ops@example.com'
          send_resolved: true
      

      Trong thực tế, cấu hình có thể mở rộng với nhiều receivers và quy tắc định tuyến phức tạp hơn để đáp ứng phạm vi hệ thống và yêu cầu vận hành của tổ chức.

      Cấu hình Alertmanager và cách thức tích hợp với Prometheus

      Alertmanager được thiết kế để làm việc cùng Prometheus nhằm tối ưu hoá việc gửi cảnh báo trên các kênh phù hợp. Prometheus sẽ đánh giá các alerting rules và gửi các cảnh báo tới Alertmanager. Tại đây, Alertmanager sẽ xử lý theo các route đã được định nghĩa, ghép nhóm cảnh báo tương tự, và đẩy thông báo tới receiver phù hợp. Việc định tuyến dựa vào các nhãn (labels) của cảnh báo cho phép phân phối cảnh báo đến đúng đội ngũ hoặc dịch vụ liên quan. Đây là yếu tố quan trọng giúp giảm noise và nâng cao thời gian phản hồi của đội ngũ vận hành.

      Trong chủ đề an ninh và xác thực, cấu hình Alertmanager có thể được mở rộng với các cơ chế bảo mật để đảm bảo an toàn khi trao đổi thông báo qua mạng, bao gồm việc thiết lập HTTPS và xác thực cho các kênh nhận thông báo nếu cần thiết.

      Ví dụ thiết kế và vận hành thực tế

      Một kịch bản điển hình trong môi trường sản xuất là một ứng dụng phục vụ người dùng có độ trễ cao đột biến. Dưới đây là cách tiếp cận ở mức vận hành:

      1. Định nghĩa một alert rule trong Prometheus để phát hiện tăng latency vượt ngưỡng và/hoặc tỉ lệ lỗi tăng lên. Rule này sẽ gửi cảnh báo tới Alertmanager.
      2. Alertmanager nhận cảnh báo, kiểm tra các điều kiện để ghép nhóm và xác định receiver phù hợp với nhóm vận hành (ví dụ on-call hoặc the on-call channel).
      3. Route được cấu hình để gửi thông báo tới người chịu trách nhiệm qua kênh email và Slack, hoặc tới một webhook tích hợp hệ thống vận hành trung tâm.
      4. Khi sự cố được resolves, cảnh báo sẽ được đóng và một thông báo gửi tới receiver xác nhận tình trạng đã được khắc phục.

      Trong quá trình triển khai, điều quan trọng là đảm bảo có thể kiểm thử luồng cảnh báo để xác nhận rằng Alertmanager có thể nhận được cảnh báo từ Prometheus, xử lý đúng bằng cách ghép nhóm và gửi thông báo tới receiver phù hợp. Một nguyên tắc được nhắc tới trong tài liệu Prometheus là cảnh báo nên tập trung vào triệu chứng thay vì cố gắng theo dõi mọi nguyên nhân có thể gây ra sự cố.

      Bảo mật và hiệu năng

      Với mô hình vận hành thực tế, các yếu tố bảo mật và hiệu năng là cần thiết để đảm bảo cảnh báo được gửi đúng người đúng lúc mà không rò rỉ thông tin hay gặp gián đoạn. Các yêu cầu quan trọng theo nguyên tắc được đề cập bao gồm:

      • Cấu hình an toàn cho kênh nhận thông báo: đảm bảo đường truyền tới receiver được bảo mật, đặc biệt khi gửi qua mạng công khai hoặc qua các hệ thống bên ngoài tổ chức.
      • Quản lý naming và tổ chức alert: đặt tên theo Camel Case cho các cảnh báo, hạn chế số lượng cảnh báo và đảm bảo mỗi cảnh báo liên quan tới một triệu chứng cụ thể có thể dễ dàng xác định. Việc này giúp giảm nhiễu và tăng khả năng đo lường tình trạng hệ thống.
      • Metamonitoring cho hệ thống cảnh báo: có các cảnh báo liên quan đến Prometheus servers, Alertmanager instances và các thành phần liên quan (ví dụ Pushgateway) nhằm đảm bảo toàn bộ chu trình cảnh báo đang hoạt động đúng cách.
      • Thiết kế cảnh báo theo ngữ cảnh người dùng: ưu tiên cảnh báo ở mức latency và error rate ở tầng cao nhất có thể, đồng thời liên kết với các console liên quan để dễ xem nguyên nhân.

      Vận hành và giám sát hệ thống cảnh báo

      Để đảm bảo Alertmanager vận hành liên tục, cần có các hoạt động giám sát và kiểm thử định kỳ. Các khía cạnh cần kiểm tra thường gặp bao gồm:

      • Kiểm tra tính sẵn có của Alertmanager ở chế độ HA và khả năng chịu lỗi khi có node bị lỗi.
      • Đảm bảo các receivers nhận đúng dạng cảnh báo và có thời gian đáp ứng phù hợp với mức độ nghiêm trọng của cảnh báo.
      • Kiểm tra các template thông báo để đảm bảo nội dung và định dạng phù hợp với thực tiễn vận hành và ghi nhận chi tiết giúp debugging nhanh chóng.
      • Kiểm tra luồng cảnh báo từ Prometheus tới Alertmanager và từ Alertmanager tới receiver, với các test nhỏ mô phỏng cảnh báo và xác nhận phản hồi.

      Thông qua các nguyên tắc và khuyến nghị trên, quá trình vận hành Alertmanager trên Ubuntu 20.04+ có thể được duy trì ổn định và dễ bảo trì trong thời gian dài.

      Kiểm thử, xác nhận và xác thực vận hành

      Để đảm bảo chất lượng và tính đúng đắn của cấu hình Alertmanager, thực hiện một chu kỳ kiểm thử có thể bao gồm các bước sau:

      • Kiểm tra cú pháp cấu hình bằng cách xác nhận file cấu hình Alertmanager trước khi chạy trong môi trường sản xuất.
      • Thực hiện cảnh báo mô phỏng (test alert flow) bằng cách kích hoạt một cảnh báo trong Prometheus và xác nhận Alertmanager nhận và gửi thông báo tới receiver được định nghĩa.
      • Kiểm tra log của Alertmanager để xác nhận các hành động định tuyến và các thông báo nhận được bởi receiver.
      • Đảm bảo khả năng phục hồi khi một node trong chế độ HA bị lỗi và cảnh báo vẫn được định tuyến tới receiver còn hoạt động.

      Checklist vận hành cuối bài

      • Đảm bảo Prometheus và Alertmanager được triển khai đúng với chu trình cảnh báo phù hợp với yêu cầu vận hành.
      • Cấu hình route và receivers phù hợp với tổ chức, team và SLAs.
      • Thiết lập TLS và xác thực cho các kênh nhận thông báo nếu cần thiết.
      • Thiết lập cơ chế High Availability cho Alertmanager và theo dõi sức khỏe của các node.
      • Thiết lập và kiểm tra templates thông báo để đảm bảo nội dung có thể đọc được và actionable.
      • Thực hiện kiểm thử luồng cảnh báo định kỳ và cập nhật cấu hình khi cần.

      Kết luận

      Prometheus Alertmanager cung cấp cơ chế quản lý cảnh báo tập trung, giúp định tuyến và tối ưu hóa các thông báo đến đúng người và đúng kênh. Khi triển khai trên Ubuntu 20.04+ hoặc hệ thống tương đương, cần chú ý tới các nguyên tắc thiết kế: định tuyến có ngữ cảnh, gom nhóm để giảm nhiễu, và ưu tiên cảnh báo theo triệu chứng có tác động lên người dùng. Bên cạnh đó, sự tích hợp giữa Alertmanager và Prometheus, cùng với các kênh thông báo và cơ chế HA, là nền tảng cho một hệ thống giám sát và vận hành mạnh mẽ và đáng tin cậy.

      Bảo mật và Hardening Grafana trên Docker: Hướng dẫn cho Sysadmin

      Bảo mật và Hardening Grafana trên Docker: Hướng dẫn cho Sysadmin

      Grafana chạy trong Docker mang lại sự linh hoạt cho triển khai giám sát và phân tích telemetry ở quy mô doanh nghiệp. Tuy nhiên, để đảm bảo hệ thống vận hành an toàn và đáng tin cậy, việc hardening và bảo mật Grafana trên môi trường container cần được xem trọng. Bài viết này trình bày các khuyến nghị, thực hành tốt nhất và các bước triển khai bảo mật Grafana khi chạy trên Docker, với tham chiếu từ tài liệu Grafana và các khuyến nghị bảo mật chung cho hệ thống container.

      Giới thiệu và khi nào nên áp dụng

      Đối với các tổ chức triển khai Grafana trên Docker để theo dõi hệ thống, có nhiều yếu tố bảo mật cần cân nhắc trước khi đưa vào vận hànhProduction. Grafana cung cấp các tùy chọn xác thực đa dạng (LDAP, SAML, OAuth2) và khả năng tích hợp với các giải pháp quản lý bí mật như HashiCorp Vault, Google Cloud KMS, AWS KMS và Azure Key Vault để bảo vệ khóa và bí mật cơ sở dữ liệu. Việc hardening nên bắt đầu từ cấu hình xác thực, quản lý bí mật, hạn chế truy cập và thiết lập kênh TLS cho giao tiếp giữa Grafana và client hoặc giữa Grafana với nguồn dữ liệu.

      Kiến trúc cơ bản và các yếu tố bảo mật cốt lõi

      • Grafana chạy trong Docker thường làm việc với một cơ sở dữ liệu nội bộ và các nguồn dữ liệu từ bên ngoài (Prometheus, OpenTelemetry, các nguồn SQL, v.v.). Việc bảo vệ bí mật và quản lý ai có quyền truy cập vào Grafana là bắt buộc.
      • Grafana hỗ trợ xác thực từ nhiều nguồn ngoài (LDAP, SAML, OAuth2) và có khả năng quản lý người dùng/nhóm thông qua RBAC, LBAC và các cơ chế cấp phát người dùng.
      • Bảo mật dữ liệu bí mật và khóa: Grafana cho phép mã hóa bí mật trong cơ sở dữ liệu và tích hợp với các kho bí mật/khóa an toàn như Google Cloud KMS, HashiCorp Vault, AWS KMS và Azure Key Vault.
      • Giao tiếp bảo mật: thiết lập HTTPS/TLS cho Grafana và/hoặc qua reverse proxy để đảm bảo truyền tải dữ liệu an toàn giữa client, Grafana và các nguồn dữ liệu.

      Yêu cầu và chuẩn bị trước khi triển khai

      • Hệ điều hành và môi trường: sẵn sàng một máy chủ Linux (điển hình Ubuntu 20.04+ hoặc hệ CentOS tương thích) cho chạy Docker. Đảm bảo Docker được cập nhật và có hỗ trợ networking phù hợp cho Grafana và các nguồn dữ liệu.
      • Chứng chỉ TLS: chuẩn bị chứng chỉ TLS hợp lệ cho Grafana hoặc cho reverse proxy để phục vụ HTTPS. Grafana có thể được cấu hình qua reverse proxy để TLS termination hoặc thiết lập TLS trực tiếp tại Grafana theo hướng dẫn từ tài liệu “Set up HTTPS”.
      • Bí mật và khóa: xác định chiến lược quản lý bí mật cho Grafana (ví dụ: lưu trữ bí mật trong Vault hoặc KMS), đặc biệt khi Grafana lưu trữ khóa và các bí mật liên quan đến dữ liệu nguồn và cài đặt xác thực.
      • Quản lý xác thực: lựa chọn phương thức xác thực phù hợp với tổ chức (LDAP cho danh tính nội bộ, SAML cho SSO qua IdP, hoặc OAuth/OIDC cho tích hợp với nhà cung cấp OAuth2).
      • Quản trị quyền và RBAC: định nghĩa vai trò, nhóm và quyền truy cập vào dashboard, folder và data source theo nguyên tắc tối thiểu đặc quyền.

      Cấu hình bảo mật và hardening Grafana trên Docker

      Phần này tập trung vào các cấp độ cấu hình quan trọng để harden Grafana khi chạy trên Docker, dựa trên các hướng dẫn bảo mật và tính năng được Grafana hỗ trợ.

      1. Chọn và cấu hình các phương thức xác thực

      Grafana hỗ trợ nhiều phương thức xác thực ngoài. Bạn có thể chọn một hoặc kết hợp các phương thức sau để đáp ứng yêu cầu tổ chức:

      • LDAP: đồng bộ danh tính từ hệ thống thư mục doanh nghiệp.
      • SAML: SSO qua Service Provider (SP) và Identity Provider (IdP) với khả năng khôi phục và bảo vệ phiên làm việc.
      • OAuth/OIDC: xác thực qua các nhà cung cấp OAuth2/OIDC (ví dụ Google, Entra ID, GitHub, Okta, v.v.).

      Theo tài liệu Grafana, các tùy chọn LDAP, SAML và OAuth2 được nêu rõ trong các mô-đun cấu hình bảo mật và quản lý xác thực. Việc triển khai xác thực ngoài giúp cô lập quản trị người dùng, giảm thiểu việc lưu trữ mật khẩu trong Grafana và tăng cường kiểm soát truy cập.

      Khuyến nghị thực hành:

      • Đánh giá khung xác thực phù hợp với tổ chức (ví dụ tích hợp LDAP cho danh tính nội bộ hoặc SSO qua IdP với SAML).
      • Tách biệt quyền truy cập quản trị khỏi tài khoản người dùng bình thường và áp dụng RBAC để điều tiết quyền quản trị dashboard, thư mục, nguồn dữ liệu.
      • Kiểm tra và đảm bảo các cấu hình xác thực được đồng bộ với nguồn dữ liệu người dùng và tổ chức quản trị danh tính.

      2. Bảo mật dữ liệu bí mật và khóa

      Grafana cho phép mã hóa bí mật cơ sở dữ liệu và tích hợp với các kho bí mật/khóa an toàn. Bạn nên cấu hình để bí mật (ví dụ khóa, chứng chỉ, khóa truy cập) được lưu và quản lý bởi một hệ thống lưu trữ bí mật ngoài Grafana:

      • Google Cloud KMS
      • HashiCorp Vault
      • AWS KMS
      • Azure Key Vault

      Ví dụ tham khảo (không phải cú pháp trực tiếp từ tài liệu Grafana, nhưng phản ánh nguyên tắc triển khai):

      // Cấu hình tham khảo cho provider mã hóa bí mật (điểm cốt lõi là chỉ định nguồn lưu trữ bí mật ngoài Grafana)
      secret_storage_provider = Vault
      vault_address = https://vault.example.com
      vault_auth_method = token
      vault_token = <token>
      

      Đảm bảo các kết nối đến kho bí mật được bảo mật (TLS) và trợ giúp xác thực mạnh mẽ cho vault/kms.

      3. Thiết lập TLS và HTTPS

      Để bảo vệ dữ liệu khi người dùng truy cập Grafana, hãy thiết lập TLS cho giao tiếp giữa người dùng và Grafana. Grafana có thể được triển khai qua reverse proxy để xử lý TLS hoặc cấu hình TLS trực tiếp theo hướng dẫn “Set up HTTPS” trong tài liệu Grafana. Việc này giúp bảo vệ dữ liệu đăng nhập và các truy vấn tới nguồn dữ liệu khi di chuyển trên mạng.

      Gợi ý thực hành:

      • Sử dụng chứng chỉ TLS hợp lệ và được tin cậy.
      • Định kỳ gia hạn chứng chỉ và tự động làm mới khi có thể.
      • Định cấu hình plugin/người dùng proxy để chỉ cho phép TLS và chặn TLS versions yếu.

      4. Quản trị truy cập và RBAC/LBAC

      Grafana hỗ trợ RBAC (quản lý vai trò và quyền) và LBAC (Label Based Access Control) để phân quyền truy cập vào dashboard, thư mục và nguồn dữ liệu. Áp dụng RBAC/LBAC giúp giới hạn người dùng chỉ với các tài nguyên cần thiết và giảm thiểu rủi ro lạm quyền trên hệ thống Docker.

      Theo tài liệu Grafana, việc thiết lập quyền và phân quyền là một phần quan trọng của bảo mật và quản trị hệ thống Grafana.

      5. Cấu hình nâng cao bảo mật và quản lý truy cập

      Bạn có thể cấu hình việc cấp phát người dùng và nhóm bằng SCIM để đồng bộ danh sách người dùng với hệ thống quản trị danh tính, đồng thời đảm bảo các quy trình cấp phát/thu hồi tài khoản được tự động hoá. Grafana cung cấp các tùy chọn liên quan đến quản trị người dùng, nhóm và quyền qua API và giao diện quản trị.

      Khuyến nghị: kết nối Grafana với SCIM để tự động đồng bộ danh sách người dùng và nhóm, đồng thời quản lý vai trò và quyền truy cập một cách nhất quán.

      6. Bảo vệ và quản lý log, audit

      Việc theo dõi và ghi nhận sự kiện bảo mật là một phần thiết yếu của vận hành an toàn. Grafana cho phép xuất日志 và audit các hoạt động liên quan đến hệ thống. Bạn nên bật và định tuyến logs đến hệ thống quản lý log an toàn, đồng thời đảm bảo có cơ chế kiểm tra và phân tích các sự kiện bảo mật khi cần.

      7. Zuất triển và kiểm tra tính sẵn sàng bảo mật

      Để đảm bảo độ tin cậy của hệ thống bảo mật, hãy thực hiện các bước kiểm thử sau:

      • Kiểm tra khả năng đăng nhập qua các provider được cấu hình (LDAP, SAML, OAuth2) và xác nhận hoạt động SSO khi cần.
      • Kiểm tra kết nối TLS và xác thực chứng chỉ ở cả phía Grafana và nguồn dữ liệu.
      • Kiểm tra cấp phát quyền và RBAC/LBAC cho người dùng và nhóm, đảm bảo quyền tối thiểu phù hợp với vai trò.
      • Kiểm tra tích hợp với kho bí mật (Vault/KMS) và xác thực máy chủ bí mật.
      • Kiểm tra log và audit để phát hiện bất thường và vận hành đúng quy trình incident response.

      Cấu hình Docker và thực hành vận hành an toàn

      Để vận hành Grafana an toàn trong Docker, cần cân nhắc các thực hành container security cơ bản, đồng thời áp dụng các khuyến nghị từ tài liệu Grafana về bảo mật và hardening. Dưới đây là các yếu tố đáng xem xét, dựa trên các khuyến nghị tổng quát và các mục trong tài liệu Grafana:

      • Chạy Grafana bằng phiên bản Docker image được duy trì, theo dõi các bản vá và cập nhật bảo mật từ nhà cung cấp Grafana.
      • Kiểm soát truy cập máy chủ Docker, giới hạn quyền truy cập vào host và mạng liên quan đến Grafana.
      • Thiết lập TLS cho giao tiếp người dùng và các kết nối đến nguồn dữ liệu, và cân nhắc dùng reverse proxy để quản lý TLS và chứng chỉ.
      • Quản lý bí mật ngoài Grafana, thông qua Vault/Cloud KMS hoặc tương tự, và tránh lưu trữ bí mật nhạy cảm trong container.
      • Thiết lập auditing/logging và định tuyến logs sang hệ thống quản trị logs tập trung.

      Ví dụ thực hành và minh họa triển khai (khung tham chiếu)

      Dựa trên các hướng dẫn và tính năng được Grafana công bố, dưới đây là khung tham chiếu cho một triển khai Grafana an toàn trên Docker. Lưu ý: các tham số chi tiết có thể thay đổi tùy theo phiên bản Grafana và môi trường vận hành. Bạn nên tham khảo tài liệu cập nhật khi triển khai:

      // Sơ đồ triển khai tham khảo (không phải cú pháp cấu hình chính thức)
      - Grafana chạy trong Docker, nằm sau reverse proxy (người dùng truy cập qua HTTPS)
      - Xác thực qua một hoặc nhiều provider: LDAP/SAML/OAuth2
      - Bí mật và khóa được lưu trữ ngoài Grafana (Vault/KMS)
      - RBAC/LBAC được cấu hình cho người dùng và nhóm
      - SCIM được bật để đồng bộ người dùng từ IdP
      - Logs được gửi tới hệ thống quản trị logs và audit
      

      Để kiểm tra nhanh sau triển khai, bạn có thể thực hiện các bước sau:

      1. Kiểm tra TLS: curl -I https://grafana.example.com và xác nhận trả về mã 200/301 với TLS được thiết lập đúng.
      2. Kiểm tra xác thực: thực hiện đăng nhập bằng tài khoản được cấp từ IdP và xác nhận hệ thống ghi nhận sự kiện đăng nhập.
      3. Kiểm tra quyền: đăng nhập bằng tài khoản thuộc nhóm có quyền truy cập dashboard và xác nhận không thể truy cập các tài nguyên ngoài phạm vi được cấp.
      4. Kiểm tra bí mật: xác thực rằng bí mật được Vault/KMS cấp phát và Grafana có thể truy cập khi cần.

      Đo lường hiệu suất và giám sát an toàn

      Ngoài bảo mật, hiệu suất và tính sẵn sàng là yếu tố quan trọng. Grafana và hệ sinh thái của nó cung cấp các công cụ để giám sát và kiểm tra hiệu suất dưới tải cao:

      • Đánh giá và thực hiện các bài kiểm tra tải để đảm bảo phản hồi và thời gian truy cập ở mức chấp nhận được, đặc biệt khi có nhiều người dùng hoặc nhiều nguồn dữ liệu đồng thời kết nối.
      • Kết nối Grafana với các nguồn dữ liệu và kiểm soát truy vấn để tránh ảnh hưởng đến nguồn dữ liệu gốc.
      • Giám sát an toàn, audit và log để nhanh chóng nhận diện và xử lý các sự kiện bảo mật hoặc bất thường.

      Kiểm tra, xác thực và đánh giá sau khi triển khai

      Quy trình kiểm tra sau triển khai nên bao gồm:
      – Xác thực tích hợp với IdP và các provider xác thực đã chọn.
      – Kiểm tra TLS ở cả phía người dùng và phía nguồn dữ liệu.
      – Kiểm tra quyền truy cập và RBAC/LBAC theo vai trò thực tế.
      – Kiểm tra tích hợp với kho bí mật và cơ chế quản lý khóa.
      – Kiểm tra log và audit để đảm bảo ghi nhận đầy đủ các sự kiện bảo mật.

      Checklist vận hành cuối cùng

      • Grafana được cập nhật và chạy bằng Docker image được duy trì.
      • TLS/HTTPS được thiết lập và chứng chỉ được gia hạn định kỳ.
      • Xác thực ngoài được cấu hình và đồng bộ với IdP/LDAP/OAuth2.
      • Bí mật và khóa được lưu trữ an toàn ngoài Grafana (Vault/KMS) và Grafana có quyền truy cập đúng.
      • Quyền truy cập người dùng, nhóm và dashboard được quản lý bằng RBAC/LBAC, với nguyên tắc tối đa đặc quyền.
      • SCIM được bật (nếu có) để đồng bộ danh sách người dùng từ IdP.
      • Logging và audit được định tuyến tới hệ thống quản trị logs và có kế hoạch phản ứng sự cố.

      Kết luận

      Hardening Grafana trong Docker là quá trình liên tục và cần kết hợp giữa xác thực an toàn, quản lý bí mật, bảo mật mạng và giám sát vận hành. Việc cấu hình đúng các lựa chọn xác thực, bảo vệ bí mật và quản lý quyền truy cập sẽ giúp giảm thiểu rủi ro an ninh và tăng tính sẵn sàng cho môi trường quan trọng của bạn. Bởi Grafana cung cấp hỗ trợ cho LDAP, SAML và OAuth2, cùng với khả năng tích hợp bí mật với Vault/KMS và khả năng bảo mật qua TLS, tổ chức có thể thiết lập một nền tảng giám sát an toàn trên Docker mà vẫn linh hoạt cho quy mô và nhu cầu ngày càng tăng.

      Tối ưu hiệu năng Zabbix trên Ubuntu 22.04+: Chiến lược cho môi trường production

      Tối ưu hiệu năng Zabbix trên Ubuntu 22.04+: Chiến lược cho môi trường production

      Giới thiệu

      Bài viết này trình bày chiến lược tối ưu hóa hiệu năng cho Zabbix trên Ubuntu 22.04+ trong môi trường production. Với mô hình triển khai hiện đại, Zabbix cho phép phân tán tải bằng cách kết hợp máy chủ, agent và các máy chủ proxy được phân bổ ở nhiều vị trí, đồng thời tận dụng các tính năng an ninh và tối ưu hóa hiệu suất có sẵn trong hệ sinh thái Zabbix. Nội dung tập trung vào các khía cạnh kiến trúc, cài đặt, cấu hình tối ưu, triển khai thực tế và quy trình vận hành để đảm bảo hiệu năng ổn định và có thể mở rộng.

      Kiến trúc và khái niệm cốt lõi

      Hiệu năng của hệ thống giám sát phụ thuộc vào cách bạn sắp đặt các thành phần chính của Zabbix và cách chúng giao tiếp với nhau:

      • Zabbix server: Thành phần xử lý chính, nhận dữ liệu từ các agent/proxy, thực thi các biểu thức cảnh báo và lưu trữ lịch sử.
      • Agent: Thực thi trên các máy chủ/máy đích để cung cấp dữ liệu giám sát cho server hoặc proxy.
      • Proxy: Lưu trữ và đệm dữ liệu ở mức trung gian; giúp phân tán tải và tăng khả năng mở rộng cho hệ thống ở quy mô lớn.
      • Java gateway (nếu có): Thành phần bổ sung cho các trường hợp tích hợp Java.
      • High availability (HA): Môi trường production thường yêu cầu cơ chế sẵn sàng cao cho server và/hoặc proxy để giảm thời gian ngừng dịch vụ và mất dữ liệu trong khi bảo toàn hiệu suất hoạt động.
      • Distributed monitoring: Khả năng giám sát phân tán qua multiple proxies và sự đồng bộ cấu hình giữa các thành phần, giúp mở rộng quy mô và tăng tính resilience.
      • Encryption: Bảo mật kết nối giữa các thành phần thông qua các cơ chế mã hóa và khóa chia sẻ (TLS/PSK theo tài liệu Zabbix).

      Chuẩn bị và cài đặt trên Ubuntu 22.04+

      Đối với nền tảng ubuntu-22.04-plus, Zabbix có thể cài đặt từ các gói Debian/Ubuntu. Quá trình này bao gồm cài đặt các thành phần cần thiết và cấu hình ban đầu để có thể đi vào vận hành. Khi triển khai cho production, bạn có thể cân nhắc sử dụng một hoặc nhiều proxy để phân tán tải và thiết lập cơ chế giao tiếp an toàn giữa server và proxy.

      Yêu cầu và chuẩn bị

      • Hệ điều hành: Ubuntu 22.04+ (64-bit) hoặc các bản phân phối tương thích khác được hỗ trợ.
      • Môi trường chạy Zabbix server và frontend (web server và môi trường PHP) đủ đáp ứng tải giám sát dự kiến.
      • Sơ đồ mạng cho phép kết nối giữa Zabbix server, proxies và agents.

      Cài đặt từ gói Debian/Ubuntu

      Quá trình cài đặt từ gói đóng gói cho Debian/Ubuntu được mô tả trong tài liệu Zabbix. Dưới đây là các bước thực tế ở mức khung tham khảo cho hệ thống Ubuntu 22.04+:

      sudo apt update
      sudo apt install -y zabbix-server zabbix-frontend-php zabbix-agent
      

      Trong trường hợp bạn mở rộng với mô hình phân tán, có thể thêm zabbix-proxy hoặc các thành phần khác theo nhu cầu, sau đó khởi động và bật tự động các dịch vụ:

      sudo systemctl enable --now zabbix-server zabbix-agent

      Kiểm tra trạng thái dịch vụ để đảm bảo các thành phần đang hoạt động bình thường:

      systemctl status zabbix-server
      systemctl status zabbix-agent

      Cấu hình ban đầu và liên kết với cơ sở dữ liệu

      Với mô hình cài đặt từ gói, bạn sẽ cần cấu hình kết nối cơ sở dữ liệu và tích hợp với giao diện web. Trong các bài hướng dẫn chi tiết của Zabbix, các bước này được mô tả rõ ràng cho từng ngữ cảnh cài đặt (cơ sở dữ liệu và phiên bản frontend). Đối với mục tiêu tối ưu hóa hiệu năng ở production, bạn có thể xem xét việc tách biệt cơ sở dữ liệu và tối ưu đường dẫn truy vấn giữa server và cơ sở dữ liệu.

      Cấu hình tối ưu hiệu năng cho production

      Để tối ưu hiệu năng cho Zabbix trên Ubuntu 22.04+, tập trung vào các nguyên tắc sau đây, được hỗ trợ bởi các khía cạnh kiến trúc của Zabbix và các chức năng phân tán/điện tử của hệ thống:

      Phân tán tải và sử dụng proxies

      • Sử dụng proxy ở các vùng địa lý hoặc phân khu dữ liệu để thu thập dữ liệu từ các hosts và gửi lên server ở cấp cao hơn. Distributed monitoring giúp giảm tải cho Zabbix server, đồng thời tăng tốc độ xử lý và đảm bảo tính sẵn sàng cao.
      • Thiết lập đồng bộ cấu hình giữa server và proxies để đảm bảo các rule, templates và discovery được áp dụng nhất quán trên toàn hệ thống.

      Quản lý ha và redundancy

      • Áp dụng cơ chế High availability cho các thành phần then chốt (server và/hoặc proxy) để giảm thiểu thời gian gián đoạn dịch vụ khi thay đổi hoặc gặp sự cố.
      • Thiết kế topology sao cho proxy có thể hoạt động độc lập khi server gặp sự cố, và dữ liệu được đồng bộ khi khôi phục.

      Bảo mật và mã hóa liên lạc

      Đảm bảo liên lạc giữa các thành phần được bảo mật bằng các cơ chế mã hóa. Zabbix hỗ trợ Encryption với các hình thức:

      • Sử dụng chứng chỉ (certificates) để thiết lập TLS giữa các thành phần.
      • Sử dụng khóa chia sẻ trước (PSK) khi thiết lập kết nối giữa các thành phần.

      Làm chủ vòng đời và hiệu suất truy vấn

      • Cân nhắc số lượng poller, trappers và các yếu tố xử lý liên quan trong Zabbix server để phù hợp với tải mong đợi. Các yếu tố này được đề cập trong khung quản trị chung của tài liệu Zabbix và có thể được điều chỉnh thông qua cấu hình phù hợp với môi trường của bạn.
      • Sử dụng template và discovery để tinh gọn dữ liệu thu thập được, tránh tạo quá nhiều item tĩnh ngoài phạm vi cần thiết.

      Cấu hình và triển khai thực tế

      Để vận hành trên môi trường production, hãy cân nhắc các kịch bản triển khai phổ biến sau:

      Mô hình một server, nhiều proxy

      Đối với quy mô vừa và lớn, bạn có thể triển khai một Zabbix server duy nhất phối hợp với nhiều proxy ở các khu vực khác nhau. Server chịu trách nhiệm tổng hợp dữ liệu, trong khi proxies đảm bảo thu thập dữ liệu và gửi về server. Quá trình đồng bộ cấu hình giữa server và proxies được hỗ trợ để đảm bảo tính nhất quán.

      Mô hình HA cho server hoặc proxy

      Trong môi trường yêu cầu mức sẵn sàng cao, xem xét triển khai các giải pháp HA cho server và/hoặc proxy. Tài liệu Zabbix mô tả rõ ràng khái niệm HA ở các thành phần khác nhau của hệ thống.

      Tiêu chuẩn hóa và quản trị cấu hình

      Quản lý cấu hình từ một nguồn duy nhất và sử dụng các template, discovery rule, và prototypes để tự động hóa việc mở rộng giám sát, giảm thiểu công sức vận hành và tránh sai lệch cấu hình giữa các máy chủ và proxy.

      An ninh thông tin và quản trị access

      Đảm bảo quyền truy cập phù hợp cho người dùng và nhóm người dùng, đồng thời áp dụng cơ chế bảo mật liên lạc như đã nêu ở phần Encryption và chuẩn bị khóa và chứng chỉ cho hệ thống.

      <h2 Cấu hình chi tiết cho hành động và giám sát hiệu năng

      Trong tài liệu Zabbix có phần Quickstart và phần khám phá (Discovery) cũng như các công cụ quản trị khác. Đây là cơ sở để bạn thiết lập các yếu tố nhằm tối ưu hóa hiệu năng:

      • Quickstart hướng dẫn cách đăng nhập, thêm host, tạo item và trigger để có được nền tảng giám sát nhanh chóng và có thể mở rộng sau này.
      • Discovery và low-level discovery (LLD) cho tự động phát hiện và đưa ra các prototypes cho item, trigger và graph, giúp giảm thời gian vận hành và tăng hiệu quả quản trị.
      • Templates và template groups để chuẩn hóa cách giám sát cho các hệ thống khác nhau, đồng thời dễ dàng nhân rộng khi mở rộng hạ tầng.
      <h2 Ví dụ triển khai thực tế

      Dưới đây là một bối cảnh minh họa cho việc tối ưu hiệu năng trên quy mô trung bình đến lớn:

      • Một Zabbix server chịu trách nhiệm tổng hợp và phân tích dữ liệu từ các proxies ở 3 khu vực, mỗi proxy đảm nhận dữ liệu từ 10–50 hosts tùy khu vực.
      • Sử dụng TLS cho liên lạc giữa server và proxies; sử dụng PSK cho kết nối giữa các thành phần khi cần thiết.
      • Thiết lập discovery rules và item prototypes để tự động mở rộng giám sát mà không phụ thuộc vào việc cấu hình thủ công từng host.
      <h2 Bảo mật và quản trị quyền truy cập

      Trong các triển khai production, cần thực hiện các biện pháp bảo mật được Zabbix nêu trong phần Encryption:

      • Thiết lập chứng chỉ (certificates) để mã hóa liên lạc giữa các thành phần.
      • Sử dụng khóa chia sẻ trước (PSK) cho các thiết lập liên lạc giữa server và proxy khi phù hợp.
      <h2 Giám sát và observability

      Để đảm bảo hệ thống hoạt động ổn định, cần theo dõi các chỉ số liên quan đến hiệu năng và sức khỏe của Zabbix runtime, cũng như trạng thái của các thành phần trong kiến trúc phân tán. Việc kiểm tra các log, trạng thái dịch vụ và sự sẵn sàng của front-end (web interface) là các hoạt động vận hành hàng ngày. Bạn có thể dựa vào các phần Quickstart và các phần cấu hình trong tài liệu Zabbix để thiết lập các báo cáo và cảnh báo phù hợp với nhu cầu và SLAs của tổ chức.

      <h2 Validation và kiểm tra vận hành

      Để xác thực hoạt động tối ưu của hệ thống sau khi triển khai, thực hiện theo các bước sau:

      1. Kiểm tra trạng thái của các dịch vụ Zabbix: server, agent và proxy nếu có.
        systemctl status zabbix-server
        systemctl status zabbix-agent
        systemctl status zabbix-proxy <if_used>
      2. Đăng nhập vào giao diện web và xác nhận các host đã được liệt kê đúng theo cấu hình.
      3. Tạo mới một host và một item đơn giản, rồi xác nhận item chạy và dữ liệu được lưu trữ.
      4. Kiểm tra discovery và templates để đảm bảo tự động hóa đang hoạt động đúng như mong đợi.
      5. Kiểm tra cơ chế gửi thông báo khi có sự cố (media types, actions) phù hợp với quy trình vận hành.
      <h2 Final operational checklist
      • Kiểm tra topology và sự có mặt của server và proxies (nếu có) trong hệ thống phân tán.
      • Đảm bảo TLS/PSK được thiết lập cho các kết nối giữa các thành phần và tuân thủ chính sách bảo mật của bạn.
      • Đảm bảo Discovery và Templates đang được áp dụng đúng cho các hệ thống mới và đang mở rộng.
      • Theo dõi các log của Zabbix để kịp thời phát hiện sự cố và điều chỉnh cấu hình nếu cần.
      • Rà soát cấu hình và vận hành hàng tuần để đảm bảo không có lỗ hổng cấu hình và hiệu suất đáp ứng nhu cầu.
      <h2 Kết luận

      Việc tối ưu hiệu năng Zabbix trên Ubuntu 22.04+ liên quan đến thiết kế kiến trúc phân tán, sử dụng proxy để phân tải, áp dụng bảo mật mạnh mẽ và tận dụng các công cụ tự động hóa như discovery, templates và low-level discovery. Bằng cách kết hợp các yếu tố này với quản trị và vận hành chuẩn mực, bạn có thể đạt được hiệu năng giám sát ổn định và khả năng mở rộng phù hợp cho môi trường production của mình. Hướng dẫn và các khuyến nghị ở trên dựa trên các khía cạnh được mô tả trong tài liệu Zabbix 7.4 và các phần liên quan, và được trình bày ở mức khung thực tiễn cho hệ thống Ubuntu 22.04+.

      Zabbix Monitoring

      Giới thiệu

      Trong thế giới công nghệ hiện đại, việc giám sát hệ thống và ứng dụng đóng vai trò thiết yếu trong việc duy trì hiệu suất và độ tin cậy. Zabbix Monitoring là một công cụ mã nguồn mở mạnh mẽ, cho phép bạn theo dõi tài nguyên, hiệu suất và sức khỏe của toàn bộ hệ thống, từ các server vật lý đến môi trường đám mây. Với tính năng mạnh mẽ, Zabbix hỗ trợ quản trị viên dễ dàng phát hiện và xử lý các vấn đề trước khi chúng trở thành sự cố lớn.

      Zabbix là một giải pháp giám sát hạ tầng (mã nguồn mở) cấp độ doanh nghiệp (high-level enterprise) cực kỳ mạnh mẽ và phổ biến. Chính vì vậy đội ngũ phát triển của Zabbix thường xuyên bổ xung thêm nhiều tính năng, template và hỗ trợ nhiều service mới trong các bản cập nhật để bắt kịp tốc độ “sinh sôi” SaaS của những “ông lớn” công nghệ.

      Tuy nhiên, với một đòn đau từ Red Hat (ngưng hỗ trợ CentOS 7 đến hết 30/6/2024 và CentOS 8 đến hết năm 2021) nhằm mục đích ép một lượng lớn người dùng chuyển sang bản OS trên nền tảng cloud (bản quyền).

      Bài viết này sử dụng :

      • Ubuntu Server 20.04
      • Zabbix 5.4
      • PHP 7.4
      • Nginx 1.8
      • MariaDB 10.0

      Cài đặt LEMP STACK ( Nginx Web Server, PHP7.4, PHP7.4-FPM, MARIADB)

      1. Cài đặt nginx
      2. Zabbix 5.4 yêu cầu chạy trên web server nên ta cần cập nhật ubuntu và cài đặt nginx
      $ sudo apt update
      $ sudo apt install nginx
      •  Sau khi quá trình cài đặt nginx server hoàn tất, bạn khởi động Nginx, kích hoạt Nginx (tự động khởi động khi hệ thống reboot) và kiểm tra trạng thái Nginx bằng những tập lệnh bên dưới.
      $ sudo systemctl start nginx
      $ sudo systemctl enable nginx
      $ sudo systemctl status nginx
      • Cấu hình tường lửa cho phép HTTP & HTTPS đi qua bằng tập lệnh dưới đây
      $ sudo ufw allow 80/tcp
      $ sudo ufw allow 443/tcp
      $ sudo ufw reload
      • Kiểm tra lại hoạt động của nginx bằng http(s)://IP-Address/
      • Cài đặt PHP7 hỗ trợ cho nginx.
        • Kích hoạt PPA cho PHP trên trên hệ thống Ubuntu bằng tập lệnh sau :
      $ sudo apt-get install software-properties-common
      $ sudo add-apt-repository ppa:ondrej/php
      • Server của bạn đã được thiết lập để cài đặt PHP từ PPA repository. Sử dụng một trong những lệnh bên dưới để cài đặt PHP 7.0, PHP 7.1, PHP 7.2 hoặc PHP 7.3:
      $ sudo apt-get update
      ## Install PHP 7.4
      $ sudo apt-get install -y php7.4
      $ sudo php -v
      • Kiểm tra cài đặt PHP modules.

      Sau khi cài đặt một phiên bản PHP 7.x trên server, bạn có thể sử dụng lệnh bên dưới để tìm những PHP modules có sẵn trong gói PPA repository:

      $ sudo apt-cache search php7*
      • Cài đặt module cần thiết cho Zabbix
      $ sudo apt-get install php7.4-mysql php7.4-curl php7.4-json php7.4-cgi php7.4-xsl
      • Kiểm tra hoạt động của PHP
      $ sudo systemctl status php7.4-fpm
      • Mở file cấu hình Nginx mặc định /etc/nginx/sites-available/default bằng lệnh sau:
      # nano /etc/nginx/sites-available/default

      Để Nginx server có thể xử lý được các file kịch bản PHP (fastcgi script), bạn cần tìm đến giá trị location trong server block và thêm những dòng như bên dưới.

      location ~ .php$ {
               include snippets/fastcgi-php.conf;
      #       # With php-fpm (or other unix sockets):
               fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
      #       # With php-cgi (or other tcp sockets):
      #       fastcgi_pass 127.0.0.1:9000;
      }
      • Để xem toàn bộ hệ thống PHP trên ubuntu, ta tạo file php.info trong Nginx Document Root, khởi động lại nginx và php-fpm rồi mở trình duyệt truy cập.
      $ sudo echo "<?php phpinfo();?>" > /var/www/html/info.php 
      $ sudo systemctl restart nginx 
      $ sudo systemctl restart php7.3-fpm

      Http://<ip-address>/info.php

      • Cài đặt và cấu hình Maria Database.

      8.1 Cài đặt thêm repository vào hệ thống :

      $ sudo apt-get install software-properties-common

      8.2 Thực thi lệnh để thêm Repsitory Key vào hệ thống :

      $ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

      8.3 Sau khi thêm Repository Key vào hệ thống, ta add URL Repository URL vào hệ thống :

      sudo add-apt-repository 'deb [arch=amd64] http://mirror.zol.co.zw/mariadb/repo/10.3/ubuntu bionic main'

      8.4. Thực thi cài đặt Maria Database

      $ sudo apt update
      
      $ sudo apt -y install mariadb-server mariadb-client

      8.5. Kiểm tra trạng thái MariaDB

      8.6. Kiểm tra trạng thái Database

      $ sudo mysql -u root -p
      MariaDB > show databases;
      • Bật chạy nền cho nginx, php, mariadb
      $ sudo systemctl enable mariadb 
      $ sudo systemctl enable nginx
      $ sudo systemctl enable php7.4-fpm
      • Cài đặt Zabbix-Server, Zabbix-PHP-Frontend, Zabbix-Agent

      10.1 Cài đặt Zabbix Repository

      wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.4-1%2Bfocal_all.deb
      dpkg -i zabbix-release_5.0-1+focal_all.deb
      apt update

      10.2 Cài đặt Zabbix Server, Zabbix PHP Frontend

      # apt install zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-sql-scripts zabbix-agent
      1. Tạo Database lưu trữ dữ liệu Zabbix

      11.1 Bạn cần tạo một RDBMS database để lưu trữ dữ liệu của Zabbix. Truy cập vào MySQL/MariaDB. khởi tạo một Zabbix database và gán quyền quản lý database cho một user bằng cách thực thi lần lượt những lệnh sau:

      # mysql -u root -p
      
      MariaDB [(none)]> create database zabbixdb character set utf8 collate utf8_bin;
      MariaDB [(none)]> grant all privileges on zabbixdb.* to 'zabbixuser'@'thanhnh.id.vn' identified by 'your_password';
      MariaDB [(none)]> flush privileges;
      MariaDB [(none)]> exit

      11.2 Import cấu trúc Zabbix Server vào Maria DB

      # zcat /usr/share/doc/zabbix-sql-scripts/mysql/create.sql.gz | mysql -uzabbix -p zabbix

           11.3 Mở File cấu hình Zabbix-Server và thiết lập tham số

      # nano  /etc/zabbix/zabbix_server.conf

      Tìm và điều chỉnh các giá trị kết nối database như DBHost, DBName, DBUser  DBPassword trong file zabbix_server.conf tương tự như hình ảnh bên dưới.

      11.4 Khởi động lại Zabbix Server để áp dụng các thiết lập

      # systemct restart zabbix-server

      11.5 Mở File Zabbix Agent để thiết lập Listen Port

      # nano  /etc/zabbix/zabbix_agentd.conf

      11.6 Khởi động lại Zabbix Agent để áp dụng các thiết lập

      # systemctl restart zabbix-agent

      11.7 Tạo một Virtual Host để Nginx có thể hosting với Zabbix với domain. Tạo một file nano /etc/sites-available/zabbix.conf

      server {
      
          listen       81;
      
          server_name  zabbix.domain.local;
          #charset koi8-r;
          access_log  /var/log/nginx/zabbix.domain.local.access.log;
          error_log  /var/log/nginx/zabbix.domain.local.error.log;
      
          location / {
              root   /usr/share/zabbix/;
              index  index.php index.html index.htm;
           # include the "?$args" part so non-default permalinks doesn't break when using query string
              try_files $uri $uri/ /index.php?$args;
          }
      
          location ~ .php$ {
              root   /usr/share/zabbix/;
              fastcgi_index  index.php;
              # With php-fpm (or other unix sockets):
              fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
              fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
              fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
              include        fastcgi_params;
          }
      }

      11.8 Kế đến, tạo một symbolic link từ /etc/nginx/sites-available/zabbix.conf tới /etc/nginx/sites-enable/zabbix.conf

      ln -s /etc/nginx/sites-available/zabbix.conf /etc/nginx/sites-enabled/
      1.  Khởi động lại Nginx
      systemctl restart nginx
      1.  Mở web cài đặt : http://<ip-address>:81

      Bấm Next, kiểm tra các điều kiện của PHP. Nếu sai, hãy chỉnh sửa trong file

        sudo nano /etc/php/7.4/fpm/php.ini

      1. Sau khi kiểm tra các cài đặt thành công, bấm Next để tiếp tục cài đặt.

      Kiểm tra các cài đặt khớp với các cài đặt ở trên rồi bấm Next để Zabbix connect với Database.

      Đăng nhập với :

               Username : Admin

               Password  : zabbix

      Vậy đã hoàn thành cài đặt Zabbix Monitoring 5.4 trên Ubuntu 20.04

      Zabbix Monitoring không chỉ là công cụ giám sát mạnh mẽ mà còn là trợ thủ đắc lực giúp bạn duy trì hiệu suất tối ưu và đảm bảo tính ổn định cho hệ thống. Bằng cách triển khai Zabbix một cách hiệu quả, bạn có thể chủ động phát hiện và giải quyết các vấn đề kịp thời. Hãy bắt đầu khám phá Zabbix Monitoring ngay hôm nay để nâng cao năng lực quản lý hệ thống của bạn!

      Cài đặt Zabbix Agent trên các hệ thống

      Giới thiệu

      Zabbix Agent là một thành phần quan trọng trong hệ thống giám sát của Zabbix, giúp thu thập thông tin từ các máy chủ và ứng dụng để gửi về Zabbix Server. Việc cài đặt Zabbix Agent đúng cách trên các hệ thống như Windows, Linux, hay macOS không chỉ đảm bảo dữ liệu được giám sát chính xác mà còn giúp bạn tối ưu hóa hoạt động của toàn bộ hạ tầng CNTT. Trong bài viết này, chúng ta sẽ đi qua từng bước cài đặt Zabbix Agent trên các nền tảng phổ biến.

      Giám sát tường lửa Pfsense sử dụng Zabbix_Agent

      Truy cập Pfsense /Systems/PackageManager/Availabe Package

      Tìm kiếm Zabbix-Agent phù hợp với Zabbix-Server hiện tại và Install

      Sau khi cài đặt thành công kiểm tra tại /Service/Zabbix_Agent.

      • Server : Server của Zabbix-Server
      • Server Active : 127.0.0.1
      • Hostname : Zabbix
      • Listen IP : 0.0.0.0
      • Listen Port : 10050

      Trên Firewall Open Port 10050 trên WAN

      Để đảm bảo bảo mật, ta sử dụng phương thức key psk

      TLS PSK identity : “Tên Key”

      TLS PSK : “Key mã hóa “ ( Sử dụng Key Generator PSK trên mạng )

      Trên Zabbix, truy cập Confriguration/Host/Create Host

      • Hostname : Home_Pfsense
      • Groups : Linux Server
      • Interface : Agent – IP của Pfsense – Port :10050

      Mục Template, chọn hđh FreeBSD

      Mục PSK, ta điền TLS PSK identity và PSK khớp với Pfsense

      Hoàn thành xong, bấm Update đợi một lúc để Zabbix connect đến và đợi 30-60p để lấy hết dữ liệu hiện tại.

      Kiểm tra status : Host Available là thành công!

      Giám sát Windows với Zabbix Agent

      Tải ZabbixAgent.exe tại https://www.zabbix.com/download_agents

      Cài đặt

      Kiểm tra service hoạt động ở TaskManager/ Service

      Mở Port 10050 trên firewall của windows . Ta mở Windows PowerShell với quyền quản trị :

      netsh advfirewall firewall add rule name="ICMP Allow incoming V4 echo request" protocol="icmpv4:8,any" dir=in action=allow
      netsh advfirewall firewall add rule name="Open Port 10050" dir=in action=allow protocol=TCP localport=10050

      Add Window Host to Zabbix Server

      • Hostname : Đặt tên cho Host ( Home_Win7_ThinPC)
      • Groups : TemplatesOperatingSystems
      • Interface : Agent IP : IP của win 7 – Port : 10050
      • Templates : Windows by Zabbix Agent

      Bấm Update.

      Kiểm tra kết nối, nếu status : Available là đã thành công

      Giám sát Synology NAS với Zabbix

      Tải Template NAS Synology trên trang chủ Zabbix :

      https://www.zabbix.com/integrations/synology

      Import Templates.xml lên Zabbix : Zabbix/Hosts/ Import

      Trên Synology NAS bật SNMP để Zabbix Monitor :

      NAS / Control Panel / Terminal & SNMP / SNMP

      Add NAS vào Zabbix :

               Zabbix / Configuration / Hosts / Create Host

      • Host name : Đặt tên : NAS
      • Groups : Linux Server
      • Interfaces : Giao thức SNMP & IP & Port

      Add Templates Synology mà chúng ta vừa tải ở trên về

      • Marcos : {$SNMP_COMMUNITY}
      • Value : Tên Community đặt ở trên NAS

      Việc cài đặt Zabbix Agent trên các hệ thống là bước đầu tiên để xây dựng một môi trường giám sát mạnh mẽ và hiệu quả. Dù bạn sử dụng Windows, Linux hay macOS, Zabbix Agent sẽ là công cụ đắc lực giúp bạn theo dõi hiệu suất và phát hiện sớm các vấn đề tiềm ẩn. Hãy triển khai Zabbix Agent ngay hôm nay để tối ưu hóa khả năng quản lý hệ thống của bạn!

      Cài đặt Prometheus + Grafana

      Giới thiệu

      Prometheus và Grafana là bộ đôi công cụ giám sát và trực quan hóa mạnh mẽ được sử dụng rộng rãi trong các hệ thống hiện đại. Trong khi Prometheus chịu trách nhiệm thu thập và lưu trữ dữ liệu từ các ứng dụng và hệ thống, Grafana cung cấp giao diện trực quan để phân tích và hiển thị dữ liệu đó dưới dạng biểu đồ. Bài viết này sẽ hướng dẫn bạn từng bước cài đặt Prometheus và Grafana trên hệ thống, giúp bạn xây dựng một nền tảng giám sát hiệu quả và toàn diện.

      Update package & Timedatectl

      apt update
      timedatectl set-timezone "Asia/Ho_Chi_Minh"
      timedatectl set-ntp true
      systemctl restart systemd-timesyncd

      Xác định phiên bản của prometheus

      https://github.com/prometheus/prometheus/releases
      export RELEASE="2.20.1"

      Tải và giải nén gói cài đặt

      wget https://github.com/prometheus/prometheus/releases/download/v${RELEASE}/prometheus-${RELEASE}.linux-amd64.tar.gz
      tar xvf prometheus-${RELEASE}.linux-amd64.tar.gz
      cd prometheus-${RELEASE}.linux-amd64/

      Tạo user cho dịch vụ Prometheus

      groupadd --system prometheus
      grep prometheus /etc/group
      useradd -s /sbin/nologin -r -g prometheus prometheus

      Tạo thư mục chứa file cấu hình Prometheus

      mkdir -p /etc/prometheus/{rules,rules.d,files_sd}  /var/lib/prometheus

      Chuyển các file thực thi binary vào thư mục local bin và copy thư mục consoles, file config

      cp prometheus promtool /usr/local/bin/
      cp -r consoles/ console_libraries/ /etc/prometheus/
      cp prometheus.yml /etc/prometheus/

      Gán quyền cho user prometheus

      chown -R prometheus:prometheus /etc/prometheus/  /var/lib/prometheus/
      chmod -R 775 /etc/prometheus/ /var/lib/prometheus/

      Tạo file systemd cho dịch vụ prometheus

      nano /etc/systemd/system/prometheus.service
      [Unit]
      Description=Prometheus systemd service unit
      Wants=network-online.target
      After=network-online.target
      [Service]
      Type=simple
      User=prometheus
      Group=prometheus
      ExecReload=/bin/kill -HUP $MAINPID
      ExecStart=/usr/local/bin/prometheus 
      --config.file=/etc/prometheus/prometheus.yml 
      --storage.tsdb.path=/var/lib/prometheus 
      --web.console.templates=/etc/prometheus/consoles 
      --web.console.libraries=/etc/prometheus/console_libraries 
      --web.listen-address=0.0.0.0:9090 
      --storage.tsdb.retention.time=1y
      SyslogIdentifier=prometheus
      Restart=always
      [Install]
      WantedBy=multi-user.target

      Enable và khởi động dịch vụ prometheus

      systemctl daemon-reload
      systemctl start prometheus
      systemctl enable prometheus

      Truy cập tại : http://<IP_HOST>:9090

      Cài đặt Grafana trên Ubuntu 18

      Đầu tiên, bạn thêm repository của Grafana vào máy chủ

      echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
      wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add

      Update các gói phần mềm từ repository này và cài đặt Grafana.

      apt-get update
      apt-get install grafana -y

      Kích hoạt và khởi động dịch vụ

      systemctl start grafana-server
      systemctl enable grafana-server.service

      Truy cập <IP_HOST>: :3000


      Việc cài đặt Prometheus và Grafana là bước quan trọng để xây dựng một hệ thống giám sát hiện đại và mạnh mẽ. Với Prometheus thu thập dữ liệu chính xác và Grafana trực quan hóa thông tin, bạn có thể dễ dàng theo dõi, phân tích và tối ưu hóa hiệu suất hệ thống. Hãy bắt đầu triển khai ngay hôm nay để tận dụng tối đa lợi ích từ bộ công cụ giám sát hàng đầu này!

      Prometheus: Monitoring VmWare

      Giới thiệu

      Hạ tầng ảo hóa như VMware đóng vai trò quan trọng trong các hệ thống hiện đại, giúp tối ưu hóa tài nguyên và tăng hiệu quả hoạt động. Tuy nhiên, việc giám sát hiệu suất và tình trạng của VMware là một thách thức lớn. Prometheus, kết hợp với các Exporter chuyên dụng, là giải pháp lý tưởng để theo dõi dữ liệu từ VMware, giúp bạn chủ động quản lý và tối ưu hóa hệ thống. Trong bài viết này, chúng ta sẽ tìm hiểu cách tích hợp Prometheus để giám sát VMware chi tiết nhất.

      Cài đặt python3

      apt install python3 -y
      apt install python3-pip -y

      Cài đặt vmware_exporter

      pip3 install vmware_exporter
      pip3 install --ignore-installed PyYAML

      Sau khi cài xong, thư mục chứa source vmware_exporter nằm ở /usr/local/lib/python3.8/dist-packages/vmware_exporter

      Tạo file config cho vmware_exporter

      nano /usr/local/lib/python3.6/dist-packages/vmware_exporter/config.yml
      default:
          vsphere_host: vcenter.yourdomain.com
          vsphere_user: 'usermonitor@vcenterdomain.local'
          vsphere_password: 'usermonitorpass'
          ignore_ssl: True
          specs_size: 5000
          fetch_custom_attributes: True
          fetch_tags: True
          fetch_alarms: True
          collect_only:
              vms: True
              vmguests: True
              datastores: True
              hosts: True
              snapshots: True

      Tạo file service systemd cho vmware_exporter

      nano /etc/systemd/system/vmware_exporter.service
      [Unit]
      Description=Prometheus VMWare Exporter
      Wants=network-online.target
      After=network-online.target
      
      [Service]
      Type=simple
      User=root
      Group=root
      ExecReload=/bin/kill -HUP $MAINPID
      ExecStart=/usr/bin/python3 /usr/local/bin/vmware_exporter -c /usr/local/lib/python3.6/dist-packages/vmware_exporter/config.yml
      SyslogIdentifier=vmware_exporter
      Restart=always
      
      [Install]
      WantedBy=multi-user.target

      Reload daemon và khởi động dịch vụ

      systemctl daemon-reload
      systemctl enable vmware_exporter.service
      systemctl start vmware_exporter.service

      Thiết lập Prometheus cho vmware_exporter, thiết lập prometheus gọi tới cổng dịch vụ của vmware_exporter

      nano /etc/prometheus/prometheus.yml
        - job_name: 'dc_vcenter'
          scrape_timeout: 1m
          scrape_interval: 2m
          metrics_path: '/metrics'
          static_configs:
            - targets:
              - 'vcenter.yourdomain.com'
          relabel_configs:
            - source_labels: [__address__]
              target_label: __param_target
            - source_labels: [__param_target]
              target_label: instance
            - target_label: __address__
              replacement: thanhnh.id.vn:9272

      Tiếp theo, bạn tìm trong file prometheus.yml đoạn như dưới và thêm file rule cho vcenter.

      rule_files:
        # - "first_rules.yml"
        # - "second_rules.yml"
          - "/etc/prometheus/rules/vcenter.yml"

      Thiết lập rule alertmanager cho vmware, tạo một file chứa các rule alert cho vcenter

      nano /etc/prometheus/rules/vcenter.yml

      Bạn copy nội dung giống như dưới vào file (Vcenter.yml đính kèm file)

      Bây giờ bạn reload dịch vụ prometheus và dịch vụ alertmanager

      systemctl reload prometheus
      systemctl reload alertmanager

      Import Template JSON Vcenter đính kèm theo file vào , chọn datasource Prometheus -> Done

      Prometheus cung cấp một cách tiếp cận hiệu quả và linh hoạt để giám sát VMware, cho phép bạn theo dõi hiệu suất hạ tầng ảo hóa một cách chính xác và đáng tin cậy. Bằng cách sử dụng các Exporter phù hợp và tích hợp Prometheus, bạn có thể đảm bảo hệ thống luôn hoạt động ổn định và đạt hiệu suất cao nhất. Hãy bắt đầu thiết lập ngay hôm nay để tận dụng sức mạnh của Prometheus trong giám sát VMware!

      Cài đặt Zabbix Agent trên các hệ thống

      Giới thiệu

      Zabbix Agent là một thành phần quan trọng trong hệ thống giám sát của Zabbix, giúp thu thập thông tin từ các máy chủ và ứng dụng để gửi về Zabbix Server. Việc cài đặt Zabbix Agent đúng cách trên các hệ thống như Windows, Linux, hay macOS không chỉ đảm bảo dữ liệu được giám sát chính xác mà còn giúp bạn tối ưu hóa hoạt động của toàn bộ hạ tầng CNTT. Trong bài viết này, chúng ta sẽ đi qua từng bước cài đặt Zabbix Agent trên các nền tảng phổ biến.

      Giám sát tường lửa Pfsense sử dụng Zabbix_Agent

      Truy cập Pfsense /Systems/PackageManager/Availabe Package

      Tìm kiếm Zabbix-Agent phù hợp với Zabbix-Server hiện tại và Install

      Sau khi cài đặt thành công kiểm tra tại /Service/Zabbix_Agent.

      • Server : Server của Zabbix-Server
      • Server Active : 127.0.0.1
      • Hostname : Zabbix
      • Listen IP : 0.0.0.0
      • Listen Port : 10050

      Trên Firewall Open Port 10050 trên WAN

      Để đảm bảo bảo mật, ta sử dụng phương thức key psk

      TLS PSK identity : “Tên Key”

      TLS PSK : “Key mã hóa “ ( Sử dụng Key Generator PSK trên mạng )

      Trên Zabbix, truy cập Confriguration/Host/Create Host

      • Hostname : Home_Pfsense
      • Groups : Linux Server
      • Interface : Agent – IP của Pfsense – Port :10050

      Mục Template, chọn hđh FreeBSD

      Mục PSK, ta điền TLS PSK identity và PSK khớp với Pfsense

      Hoàn thành xong, bấm Update đợi một lúc để Zabbix connect đến và đợi 30-60p để lấy hết dữ liệu hiện tại.

      Kiểm tra status : Host Available là thành công!

      Giám sát Windows với Zabbix Agent

      Tải ZabbixAgent.exe tại https://www.zabbix.com/download_agents

      Cài đặt

      Kiểm tra service hoạt động ở TaskManager/ Service

      Mở Port 10050 trên firewall của windows . Ta mở Windows PowerShell với quyền quản trị :

      netsh advfirewall firewall add rule name="ICMP Allow incoming V4 echo request" protocol="icmpv4:8,any" dir=in action=allow
      netsh advfirewall firewall add rule name="Open Port 10050" dir=in action=allow protocol=TCP localport=10050

      Add Window Host to Zabbix Server

      • Hostname : Đặt tên cho Host ( Home_Win7_ThinPC)
      • Groups : TemplatesOperatingSystems
      • Interface : Agent IP : IP của win 7 – Port : 10050
      • Templates : Windows by Zabbix Agent

      Bấm Update.

      Kiểm tra kết nối, nếu status : Available là đã thành công

      Giám sát Synology NAS với Zabbix

      Tải Template NAS Synology trên trang chủ Zabbix :

      https://www.zabbix.com/integrations/synology

      Import Templates.xml lên Zabbix : Zabbix/Hosts/ Import

      Trên Synology NAS bật SNMP để Zabbix Monitor :

      NAS / Control Panel / Terminal & SNMP / SNMP

      Add NAS vào Zabbix :

               Zabbix / Configuration / Hosts / Create Host

      • Host name : Đặt tên : NAS
      • Groups : Linux Server
      • Interfaces : Giao thức SNMP & IP & Port

      Add Templates Synology mà chúng ta vừa tải ở trên về

      • Marcos : {$SNMP_COMMUNITY}
      • Value : Tên Community đặt ở trên NAS

      Việc cài đặt Zabbix Agent trên các hệ thống là bước đầu tiên để xây dựng một môi trường giám sát mạnh mẽ và hiệu quả. Dù bạn sử dụng Windows, Linux hay macOS, Zabbix Agent sẽ là công cụ đắc lực giúp bạn theo dõi hiệu suất và phát hiện sớm các vấn đề tiềm ẩn. Hãy triển khai Zabbix Agent ngay hôm nay để tối ưu hóa khả năng quản lý hệ thống của bạn!

      Docker File

      Giới thiệu

      Dockerfile là một trong những thành phần quan trọng nhất trong Docker, cho phép bạn định nghĩa cách tạo Docker image một cách tự động và chính xác. Với Dockerfile, bạn có thể kiểm soát toàn bộ quy trình, từ việc cài đặt hệ điều hành, thêm phần mềm, cho đến cấu hình môi trường. Trong bài viết này, chúng ta sẽ tìm hiểu cách tạo và sử dụng Dockerfile hiệu quả để xây dựng và triển khai ứng dụng của bạn một cách nhanh chóng và tối ưu.


      FROMmọi Docker file đều có chỉ thị này, chỉ định image cơ sở
      COPY ADDsao chép dữ liệu
      ENVthiết lập biến môi trường
      RUNchạy các lệnh.
      VOLUMEgắn ổ đĩa, thư mục
      USERuser
      WORKDIRthư mục làm việc
      EXPOSEthiết lập cổng

      FROM

      Như trên đã nói, chỉ thị này chỉ ra image cơ sở để xây dựng nên image mới. Để xây dựng từ image nào đó thì bạn cần đọc document của Image đó để biết trong đó đang chứa gì, có thể chạy các lệnh gì trong đó … Ví dụ, nếu bạn chọn xây dựng từ image centos:laste thì bạn bắt đầu bằng hệ điều hành CentOS và bạn có thể cài đặt, cập nhật các gói với yum, ngược lại nếu bạn chọn ubuntu:latest thì trình quản lý gói của nó là APT …

      COPY và ADD

      Được dùng để thêm thư mục, file vào Image

      ADD thưmục_nguồn thư_mụcđích

      Trong đó thưmục_nguồn là thư mục ở máy chạy Dockerfile, chứa dữ liệu cần thêm vào. thư_mụcđích là nơi dữ liệu được thêm vào ở container.

      ENV

      Chỉ thị này dùng để thiết lập biến môi trường, như biến môi trường PATH …, tùy hệ thống hay ứng dụng yêu cầu biến môi trường nào thì căn cứ vào đó để thiết lập.

      ENV biến giá_trị

      RUN

      Thi hành các lệnh, tương tự bạn chạy lệnh shell trên OS từ terminal.

      RUN lệnh-và-tham-số-cần-chạy
      RUN ["lệnh", "tham số1", "tham số 2" ...]

      VOLUME

      Chỉ thi tạo một ổ đĩa chia sẻ được giữa các container.

      VOLUME /dir_vol

      USER

      Bạn thêm user được dùng khi chạy các lệnh ở chỉ thị RUN CMD WORKDIR.

      USER private

      WORKDIR

      Thiết lập thư mục làm việc hiện tại chi các chỉ thị CMD, ENTRYPOINT, ADD thi hành.

      WORKDIR path_current_dir

      EXPOSE

      Để thiết lập cổng mà container lắng nghe, cho phép các container khác trên cùng mạng liên lạc qua cổng này hoặc đỉ ánh xạ cổng host vào cổng này.

      EXPOSE port

      ENTRYPOINT, CMD

      Chạy lệnh trong chỉ thị này khi container được chạy.

      ENTRYPOINT commnad_script
      ENTRYPOINT ["command", "tham-số", ...]

      CMD ý nghĩa tương tự như ENTRYPOINT, khác là lệnh chạy bằng shell của container.

      CMD command param1 param2
      #Chú ý ở dạng sau của CMD thì nó lại là thiết lập tham số cho ENTRYPOINT
      CMD ["tham-số1", "tham-số2"]

      EXAMPLE :

      FROM ubuntu:20.04 
      
      RUN apt update && apt upgrade -y 
          && apt install nano -y 
          && apt install htop -y 
          && apt install nginx -y 
          && service nginx start
      
      ADD ./test.html /etc/nginx/sites-available/
      
      EXPOSE 80
      EXPOSE 8080
      EXPOSE 443
      
      ENTRYPOINT service nginx start && /bin/bash

      Dockerfile giúp tự động hóa và đơn giản hóa việc tạo Docker image, làm cho quá trình phát triển và triển khai trở nên nhất quán và dễ dàng hơn. Hiểu rõ cấu trúc và cách sử dụng Dockerfile sẽ giúp bạn tận dụng tối đa sức mạnh của Docker trong các dự án của mình. Hãy bắt đầu áp dụng ngay hôm nay để khám phá tiềm năng vô tận của Docker!

      Hướng dẫn tạo Virtual Host Nginx

      Tạo Virtual Host trong Nginx là một kỹ thuật quan trọng giúp bạn chạy nhiều trang web trên cùng một máy chủ. Điều này không chỉ giúp tối ưu hóa việc sử dụng tài nguyên mà còn mang lại sự linh hoạt trong quản lý và tổ chức các trang web của bạn. Trong bài viết này, chúng tôi sẽ cung cấp một hướng dẫn chi tiết về cách tạo và cấu hình Virtual Host trong Nginx.

      Phần 1 : Virtual Host làm Reserve Proxy

      server {
              listen 80 ;
              listen [::]:80 ;
      
              server_name example.com www.example.com;
      
      ##Block Google Crawl  
              if ($http_user_agent ~* (google) ) {
                      return 403; 
              }
      ##Block Google Crawl
      
              location / {
                      proxy_buffers 4 256k;
                      proxy_buffer_size 128k;
                      proxy_busy_buffers_size   256k;
                      proxy_headers_hash_max_size 1024;
                      proxy_headers_hash_bucket_size 128;
      
                      #1 hour timeout
                      proxy_read_timeout 3600;
                      client_max_body_size 100M;
      
                      proxy_pass http://192.168.1.10:80;
                      proxy_set_header Accept-Encoding "";
                      proxy_set_header Host $host;
                      proxy_set_header X-Real-IP $remote_addr;
                      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                      proxy_set_header X-Forwarded-SSL on;
                      proxy_set_header X-Forwarded-Proto $scheme;
                      proxy_set_header Accept-Encoding "";
                      # Add HSTS header with preload.
                      add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
              }
      #Brotli
              brotli on;
              brotli_comp_level 8;
              brotli_static on;
              brotli_types application/atom+xml application/javascript application/json application/rss+xml
                     application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype
                     application/x-font-ttf application/x-javascript application/xhtml+xml application/xml
                     font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon
                     image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;
      #Brotli
      
      
      }

      Với SSL Let’s Encrypt :

      server {
      
          server_name thanhnh.id.vn;
      
          location / {
              # BLOCK SPAMMERS IP ADDRESSES
              #include /etc/nginx/conf.d/blockips.conf;
      
      #        access_log one;
              access_log /var/log/nginx/thanhnh.id.vn/access.log;
              error_log /var/log/nginx/thanhnh.id.vn/error.log;
      
              proxy_set_header Accept-Encoding "";
      
                      if ($request_method = 'OPTIONS') {
                              add_header 'Access-Control-Allow-Origin' '*';
                              #
                              # Om nom nom cookies
                              #
                              add_header 'Access-Control-Allow-Credentials' 'true';
                              add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                              #
                              # Custom headers and headers various browsers should be OK with but aren't
                              #
                              add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
                              #
                              # Tell client that this pre-flight info is valid for 20 days
                              #
                              add_header 'Access-Control-Max-Age' 1728000;
                              add_header 'Content-Type' 'text/plain charset=UTF-8';
                              add_header 'Content-Length' 0;
                              return 204;
                      }
                      if ($request_method = 'POST') {
                              add_header 'Access-Control-Allow-Origin' '*';
                              add_header 'Access-Control-Allow-Credentials' 'true';
                              add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                              add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
                      }
                      if ($request_method = 'GET') {
                              add_header 'Access-Control-Allow-Origin' '*';
                              add_header 'Access-Control-Allow-Credentials' 'true';
                              add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                              add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
                      }
      
              proxy_buffers 4 256k;
              proxy_buffer_size 128k;
              proxy_busy_buffers_size   256k;
      
              #1 hour timeout
              proxy_read_timeout 3600;
              client_max_body_size 60M;
      
              proxy_pass http://192.168.12.220:8898/;
              proxy_set_header Host $host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-SSL on;
              proxy_set_header X-Forwarded-Proto $scheme;
              # Add HSTS header with preload.
              add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
      
      #Brotli
          brotli on;
          brotli_comp_level 8;
          brotli_static on;
          brotli_types application/atom+xml application/javascript application/json application/rss+xml
               application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype
                   application/x-font-ttf application/x-javascript application/xhtml+xml application/xml
                   font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon
                   image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;
      #Brotli
      
          }
      
          listen [::]:443 ssl http2 ipv6only=on; # managed by Certbot
          listen 443 ssl http2; # managed by Certbot
          ssl_certificate /etc/letsencrypt/live/thanhnh.id.vn/fullchain.pem; # managed by Certbot
          ssl_certificate_key /etc/letsencrypt/live/thanhnh.id.vn/privkey.pem; # managed by Certbot
          ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
          ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
      
      
      }
      server {
          if ($host = thanhnh.id.vn) {
              return 301 https://$host$request_uri;
          } # managed by Certbot
      
          listen 80;
          listen [::]:80;
      
          server_name thanhnh.id.vn;
          return 404; # managed by Certbot
      
      
      
      
      }

      Phần 2 : Nginx sử dụng để handle PHP code

      server {
               listen       80;
               server_name  example.thanhnh.id.vn;
               root         /var/www/html/wordpress;
      
               access_log /var/log/nginx/example.thanhnh.id.vn-access.log;
               error_log  /var/log/nginx/example.thanhnh.id.vn-error.log error;
               index index.html index.htm index.php;
      
               location / {
                            try_files $uri $uri/ /index.php$is_args$args;
               }
      
        # pass PHP scripts on Nginx to FastCGI (PHP-FPM) server
        location ~ .php$ {
          include snippets/fastcgi-php.conf;
      
          # Nginx php-fpm sock config:
          fastcgi_pass unix:/run/php/php8.1-fpm.sock;
          # Nginx php-cgi config :
          # Nginx PHP fastcgi_pass 127.0.0.1:9000;
        }
      
        # deny access to Apache .htaccess on Nginx with PHP, 
        # if Apache and Nginx document roots concur
        location ~ /.ht {
          deny all;
        }
      }

      Nginx handle PHPMYADMIN

      server {
        listen 8080;
        listen [::]:8080;
        server_name pma.example.com;
        root /usr/share/phpmyadmin/;
        index index.php index.html index.htm index.nginx-debian.html;
      
        access_log /var/log/nginx/phpmyadmin_access.log;
        error_log /var/log/nginx/phpmyadmin_error.log;
      
        location / {
          try_files $uri $uri/ /index.php;
        }
      
        location ~ ^/(doc|sql|setup)/ {
          deny all;
        }
      
        location ~ .php$ {
          fastcgi_pass unix:/run/php/php8.2-fpm.sock;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
          include snippets/fastcgi-php.conf;
        }
      
        location ~ /.ht {
          deny all;
        }
      }

      Tìm hiểu thêm :

      Multi-Node MySQL

      Giới thiệu

      Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

      Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

      https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

      https://mariadb.com/kb/en/galera-cluster

      Phần 1: Giới thiệu về Multi-node MySQL: Cách Hoạt Động và Ứng Dụng

      MySQL:

      • MySQL InnoDB Cluster cung cấp một giải pháp tăng tính sẵn sàng cao hoàn chỉnh cho MySQL.
      • MySQL Shell bao gồm AdminAPI cho phép dễ dàng cấu hình và quản trị một nhóm với ít nhất ba máy chủ MySQL, hoạt động như một InnoDB Cluster.
      • Mỗi máy chủ MySQL chạy MySQL Group Replication, cung cấp cơ chế sao chép dữ liệu trong InnoDB Cluster, với khả năng chuyển đổi dự phòng được tích hợp.
      • Trong trường hợp xảy ra lỗi không mong muốn của một máy chủ, cluster sẽ tự động cấu hình lại.
      • Trong chế độ single-primary mặc định, InnoDB cluster có một máy chủ đọc ghi – primary instance. Nhiều máy chủ thứ cấp secondary instance là bản sao của primary instance.
      • Nếu lỗi xảy ra ở máy chủ chính primary instance, một máy phụ secondary instance sẽ tự động được chuyển đổi vai trò thành primary instance.
      • MySQL Router tự động phát hiện điều này và chuyển tiếp các kết nối đến bản chính mới. Tính năng nâng cao cũng cho phép cấu hình một cluster có nhiều primary instance.
      • MySQL Router có thể tự động chuyển đổi cấu hình dựa trên cluster đã triển khai, đảm bảo kết nối đến các máy chủ không bị gián đoạn khi có máy chủ xảy ra sự cố.

      MariaDB:

      • Galera Cluster hỗ trợ tốt nhất với innoDB
      • Có thể có các bảng MYiSAM hoặc MEMORY nhưng không nhận được bản sao đồng bộ sang các nút khác, chỉ có thể làm được với innoDB
      • Cách Galera đồng bộ dữ liệu bản sao, yêu cầu RollBack phải khả thi kể cả đang COMMIT. Các keys trùng lặp sẽ là vấn đề khi cho phép ghi vào tất cả các nodes
      • NDB thực hiện cách tiếp cận khác ( Tính nhất quán cuối cùng ). Các keys trùng lặp có thể xâm nhập vào hệ thống nhưng client sẽ phải cung cấp thuật toán để khắc phục
      • MYiSAM không có cách nào để thực hiện RollBack vì phụ thuộc vào bảng khóa phía trước. Khóa các bảng trên node khác sẽ gây ra vấn đề và không hiệu quả
      • Galera có thể hoạt động hiệu quả ngay cả trong WAN nhờ hành động COMMIT đơn lẻ trên từng node

      Một số thông tin cần chú ý

      Binary Log Purging

      MySql Binary Log là một cơ chế của MySql dùng để lưu trữ các thay đổi của dữ liệu dưới dạng một file log.Tất cả các thay đổi sẽ được lưu thêm vào (append only) vào một file log được đánh số thứ tự.Mỗi thay đổi được đặc trưng bởi hai tham số: file log được ghi vào vị trí offset trên file log.

      • Mysql 8.0 : Binary Log tự động xoá ( binlog_expire_logs_seconds )
      • Version trước 8.0.1 Không tự động xoá binary log ( defaults =0 )
      • Version 8.0.1 -> 8.0.4 Xoá binary log sau 30 ngày ( defaults = 30 )
      • Version sau 8.0.10 xoá binary log sau 30 ngày ( defaults = 2592000 và default value expire_log_days = 0 )

      Thay đổi trên từng host :

      SET GLOBAL expire_logs_days = 10;

      Tóm lại

      Multi-node MySQL là lựa chọn lý tưởng cho những doanh nghiệp và tổ chức cần hệ thống cơ sở dữ liệu mạnh mẽ, ổn định và có khả năng mở rộng linh hoạt. Việc triển khai giải pháp này không chỉ giúp giảm thiểu tải cho máy chủ mà còn tối ưu hóa tốc độ xử lý và bảo đảm sự an toàn dữ liệu. Nếu bạn đang tìm kiếm cách tối ưu hóa hệ thống cơ sở dữ liệu của mình, Multi-node MySQL chính là giải pháp đáng để cân nhắc.

      Xem thêm

      Cài đặt Prometheus + Grafana

      Giới thiệu

      Prometheus và Grafana là bộ đôi công cụ giám sát và trực quan hóa mạnh mẽ được sử dụng rộng rãi trong các hệ thống hiện đại. Trong khi Prometheus chịu trách nhiệm thu thập và lưu trữ dữ liệu từ các ứng dụng và hệ thống, Grafana cung cấp giao diện trực quan để phân tích và hiển thị dữ liệu đó dưới dạng biểu đồ. Bài viết này sẽ hướng dẫn bạn từng bước cài đặt Prometheus và Grafana trên hệ thống, giúp bạn xây dựng một nền tảng giám sát hiệu quả và toàn diện.

      Update package & Timedatectl

      apt update
      timedatectl set-timezone "Asia/Ho_Chi_Minh"
      timedatectl set-ntp true
      systemctl restart systemd-timesyncd

      Xác định phiên bản của prometheus

      https://github.com/prometheus/prometheus/releases
      export RELEASE="2.20.1"

      Tải và giải nén gói cài đặt

      wget https://github.com/prometheus/prometheus/releases/download/v${RELEASE}/prometheus-${RELEASE}.linux-amd64.tar.gz
      tar xvf prometheus-${RELEASE}.linux-amd64.tar.gz
      cd prometheus-${RELEASE}.linux-amd64/

      Tạo user cho dịch vụ Prometheus

      groupadd --system prometheus
      grep prometheus /etc/group
      useradd -s /sbin/nologin -r -g prometheus prometheus

      Tạo thư mục chứa file cấu hình Prometheus

      mkdir -p /etc/prometheus/{rules,rules.d,files_sd}  /var/lib/prometheus

      Chuyển các file thực thi binary vào thư mục local bin và copy thư mục consoles, file config

      cp prometheus promtool /usr/local/bin/
      cp -r consoles/ console_libraries/ /etc/prometheus/
      cp prometheus.yml /etc/prometheus/

      Gán quyền cho user prometheus

      chown -R prometheus:prometheus /etc/prometheus/  /var/lib/prometheus/
      chmod -R 775 /etc/prometheus/ /var/lib/prometheus/

      Tạo file systemd cho dịch vụ prometheus

      nano /etc/systemd/system/prometheus.service
      [Unit]
      Description=Prometheus systemd service unit
      Wants=network-online.target
      After=network-online.target
      [Service]
      Type=simple
      User=prometheus
      Group=prometheus
      ExecReload=/bin/kill -HUP $MAINPID
      ExecStart=/usr/local/bin/prometheus 
      --config.file=/etc/prometheus/prometheus.yml 
      --storage.tsdb.path=/var/lib/prometheus 
      --web.console.templates=/etc/prometheus/consoles 
      --web.console.libraries=/etc/prometheus/console_libraries 
      --web.listen-address=0.0.0.0:9090 
      --storage.tsdb.retention.time=1y
      SyslogIdentifier=prometheus
      Restart=always
      [Install]
      WantedBy=multi-user.target

      Enable và khởi động dịch vụ prometheus

      systemctl daemon-reload
      systemctl start prometheus
      systemctl enable prometheus

      Truy cập tại : http://<IP_HOST>:9090

      Cài đặt Grafana trên Ubuntu 18

      Đầu tiên, bạn thêm repository của Grafana vào máy chủ

      echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
      wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add

      Update các gói phần mềm từ repository này và cài đặt Grafana.

      apt-get update
      apt-get install grafana -y

      Kích hoạt và khởi động dịch vụ

      systemctl start grafana-server
      systemctl enable grafana-server.service

      Truy cập <IP_HOST>: :3000


      Việc cài đặt Prometheus và Grafana là bước quan trọng để xây dựng một hệ thống giám sát hiện đại và mạnh mẽ. Với Prometheus thu thập dữ liệu chính xác và Grafana trực quan hóa thông tin, bạn có thể dễ dàng theo dõi, phân tích và tối ưu hóa hiệu suất hệ thống. Hãy bắt đầu triển khai ngay hôm nay để tận dụng tối đa lợi ích từ bộ công cụ giám sát hàng đầu này!

      Các loại Load Balancing với Nginx

      Giới thiệu

      Trong các hệ thống hiện đại, Load Balancing (cân bằng tải) là một trong những phương pháp quan trọng để đảm bảo hiệu suất cao và độ tin cậy. Với Nginx, bạn không chỉ thiết lập Load Balancing một cách dễ dàng mà còn có thể tận dụng sức mạnh của nó trong vai trò Reverse Proxy. Bài viết này sẽ hướng dẫn bạn cách cấu hình Load Balancing với Nginx, giúp hệ thống của bạn xử lý lưu lượng truy cập hiệu quả hơn và giảm tải cho các server backend.

      Nginx hỗ trợ nhiều kỹ thuật load balancing (cân bằng tải), phổ biến trong việc phân phối lưu lượng truy cập giữa các máy chủ backend để tăng cường hiệu suất và đảm bảo tính ổn định của hệ thống. Dưới đây là các thể loại load balancing mà Nginx cung cấp:

      1. Round Robin

      Nguyên lý: Các yêu cầu được phân phối tuần tự đến từng máy chủ trong danh sách, không xét đến tải hoặc trạng thái của máy chủ.

      Ưu điểm:

      • Đơn giản, dễ cấu hình.
      • Phù hợp với các máy chủ có cấu hình và tài nguyên tương đồng.
      upstream backend {
          server server1.example.com;
          server server2.example.com;
      }
      
      server {
          location / {
              proxy_pass http://backend;
          }
      }

      2. Least Connections

      Nguyên lý: Chuyển yêu cầu đến máy chủ có ít kết nối đang hoạt động nhất.

      Ưu điểm:

      • Hiệu quả với các ứng dụng có thời gian xử lý yêu cầu không đồng nhất.
      upstream backend {
          least_conn;
          server server1.example.com;
          server server2.example.com;
      }

      3. IP Hash

      Nguyên lý: Yêu cầu từ một IP cụ thể luôn được chuyển đến cùng một máy chủ, dựa trên hàm băm của địa chỉ IP.

      Ưu điểm:

      • Đảm bảo phiên làm việc (session) của người dùng được duy trì trên một máy chủ (sticky sessions).
      upstream backend {
          ip_hash;
          server server1.example.com;
          server server2.example.com;
      }

      4. Generic Hash

      Nguyên lý: Dựa trên giá trị được chỉ định (ví dụ: URL, cookie, v.v.), Nginx phân phối yêu cầu đến một máy chủ cụ thể.Ưu điểm:

      • Tùy chỉnh cao, phù hợp với các ứng dụng cần duy trì dữ liệu trên một backend cố định.
      upstream backend {
          hash $request_uri consistent;
          server server1.example.com;
          server server2.example.com;
      }

      5. Weight-Based Load Balancing

      Nguyên lý: Gán trọng số (weight) cho các máy chủ, máy chủ có trọng số cao hơn sẽ nhận nhiều yêu cầu hơn.

      Ưu điểm:

      • Hữu ích khi các máy chủ có cấu hình không đồng đều.
      upstream backend {
          server server1.example.com weight=3;
          server server2.example.com weight=1;
      }

      6. Dynamic Load Balancing (Sticky Sessions)

      Nguyên lý: Duy trì yêu cầu của người dùng trên một máy chủ trong suốt thời gian làm việc bằng cách sử dụng cookie hoặc token.

      Cách cấu hình (sử dụng Nginx Plus hoặc module third-party)

      upstream backend {
          server server1.example.com;
          server server2.example.com;
          sticky cookie srv_id expires=1h path=/;
      }

      7. Active Health Check

      Nguyên lý: Liên tục kiểm tra tình trạng của các máy chủ backend. Yêu cầu chỉ được gửi đến các máy chủ đang hoạt động.

      Ưu điểm:

      • Giảm thiểu thời gian chết của hệ thống khi một hoặc nhiều máy chủ gặp sự cố.
      upstream backend {
          server server1.example.com;
          server server2.example.com;
          health_check;
      }

      8. Failover

      Nguyên lý: Khi một máy chủ không khả dụng, yêu cầu sẽ được chuyển đến một máy chủ khác trong danh sách.Ưu điểm:

      • Tăng tính sẵn sàng của hệ thống.

      Cách cấu hình: Failover tự động được áp dụng với các loại cân bằng tải khác khi có health check.

      9. Stream Load Balancing (TCP/UDP)

      Nguyên lý: Cân bằng tải cho giao thức TCP và UDP, thường sử dụng cho các dịch vụ như MySQL, Redis, hoặc WebSocket.

      stream {
          upstream backend {
              server server1.example.com:3306;
              server server2.example.com:3306;
          }
      
          server {
              listen 3306;
              proxy_pass backend;
          }
      }

      Tùy vào đặc điểm ứng dụng và yêu cầu hệ thống, bạn có thể chọn hoặc kết hợp các phương pháp trên để tối ưu hóa việc cân bằng tải.

      Docker Compose

      Giới thiệu

      Trong các dự án sử dụng Docker, việc quản lý nhiều container có thể trở nên phức tạp. Đây là lúc Docker Compose phát huy tác dụng, giúp bạn dễ dàng cấu hình, triển khai và quản lý các container một cách nhất quán. Với tệp cấu hình docker-compose.yml, bạn có thể định nghĩa và tự động hóa toàn bộ hệ thống chỉ với vài dòng lệnh. Hãy cùng khám phá cách sử dụng Docker Compose để tối ưu hóa quy trình làm việc của bạn!


      File docker-compose.yml gần giống ý nghĩa với file Dockerfile đã tìm hiểu trong Sử dụng Dockerfile, là một file text, viết với định dạng YAML (Ain’t Markup Language, đọc nhanh định dạng Định dạng YML) là cấu hình để tử đó lệnh docker compose sinh ra và quản lý các service (container), các network, các ổ đĩa … cho một ứng dụng hoàn chỉnh.

      Các lệnh docker compose:

      Tạo và chạy các thành phần định nghĩa trong docker-compose.yml (các dịch vụ, image, container, mạng, đĩa …)

      docker-compose up

      Dừng và xóa: image, container, mạng, đĩa tạo ra bởi docker-compose up

      docker-compose down

      Theo dõi logs từ các dịch vụ

      docker-compose logs [SERVICES]

      Tuỳ chọn

      docker-compose up -d <ten-dich-vu>

      Lệnh này để chạy background

      Example

      Ở đây tôi sẽ ví dụ với một ứng dụng Zabbix hoàn chỉnh:

      version: '3'
      
      services:
        zabbix-server-mysql:
          image: zabbix-server-mysql:2023
          ports:
            - 10051:10051
          networks:
            zabbix-network:
              ipv4_address: 192.168.200.4
          restart: always
          environment:
            - DB_SERVER_HOST=mysql
            - MYSQL_DATABASE=zabbixdb
            - MYSQL_USER=zabbixuser
            - MYSQL_PASSWORD=password
            - MYSQL_ROOT_PASSWORD=password
            - ZBX_JAVAGATEWAY=zabbix-java-gateway
            - StartVMwareCollectors=5
      
        zabbix-web-nginx-mysql:
          image: zabbix-web-nginx-mysql:2023
          ports:
            - 80:8080
          environment:
            - ZBX_SERVER_HOST="zabbix-server-mysql"
            - DB_SERVER_HOST="mysql"
            - MYSQL_DATABASE="zabbixdb"
            - MYSQL_USER="zabbixuser"
            - MYSQL_PASSWORD="password"
            - MYSQL_ROOT_PASSWORD="password"
          networks:
            zabbix-network:
              ipv4_address: 192.168.200.5
          restart: always
        
        zabbix-java-gateway:
          image: zabbix/zabbix-java-gateway:2023
          networks:
            zabbix-network:
              ipv4_address: 192.168.200.3
          restart: always
        
        zabbix-agent:
          image: zabbix-agent2:2023
          networks:
            zabbix-network:
              ipv4_address: 192.168.200.6
          restart: always
      
      networks:
        zabbix-network:
          driver: bridge
          ipam:
           config:
             - subnet: 192.168.200.0/24
               gateway: 192.168.200.1

      Docker Compose là công cụ mạnh mẽ giúp đơn giản hóa việc triển khai và quản lý nhiều container, đặc biệt trong các ứng dụng phức tạp. Bằng cách sử dụng file docker-compose.yml, bạn có thể tiết kiệm thời gian và giảm thiểu lỗi cấu hình. Hãy bắt đầu áp dụng Docker Compose vào dự án của bạn để nâng cao hiệu suất và hiệu quả làm việc ngay hôm nay!

      Caching Solutions

      Tối Ưu Hóa Bộ Nhớ Redis: Cấu Hình Eviction Policies Chi Tiết Trên Ubuntu 20.04+

      Tối Ưu Hóa Bộ Nhớ Redis: Cấu Hình Eviction Policies Chi Tiết Trên Ubuntu 20.04+

      Giới thiệu

      Khi làm việc với Redis trên nền Ubuntu 20.04 trở lên, việc tối ưu bộ nhớ và xử lý hoạt động từ các chính sách eviction là yếu tố quyết định cho hiệu suất và độ ổn định của hệ thống. Eviction policies quyết định cách Redis phản ứng khi bộ nhớ đạt ngưỡng, để đảm bảo dữ liệu quan trọng vẫn có sẵn trong phạm vi bộ nhớ giới hạn. Bài viết này trình bày các khái niệm, khung kiến trúc và hướng tiếp cận thực tiễn để cấu hình eviction policy một cách an toàn và có kiểm soát trên môi trường Ubuntu 20.04+ trong bối cảnh quản trị Redis cấp doanh nghiệp.

      Các khái niệm cốt lõi

      Đến với Redis, quản lý bộ nhớ là một phần thiết yếu của vận hành hệ thống. Khi kích thước dữ liệu tăng lên hoặc lưu lượng truy cập tăng cao, Redis có thể hết bộ nhớ vật lý. Lúc này eviction policy sẽ quyết định hành vi của máy chủ Redis: loại bỏ dữ liệu cũ hay những mục ít được truy cập để nhường chỗ cho dữ liệu mới. Các yếu tố liên quan bao gồm:

      • Giới hạn bộ nhớ tối đa của Redis và cách mà nó áp dụng khi giới hạn này bị vượt quá.
      • Chiến lược loại bỏ dữ liệu khi bộ nhớ đầy nhằm duy trì tính khả dụng cho các dữ liệu quan trọng.
      • Ảnh hưởng của persistence và snapshotting lên hành vi giải phóng bộ nhớ trong quy trình eviction.
      • Quan hệ giữa eviction và cơ chế bảo mật, đảm bảo dữ liệu nhạy cảm không bị loại bỏ một cách trái phép khi hệ thống hoạt động ở chế độ mất dữ liệu.

      Kiến trúc và mô hình triển khai

      Kiến trúc Redis có thể ở mức đơn node hoặc ở mức có sao chép và tính sẵn sàng cao. Trong bối cảnh eviction và tối ưu bộ nhớ, một số mô hình triển khai phổ biến bao gồm:

      • Single-node Redis với giới hạn bộ nhớ được cấu hình để đảm bảo hiệu suất ổn định.
      • Cluster hoặc thiết lập sao chép để tăng tính sẵn sàng và phân bổ tải, đồng thời quản lý giới hạn bộ nhớ trên từng nút.
      • Giải pháp high availability như Sentinel hỗ trợ theo dõi trạng thái dịch vụ và tự động chuyển đổi khi cần thiết, giúp duy trì dịch vụ khi có sự cố và đảm bảo đúng quy trình làm việc với eviction.

      Yêu cầu và chuẩn bị trên Ubuntu 20.04+

      Trước khi bắt đầu cấu hình eviction, hãy đảm bảo hệ thống đáp ứng các yêu cầu sau:

      • Hệ điều hành: Ubuntu 20.04 hoặc phiên bản tương thích trở đi.
      • Trình quản lý gói: apt-get được cập nhật để cài đặt Redis từ kho lưu trữ chính thức của Ubuntu.
      • Quyền vận hành: quyền root hoặc quyền sudo để cài đặt và cấu hình dịch vụ Redis.
      • Mạng và bảo mật: xác định địa chỉ lắng nghe, giới hạn kết nối để tránh truy cập trái phép và đảm bảo an toàn khi lưu trữ dữ liệu.

      Cấu hình chính cho eviction policies

      Trong môi trường sản xuất, cấu hình eviction cần cân nhắc cẩn thận để cân bằng giữa dung lượng bộ nhớ, tính sẵn dùng dữ liệu và hiệu suất. Các yếu tố chính cần xem xét:

      • Thiết lập giới hạn bộ nhớ để Redis biết khi nào cần bắt đầu giải phóng dữ liệu.
      • Chọn chiến lược eviction phù hợp với đặc thù ứng dụng, ví dụ các trường hợp dữ liệu có TTL ngắn hoặc dữ liệu quan trọng càng ít thay đổi.
      • Kết hợp eviction với cơ chế Persistency và replication để giảm thiểu rủi ro mất mát dữ liệu.
      • Đảm bảo các thiết lập bảo mật và mạng liên quan không bị ảnh hưởng tiêu cực khi eviction diễn ra.

      Ví dụ minh họa về cấu hình ở mức khung sẽ có dạng như sau để tham khảo, không phải là quy chuẩn bắt buộc và có thể điều chỉnh theo thực tế triển khai:

      # Ví dụ cấu hình minh họa
      maxmemory 2gb
      maxmemory-policy allkeys-lru
      appendonly yes
      

      Ví dụ thực tế trên Ubuntu 20.04

      Quy trình triển khai trên hệ điều hành Ubuntu 20.04+ có thể theo các bước sau, bao gồm cài đặt Redis và cấu hình ban đầu:

      1. Cập nhật hệ thống và cài đặt Redis từ kho chuẩn của Ubuntu.
      2. Kích hoạt và khởi động dịch vụ Redis để tự động chạy tại khởi động.
      3. Chỉnh sửa tệp cấu hình Redis để thiết lập giới hạn bộ nhớ và eviction policy.
      4. Khởi động lại Redis để áp dụng cấu hình mới.

      Gợi ý các lệnh tham khảo cho môi trường Debian/Ubuntu tương ứng (không phải hướng dẫn chi tiết về mọi phiên bản):

      sudo apt update
      sudo apt install redis-server
      sudo systemctl enable redis-server
      sudo systemctl start redis-server
      

      Sau khi cài đặt, bạn có thể chỉnh sửa tệp cấu hình phổ biến ở vị trí mặc định và đảm bảo Redis nhận các thiết lập mới khi khởi động lại. Trong môi trường thực tế, hãy cân nhắc áp dụng cấu hình ngay tại tệp cấu hình của Redis hoặc trong mẫu cấu hình của hệ quản trị cấu hình mà bạn đang dùng.

      Kiểm tra và xác nhận

      Để xác nhận rằng eviction policy và giới hạn bộ nhớ đã được áp dụng đúng cách, thực hiện các bước kiểm tra sau:

      • Kiểm tra cấu hình hiện tại của Redis liên quan đến giới hạn bộ nhớ và chính sách eviction.
      • Theo dõi hoạt động của bộ nhớ sau khi tải hệ thống hoặc xung đột dữ liệu xảy ra.
      • Đảm bảo dữ liệu vẫn có sẵn và hệ thống phục hồi đúng theo kỳ vọng sau khi eviction diễn ra.

      Phương án kiểm tra phổ biến bao gồm các lệnh kiểm tra trạng thái bộ nhớ và cấu hình hiện tại từ trình khách Redis, tập trung vào thông tin liên quan đến bộ nhớ và chính sách eviction.

      Bảo mật và vận hành an toàn

      Khi triển khai eviction trên Redis, bảo mật là một phần không thể bỏ qua. Cân nhắc các biện pháp sau để đảm bảo an toàn vận hành:

      • Hạn chế truy cập mạng đến Redis bằng cách chỉ cho phép các máy chủ đáng tin cậy kết nối. Sử dụng tường lửa hoặc vùng mạng an toàn để quản lý lưu lượng.
      • Chỉ lắng nghe Redis từ các địa chỉ nội bộ hoặc trên các mạng riêng để giảm rủi ro truy cập trái phép.
      • Thiết lập cơ chế xác thực để ngăn người dùng trái phép thực thi các lệnh có thể ảnh hưởng đến bộ nhớ.
      • Kích hoạt lưu trữ persistence và sao lưu định kỳ để đảm bảo có thể khôi phục dữ liệu sau sự cố mà eviction gây ra.

      Đối với các tính năng quản trị nâng cao và tình trạng hoạt động, tham khảo tài liệu quản trị Redis liên quan đến bảo mật và Sentinel để hỗ trợ quản lý HA và bảo đảm dịch vụ luôn sẵn sàng trong các môi trường phức tạp.

      Giám sát và quan trắc hiệu suất

      Quan sát các chỉ số liên quan đến bộ nhớ và eviction là phần cốt lõi của vận hành hiệu quả. Các yếu tố cần theo dõi gồm:

      • Dung lượng bộ nhớ đang sử dụng và mức giới hạn.
      • Tần suất và phạm vi eviction diễn ra trong thời gian thực.
      • Tình trạng replication và khả năng sao lưu để đảm bảo dữ liệu ít bị mất khi eviction xảy ra trong môi trường đa nút.

      Việc tích hợp Redis với các công cụ giám sát hệ thống và chất lượng mạng sẽ giúp bạn nhanh chóng phát hiện các điểm nghẽn và điều chỉnh cấu hình cho phù hợp với tải thực tế.

      Xác thực vận hành và thử nghiệm

      Để đảm bảo cấu hình eviction hoạt động đúng như mong đợi trong môi trường thực tế, hãy thực hiện quy trình kiểm thử có kiểm soát:

      • Chạy các bài kiểm tra tải nhằm mô phỏng các trường hợp dữ liệu phát sinh nhanh và truy cập cao.
      • Kiểm tra hành vi của hệ thống khi bộ nhớ đạt ngưỡng và eviction được kích hoạt.
      • Đảm bảo các cơ chế backup và phục hồi hoạt động đúng sau eviction và trong trạng thái khởi động lại.

      Checklist vận hành cuối cùng

        <li Xác định ngưỡng bộ nhớ phù hợp với tải dự kiến và giới hạn phần mềm/hardware. <li Chọn chiến lược eviction phù hợp với tính chất dữ liệu và yêu cầu hiệu suất của ứng dụng. <li Đảm bảo bảo mật mạng và quyền truy cập, cùng với thiết lập xác thực cho Redis. <li Thiết lập sao lưu và cơ chế phục hồi dữ liệu thích hợp để giảm thiểu tổn thất dữ liệu khi eviction diễn ra. <li Thi công giám sát bộ nhớ và cấp phép cho cảnh báo khi vượt ngưỡng.

      Kết luận

      Việc tối ưu bộ nhớ Redis thông qua cấu hình eviction policies trên Ubuntu 20.04+ là một phần quan trọng của quản trị cơ sở dữ liệu nhanh nhạy và ổn định. Phân tích đúng nhu cầu dữ liệu, tải hệ thống và đặc thù ứng dụng sẽ giúp bạn chọn lựa chiến lược eviction phù hợp, đồng thời đảm bảo an ninh, tính sẵn sàng và khả năng mở rộng của hệ thống. Trong khuôn khổ quản trị Redis, các tài liệu về bảo mật và Sentinel có thể hỗ trợ bạn xây dựng nền tảng an toàn và có độ tin cậy cao cho môi trường sản xuất.

      Tối Ưu Hiệu Suất Redis trên CentOS

      Tối Ưu Hiệu Suất Redis trên CentOS

      Tối Ưu Hiệu Suất Redis trên CentOS

      Redis là một kho lưu trữ dữ liệu in-memory mạnh mẽ cho việc cache và streaming. Trong bài viết này, chúng ta sẽ khám phá các kỹ thuật tối ưu hiệu suất cho Redis trên nền tảng CentOS.

      1. Cài Đặt Redis trên CentOS

      sudo yum install epel-release
      sudo yum install redis
      

      2. Tối Ưu Hóa Hiệu Suất

      Sử dụng tệp cấu hình redis.conf để tối ưu hóa hiệu suất. Các tham số quan trọng bao gồm:

      • maxmemory: Giới hạn bộ nhớ mà Redis sử dụng.
      • maxmemory-policy: Chính sách khi đạt giới hạn bộ nhớ.
      # Ví dụ cài đặt maxmemory
      maxmemory 256mb
      maxmemory-policy allkeys-lru
      

      3. Bảo Mật Redis

      Bảo mật là yếu tố quan trọng để bảo vệ dữ liệu. Hãy đảm bảo:

      • Thay đổi mật khẩu mặc định trong redis.conf.
      • Sử dụng cấu hình bind để chỉ cho phép địa chỉ IP cụ thể truy cập.
      requirepass your_secure_password
      bind 127.0.0.1
      

      4. Giám Sát Redis

      Các công cụ giám sát như Redis Monitoring giúp theo dõi hiệu suất và phát hiện các vấn đề nhanh chóng. Sử dụng redis-cli để kiểm tra:

      redis-cli info
      

      5. Lưu Trữ Dữ Liệu

      Redis hỗ trợ một số phương pháp lưu trữ dữ liệu, bao gồm:

      • RDB Persistence: Lưu trữ dữ liệu ở định dạng snapshot.
      • AOF Persistence: Lưu mọi lệnh để khôi phục lại dữ liệu.
      # Ví dụ cấu hình AOF
      appendonly yes
      appendfsync everysec
      

      6. Kiểm Soát Lỗi Tổn Thất Thông Tin

      Một trong những sai lầm phổ biến là không sao lưu cấu hình. Đảm bảo bạn thường xuyên sao lưu redis.conf và dữ liệu của bạn.

      Checklist Tối Ưu:

      • Đã cấu hình maxmemory?
      • Bảo mật với requirepass?
      • Thiết lập giám sát?
      • Lưu trữ dữ liệu được cấu hình đúng?

      Hướng Dẫn Cài Đặt MySQL và MySQL Shell: Bước Đầu Để Tạo Cluster

      Giới thiệu

      Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

      Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

      https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

      https://mariadb.com/kb/en/galera-cluster

      Phần 2 : Cài đặt MySQL và MySQL Shell

      Trước khi tạo MySQL Cluster, bạn cần thực hiện các bước pre-checking và chuẩn bị hệ thống để đảm bảo mọi thành phần hoạt động trơn tru. Bài viết này sẽ hướng dẫn bạn cách kiểm tra phần cứng, mạng và cấu hình phần mềm cần thiết.

      Cài đặt MySQL

      Installing MySQL with APT

      sudo apt-get install mysql-server

      Installing MySQL with Yum

      #Update
      sudo yum update

      Tải MySQL 8.0 RPM file

      curl -sSLO https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm

      Check Sum bản MySQL RPM vừa tải xuống

      md5sum mysql80-community-release-el7-5.noarch.rpm

      So sánh với Website tại : https://dev.mysql.com/downloads/repo/yum/

      Output
      e2bd920ba15cd3d651c1547661c60c7c  mysql80-community-release-el7-5.noarch.rpm

      Cài đặt package vừa tải

      sudo yum install mysql-server

      Khởi động MySQL :

      ##CENTOS
      sudo systemctl start mysqld
      ##UBUNTU
      sudo systemctl start mysql

      Cài đặt MySQL Shell

      Làm theo các bước được đưa ra trong Thêm MySQL APT Repository, chú ý đặc biệt đến các điểm sau:

      sudo apt-get update
      sudo apt-get install mysql-shell

      Nếu bạn đã có MySQL APT repository như một kho phần mềm trên hệ thống của mình, hãy thực hiện các bước sau:

      sudo apt-get update
      sudo apt-get install mysql-apt-config
      sudo apt-get install mysql-shell

      Cài đặt MySQL Shell với MySQL Yum Repository

      sudo yum install mysql-shell

      Đối với các hệ thống có hỗ trợ dnf, hãy làm như sau:

      sudo dnf install mysql-shell

      Tóm lại

      Việc cài đặt MySQL và MySQL Shell là nền tảng vững chắc để bắt đầu xây dựng MySQL Cluster. Sau khi hoàn thành cài đặt, bạn đã sẵn sàng để tiến hành các bước tiếp theo như kiểm tra hệ thống và tạo cluster.

      Xem thêm

      System Admin

      Nginx

      nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. For a long time, it has been running on many heavily loaded Russian sites including YandexMail.RuVK, and Rambler.

      NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên Ubuntu 20.04+

      NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên Ubuntu 20.04+

      Giới thiệu

      Bài viết này trình bày cách cấu hình NGINX High Performance để thực hiện load balancing và quản lý persistence ở lớp ứng dụng (Layer 7) trên nền tảng Ubuntu 20.04+ hoặc các phân phối tương thích. Tài liệu tập trung vào cách sử dụng ngx_http_upstream_module để định nghĩa nhóm máy chủ backend và cách NGINX phân phối lưu lượng giữa chúng, đồng thời nêu rõ các tham số và chiến lược liên quan đến độ sẵn sàng và hiệu suất hệ thống. Các tham chiếu kỹ thuật từ tài liệu chính thức của NGINX cho phép triển khai một mô hình cân bằng tải ổn định, có khả năng mở rộng và dễ bảo trì trong môi trường sản xuất.

      Kiến trúc và khái niệm cốt lõi

      Nguyên lý cốt lõi của NGINX khi làm load balancer ở lớp ứng dụng được đóng gói trong module upstream. Module ngx_http_upstream_module cho phép định nghĩa một nhóm các máy chủ backend mà có thể được tham chiếu từ các directive như proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass, và grpc_pass. Định nghĩa này nằm trong một khối upstream và có thể có nhiều máy chủ với các tham số khác nhau. Ví dụ một khối upstream có thể trỏ tới nhiều máy chủ và cả socket UNIX để tối ưu hóa hiệu suất và tính sẵn sàng.

      Khái niệm cơ bản: một upstream định nghĩa một tập máy chủ mà NGINX có thể gửi request tới. Các máy chủ có thể ở các cổng khác nhau hoặc thậm chí là UNIX-domain socket. Mặc định, NGINX phân phối các yêu cầu giữa các máy chủ bằng phương pháp cân bằng vòng quay có trọng số (weighted round-robin). Điều này cho phép ưu tiên một máy chủ nhất định bằng cách gán trọng số cao cho nó để nhận nhiều yêu cầu hơn so với các máy chủ còn lại. Ngoài ra, NGINX hỗ trợ các phương pháp cân bằng khác như hash, ip_hash và random, để đáp ứng các yêu cầu khác nhau về persistence và phân bổ lưu lượng.

      Các tham số quan trọng được định nghĩa cho mỗi máy chủ trong upstream:

      • weight: xác định trọng số của máy chủ để ảnh hưởng tới phân phối lưu lượng. Trọng số càng cao, máy chủ nhận càng nhiều yêu cầu so với các máy chủ khác.
      • max_conns: giới hạn số kết nối đồng thời tới máy chủ backend (một giới hạn áp dụng nếu upstream nằm trong RAM chia sẻ và có nhiều worker).
      • max_fails: số lần thử không thành công liên tiếp với máy chủ, được đếm trong thời gian được chỉ định bởi fail_timeout để xem máy chủ có còn hợp lệ hay không.
      • fail_timeout: khoảng thời gian trong đó một số lần thử không thành công được xem là máy chủ bị unavailable.
      • backup: đánh dấu máy chủ là máy chủ sao lưu; các yêu cầu sẽ được chuyển tới máy chủ sao lưu khi các máy chủ chính không thể phục vụ.
      • down: đánh dấu máy chủ là unavailable vĩnh viễn.
      • resolve: quan sát sự thay đổi của địa chỉ IP tương ứng với tên miền của máy chủ và tự động cập nhật upstream mà không cần khởi động lại nginx (yêu cầu cấu hình resolver ở khối http hoặc upstream).
      • service: cho phép tra cứu DNS SRV và thiết lập tên dịch vụ.

      Để vận hành ở mức độ cao hơn, cơ chế kiểm tra sức khỏe (health checks) có thể được bật, nhưng trong các phiên bản thương mại của NGINX. Ví dụ trong tài liệu tham khảo, khối upstream có thể sử dụng health_check để theo dõi tình trạng của backend.

      Điểm đặc thù quan trọng khác là cách xác định địa chỉ của backend. Địa chỉ có thể là tên miền hoặc địa chỉ IP, và nếu không chỉ định port thì mặc định sẽ là cổng 80. Một tên miền có thể resolve thành nhiều địa chỉ IP sẽ tạo ra nhiều máy chủ backend cùng lúc. Thêm vào đó, tham số resolve cho phép cập nhật địa chỉ khi thay đổi DNS mà không cần khởi động lại nginx. Ngược lại, tham số backup sẽ đánh dấu một máy chủ phụ để nhận yêu cầu khi các máy chủ chính gặp sự cố. Những khía cạnh này cho phép thiết kế cơ chế cân bằng tải bền vững và có khả năng phục hồi đúng theo nhu cầu vận hành.

      Yêu cầu và chuẩn bị

      Đối với kiến trúc NGINX High Performance triển khai trên nền tảng Ubuntu 20.04+ hoặc các bản phân phối tương thích, cần đảm bảo một số yếu tố cơ bản sau:

      • Nguyên tắc cơ bản: NGINX được triển khai với các module cần thiết để định nghĩa upstream và thực thi proxy cho các backend HTTP hoặc các dạng kết nối khác (ví dụ FastCGI, uwsgi, memcached, grpc). Tham chiếu từ tài liệu cho upstream cho thấy các module như ngx_http_upstream_module và các module liên quan khác có thể được tích hợp tùy thuộc vào gói cài đặt của bạn.
      • Khả năng đọc / cập nhật DNS cho upstream động: nếu bạn dùng resolve và SRV records, cần có resolver được chỉ định ở khối http hoặc upstream để cho phép cập nhật địa chỉ backend khi DNS thay đổi.
      • Khả năng kiểm tra sức khỏe (health checks): một số tính năng nâng cao cho upstream có thể yêu cầu gói thương mại của NGINX để sử dụng health_check và các cơ chế phức tạp khác.

      Trong tài liệu tham khảo, các khía cạnh trên nhấn mạnh sự linh hoạt của upstream và khả năng tinh chỉnh phân phối tải thông qua các tham số và các phương thức cân bằng để phù hợp với từng môi trường sản xuất.

      Cấu hình chính

      Phần cấu hình dưới đây minh họa một khối upstream cơ bản và một cấu hình server để phân phối lưu lượng đến nhiều backend. Đây là mẫu tham khảo và có thể được áp dụng trên Ubuntu 20.04+ hoặc các hệ thống tương đương có NGINX được biên dịch với module upstream.

      upstream backend {
        server backend1.example.com weight=5;
        server backend2.example.com:8080;
        server unix:/tmp/backend3;
        server backup1.example.com:8080 backup;
        server backup2.example.com:8080 backup;
      }
      server {
        listen 80;
        location / {
          proxy_pass http:// backend ;
        }
      }
      

      Cấu hình ở trên cho phép phân phối tải qua các máy chủ backend xác định với các tham số trọng số, cổng khác nhau và cả socket UNIX. Máy chủ backup được gán để nhận yêu cầu khi các máy chủ chính gặp sự cố. Mặc định, NGINX sẽ sử dụng phương pháp cân bằng vòng quay có trọng số giữa các máy chủ trong upstream.

      Để làm rõ cách phân phối lưu lượng, hãy tham khảo ví dụ dưới đây. Trong ví dụ này, mỗi chu kỳ 7 yêu cầu sẽ được phân phối như sau: 5 yêu cầu tới backend1.example.com, và mỗi máy chủ backend2 và backend3 nhận 1 yêu cầu. Điều này thể hiện rõ cơ chế trọng số tác động như thế nào tới phân bổ lưu lượng.

      upstream dynamic {
        zone upstream_dynamic 64k;
        server backend1.example.com weight=5;
        server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
        server 192.0.2.1 max_fails=3;
        server backend3.example.com resolve;
        server backend4.example.com service=http resolve;
        server backup1.example.com:8080 backup;
        server backup2.example.com:8080 backup;
      }
      server {
        location / {
          proxy_pass http:// dynamic ;
          health_check;
        }
      }
      

      Ghi chú về mẫu nâng cao ở trên: khối upstream dynamic cho thấy cách định danh zone cho nhóm máy chủ, cho phép các máy chủ có các trạng thái khác nhau và khả năng tra cứu DNS SRV thông qua tham số service và resolve. Cú pháp health_check ở cuối khối server cho thấy một ví dụ về việc giám sát sức khỏe — điều này có thể được kích hoạt trong các phiên bản thương mại của NGINX để thực thi kiểm tra liên tục đối với các backend.

      Cân bằng tải và persistence ở lớp 7

      Ngữ cảnh cân bằng tải ở lớp 7 phụ thuộc vào cách bạn xác định các máy chủ backend và cách NGINX phân phối lưu lượng giữa chúng. Mặc định, upstream sử dụng phương pháp cân bằng vòng quay có trọng số, nhưng các phương pháp khác như hash, ip_hash và random cũng được nhắc tới như các tùy chọn cân bằng có thể áp dụng cho các tình huống khác nhau. Việc ưu tiên các backend hoặc thiết lập persistence có thể dựa vào các tham số của upstream và cách bạn cấu hình proxy_pass tới upstream để đảm bảo tính nhất quán của các phiên làm việc.

      Ví dụ thực tế và giải thích cấu hình

      • Upstream backend với năm máy chủ backend và hai máy chủ backup. Trọng số cao hơn cho backend1 để ưu tiên xử lý; các máy chủ backup nhận khi các máy chủ chính không khả dụng.
      • Upstream dynamic cho phép quản lý địa chỉ động theo DNS và có tùy chọn resolve để cập nhật mà không cần restart nginx. Đoạn cấu hình mẫu cho health_check cho thấy tính năng giám sát sức khỏe có thể được kích hoạt khi cần thiết (điểm lưu ý là health_check có thể là phần của các phiên bản thương mại).

      Bảo mật và tuân thủ

      Khi triển khai load balancing ở lớp 7, cần lưu ý yếu tố bảo mật liên quan đến giao thức và TLS ở phía máy chủ. NGINX hỗ trợ các module liên quan như ngx_http_ssl_module để xử lý TLS cho các kết nối tới backend hoặc đi qua proxy. Việc xác thực và quản lý số lượng kết nối tới backend cũng có thể ảnh hưởng đến bảo mật và tuân thủ vận hành. Tài liệu tham khảo cho upstream cho thấy các module liên quan và các cơ chế để đảm bảo kết nối an toàn và hiệu quả, đồng thời cho phép giám sát và vận hành ở mức độ chấp nhận được trong môi trường prod.

      Hiệu suất và tối ưu hóa

      Hiệu suất của hệ thống phụ thuộc vào cách bạn cấu hình upstream và các tham số liên quan. Ví dụ, tham số weight cho mỗi máy chủ cho phép tối ưu hóa phân bổ tải theo mức độ ưu tiên của backend. Tham số max_conns giúp giới hạn số kết nối đồng thời đến từng backend, từ đó ngăn ngừa tình trạng quá tải và giảm thiểu tác động đến các backend khác. Failover và fail_timeout cho phép hệ thống quay vòng và phục hồi khi một backend gặp sự cố, giúp hệ thống duy trì khả năng phục vụ ổn định ngay cả khi một phần hệ thống gặp sự cố.

      Quan sát và giám sát

      Khả năng giám sát hiệu suất và tình trạng của upstream là một phần quan trọng của vận hành NGINX. Tài liệu liên quan cho thấy danh sách modules của NGINX bao gồm các module hỗ trợ giám sát và quản lý trạng thái, như ngx_http_stub_status_module và ngx_http_upstream_module. Việc theo dõi sức khỏe và trạng thái của backend giúp bạn nhận diện sớm các vấn đề và tối ưu lại cấu hình khi cần thiết. Trong một số trường hợp, health_check có thể được kích hoạt để có cái nhìn chi tiết về sức khỏe của từng backend trong upstream.

      Kiểm tra và validation

      Để đảm bảo cấu hình upstream hoạt động đúng, bạn nên thực hiện các bước kiểm tra sau:

      • Kiểm tra cú pháp và hợp lệ của tập cấu hình liên quan đến upstream và proxy_pass, sau đó nạp lại NGINX khi cần. Bạn nên theo dõi log để xác định các lỗi cú pháp hoặc lỗi liên quan tới backend.
      • Kiểm tra sự phân phối lưu lượng giữa các backend bằng cách gửi các yêu cầu tới các địa chỉ frontend và quan sát phản hồi. Theo dõi trạng thái trả về từ các backend và mức độ đáp ứng của từng máy chủ để điều chỉnh trọng số hoặc kết cấu liên quan.
      • Đối với các khối upstream có quyền truy cập DNS, kiểm tra DNS resolution và sự thay đổi địa chỉ khi DNS thay đổi. Đảm bảo resolver được cấu hình đúng để cập nhật upstream mà không cần restart.

      Checklist vận hành

      • Đảm bảo upstream chứa danh sách máy chủ backend đúng và có thể đáp ứng tải.
      • Kiểm tra tham số weight và backup để tối ưu phân phối tải và khả năng phục hồi.
      • Xác nhận khả năng resolve cho DNS và SRV nếu bạn dựa vào cơ chế này để định danh backend.
      • Theo dõi log và trạng thái của backend để phát hiện sớm sự cố và kích hoạt cơ chế failover.

      Kết luận

      Cấu hình NGINX Upstream để load balancing và persistence ở lớp 7 trên Ubuntu 20.04+ mang lại khả năng phân phối lưu lượng linh hoạt, khả năng mở rộng và độ sẵn sàng cao cho các ứng dụng web. Việc sử dụng các tham số như weight, max_conns, fail_timeout và backup cho upstream cho phép tùy chỉnh hành vi phân phối và phục hồi khi backend gặp sự cố. Đồng thời, khả năng resolve và service cho DNS SRV cung cấp cơ chế quản lý địa chỉ backend động mà không làm gián đoạn dịch vụ. Để đạt được hiệu quả tối ưu, hãy thiết kế cấu hình dựa trên nhu cầu thực tế, theo dõi và thử nghiệm cẩn thận trong môi trường prod.

      Tối ưu NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên CentOS

      Tối ưu NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên CentOS

      Tối ưu NGINX High Performance: Cấu hình Load Balancing & Layer 7 Persistence trên CentOS

      Trong môi trường CentOS và các hệ thống tương thích, NGINX High Performance cung cấp cơ chế load balancing và khả năng giữ phiên làm việc ở mức Layer 7 thông qua upstream module. Bài viết này trình bày cách cấu hình và tối ưu để đảm bảo tải trọng đồng đều, độ sẵn sàng cao và quản trị dễ dàng trên nền tảng CentOS. Nội dung tập trung vào các khía cạnh kỹ thuật thực tiễn, dựa trên tài liệu tham khảo chính thức của NGINX về module upstream và cách thức định tuyến/tiếp nhận yêu cầu qua upstream group.

      Khái niệm cốt lõi và kiến trúc tổng quan

      Module ngx_http_upstream_module cho phép định nghĩa một nhóm máy chủ (upstream) và tham chiếu chúng từ các chỉ thị proxy_pass, fastcgi_pass, uwsgi_pass, và các chế độ kết nối khác. Một upstream tập hợp các máy chủ backend có thể nghe trên các cổng khác nhau hoặc thậm chí trên các socket UNIX. Mặc định, các máy chủ trong upstream được phân phối yêu cầu bằng phương pháp cân bằng tải vòng quay có trọng số (weighted round-robin). Ngoài ra, upstream còn hỗ trợ các đặc tính giành riêng cho Layer 7 như cấu hình xác định trọng số, giới hạn số kết nối đồng thời, nhận diện máy chủ dự phòng và các cơ chế khác nhằm tối ưu hóa khả năng chịu lỗi và trải nghiệm người dùng.

      • Định nghĩa nhóm máy chủ upstream: upstream name { … }
      • Định danh máy chủ với tham số như weight, max_fails, fail_timeout, backup và xuống (down) khi cố gắng liên lạc thất bại
      • Hỗ trợ cấu hình giữ trạng thái kết nối (keepalive) cho các kết nối đến upstream để giảm overhead kết nối lại
      • Khả năng định tuyến theo DNS với resolver để cập nhật địa chỉ IP khi địa chỉ backend thay đổi
      • Hỗ trợ các tham số nâng cao như health_check ở mức cấu hình nâng cao cho phiên bản thương mại của NGINX

      Với Layer 7 persistence, bạn có thể định tuyến lại lưu lượng dựa trên các đặc tính của phiên làm việc. Các cơ chế như ip_hash hoặc các tham số liên quan được mô tả trong tài liệu upstream và cho phép giữ cho các yêu cầu từ một client nhất định được chuyển tới cùng backend hoặc nhóm backend nhất định. Điều này giúp duy trì trạng thái phiên và cải thiện hiệu suất đối với các ứng dụng đòi hỏi sự nhất quán trong việc xử lý người dùng.

      Kiến trúc và luồng xử lý của upstream

      Khi một yêu cầu đến máy chủ NGINX, proxy_pass sẽ định tuyến tới một upstream group. Nếu upstream có nhiều máy chủ, NGINX sẽ chọn một trong số chúng dựa trên cơ chế cân bằng tải được chỉ định và có thể đồng thời thực hiện theo dõi tình trạng của từng máy chủ để bỏ qua những máy chưa sẵn sàng. Việc này giúp giảm thiểu thời gian phản hồi và tăng khả năng chịu lỗi của hệ thống.

      Trong cấu hình nâng cao, bạn có thể khai báo một upstream với các máy chủ backend và tham số liên quan như keepalive để giữ các kết nối mở giữa NGINX và backend, từ đó tối ưu hóa hiệu suất thay vì tái thiết lập kết nối cho mỗi yêu cầu. Ngoài ra, việc dùng resolver cho upstream động cho phép hệ thống thích nghi với thay đổi IP của backend mà không cần khởi động lại NGINX.

      Yêu cầu trước khi triển khai trên CentOS

      Để triển khai cấu hình load balancing và Layer 7 persistence trên CentOS, bạn cần một cài đặt NGINX High Performance có sẵn module upstream. Mô-đun này cho phép bạn định nghĩa upstream groups và tham chiếu chúng từ các chỉ thị proxy_pass. Trong trường hợp bạn sử dụng các tính năng nâng cao như health_check hoặc các tính năng liên quan đến DNS resolver, hãy đảm bảo hệ thống có quyền truy cập DNS và có thể liên hệ với máy chủ định tuyến / resolver được cấu hình đúng cách.

      Cấu hình cơ bản cho load balancing

      Dưới đây là ví dụ cấu hình cơ bản cho một upstream với nhiều máy chủ backend và máy chủ dự phòng, áp dụng phương thức cân bằng tải mặc định (weighted round-robin). Đoạn cấu hình này phù hợp cho các dịch vụ web hoặc API HTTP được triển khai trên CentOS.

      upstream backend {
        server backend1.example.com weight=5;
        server backend2.example.com:8080;
        server unix:/tmp/backend3;
        server backup1.example.com:8080 backup;
        keepalive 16;
      }
      
      server {
        listen 80;
        location / {
          proxy_pass http:// backend;
        }
      }

      Trong cấu hình trên, các máy chủ backend được gán trọng số, cho phép các máy chủ mạnh hơn nhận nhiều yêu cầu hơn. Máy chủ backup được sử dụng khi các máy chủ chính không thể đáp ứng. Tham số keepalive xác định số kết nối mở tối đa cho mỗi máy chủ backend, giúp giảm chi phí tái thiết lập kết nối cho các yêu cầu liên tiếp.

      Cấu hình Layer 7 persistence và lưu lượng có trạng thái

      Để duy trì sự nhất quán của phiên người dùng ở lớp 7, NGINX cho phép cấu hình các phương thức persistence nhất định trong upstream. Một ví dụ phổ biến là ip_hash, cho phép định tuyến mọi yêu cầu từ một địa chỉ IP client nhất định tới một máy chủ backend cố định. Đây là một cách đơn giản để duy trì trạng thái phiên mà không cần thêm thành phần phức tạp ở phía backend.

      upstream app_ip_hash {
        ip_hash;
        server app1.example.com;
        server app2.example.com;
      }

      Đối với các trường hợp phức tạp hơn, upstream có thể hỗ trợ các tham số khác trong danh sách chỉ thị, như hash hoặc sticky, tùy thuộc vào phiên bản và phát hành của NGINX. Việc sử dụng các tham số này cho phép bạn tinh chỉnh hành vi phân phối tải và phân bổ phiên làm việc ở mức cao hơn tùy theo nhu cầu cụ thể của ứng dụng.

      Cấu hình nâng cao với health checks và định vị DNS

      Trong cấu hình nâng cao, bạn có thể thiết lập định vị DNS cho upstream bằng chỉ thị resolver để cập nhật các địa chỉ IP của backend khi địa chỉ DNS thay đổi. Ví dụ ở cấu hình sau, upstream động bao gồm cả máy chủ định danh có thể cập nhật mà không cần khởi động lại NGINX:

      upstream dynamic {
        zone upstream_dynamic 64k;
        server backend1.example.com weight=5;
        server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
        server 192.0.2.1 max_fails=3;
        server backend3.example.com resolve;
        server backend4.example.com:8080 resolve;
        server backup1.example.com:8080 backup;
        server backup2.example.com:8080 backup;
      }
      server {
        location / {
          proxy_pass http:// dynamic;
          health_check;
        }
      }

      Đoạn cấu hình trên mô tả cách bạn có thể tận dụng health checks (không phải mọi phiên bản NGINX đều có tính năng này theo mặc định) nhằm giám sát tình trạng upstream và tự động loại bỏ các backend bị lỗi khỏi vòng phân phối tải. Ngoài ra, các máy chủ có tham số resolve cho phép tra cứu DNS và cập nhật địa chỉ IP mà không cần restart dịch vụ.

      Bảo mật và tối ưu hóa cấu hình upstream

      Để tăng cao độ tin cậy và hiệu suất, bạn có thể áp dụng các nguyên tắc sau trong cấu hình upstream:

      • Đặt máy chủ dự phòng (backup) để đảm bảo khả năng phục hồi khi các máy chủ chính gặp sự cố. Tham số backup ngăn không cho các yêu cầu tới các máy chủ dự phòng cho tới khi các máy chủ chính hết tình trạng sẵn sàng.
      • Sử dụng max_fails và fail_timeout để giới hạn số lần thất bại và thời gian bỏ qua một backend sau khi gặp sự cố.
      • Sử dụng keepalive để chia sẻ kết nối giữa NGINX và backend, giảm overhead của việc thiết lập kết nối liên tục.
      • Sử dụng resolver cho upstream động để cập nhật địa chỉ IP khi backend thay đổi mà không phải khởi động lại NGINX.

      Hiệu năng và quan sát trong thực tế vận hành

      Hiệu năng của NGINX khi làm reverse proxy và load balancer phụ thuộc vào nhiều yếu tố, trong đó phân phối tải qua upstream và khả năng duy trì kết nối ép buộc có tác động đáng kể. Các tham số như keepalive đóng vai trò quan trọng trong việc tối ưu hóa thời gian phản hồi và tải trọng đồng thời. Việc tận dụng các máy chủ dự phòng và các cơ chế Failover cũng giúp giảm thiểu thời gian ngừng dịch vụ cho người dùng cuối. Việc cấu hình health_check (nếu có sẵn) cho upstream sẽ cung cấp dữ liệu vận hành về trạng thái của từng backend và giúp hệ thống tự điều chỉnh trong thời gian thực.

      Kiểm tra, xác thực cấu hình và vận hành thực tế

      Sau khi cập nhật cấu hình, bạn nên rà soát tính hợp lệ và vận hành thông qua các nguồn cung cấp được đề cập ở trên. Cân nhắc theo dõi trạng thái của upstream và các máy chủ backend thông qua báo cáo sức khỏe và log của hệ thống. Cấu hình upstream nên được xem là một phần của chiến lược vận hành, có thể điều chỉnh theo lưu lượng và yêu cầu của ứng dụng mà bạn triển khai.

      Checklist vận hành

      • Đảm bảo upstream được khai báo đúng và tham chiếu từ proxy_pass đúng tên upstream.
      • Thiết lập máy chủ dự phòng và các tham số liên quan như max_fails và fail_timeout để nâng cao khả năng chịu lỗi.
      • Kích hoạt keepalive cho các kết nối tới backend để tối ưu hóa hiệu suất.
      • Đảm bảo resolver được cấu hình đúng nếu bạn dùng upstream động và DNS-based discovery.
      • Giám sát sức khỏe và phản hồi của upstream để nhận diện nhanh các sự cố và khôi phục trạng thái sẵn sàng.

      Kết luận

      Việc cấu hình Load Balancing và Layer 7 Persistence trên NGINX High Performance cho CentOS đòi hỏi sự hiểu biết về upstream module và cách thức định tuyến, nhằm đảm bảo sự ổn định, mở rộng và dễ bảo trì cho các hệ thống sản phẩm/dịch vụ web. Các tham số như weight, backup, max_fails, fail_timeout, keepalive và resolver đóng vai trò then chốt trong việc tối ưu hóa phân phối tải và khả năng chịu lỗi. Với kiến thức và cấu hình phù hợp, bạn có thể xây dựng một kiến trúc phân phối tải hiệu quả và bền vững cho môi trường CentOS của mình.

      Triển khai NGINX High Performance: Microservices Reverse Proxy với gRPC trên Ubuntu 20.04+

      Triển khai NGINX High Performance: Microservices Reverse Proxy với gRPC trên Ubuntu 20.04+

      Triển khai NGINX High Performance cho Microservices Reverse Proxy với gRPC trên Ubuntu 20.04+

      NGINX High Performance là một nền tảng reverse proxy và load balancer mạnh mẽ, với khả năng xử lý gRPC và hỗ trợ các kiến trúc microservices. Với Ubuntu 20.04 trở lên, bạn có thể triển khai NGINX với các module cốt lõi và module grpc để đóng vai trò như một lớp reverse proxy cho các dịch vụ microservices, đồng thời tối ưu hóa hiệu năng, bảo mật và khả năng vận hành liên tục.

      Trong khuôn khổ tài liệu này, chúng ta sẽ tập trung vào cách cấu hình NGINX để làm reverse proxy cho các service microservices giao tiếp bằng gRPC, thông qua upstream groups và grpc_pass. Nội dung dựa trên tài liệu kỹ thuật của NGINX và các mô-đun liên quan, đồng thời duy trì ngôn ngữ vận hành dành cho quản trị viên hệ thống.

      Khái niệm cốt lõi và kiến trúc

      Kiến trúc NGINX cho microservices với gRPC xoay quanh khái niệm upstream groups và các directive để định tuyến, gửi và quản lý lưu lượng giữa nhiều backend. Module ngx_http_upstream_module cho phép định nghĩa một nhóm máy chủ có thể tham chiếu từ các directive proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass và grpc_pass. Điểm mạnh ở đây là khả năng gộp nhiều backend thành một tập hợp duy nhất và áp dụng cơ chế cân bằng tải, timeout, và failover một cách tập trung.

      Theo mô hình này, gRPC là một giao thức gọi từ xa có thể được “pass-through” hoặc “pass-to-upstream” thông qua grpc_pass. Cơ chế cân bằng tải mặc định của upstream là vòng lặp có trọng số (weighted round-robin), cho phép phân phối lưu lượng giữa các backend theo tỉ lệ mong muốn. Trong trường hợp một backend gặp sự cố, NGINX sẽ tự động chuyển sang các backend còn lại cho đến khi có phản hồi hợp lệ từ một máy chủ còn hoạt động.

      Để đảm bảo tính linh hoạt và khả năng mở rộng, NGINX cho phép định nghĩa DNS hoặc SRV-based resolution cho upstream qua directive resolver và các tham số liên quan. Việc này hữu ích khi bạn triển khai các dịch vụ microservices được phát triển theo môi trường động hoặc trong các cluster có thể thay đổi địa chỉ backend theo thời gian.

      Yêu cầu tiền đề cho Ubuntu 20.04+

      • Hệ điều hành: Ubuntu 20.04 trở lên hoặc bản phân phối tương thích, có sẵn đầy đủ các gói phụ trợ cho NGINX High Performance.
      • NGINX được xây dựng với hỗ trợ module grpc và các module đi kèm cần thiết cho vận hành ổn định. Module grpc_pass và module liên quan (ví dụ ngx_http_grpc_module và ngx_http_upstream_module) là thành phần cần thiết để định tuyến gRPC qua reverse proxy.
      • Khả năng giải quyết DNS cho upstream, thông qua directive resolver hoặc các cơ chế DNS được cấp quyền bởi NGINX, đặc biệt khi backend có địa chỉ domain thay đổi theo thời gian.
      • Khả năng TLS/SSL để bảo mật kết nối, đặc biệt khi bạn triển khai gRPC qua giao thức TLS (grpcs) hoặc khi dừng ở lớp termination tại NGINX trước khi forwards tới backend.
      • Khung bảo mật và tuân thủ: theo dõi các thực tiễn bảo mật cơ bản như phân đoạn mạng, giới hạn truy cập, và ghi log để vận hành và phản hồi sự cố.

      Cấu hình chính cho Microservices Reverse Proxy với gRPC

      Trong ngữ cảnh microservices và gRPC, cách tiếp cận phổ biến là tạo một upstream group gồm các backend gRPC và dùng directive grpc_pass trong một location để chuyển tiếp các cuộc gọi đến upstream. Dưới đây là ví dụ cấu hình tham khảo, dựa trên nguyên tắc định nghĩa upstream và cách proxy tới upstream thông qua grpc_pass:

      upstream grpc_backend {
        server backend1.example.com:50051;
        server backend2.example.com:50051;
        server unix:/var/run/backend.sock;
      }
      
      server {
        listen 443 ssl http2;
        server_name api.example.com;
      
        ssl_certificate /etc/nginx/ssl/fullchain.pem;
        ssl_certificate_key /etc/nginx/ssl/privkey.pem;
      
        location / {
          grpc_pass grpcs://grpc_backend;
        }
      }
      

      Trong ví dụ trên, upstream grpc_backend định nghĩa một tập hợp backend có thể là các dịch vụ gRPC chạy trên các host hoặc các socket UNIX. location / được cấu hình để chuyển tiếp mọi gọi gRPC tới upstream bằng grpc_pass với định dạng grpcs:// khi bạn sử dụng TLS cho phía client và/hoặc TLS nội bộ tới backend.

      Ngoài ra, để đảm bảo tính ổn định và phục hồi khi một backend gặp sự cố, bạn có thể bổ sung các tham số như fail_timeout, max_fails và backup để điều chỉnh hành vi khi mất kết nối. Ví dụ:

      upstream grpc_backend {
        server backend1.example.com:50051 weight=3;
        server backend2.example.com:50051 weight=2 max_fails=3 fail_timeout=10s;
        server unix:/var/run/backend.sock backup;
      }
      

      Trong phương án có dynamic DNS hoặc thay đổi IP của backend, bạn có thể dùng resolver để theo dõi sự thay đổi của địa chỉ server và tự động cập nhật cấu hình upstream mà không cần khởi động lại NGINX. Ví dụ tham chiếu tới cách khai báo resolver và upstream có sử dụng resolve hoặc các trường hợp tương tự:

      resolver 10.0.0.1;
      upstream dynamic {
        zone upstream_dynamic 64k;
        server backend1.example.com weight=5;
        server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
        server 192.0.2.1 max_fails=3;
        server backend3.example.com resolve;
        server backend4.example.com service=http resolve;
        server backup1.example.com:8080 backup;
        server backup2.example.com:8080 backup;
      }
      server {
        location / {
          grpc_pass grpcs://dynamic;
        }
      }
      

      Ở ví dụ trên, upstream dynamic có khả năng resolve địa chỉ mới và có các máy chủ dự phòng cho trường hợp primary bị quá tải hoặc không đáp ứng, đồng thời có các máy chủ đánh dấu là backup để phục vụ khi các máy chủ chính không hoạt động. Đây là mô hình phù hợp với hạ tầng microservices có tính linh hoạt cao và yêu cầu độ sẵn sàng cao.

      Bảo mật và hiệu suất trong môi trường gRPC

      Để tăng cường bảo mật và hiệu suất, hãy cân nhắc các yếu tố sau:

      • Áp dụng TLS cho cả phía client và phía backend. Sử dụng grpcs:// trong grpc_pass và đảm bảo cấu hình TLS ở phía server có đầy đủ chứng chỉ hợp lệ.
      • Sử dụng HTTP/2 cho kết nối giữa client và NGINX để tối ưu hóa hiệu suất gRPC và multiplexing nhiều cuộc gọi đồng thời.
      • Tối ưu cấu hình thời gian chờ và retry bằng các tham số như fail_timeout và max_fails, cũng như các cơ chế backup để đảm bảo phục hồi khi backend bị quá tải hoặc bị ngắt kết nối.
      • Kích hoạt health check (nếu có sẵn trong phiên bản bạn dùng) để giám sát tình trạng các backend và giảm tải cho các backend không đáp ứng.
      • Sử dụng DNS SRV hoặc resolver khi backend có thể thay đổi địa chỉ liên tục, giảm thiểu sự cố do thay đổi IP mà không cần cập nhật toàn bộ cấu hình.

      Giám sát, logging và observability

      Để vận hành một hệ thống NGINX Reverse Proxy cho gRPC một cách hiệu quả, bạn cần các cơ chế giám sát và logging đáng tin cậy. Các module liên quan có trong NGINX High Performance bao gồm các thành phần cho ghi log và trạng thái hệ thống. Cụ thể, các module như ngx_http_stub_status_module có thể cung cấp thông tin trạng thái ở một endpoint nhỏ gọn, hỗ trợ quan sát lưu lượng và hiệu suất dưới dạng số liệu từ các upstream và máy chủ backend. Bên cạnh đó, khả năng ghi log ra syslog giúp tích hợp với hệ thống SIEM hoặc bộ tập trung log của bạn.

      Để bắt đầu, bạn có thể kích hoạt và xem trạng thái cơ bản của NGINX trong môi trường tiền sản xuất hoặc staging, sau đó mở rộng sang giám sát chi tiết hơn bằng các giải pháp gián tiếp hoặc các module/tiện ích bổ sung theo nhu cầu vận hành.

      Kiểm tra và xác thực triển khai

      Trước khi đưa cấu hình mới vào môi trường sản xuất, hãy kiểm tra cú pháp và tính hợp lệ của cấu hình NGINX, sau đó thực thi nghiệm Thu thập bảo trì và vận hành:

      • Kiểm tra cú pháp cấu hình NGINX: xác nhận cấu hình của upstream và grpc_pass được thiết lập đúng cách và không có lỗi cú pháp.
      • Kiểm tra khả năng phân phối lưu lượng đến các backend bằng cách theo dõi log và trạng thái của upstream để đảm bảo vòng lặp có trọng số đang hoạt động.
      • Kiểm tra kết nối TLS và xác thực chứng chỉ ở phía client và phía backend nếu có TLS liên kết giữa NGINX và backend.
      • Kiểm tra khả năng failover và backup server bằng cách tắt một trong các backend và xác thực NGINX tự động chuyển sang các backend còn lại.
      • Kiểm tra tính tương thích của client gRPC với đường dẫn qua NGINX: đảm bảo client có thể gọi các service gRPC và nhận phản hồi đúng từ upstream.

      Danh sách vận hành và checklist triển khai

      • Xác định topology microservices và danh sách các backend gRPC cần định tuyến thông qua NGINX.
      • Thiết lập upstream groups với các backend đầy đủ và thể hiện rõ các tham số trọng số, fail_timeout, max_fails và backup khi cần.
      • Cấu hình TLS cho kết nối giữa client và NGINX (và giữa NGINX và backend nếu cần sử dụng grpcs).
      • Cấu hình DNS resolver nếu backend được xác định bằng tên miền và có thể thay đổi theo thời gian.
      • Kích hoạt health_check (nếu có) và logging để giám sát trạng thái backend và hiệu suất hệ thống.
      • <liKiểm tra cấu hình với lệnh kiểm tra cú pháp và thực hiện reload khi áp dụng thay đổi trong môi trường thử nghiệm và sau đó ở môi trường sản xuất. <liThiết lập thay đổi và rollback plan để đảm bảo phục hồi nhanh khi gặp sự cố liên quan đến reverse proxy.

      Kết luận

      Việc triển khai NGINX High Performance làm reverse proxy cho microservices với gRPC trên Ubuntu 20.04+ mang lại lợi ích rõ ràng về hiệu suất xử lý, khả năng mở rộng và quản lý lưu lượng giữa các dịch vụ. Việc sử dụng upstream groups với grpc_pass cho phép định tuyến gọi gRPC một cách linh hoạt, đồng thời kết hợp với các cơ chế như resolver và health check để đảm bảo tính sẵn sàng và độ tin cậy của hệ thống. Hãy cân nhắc áp dụng các thực tiễn bảo mật và observability để có thể vận hành hệ thống một cách ổn định và an toàn trên môi trường sản xuất.

      Install Nginx

      Cài đặt phiên bản mới nhất của Nginx trên ubuntu

      Update Ubuntu :

      sudo apt update && sudo apt upgrade -y

      Gỡ bỏ cài đặt cấu hình cũ của Nginx (nếu có):

      sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old

      Cài đặt và nâng cấp Nginx Repository

      sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

      Tải về và cài Nginx GPG key để xác nhận gói

      curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor 
      | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

      Xác thực key :

      gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

      Import Nginx stable Repository :

      echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] 
      http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" 
      | sudo tee /etc/apt/sources.list.d/nginx.list

      Import Nginx Mainline Repository:

      echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] 
      http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" 
      | sudo tee /etc/apt/sources.list.d/nginx.list

      Cài đặt gói APT hướng đến phiên bản Nginx hoặc các phiên bản mặc định khác của PPA’s :

      echo -e "Package: *nPin: origin nginx.orgnPin: release o=nginxnPin-Priority: 900n" 
      | sudo tee /etc/apt/preferences.d/99nginx

      Cải đặt Nginx :

      sudo apt update
      sudo apt install nginx

      Khởi động của nginx :

      systemctl start nginx
      systemctl enable nginx

      Kiểm tra hoạt động của nginx :

      systemctl status nginx
      nginx -t

      Vậy là đã hoàn thành !

      Install Let's Encrypt in Nginx

      Install Core

      sudo snap install core; sudo snap refresh core

      Remove old certbot

      sudo apt-get remove certbot

      Install Certbot

      sudo snap install --classic certbot

      Prepare the Certbot command

      sudo ln -s /snap/bin/certbot /usr/bin/certbot

      Install your certificates…

      sudo certbot --nginx

      Or, just get a certificate

      sudo certbot certonly --nginx

      Test automatic renewal

      sudo certbot renew --dry-run

      Second way to install :

      sudo apt install certbot python3-certbot-nginx

      Check SSL Certificate :

      openssl s_client –showcerts –connect WebServerURL:PortNumber

      Auto Renew Certbot by Cron :

      43 6 * * * certbot renew --post-hook "systemctl reload nginx"

      Configuration HTTP/2 NGINX

      Open the configuration file for your domain:

      sudo nano /etc/nginx/sites-available/your_domain

      In the file, locate the listen variables associated with port 443:

      ...
          listen [::]:443 ssl ipv6only=on; 
          listen 443 ssl; 
      ...

      The first one is for IPv6 connections. The second one is for all IPv4 connections. We will enable HTTP/2 for both.

      ...
          listen [::]:443 ssl http2 ipv6only=on; 
          listen 443 ssl http2; 
      ...

      Test NGINX

      sudo nginx -t

      Removing Old and Insecure Cipher Suites

      sudo nano /etc/nginx/sites-available/your_domain

      Locate the line that includes the options-ssl-nginx.conf file and comment it out:

      # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>

      Below that line, add this line to define the allowed ciphers:

      ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

      Open the file /etc/nginx/snippets/ssl-params.conf in your text editor:

      sudo nano /etc/nginx/snippets/ssl-params.conf

      Locate the following line:

      ...
      ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
      ...

      Modify it so it looks like this:

      ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

      Save the file and exit your editor.

      sudo nginx -t
      sudo systemctl reload nginx

      Hide server nginx, apache in Respone Header

      Solution 1 : Use the 3rd-party “Headers More” Module :

      Upgrade nginx-common and nginx-extras :

      sudo apt-get install nginx-common
      sudo apt-get install nginx-extras

      Configuration nginx.conf

      nano /etc/nginx/nginx.conf
      ##Add this one :
      load_module modules/ngx_http_headers_more_filter_module.so;
      http {
          ...
             more_clear_headers Server;
          ...
      }

      Test Nginx

      nginx -t
      service nginx reload

      Solution 2 : Install and Compile new module Headers-More-Nginx-Module

      Download your version nginx :

      wget http://nginx.org/download/nginx-1.12.2.tar.gz

      Decompress your nginx.tar :

      tar -xvzf nginx-1.12.2.tar.gz 

      Download the source code of the dynamic module we need to compile :

      git clone https://github.com/openresty/headers-more-nginx-module.git

      Go to Nginx File

      cd ~/nginx1.12.2

      Compile and run source :

      ./configure --with-compat --add-dynamic-module=../headers-more-nginx-module
      make modules 

      In objs directory the “module.so” file will be created, copy the file to nginx modules directory :

      sudo cp objs/ngx_http_headers_more_filter_module.so /usr/lib/nginx/modules

      Let nginx know about the newly compiled module, add the following line in your nginx.conf file :

      load_module modules/ngx_http_headers_more_filter_module.so;

      And in the HTTP block of the engine.conf, add :

      server_tokens off;
      more_set_headers 'Server: Thanhnh';
      // or 
      more_set_header Server;

      Tối ưu nén file Nginx

      Mô tả

      Tối ưu nén file Nginx là một phương pháp quan trọng nhằm cải thiện hiệu suất và tốc độ tải trang web. Bằng cách sử dụng các kỹ thuật nén như Gzip hoặc Brotli, Nginx có thể giảm kích thước của các tệp tin trước khi chúng được gửi tới trình duyệt của người dùng. Điều này không chỉ giúp tiết kiệm băng thông mà còn giảm thời gian tải trang, nâng cao trải nghiệm người dùng và tối ưu hóa tài nguyên máy chủ. Để triển khai hiệu quả, cần cấu hình đúng các tham số nén và đảm bảo các loại tệp tin cần thiết được nén, đồng thời kiểm tra hiệu suất để đảm bảo không ảnh hưởng đến hoạt động của hệ thống.

      Phần 1 : Tối ưu với Gzip

      Mở file cấu hình Nginx:

      Thường thì file này nằm ở đường dẫn /etc/nginx/nginx.conf hoặc /etc/nginx/conf.d/default.conf.

      Thêm hoặc chỉnh sửa các dòng cấu hình gzip:

      Thêm các dòng sau vào block http trong file cấu hình:

      http {
          gzip on; 
          gzip_comp_level 5;
          gzip_min_length 256; 
          gzip_buffers 16 8k; 
          gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
          gzip_proxied any; 
          gzip_vary on; 
      }
      

      Bật nén Gzip.

      gzip on;
      gzip_static  on;
      

      Bật nén cho cả HTTP/1.0 và HTTP/1.1.

      gzip_http_version  1.1;
      

      Mức độ nén (1-9). 5 là một sự cân bằng hoàn hảo giữa size và mức sử dụng CPU, cung cấp khoảng 75% giảm kích thước cho hầu hết các tệp ASCII (gần như giống hệt mức độ 9).

      gzip_comp_level    5;
      

      Không nén bất cứ thứ gì đã nhỏ và không có khả năng giảm kích thước nhiều nếu có. (mặc định là 20 byte, điều này không hợp lý vì thường dẫn đến tệp lớn hơn sau khi nén)

      gzip_min_length 256;

      Nén dữ liệu ngay cả đối với các client kết nối với chúng ta qua proxy, được xác định bởi header “Via” (cần thiết cho CloudFront).

      gzip_proxied any;

      **Yêu cầu proxy lưu trữ cả phiên bản đã nén và không nén của tài nguyên bất cứ khi nào tiêu đề khả năng Accept-Encoding của client thay đổi; **

      • Tránh vấn đề khi một client không có khả năng gzip (rất hiếm ngày nay) sẽ hiển thị ký tự lộn xộn nếu proxy của họ đưa cho họ phiên bản đã nén.
      gzip_vary          on;
      

      Nén tất cả các đầu ra được gắn nhãn với một trong các MIME-types sau.

      # text/html luôn được nén bởi HttpGzipModule
      gzip_types
      application/atom+xml
      application/javascript
      application/json
      application/rss+xml
      application/vnd.ms-fontobject
      application/x-font-ttf
      application/x-web-app-manifest+json
      application/xhtml+xml
      application/xml
      font/opentype
      image/svg+xml
      image/x-icon
      text/css
      text/plain
      text/x-component;

      Test lại nginx :

      nginx -t 
      service nginx restart

      Phần 2 : Tối ưu nginx với nén Brotli

      Chuẩn bị package cần thiết :

      apt-get update -y
      apt-get install dpkg-dev curl gnupg2 build-essential zlib1g-dev libpcre3 libpcre3-dev unzip -y

      Tải nginx và Source Brotli

      Tải nginx :

      cd ~
      wget https://nginx.org/download/nginx-1.18.0.tar.gz
      tar zxvf nginx-1.18.0.tar.gz

      Tải Brotli :

      git clone https://github.com/google/ngx_brotli.git
      cd ~/ngx_brotli
      git submodule update --init

      Biên dịch :

      cd ~/nginx-1.18.0
      ./configure --with-compat --add-dynamic-module=../ngx_brotli
      make modules
      sudo cp ./objs/*.so /usr/lib/nginx/modules
      

      Sửa lại nginx.conf :

      cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
      nano /etc/nginx/nginx.conf

      Sau khi mở file nginx.conf bạn thêm vào 2 đoạn sau ở đầu file

      load_module modules/ngx_http_brotli_filter_module.so;
      load_module modules/ngx_http_brotli_static_module.so;

      Test Nginx và khởi động lại :

      nginx -t
      service nginx reload

      Thêm cấu hình Brotli vào vhost nginx :

      /etc/nginx/sites-available/example.conf
      brotli on;
      brotli_comp_level 6;
      brotli_static on;
      brotli_types application/atom+xml application/javascript application/json application/vnd.api+json application/rss+xml
                   application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype
                   application/x-font-ttf application/x-javascript application/xhtml+xml application/xml
                   font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon
                   image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;

      brotli_static

      • Cú pháp: brotli_static on|off|always
      • Mặc định: off
      • Ngữ cảnh: http, server, location
      • Mô tả: Bật hoặc tắt kiểm tra sự tồn tại của các tệp tin đã nén sẵn với phần mở rộng .br. Với giá trị always, tệp tin đã nén sẵn sẽ được sử dụng trong mọi trường hợp, không cần kiểm tra xem máy khách có hỗ trợ hay không.

      brotli

      • Cú pháp: brotli on|off
      • Mặc định: off
      • Ngữ cảnh: http, server, location, if
      • Mô tả: Bật hoặc tắt nén đáp ứng ngay tại thời điểm phản hồi.

      brotli_types

      • Cú pháp: brotli_types <mime_type> [..]
      • Mặc định: text/html
      • Ngữ cảnh: http, server, location
      • Mô tả: Bật nén đáp ứng ngay tại thời điểm phản hồi cho các loại MIME chỉ định thêm ngoài text/html. Giá trị đặc biệt * khớp với bất kỳ loại MIME nào. Các phản hồi với loại MIME text/html luôn được nén.

      brotli_buffers

      • Cú pháp: brotli_buffers <number> <size>
      • Mặc định: 32 4k|16 8k
      • Ngữ cảnh: http, server, location
      • Mô tả: Đã lỗi thời, bỏ qua.

      brotli_comp_level

      • Cú pháp: brotli_comp_level <level>
      • Mặc định: 6
      • Ngữ cảnh: http, server, location
      • Mô tả: Thiết lập mức độ chất lượng (nén) của nén Brotli ngay tại thời điểm phản hồi. Các giá trị chấp nhận trong khoảng từ 0 đến 11.

      brotli_window

      • Cú pháp: brotli_window <size>
      • Mặc định: 512k
      • Ngữ cảnh: http, server, location
      • Mô tả: Thiết lập kích thước cửa sổ Brotli. Các giá trị chấp nhận bao gồm: 1k, 2k, 4k, 8k, 16k, 32k, 64k, 128k, 256k, 512k, 1m, 2m, 4m, 8m16m.

      brotli_min_length

      • Cú pháp: brotli_min_length <length>
      • Mặc định: 20
      • Ngữ cảnh: http, server, location
      • Mô tả: Thiết lập độ dài tối thiểu của phản hồi sẽ được nén. Độ dài này chỉ được xác định từ trường tiêu đề phản hồi Content-Length.

      Source :

      TÌm hiểu thêm :

      Hướng dẫn tạo Virtual Host Nginx

      Tạo Virtual Host trong Nginx là một kỹ thuật quan trọng giúp bạn chạy nhiều trang web trên cùng một máy chủ. Điều này không chỉ giúp tối ưu hóa việc sử dụng tài nguyên mà còn mang lại sự linh hoạt trong quản lý và tổ chức các trang web của bạn. Trong bài viết này, chúng tôi sẽ cung cấp một hướng dẫn chi tiết về cách tạo và cấu hình Virtual Host trong Nginx.

      Phần 1 : Virtual Host làm Reserve Proxy

      server {
              listen 80 ;
              listen [::]:80 ;
      
              server_name example.com www.example.com;
      
      ##Block Google Crawl  
              if ($http_user_agent ~* (google) ) {
                      return 403; 
              }
      ##Block Google Crawl
      
              location / {
                      proxy_buffers 4 256k;
                      proxy_buffer_size 128k;
                      proxy_busy_buffers_size   256k;
                      proxy_headers_hash_max_size 1024;
                      proxy_headers_hash_bucket_size 128;
      
                      #1 hour timeout
                      proxy_read_timeout 3600;
                      client_max_body_size 100M;
      
                      proxy_pass http://192.168.1.10:80;
                      proxy_set_header Accept-Encoding "";
                      proxy_set_header Host $host;
                      proxy_set_header X-Real-IP $remote_addr;
                      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                      proxy_set_header X-Forwarded-SSL on;
                      proxy_set_header X-Forwarded-Proto $scheme;
                      proxy_set_header Accept-Encoding "";
                      # Add HSTS header with preload.
                      add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
              }
      #Brotli
              brotli on;
              brotli_comp_level 8;
              brotli_static on;
              brotli_types application/atom+xml application/javascript application/json application/rss+xml
                     application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype
                     application/x-font-ttf application/x-javascript application/xhtml+xml application/xml
                     font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon
                     image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;
      #Brotli
      
      
      }

      Với SSL Let’s Encrypt :

      server {
      
          server_name thanhnh.id.vn;
      
          location / {
              # BLOCK SPAMMERS IP ADDRESSES
              #include /etc/nginx/conf.d/blockips.conf;
      
      #        access_log one;
              access_log /var/log/nginx/thanhnh.id.vn/access.log;
              error_log /var/log/nginx/thanhnh.id.vn/error.log;
      
              proxy_set_header Accept-Encoding "";
      
                      if ($request_method = 'OPTIONS') {
                              add_header 'Access-Control-Allow-Origin' '*';
                              #
                              # Om nom nom cookies
                              #
                              add_header 'Access-Control-Allow-Credentials' 'true';
                              add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                              #
                              # Custom headers and headers various browsers should be OK with but aren't
                              #
                              add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
                              #
                              # Tell client that this pre-flight info is valid for 20 days
                              #
                              add_header 'Access-Control-Max-Age' 1728000;
                              add_header 'Content-Type' 'text/plain charset=UTF-8';
                              add_header 'Content-Length' 0;
                              return 204;
                      }
                      if ($request_method = 'POST') {
                              add_header 'Access-Control-Allow-Origin' '*';
                              add_header 'Access-Control-Allow-Credentials' 'true';
                              add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                              add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
                      }
                      if ($request_method = 'GET') {
                              add_header 'Access-Control-Allow-Origin' '*';
                              add_header 'Access-Control-Allow-Credentials' 'true';
                              add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                              add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
                      }
      
              proxy_buffers 4 256k;
              proxy_buffer_size 128k;
              proxy_busy_buffers_size   256k;
      
              #1 hour timeout
              proxy_read_timeout 3600;
              client_max_body_size 60M;
      
              proxy_pass http://192.168.12.220:8898/;
              proxy_set_header Host $host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-SSL on;
              proxy_set_header X-Forwarded-Proto $scheme;
              # Add HSTS header with preload.
              add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
      
      #Brotli
          brotli on;
          brotli_comp_level 8;
          brotli_static on;
          brotli_types application/atom+xml application/javascript application/json application/rss+xml
               application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype
                   application/x-font-ttf application/x-javascript application/xhtml+xml application/xml
                   font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon
                   image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;
      #Brotli
      
          }
      
          listen [::]:443 ssl http2 ipv6only=on; # managed by Certbot
          listen 443 ssl http2; # managed by Certbot
          ssl_certificate /etc/letsencrypt/live/thanhnh.id.vn/fullchain.pem; # managed by Certbot
          ssl_certificate_key /etc/letsencrypt/live/thanhnh.id.vn/privkey.pem; # managed by Certbot
          ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
          ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
      
      
      }
      server {
          if ($host = thanhnh.id.vn) {
              return 301 https://$host$request_uri;
          } # managed by Certbot
      
          listen 80;
          listen [::]:80;
      
          server_name thanhnh.id.vn;
          return 404; # managed by Certbot
      
      
      
      
      }

      Phần 2 : Nginx sử dụng để handle PHP code

      server {
               listen       80;
               server_name  example.thanhnh.id.vn;
               root         /var/www/html/wordpress;
      
               access_log /var/log/nginx/example.thanhnh.id.vn-access.log;
               error_log  /var/log/nginx/example.thanhnh.id.vn-error.log error;
               index index.html index.htm index.php;
      
               location / {
                            try_files $uri $uri/ /index.php$is_args$args;
               }
      
        # pass PHP scripts on Nginx to FastCGI (PHP-FPM) server
        location ~ .php$ {
          include snippets/fastcgi-php.conf;
      
          # Nginx php-fpm sock config:
          fastcgi_pass unix:/run/php/php8.1-fpm.sock;
          # Nginx php-cgi config :
          # Nginx PHP fastcgi_pass 127.0.0.1:9000;
        }
      
        # deny access to Apache .htaccess on Nginx with PHP, 
        # if Apache and Nginx document roots concur
        location ~ /.ht {
          deny all;
        }
      }

      Nginx handle PHPMYADMIN

      server {
        listen 8080;
        listen [::]:8080;
        server_name pma.example.com;
        root /usr/share/phpmyadmin/;
        index index.php index.html index.htm index.nginx-debian.html;
      
        access_log /var/log/nginx/phpmyadmin_access.log;
        error_log /var/log/nginx/phpmyadmin_error.log;
      
        location / {
          try_files $uri $uri/ /index.php;
        }
      
        location ~ ^/(doc|sql|setup)/ {
          deny all;
        }
      
        location ~ .php$ {
          fastcgi_pass unix:/run/php/php8.2-fpm.sock;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
          include snippets/fastcgi-php.conf;
        }
      
        location ~ /.ht {
          deny all;
        }
      }

      Tìm hiểu thêm :

      Các loại Load Balancing với Nginx

      Giới thiệu

      Trong các hệ thống hiện đại, Load Balancing (cân bằng tải) là một trong những phương pháp quan trọng để đảm bảo hiệu suất cao và độ tin cậy. Với Nginx, bạn không chỉ thiết lập Load Balancing một cách dễ dàng mà còn có thể tận dụng sức mạnh của nó trong vai trò Reverse Proxy. Bài viết này sẽ hướng dẫn bạn cách cấu hình Load Balancing với Nginx, giúp hệ thống của bạn xử lý lưu lượng truy cập hiệu quả hơn và giảm tải cho các server backend.

      Nginx hỗ trợ nhiều kỹ thuật load balancing (cân bằng tải), phổ biến trong việc phân phối lưu lượng truy cập giữa các máy chủ backend để tăng cường hiệu suất và đảm bảo tính ổn định của hệ thống. Dưới đây là các thể loại load balancing mà Nginx cung cấp:

      1. Round Robin

      Nguyên lý: Các yêu cầu được phân phối tuần tự đến từng máy chủ trong danh sách, không xét đến tải hoặc trạng thái của máy chủ.

      Ưu điểm:

      • Đơn giản, dễ cấu hình.
      • Phù hợp với các máy chủ có cấu hình và tài nguyên tương đồng.
      upstream backend {
          server server1.example.com;
          server server2.example.com;
      }
      
      server {
          location / {
              proxy_pass http://backend;
          }
      }

      2. Least Connections

      Nguyên lý: Chuyển yêu cầu đến máy chủ có ít kết nối đang hoạt động nhất.

      Ưu điểm:

      • Hiệu quả với các ứng dụng có thời gian xử lý yêu cầu không đồng nhất.
      upstream backend {
          least_conn;
          server server1.example.com;
          server server2.example.com;
      }

      3. IP Hash

      Nguyên lý: Yêu cầu từ một IP cụ thể luôn được chuyển đến cùng một máy chủ, dựa trên hàm băm của địa chỉ IP.

      Ưu điểm:

      • Đảm bảo phiên làm việc (session) của người dùng được duy trì trên một máy chủ (sticky sessions).
      upstream backend {
          ip_hash;
          server server1.example.com;
          server server2.example.com;
      }

      4. Generic Hash

      Nguyên lý: Dựa trên giá trị được chỉ định (ví dụ: URL, cookie, v.v.), Nginx phân phối yêu cầu đến một máy chủ cụ thể.Ưu điểm:

      • Tùy chỉnh cao, phù hợp với các ứng dụng cần duy trì dữ liệu trên một backend cố định.
      upstream backend {
          hash $request_uri consistent;
          server server1.example.com;
          server server2.example.com;
      }

      5. Weight-Based Load Balancing

      Nguyên lý: Gán trọng số (weight) cho các máy chủ, máy chủ có trọng số cao hơn sẽ nhận nhiều yêu cầu hơn.

      Ưu điểm:

      • Hữu ích khi các máy chủ có cấu hình không đồng đều.
      upstream backend {
          server server1.example.com weight=3;
          server server2.example.com weight=1;
      }

      6. Dynamic Load Balancing (Sticky Sessions)

      Nguyên lý: Duy trì yêu cầu của người dùng trên một máy chủ trong suốt thời gian làm việc bằng cách sử dụng cookie hoặc token.

      Cách cấu hình (sử dụng Nginx Plus hoặc module third-party)

      upstream backend {
          server server1.example.com;
          server server2.example.com;
          sticky cookie srv_id expires=1h path=/;
      }

      7. Active Health Check

      Nguyên lý: Liên tục kiểm tra tình trạng của các máy chủ backend. Yêu cầu chỉ được gửi đến các máy chủ đang hoạt động.

      Ưu điểm:

      • Giảm thiểu thời gian chết của hệ thống khi một hoặc nhiều máy chủ gặp sự cố.
      upstream backend {
          server server1.example.com;
          server server2.example.com;
          health_check;
      }

      8. Failover

      Nguyên lý: Khi một máy chủ không khả dụng, yêu cầu sẽ được chuyển đến một máy chủ khác trong danh sách.Ưu điểm:

      • Tăng tính sẵn sàng của hệ thống.

      Cách cấu hình: Failover tự động được áp dụng với các loại cân bằng tải khác khi có health check.

      9. Stream Load Balancing (TCP/UDP)

      Nguyên lý: Cân bằng tải cho giao thức TCP và UDP, thường sử dụng cho các dịch vụ như MySQL, Redis, hoặc WebSocket.

      stream {
          upstream backend {
              server server1.example.com:3306;
              server server2.example.com:3306;
          }
      
          server {
              listen 3306;
              proxy_pass backend;
          }
      }

      Tùy vào đặc điểm ứng dụng và yêu cầu hệ thống, bạn có thể chọn hoặc kết hợp các phương pháp trên để tối ưu hóa việc cân bằng tải.

      Apache-Php

      PHP là một ngôn ngữ lập trình phổ biến và mạnh mẽ, được sử dụng rộng rãi để phát triển các ứng dụng web động. Khám phá các tính năng, công cụ và tài nguyên học PHP để xây dựng các trang web và ứng dụng hiệu quả.

      Apache2 trên Ubuntu 20.04+: giám sát và quan sát hệ thống cho quản trị viên

      Apache2 trên Ubuntu 20.04+: giám sát và quan sát hệ thống cho quản trị viên

      Apache2 trên Ubuntu 20.04+ giám sát và quan sát hệ thống cho quản trị viên

      Việc giám sát và quan sát Apache2 trên nền tảng Ubuntu 20.04 trở nên quan trọng để đảm bảo khả dụng, hiệu suất và an toàn cho các ứng dụng web của bạn. Bài viết này trình bày các khía cạnh thực tiễn cho quản trị hệ thống, từ kiến trúc cốt lõi đến các biện pháp cấu hình tối ưu và phương pháp giám sát phù hợp với môi trường sản xuất. Nội dung được xây dựng dựa trên các tài liệu kỹ thuật hiện có và tập trung vào cách khai thác các directive và mô hình xử lý hiện có của Apache2 Version 2.4 để hỗ trợ công tác vận hành và bảo trì trên Ubuntu 20.04+.

      Kiến trúc và khái niệm cốt lõi

      Kiến trúc Apache2 cho phiên bản 2.4 gồm nhiều thành phần có thể điều chỉnh nhằm tối ưu hóa khả năng phục vụ các kết nối đồng thời. Một sự khác biệt quan trọng là việc dùng Multi Processing Module MPM để xử lý luồng công việc và kết nối. MPM event là một biến thể của MPM worker có mục tiêu tiêu thụ threads chỉ cho các kết nối đang có xử lý thực sự, trong khi các kết nối khác được quản lý bởi các listener thread, nhờ đó các worker threads có thể phục vụ yêu cầu mới nhanh hơn. Đây là một mô hình kết nối bất đồng bộ giúp giảm yếu tố thận thùng và tối ưu hóa xử lý đồng thời. Để dùng MPM event, cấu hình biên dịch cho httpd cần được thiết kế với tham số –with-mpm=event khi biên dịch chương trình, sau đó là quá trình biên dịch và cài đặt.

      Trong cơ chế vận hành, Apache2 duy trì một control process và các process con, mỗi process con sẽ tạo ra một số lượng server thread cố định để xử lý yêu cầu và một listener thread tiếp nhận kết nối. Việc tách biệt giữa các giai đoạn nhận kết nối và xử lý chính giúp giảm chi phí khởi tạo tài nguyên cho mỗi kết nối và cải thiện khả năng xử lý đồng thời, đặc biệt khi lưu lượng cao hoặc có nhiều kết nối KeepAlive. Các yếu tố như AsyncRequestWorkerFactor và cách quản lý KeepAlive đều liên quan trực tiếp đến hiệu năng và khả năng chịu tải của hệ thống.

      Để quản trị viên có thể theo dõi tiến trình và hiệu suất, Apache còn cung cấp các chỉ số và cơ chế trực quan thông qua sử dụng mod_status và Scoreboard. Việc theo dõi trạng thái các kết nối bất động và tổng số kết nối đang hoạt động giúp nhận diện bottleneck và điều chỉnh tham số cho phù hợp với tải thực tế.

      Yêu cầu và chuẩn bị cài đặt

      Trên Ubuntu 20.04+ hoặc các bản phân phối tương thích, bạn sẽ bắt đầu từ việc cài đặt Apache2 và đảm bảo các cấu hình an toàn cho server root cùng các thư mục liên quan. Trong ngữ cảnh bảo mật và ổn định, cần chú ý quản lý quyền trên các thư mục và tập tin quan trọng, đảm bảo chỉ root mới có thể chỉnh sửa các thành phần cốt lõi và các đường dẫn quan trọng của ServerRoot. Các bước cụ thể có thể được cân nhắc như sau:

      • Đảm bảo đúng quyền và sở hữu trên thư mục ServerRoot và các thư mục con như bin, conf, logs, đảm bảo rằng chúng chỉ có thể được sửa bởi root và các người dùng được cấu hình phù hợp trên hệ thống.
      • Tập tin thực thi httpd nên được bảo vệ nghiêm ngặt để ngăn sửa đổi trái phép và ngăn lưu đè lên log hoặc các tệp hệ thống quan trọng.
      • Khái niệm về Server Side Includes SSI và các rủi ro dẫn đến tải hệ thống và các vấn đề bảo mật liên quan đến SSI cần được cân nhắc trong môi trường chia sẻ và có nhiều người dùng.

      Trong thực tế, các thiết lập cụ thể về nhận diện và xử lý kết nối cần được điều chỉnh dựa trên tải và đặc thù ứng dụng. Đối với Linux và các hệ điều hành có hỗ trợ AcceptFilter, bạn có thể cấu hình để offload một phần xử lý nhận kết nối cho kernel hoặc các cơ chế OS, nhằm giảm gánh nặng cho Apache. Phần này sẽ được trình bày kỹ hơn trong phần cấu hình.

      Cấu hình chính cho giám sát và tối ưu hóa

      Để đảm bảo khả năng giám sát và quan sát hệ thống, bạn cần chú ý đến một số directive cốt lõi và các cơ chế tối ưu hóa sẵn có trong Apache 2.4. Dưới đây là danh sách các khái niệm và directive quan trọng có liên quan trực tiếp đến giám sát và vận hành hệ thống:

      • TimeOut và KeepAlive: TimeOut xác định thời gian một client có thể mất để gởi yêu cầu. TimeOut có thể được giảm xuống mức thích hợp để giảm thiểu tình trạng DoS. KeepAlive cho phép giữ mở kết nối để tái sử dụng và giảm chi phí thiết lập lại kết nối, tuy nhiên việc giữ lại quá mức có thể ảnh hưởng đến hiệu suất. KeepAliveTimeout có thể được giả lập để tối ưu giữa khả năng phục hồi và hiệu suất.
      • Limit các yêu cầu và dữ liệu đầu vào: LimitRequestBody, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine và LimitXMLRequestBody được thiết kế để giới hạn nguồn lực tiêu thụ từ phần mô tả của client. Việc cấu hình các giới hạn này giúp hạn chế rủi ro từ dữ liệu đầu vào không hợp lệ hoặc cố tình nhồi dữ liệu lớn.
      • AcceptFilter và tối ưu hóa nhận kết nối: AcceptFilter giúp offload một phần xử lý cho kernel hay các thành phần hệ điều hành, dựa trên nền tảng OS. Ví dụ trên Linux có thể chọn AcceptFilter http data hoặc dataready, và trên Windows hoặc FreeBSD có các tùy chọn khác nhau. Việc bật AcceptFilter có thể giúp giảm tải cho Apache trong các môi trường có lưu lượng cao.
      • Async và MaxRequestWorkers: MPM event hỗ trợ xử lý bất đồng bộ và có tham số AsyncRequestWorkerFactor để điều chỉnh lượng công việc bất đồng bộ. MaxRequestWorkers quyết định số lượng kết nối đồng thời được phục vụ. Việc điều chỉnh các tham số này giúp tối ưu khả năng phục vụ và quản lý nguồn lực khi tải cao.
      • Scoreboard và quản trị tiến trình: Scoreboard cho biết trạng thái của các tiến trình và worker threads. Trong trường hợp scoreboard đầy hoặc các tiến trình đang ở trạng thái Graceful, bạn có thể nhận diện các bottleneck và tối ưu hóa lộ trình xử lý trong thời gian bảo trì hoặc khởi động lại.
      • Path và quản lý đường dẫn cài đặt: Chính sách URI và PATH_INFO thông qua AcceptPathInfo cho phép xác định cách xử lý các trailing path sau file thực thi, ảnh hưởng đến khả năng chạy script và bảo mật của đường dẫn.

      Ví dụ cấu hình cho các directive phổ biến

      TimeOut 5
      KeepAlive On
      KeepAliveTimeout 5
      MaxRequestWorkers 150
      AsyncRequestWorkerFactor 2
      AcceptFilter http data
      AcceptPathInfo On
      ExtendedStatus On
      ScoreBoardFile /var/log/apache2/status

      Trong thực tế, các giá trị trên chỉ là ví dụ và cần được điều chỉnh dựa trên tải thực tế, tính sẵn có của phần cứng và đặc thù ứng dụng. Hãy cân nhắc đến khía cạnh an toàn khi cho phép PATH_INFO hoặc bất kỳ dạng dữ liệu đầu vào nào và luôn giám sát tác động lên nguồn lực hệ thống.

      An ninh và bảo mật khi giám sát

      An toàn là thành phần không thể tách rời của quá trình giám sát và vận hành. Các nguyên tắc bảo mật cơ bản liên quan đến quyền truy cập và cách Apache tương tác với hệ điều hành có thể ảnh hưởng lớn đến độ tin cậy của hệ thống. Một số biện pháp có thể tham khảo dựa trên tài liệu an toàn cho Apache 2.4:

      • Giữ ServerRoot và các thư mục quan trọng ở quyền và sở hữu đúng. Trong hoạt động bình thường, Apache được khởi động bởi người dùng root và sau đó chuyển sang người dùng được chỉ định bởi directive User để phục vụ các lượt truy cập. Đảm bảo rằng các thư mục và các tập tin trong ServerRoot chỉ có quyền write bởi root và các cấp cha con của chúng cũng vậy. Việc cho phép người dùng phi root chỉnh sửa các tập tin liên quan đến chạy chương trình có thể mở nguy cơ bị tấn công.
      • Nghỉ ngơi hoặc giảm thiểu rủi ro từ SSI. SSI có thể phát sinh tải trên máy chủ và các rủi ro bảo mật liên quan đến thực thi CGI hoặc các script dưới quyền của người dùng. Xem xét nhu cầu và ảnh hưởng trước khi bật SSI trong môi trường chia sẻ.
      • Config và giới hạn đầu vào từ phía client để giảm nguy cơ DoS và các hình thức tấn công qua dữ liệu đầu vào. Kết hợp với tường lửa và các cấu hình kernel phù hợp để hạn chế số luồng đồng thời từ một địa chỉ IP hay mạng nhất định.
      • Áp dụng AcceptFilter và các tối ưu OS để giảm tải cho Apache và tăng khả năng chịu tải trong các môi trường có lưu lượng cao.

      Đối với hệ thống Linux, những khuyến nghị về AcceptFilter và offloading xử lý cho kernel có thể mở rộng khả năng đáp ứng và giảm tải cho máy chủ. Việc quản trị đúng các đường dẫn tài nguyên và đảm bảo quyền truy cập an toàn đóng vai trò then chốt trong việc duy trì tính toàn vẹn của hệ thống trong quá trình giám sát và vận hành.

      Hiệu năng và tối ưu hóa

      Hiệu năng của Apache2 phụ thuộc vào cách cấu hình MPM và cách quản trị tài nguyên. Các giải pháp tối ưu phổ biến bao gồm:

      • Chọn MPM event hoặc worker với cách phân bổ thread và process hợp lý, nhằm tối ưu hóa CPU và RAM. Sự chuyển đổi sang mô hình event giúp giảm chi phí cho mỗi kết nối và tăng khả năng phục vụ đồng thời.
      • Giảm thời gian chờ đợi cho từng yêu cầu bằng TimeOut và KeepAlive phù hợp với tải. Việc giảm KeepAlive và KeepAliveTimeout đối với các site dễ bị DoS có thể giúp giảm gánh nặng cho hệ thống, nhưng đi kèm với đánh đổi hiệu suất cho các site có nhiều CGI hoặc long running scripts.
      • Kiểm soát phạm vi và độ khắt khe của giới hạn đầu vào với các directive LimitRequestBody và các giới hạn khác để ngăn tình trạng tốn tài nguyên do dữ liệu từ client gửi lên.
      • Hướng tới OS level offloading cho việc xử lý nhận kết nối bằng AcceptFilter, nhằm tối ưu hóa luồng xử lý và giảm thiểu chi phí từ kernel.

      Đồng thời hãy theo dõi sự thay đổi và cập nhật phần mềm. Apache có lịch sử bảo mật tốt, nhưng sự cố có thể phát sinh từ mã thêm hoặc hệ điều hành đi kèm. Vì vậy, việc cập nhật và tham gia danh sách thông báo từ Apache HTTP Server là điều được khuyến nghị để duy trì an ninh và tính ổn định của hệ thống.

      Giám sát và observability

      Khả năng quan sát hệ thống là yếu tố quyết định để duy trì vận hành liên tục. Các yếu tố cần theo dõi gồm:

      • Trạng thái và hiệu suất qua trang status của mod_status. Trang trạng thái cho phép xem thông tin về số kết nối đang chờ xử lý, số worker và các thông tin liên quan đến Async connections. Việc này cho phép nhận diện sớm các bottleneck và điều chỉnh tham số cho phù hợp.
      • Scoreboard và trạng thái của các tiến trình. Scoreboard cho biết trạng thái của các tiến trình và các worker threads, giúp bạn nhận diện các tình huống Graceful hoặc các vòng lặp xử lý đang chiếm dụng tài nguyên.
      • Quan sát log và nhật ký hệ thống. Việc theo dõi log là căn bản để nhận diện các sự kiện bất thường, lỗi và các xung đột khi chạy các module hoặc CGI script. Đảm bảo quyền ghi log được quản lý đúng cách để tránh bị sửa đổi trái phép.
      • Kiểm tra và đánh giá biểu đồ và dữ liệu từ các directive liên quan đến giới hạn và thời gian phản hồi nhằm đảm bảo rằng các phạm vi cấu hình đang phù hợp với tải thực tế.

      Để thực hiện giám sát hiệu quả, bạn có thể bậtExtendedStatus để có thêm dữ liệu chi tiết tham gia vào mod_status và giữ nguyên chế độ theo dõi trong quá trình vận hành. Việc theo dõi quy mô và hiệu suất cần được thực hiện liên tục và kết hợp với các cảnh báo khi có sự cố. Trong đó hãy chú ý tới thời gian phản hồi và số lượng kết nối đồng thời để điều chỉnh tham số cho phù hợp với tải.

      Kiểm tra và xác nhận vận hành

      Kiểm tra cấu hình và xác nhận vận hành là bước quan trọng trước khi đẩy hệ thống vào sản xuất. Những bước kiểm tra cơ bản gồm:

      • Kiểm tra syntax và cú pháp cấu hình bằng cách kiểm tra đúng các directive đã bật và đảm bảo không có lỗi biên dịch hoặc cú pháp. Theo dõi các log để nhận diện cảnh báo hoặc lỗi liên quan đến cấu hình.
      • Kiểm tra khả năng xử lý kết nối đồng thời và qua mod_status để xem số lượng kết nối đang hoạt động và tình trạng các worker. Theo dõi bằng cách xem thông tin liên quan đến Async connections và MaxRequestWorkers.
      • Đảm bảo tính bảo mật của đường dẫn ServerRoot và các thư mục liên quan bằng cách kiểm tra quyền viết và quyền truy cập của non-root users. Theo dõi các log để đảm bảo không có thay đổi trái phép nào diễn ra.
      • Kiểm tra khả năng offloading nhận kết nối và tiến trình xử lý của kernel khi được kích hoạt AcceptFilter trên hệ thống Linux. Đảm bảo AcceptFilter hoạt động đúng theo các giá trị bạn đã cấu hình và theo dõi các log hệ thống khi cần thiết.

      Trong quá trình vận hành, hãy bảo đảm hệ thống được theo dõi một cách liên tục và có kế hoạch sao lưu cấu hình cũng như sao lưu dữ liệu logs để có thể phục hồi nhanh chóng khi gặp sự cố. Việc tham gia danh sách thông báo của Apache và cập nhật kịp thời là yếu tố then chốt để duy trì an toàn và ổn định cho hệ thống.

      Checklist vận hành ngắn gọn

      • Xác định mô hình MPM phù hợp với tải và yêu cầu ứng dụng
      • Cấu hình TimeOut, KeepAlive và các giới hạn đầu vào cho một phiên bản an toàn
      • Bật và cấu hình AcceptFilter cho hệ điều hành đang sử dụng, đặc biệt trên Linux
      • Bật ExtendedStatus và theo dõi mod_status để giám sát trạng thái và hiệu suất
      • Theo dõi log và đảm bảo quyền ghi, không cho phép sửa đổi trái phép
      • Đảm bảo quyền truy cập đúng trên ServerRoot và các thư mục quan trọng
      • Với các thay đổi cấu hình, kiểm tra syntax và xác nhận vận hành trước khi đưa vào sản xuất
      • Chuẩn bị kế hoạch sao lưu cấu hình và dữ liệu log

      Kết luận ngắn

      Việc giám sát và quan sát hệ thống Apache2 trên Ubuntu 20.04+ đòi hỏi sự cân bằng giữa hiệu năng và an toàn. Bằng cách áp dụng các nguyên tắc quản trị nguồn lực, tối ưu hóa thông qua MPM event, và thiết lập đúng các directive như TimeOut, KeepAlive, và các giới hạn đầu vào, bạn có thể duy trì hệ thống ổn định ngay cả khi đối mặt với lưu lượng cao. Việc tận dụng công cụ giám sát như mod_status và Scoreboard hợp cùng với các biện pháp bảo mật cơ bản sẽ giúp quản trị viên nhanh chóng nhận diện và xử lý các sự cố, từ đó đảm bảo dịch vụ web luôn sẵn sàng cho người dùng cuối.

      Hardening php.ini cho Shared Hosting: Bảo mật và Tối ưu Apache & PHP-FPM trên Ubuntu 20.04+

      Hardening php.ini cho Shared Hosting: Bảo mật và Tối ưu Apache & PHP-FPM trên Ubuntu 20.04+

      Hardening php.ini cho Shared Hosting: Bảo mật và Tối ưu Apache & PHP-FPM trên Ubuntu 20.04+

      Document này trình bày cách harden php.ini cho môi trường Shared Hosting chạy trên stack Apache và PHP-FPM trên Ubuntu 20.04+. Nội dung tập trung vào quản lý cấu hình PHP và OPcache thông qua php.ini để tăng cứng an ninh và tối ưu hiệu suất, phù hợp với hệ thống chia sẻ tài nguyên và yêu cầu bảo mật nghiêm ngặt.

      Giới thiệu

      Trong mô hình Shared Hosting, PHP được vận hành giữa Apache hoặc Nginx và PHP-FPM. Việc cấu hình và làm cứng php.ini đóng vai trò then chốt để giảm thiểu rủi ro từ dữ liệu người dùng và tối ưu hiệu suất phục vụ cùng lúc nhiều người dùng. Các yếu tố liên quan tập trung vào cách PHP xử lý dữ liệu người dùng, bảo mật báo cáo lỗi và đặc biệt tối ưu hóa thông qua OPcache. Tài liệu tham khảo choOPcache và các tham số PHP được trình bày trong phạm vi Runtime Configuration của PHP.

      Kiến trúc và khái niệm cốt lõi

      php.ini là nơi định hình hành vi của PHP tại thời điểm chạy. Các tùy chọn trong php.ini cho phép điều chỉnh cách PHP xử lý dữ liệu người dùng, cách quản lý tài nguyên, và cách tối ưu hiệu suất thông qua OPcache. Trong phần Open Cache (OPcache), các tham số như opcache.enable, opcache.memory_consumption, opcache.validate_timestamps và các tham số liên quan khác đóng vai trò chính trong việc quyết định cách PHP biên dịch và lưu trữ mã nguồn dưới dạng opcode để tăng tốc thực thi.

      OPcache là một phần cấu hình runtime của PHP và có nhiều tùy chọn để tinh chỉnh. Những tham số này được mô tả chi tiết trong tài liệu Runtime Configuration, cho thấy cách opcache.enable, opcache.memory_consumption, opcache.validate_timestamps và các tham số khác ảnh hưởng đến hành vi của hệ thống PHP tại runtime. Việc bật OPcache và thiết lập đúng các tham số giúp giảm tải CPU và tăng tốc đáp ứng cho các request đồng thời. Nguồn tham khảo cho các tham số OPcache và cách chúng được mô tả trong php.ini được trình bày trong phần phụ lục của tài liệu này.

      Yêu cầu và chuẩn bị

      Đối với Ubuntu 20.04+, hệ thống áp dụng stack Apache và PHP-FPM cho môi trường Shared Hosting. Trong khối tài liệu này khuyến nghị bật OPcache và tùy biến các tham số liên quan ở mức phù hợp với tải trọng và giới hạn tài nguyên của máy chủ, sao cho vừa đảm bảo an toàn vừa tối ưu hiệu suất phục vụ nhiều tài khoản hosting cùng lúc. Nhắc lại rằng OPcache là một phần của runtime configuration và có các tham số có thể được bật/tắt và điều chỉnh thông qua php.ini, với các tham số chủ đạo được liệt kê và mô tả trong phần cấu hình OPcache của tài liệu này.

      Cấu hình chính cho php.ini

      Một phần cấu hình hardening cho php.ini tập trung vào OPcache và các tham số liên quan đến hành vi runtime. Dưới đây là danh sách các tham số OPcache quan trọng và giá trị tham khảo dựa trên tài liệu Runtime Configuration. Hãy áp dụng chúng vào php.ini của PHP-FPM (hoặc thông qua các pool cấu hình nếu phù hợp với hệ thống của bạn).

      opcache.enable=1
      opcache.enable_cli=0
      opcache.memory_consumption=128
      opcache.interned_strings_buffer=8
      opcache.max_accelerated_files=10000
      opcache.max_wasted_percentage=5
      opcache.use_cwd=1
      opcache.validate_timestamps=1
      opcache.revalidate_freq=2
      opcache.save_comments=1
      opcache.fast_shutdown=0
      opcache.file_cache_consistency_checks=1
      opcache.lockfile_path /tmp
      opcache.opt_debug_level=0
      opcache.jit disable
      opcache.jit_buffer_size 64M
      

      Ghi chú về các tham số:
      – opcache.enable=1: Bật OPcache để lưu trữ và phục hồi opcode, giúp tăng tốc xử lý các yêu cầu PHP.
      – opcache.enable_cli=0: Tắt OPcache cho CLI, tránh rò rỉ bộ nhớ và tăng tính ổn định cho các tác vụ dòng lệnh nếu có.
      – opcache.memory_consumption=128: Dung lượng bộ nhớ dùng cho opcode cache, sử dụng 128 MB làm mặc định cho môi trường có tải trung bình đến cao.
      – opcache.interned_strings_buffer=8: Dung lượng bộ nhớ cho các chuỗi nội dung được interned, giúp tối ưu tham chiếu chuỗi trong quá trình biên dịch.
      – opcache.max_accelerated_files=10000: Giới hạn số lượng file PHP được cache để đáp ứng số lượng file code được tải đồng thời.
      – opcache.max_wasted_percentage=5: Tỉ lệ phần trăm tối đa của bộ nhớ cache có thể tạm thời bị loại bỏ do thiếu mã nguồn hợp lệ.
      – opcache.use_cwd=1: Tối ưu hóa caching theo thư mục làm việc hiện tại để tránh cache chung cho toàn bộ hệ thống.
      – opcache.validate_timestamps=1: Theo dõi sự thay đổi timestamp của files để làm mới cache khi có thay đổi.
      – opcache.revalidate_freq=2: Số lần lược bỏ cache hợp lệ trước khi làm mới khi có thay đổi file với tần suất thấp.
      – opcache.save_comments=1: Lưu lại các nhận xét trong opcode để hỗ trợ debugging và tooling.
      – opcache.fast_shutdown=0: Tắt chế độ shutdown nhanh để đảm bảo an toàn khi xử lý nhiều request đồng thời.
      – opcache.file_cache_consistency_checks=1: Bật kiểm tra tính nhất quán cho cache file ở cấp độ hệ thống.
      – opcache.lockfile_path /tmp: Định vị đường dẫn lockfile cho OPcache để hỗ trợ đồng bộ hóa truy cập cache trong môi trường đa tiến trình.
      – opcache.opt_debug_level=0: Thiết lập mức debug tối thiểu cho OPcache để cân bằng giữa hiệu suất và khả năng chẩn đoán.
      – opcache.jit=disable và opcache.jit_buffer_size=64M: Vô hiệu hóa JIT hoặc tinh chỉnh khi cần, phù hợp cho môi trường chia sẻ với PHP-FPM.

      Những giá trị trên là tham khảo từ tài liệu Runtime Configuration và có thể điều chỉnh tùy theo phiên bản PHP đang chạy và tải trọng thực tế. Trong quá trình triển khai, nên bắt đầu với các giá trị an toàn và theo dõi hiệu suất, sau đó tinh chỉnh dần dần.

      Bảo mật và thực hành an toàn liên quan đến php.ini

      Các khía cạnh an ninh liên quan đến PHP có thể được ảnh hưởng bởi php.ini ở nhiều mức độ. Các nội dung sau đây dựa trên phân tích của tài liệu liên quan đến bảo mật và cấu hình PHP:

      • Quản lý dữ liệu người dùng và xử lý dữ liệu người nộp: php.ini có vai trò quyết định cách PHP xử lý dữ liệu người dùng, vì vậy nên giới hạn các cơ chế nhận dữ liệu và đảm bảo xác thực người dùng ở mức ứng dụng. Đảm bảo các tham số như báo cáo lỗi được kiểm soát để không làm lộ thông tin nhạy cảm ra bên ngoài.
      • Bảo mật báo cáo lỗi: Thiết lập sao cho lỗi hệ thống không bị hiển thị công khai, và log được ghi lại cho phân tích sự cố sau này. Yếu tố này nằm ở mục giới thiệu an ninh tổng thể và ảnh hưởng tới chuyển đổi cấu hình php.ini theo hướng an toàn.
      • Quản lý dữ liệu nhúng và tải lên tệp: PHP có cơ chế xử lý file uploads và dữ liệu người dùng; php.ini được dùng để giới hạn kích thước tải lên và các tham số liên quan tới xử lý dữ liệu người dùng.
      • Ẩn thông tin và giảm fingerprint hệ thống: trong khía cạnh an ninh, ẩn thông tin về môi trường thực thi cũng là mục tiêu có thể được cân nhắc thông qua php.ini và cấu hình máy chủ.

      Những nguyên tắc này được mô tả trong tài liệu Security Introduction đi kèm với tài liệu Runtime Configuration và được áp dụng đồng bộ với các tham số OPcache ở trên để tối ưu cả bảo mật lẫn hiệu suất trong môi trường shared hosting.

      Hiệu suất và tối ưu hóa

      OPcache đóng vai trò then chốt trong tối ưu hiệu suất của PHP khi chạy trên PHP-FPM và Apache. Việc bật OPcache và tinh chỉnh các tham số liên quan có thể giảm tải CPU và cải thiện thời gian đáp ứng cho nhiều người dùng cùng lúc. Trong tài liệu Runtime Configuration, OPcache được trình bày với các tham số có thể điều chỉnh và ảnh hưởng trực tiếp đến cách PHP biên dịch và lưu trữ opcode. Việc tối ưu dựng lên từ các tham số như bộ nhớ cache, số file được cache, thời gian làm mới cache và cách thức xử lý các file có thể tạm thời ảnh hưởng tới hiệu suất theo từng trường hợp cụ thể.

      Đối với môi trường Ubuntu 20.04+ chạy Apache và PHP-FPM, việc tối ưu hóa OPcache nên cân nhắc các yếu tố sau:

      • Dung lượng bộ nhớ cho OPcache phụ thuộc tải trọng và giới hạn tài nguyên. Với số lượng file code và số request đồng thời, việc tăng memory_consumption có thể cải thiện hiệu suất, lưu ý không vượt quá giới hạn RAM có sẵn để tránh swapping.
      • Kiểm soát thời gian làm mới cache và theo dõi timestamp để cân bằng giữa tính đồng bộ và hiệu suất. Tham số validate_timestamps và revalidate_freq cho phép bạn xác định tần suất làm mới khi có sự thay đổi mã nguồn.
      • Khung chữ ký và cấu hình JIT (Just-In-Time compilation) có thể được tắt hoặc bật tùy phiên bản và workload. Trong môi trường chia sẻ, khởi đầu với chế độ disable JIT là an toàn, và kích hoạt khi có nhu cầu tối ưu hóa thêm.

      Việc áp dụng các tham số OPcache như đã nêu sẽ giúp tối ưu hiệu suất cho các ứng dụng chạy trên PHP-FPM và phục vụ đồng thời nhiều tài khoản hosting mà không làm tăng rủi ro bảo mật. Đây là một trong các bước then chốt trong quá trình hardening php.ini cho môi trường shared hosting.

      Giám sát và quan sát hiệu suất

      Việc theo dõi trạng thái hoạt động của OPcache và PHP là cần thiết để xác định hiệu suất và mức độ ổn định của hệ thống. Trong thực tiễn, hãy theo dõi các chỉ số liên quan đến OPcache và log lớp runtime để có thể điều chỉnh cấu hình khi tải trọng thay đổi. Các tham số OPcache được mô tả ở mục trên là cơ sở để bạn thiết lập và so sánh khi phân tích hiệu suất hệ thống, đồng thời kết hợp với các biện pháp bảo mật đã đề cập ở phần trước.

      Kiểm tra và xác thực cấu hình

      Để xác nhận rằng cấu hình php.ini đã được áp dụng đúng, bạn có thể thực hiện các bước sau đây, dựa trên các tham số OPcache đã thiết lập ở trên:

      • Xác nhận OPcache đang được bật và các tham số chính đang có hiệu lực bằng cách kiểm tra cấu hình runtime của PHP thông qua các công cụ quản trị hoặc bằng cách xem các tệp log phù hợp của PHP-FPM và Apache.
      • Kiểm tra tính hợp lệ của các file code và thời gian làm mới cache, đảm bảo rằng hệ thống sẽ làm mới đúng theo thiết lập revalidate_freq và validate_timestamps để đảm bảo rằng các bản vá và cập nhật mã nguồn được phản ánh kịp thời.
      • Đảm bảo rằng các tham số bảo mật liên quan đến báo cáo lỗi và ghi log được áp dụng đúng cách để ngăn rò rỉ thông tin nhạy cảm ra bên ngoài.

      Những thực hành trên đều dựa trên nguyên tắc được mô tả trong tài liệu Runtime Configuration và Security Introduction và áp dụng một cách nhất quán với hệ thống Apache và PHP-FPM trên Ubuntu 20.04+.

      Checklist vận hành cuối cùng

        <li Xác định phiên bản PHP đang chạy và đường dẫn tới php.ini cho PHP-FPM và Apache để áp dụng cấu hình đúng cho mỗi pool hoặc vhost nếu cần. <li Bật OPcache và áp dụng các tham số đã liệt kê ở mục Cấu hình chính. <li Giới hạn và định lượng tải: thiết lập memory_consumption phù hợp với RAM sẵn có và tải trọng tối đa dự kiến. <li Thiết lập revalidate_freq và validate_timestamps để cân bằng giữa tính đúng đắn của cache và hiệu suất. <li Đảm bảo an toàn báo cáo lỗi và không hiển thị thông tin nhạy cảm cho người dùng. <li Theo dõi hiệu suất sau khi triển khai và điều chỉnh tham số OPcache theo nhu cầu.

      Kết luận

      Hardening php.ini cho môi trường Shared Hosting là một phần quan trọng của quy trình quản trị hệ thống. Việc bật và tối ưu OPcache thông qua các tham số trong php.ini không chỉ giúp cải thiện hiệu suất phục vụ nhiều tài khoản mà còn góp phần tăng cường bảo mật bằng cách quản lý cách PHP xử lý và cache mã nguồn. Với Ubuntu 20.04+ và stack Apache cùng PHP-FPM, bạn có thể áp dụng các tham số OPcache được mô tả ở đây và điều chỉnh dựa trên tải trọng thực tế của máy chủ. Hãy duy trì một chu kỳ kiểm tra cấu hình và hiệu suất để đảm bảo hệ thống luôn ở trạng thái an toàn và tối ưu nhất cho người dùng cuối.

      Cài đặt Apache2.4 với PHP 7.4

      Giới thiệu

      Apache HTTP Server, thường được gọi là Apache, là một trong những máy chủ web phổ biến nhất trên thế giới. Nó là phần mềm mã nguồn mở, miễn phí và có khả năng phục vụ nội dung web với hiệu suất cao, được sử dụng rộng rãi bởi các doanh nghiệp, tổ chức và cá nhân để lưu trữ các trang web và ứng dụng trực tuyến.

      PHP, viết tắt của “Hypertext Preprocessor,” là một ngôn ngữ lập trình kịch bản phía server mạnh mẽ và linh hoạt, được sử dụng chủ yếu cho phát triển web. Phiên bản PHP 7.4 mang lại nhiều cải tiến về hiệu năng và một loạt các tính năng mới, giúp tối ưu hóa các ứng dụng web.

      Trong bài viết này, chúng ta sẽ hướng dẫn cách cài đặt Apache phiên bản 2.4 cùng với PHP phiên bản 7.4 trên hệ điều hành Ubuntu. Đây là một cấu hình phổ biến, được sử dụng trong nhiều dự án web từ nhỏ đến lớn, cho phép bạn triển khai các ứng dụng PHP một cách nhanh chóng và hiệu quả.

      Hướng dẫn này sẽ bao gồm các bước cài đặt chi tiết, từ việc cập nhật hệ thống, cài đặt Apache và PHP, cho đến việc kiểm tra để đảm bảo mọi thứ hoạt động ổn định. Bài viết này dành cho những ai đang bắt đầu tìm hiểu về quản trị server web hoặc muốn cài đặt một môi trường phát triển PHP trên máy chủ của mình.

      Cài đặt Apache2.4

      Cập nhật hệ thống :

      apt update
      apt upgrade -y

      Cài đặt Apache2 :

      apt install apache2 -y
      systemctl enable apache2
      systemctl start apache2 
      systemctl status apache2

      Cài đặt các gói cơ bản thường dùng của PHP7.4 :

      apt update
      sudo apt install software-properties-common
      sudo add-apt-repository ppa:ondrej/php
      apt-get install php7.4-fpm
      #Kiểm tra phiên bản của php
      php -v

      Cài đặt các extension PHP & Tích hợp PHP 7.4 với Apache

      sudo apt-get install libapache2-mod-php7.4 -y 
      && sudo apt-get install -y php7.4-mcrypt 
      && sudo apt-get install -y php7.4-mbstring 
      && sudo apt-get install -y php7.4-mysqlnd 
      && sudo apt-get install -y php7.4-soap 
      && sudo apt-get install -y php7.4-curl 
      && sudo apt-get install -y php7.4-gd 
      && sudo apt-get install -y php7.4-zip 
      && sudo apt-get install -y php7.4-imagick 
      && sudo apt-get install -y php7.4-dom 
      && sudo apt-get install -y php7.4-tidy 
      && sudo apt-get install -y php7.4-bcmath 

      Khởi động lại apache và kiểm tra :

      apachectl -t 
      apachectl -k restart

      Cài đặt Virtual Host Apache2 để kiểm tra PHP7.4

      cd /etc/apache/sites-available/
      nano default.conf
      <VirtualHost *:80>
      
      # Admin email, Server Name (domain name), and any aliases
             ServerName domain.com
             ServerAlias www.domain.com
      
      # Index file and Document Root (where the public files are located)
             DirectoryIndex index.html index.php
             DocumentRoot /var/www/html/test/
      
      <Directory /var/www/html/test/>
      
             Options Indexes FollowSymLinks
             AllowOverride All
             Require all granted
      
      </Directory>
      
      #set version php apply cho website
      <FilesMatch .php$>
             SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://thanhnh.id.vn/"
      </FilesMatch>
      
      # Log file locations
             LogLevel warn
             ErrorLog /var/log/apache/error.log
             CustomLog /var/log/apache/access.log combined
      
      </VirtualHost>

      Tạo 1 file index.php trong /var/www/html/test/

      nano /var/www/html/test/index.php

      Thêm trong file index.php như sau

      <?php
         
      phpinfo();
         
      ?> 

      Kiểm tra apache và khởi động lại apache2

      apachectl -t
      apachectl -k restart

      Mở trình duyệt và kiểm tra :

      Kết luận:

      • Tóm tắt các bước đã thực hiện và đưa ra một số hướng dẫn cơ bản về cách tiếp tục với việc cấu hình thêm hoặc triển khai ứng dụng web trên môi trường Apache và PHP vừa thiết lập.

      Lợi ích bài viết:

      • Giúp người đọc dễ dàng thiết lập môi trường phát triển web trên máy chủ Linux.
      • Đảm bảo môi trường ổn định và tương thích với các ứng dụng yêu cầu PHP 7.4.

      Bài viết này rất hữu ích cho những người mới bắt đầu cũng như những người đã có kinh nghiệm muốn cài đặt một môi trường web server ổn định và hiện đại.

      Tổng hợp cài đặt PHP Ubuntu các phiên bản

      Giới thiệu

      Cài đặt PHP trên Ubuntu là một bước thiết yếu để xây dựng và triển khai các ứng dụng web. Với mỗi phiên bản Ubuntu khác nhau, quy trình cài đặt có thể có những điểm khác biệt nhỏ. Bài viết này sẽ hướng dẫn chi tiết từng bước để bạn có thể dễ dàng thiết lập PHP trên các phiên bản Ubuntu phổ biến như 18.04, 20.04, và 22.04. Dù bạn là người mới bắt đầu hay đã có kinh nghiệm, hướng dẫn này sẽ giúp bạn cài đặt PHP một cách nhanh chóng và hiệu quả.

      Cài đặt PHP-FPM các phiên bản

      PHP-FPM5.6 :

      apt update
      sudo apt install software-properties-common
      sudo add-apt-repository ppa:ondrej/php
      
      sudo apt install php5.6 php5.6-fpm -y
      
      sudo apt-get install -y php5.6-mcrypt 
      && sudo apt-get install -y php5.6-mbstring 
      && sudo apt-get install -y php5.6-mysqlnd 
      && sudo apt-get install -y php5.6-soap 
      && sudo apt-get install -y php5.6-curl 
      && sudo apt-get install -y php5.6-gd 
      && sudo apt-get install -y php5.6-zip 
      && sudo apt-get install -y php5.6-imagick 
      && sudo apt-get install -y php5.6-dom 
      && sudo apt-get install -y php5.6-tidy 
      && sudo apt-get install -y php5.6-bcmath 
      
      #enable fcgi mode
      sudo a2enmod actions alias proxy_fcgi fcgid
      sudo service apache2 restart
      
      systemctl enable php5.6-fpm && systemctl start php5.6-fpm
      
      #check status
      sudo systemctl status php5.6-fpm

      PHP-FPM7.2 :

      apt update
      sudo apt install software-properties-common
      sudo add-apt-repository ppa:ondrej/php
      
      sudo apt install php7.2 php7.2-fpm -y
      
      sudo apt-get install libapache2-mod-php7.2 -y 
      && sudo apt-get install -y php7.2-mcrypt 
      && sudo apt-get install -y php7.2-mbstring 
      && sudo apt-get install -y php7.2-mysqlnd 
      && sudo apt-get install -y php7.2-soap 
      && sudo apt-get install -y php7.2-curl 
      && sudo apt-get install -y php7.2-gd 
      && sudo apt-get install -y php7.2-zip 
      && sudo apt-get install -y php7.2-imagick 
      && sudo apt-get install -y php7.2-dom 
      && sudo apt-get install -y php7.2-tidy 
      && sudo apt-get install -y php7.2-bcmath
      
      #enable fcgi mode
      	sudo a2enmod actions alias proxy_fcgi fcgid
              systemctl enable php7.2-fpm && systemctl start php7.2-fpm
      	sudo service apache2 restart
      
      #Check Status :
      	sudo systemctl status php7.2-fpm

      PHP-FPM7.4 :

      apt update
      sudo apt install software-properties-common
      sudo add-apt-repository ppa:ondrej/php
      
      sudo apt install php7.4 php7.4-fpm -y
      
      sudo apt-get install libapache2-mod-php7.4 -y 
      && sudo apt-get install php7.4-fpm -y 
      && sudo apt-get install -y php7.4-mcrypt 
      && sudo apt-get install -y php7.4-mbstring 
      && sudo apt-get install -y php7.4-mysqlnd 
      && sudo apt-get install -y php7.4-soap 
      && sudo apt-get install -y php7.4-curl 
      && sudo apt-get install -y php7.4-gd 
      && sudo apt-get install -y php7.4-zip 
      && sudo apt-get install -y php7.4-imagick 
      && sudo apt-get install -y php7.4-dom 
      && sudo apt-get install -y php7.4-tidy 
      && sudo apt-get install -y php7.4-bcmath 
      
      #enable fcgi mode
      	sudo a2enmod actions alias proxy_fcgi fcgid
              systemctl enable php7.4-fpm && systemctl start php7.4-fpm
      	sudo service apache2 restart
      
      #Check Status :
      	sudo systemctl status php7.4-fpm
      

      PHP-FPM8.0:

      apt update
      sudo apt install software-properties-common
      sudo add-apt-repository ppa:ondrej/php
      
      sudo apt-get install -y php8.0 php8.0-fpm php8.0-mcrypt 
      && sudo apt-get install libapache2-mod-php8.0 -y 
      && sudo apt-get install -y php8.0-mbstring 
      && sudo apt-get install -y php8.0-mysqlnd 
      && sudo apt-get install -y php8.0-soap 
      && sudo apt-get install -y php8.0-curl 
      && sudo apt-get install -y php8.0-gd 
      && sudo apt-get install -y php8.0-zip 
      && sudo apt-get install -y php8.0-imagick 
      && sudo apt-get install -y php8.0-dom 
      && sudo apt-get install -y php8.0-tidy 
      && sudo apt-get install -y php8.0-bcmath php8.0-common php8.0-memcached php8.0-redis 
      && apt install -y php8.0-gmp
      
      #enable fcgi mode
      	sudo a2enmod actions alias proxy_fcgi fcgid
              systemctl enable php8.0-fpm && systemctl start php8.0-fpm
      	sudo service apache2 restart
      
      #Check Status :
      	sudo systemctl status php8.0-fpm
      

      PHP-FPM8.3

      apt update
      sudo apt install software-properties-common
      sudo add-apt-repository ppa:ondrej/php
      
      sudo apt-get install -y php8.3 php8.3-fpm php8.3-mcrypt 
      && sudo apt-get install libapache2-mod-php8.3 -y 
      && sudo apt-get install -y php8.3-mbstring 
      && sudo apt-get install -y php8.3-mysqlnd 
      && sudo apt-get install -y php8.3-soap 
      && sudo apt-get install -y php8.3-curl 
      && sudo apt-get install -y php8.3-gd 
      && sudo apt-get install -y php8.3-zip 
      && sudo apt-get install -y php8.3-imagick 
      && sudo apt-get install -y php8.3-dom 
      && sudo apt-get install -y php8.3-tidy 
      && sudo apt-get install -y php8.3-bcmath php8.3-common php8.3-memcached php8.3-redis 
      && apt install -y php8.3-gmp
      
      #enable fcgi mode
      	sudo a2enmod actions alias proxy_fcgi fcgid
              systemctl enable php8.3-fpm && systemctl start php8.3-fpm
      	sudo service apache2 restart
      
      #Check Status :
      	sudo systemctl status php8.3-fpm
      

      Hoặc có thể sử dụng Ctrl+C + Ctrl+V cho các bạn lười :

      apt install apache2 -y 
      && apt update 
      && sudo apt install software-properties-common -y 
      && sudo add-apt-repository ppa:ondrej/php 
      && sudo apt install php5.6 php5.6-fpm php7.2 php7.2-fpm php7.4 php7.4-fpm php8.0 php8.0-fpm  -y 
      && sudo a2enmod actions alias proxy_fcgi fcgid 
      && systemctl enable apache2 php5.6-fpm php7.4-fpm php7.2-fpm php8.0-fpm 
      && sudo apt-get install -y php7.2-mcrypt php7.2-mbstring php7.2-mysqlnd php7.2-soap php7.2-curl php7.2-gd php7.2-zip php7.2-imagick php7.2-dom php7.2-tidy libapache2-mod-php7.2 
      && sudo apt-get install -y php7.4-mcrypt php7.4-mbstring php7.4-mysqlnd php7.4-soap php7.4-curl php7.4-gd php7.4-zip php7.4-imagick php7.4-dom php7.4-tidy libapache2-mod-php7.4 
      && sudo apt-get install -y php5.6-mcrypt php5.6-mbstring php5.6-mysqlnd php5.6-soap php5.6-curl php5.6-gd php5.6-zip php5.6-imagick php5.6-dom php5.6-tidy libapache2-mod-php5.6 
      && sudo apt-get install -y php8.0-mcrypt php8.0-mbstring php8.0-mysqlnd php8.0-soap php8.0-curl php8.0-gd php8.0-zip php8.0-imagick php8.0-dom php8.0-tidy libapache2-mod-php8.0 
      && systemctl start apache2 php5.6-fpm php7.2-fpm php7.4-fpm php8.0-fpm 
      && systemctl status apache2 php5.6-fpm php7.2-fpm php7.4-fpm php8.0-fpm 
      && a2enmod rewrite 
      && a2enmod headers 
      && for file in hosts; do cat "$file" >> /etc/hosts; done 
      && for file in ports.conf; do cat "$file" >> /etc/apache2/ports.conf; done 
      && cp ./conf/* /etc/apache2/sites-available/ 
      && cd /etc/apache2/sites-available/ 
      && a2ensite * 
      && apachectl configtest
      

      Qua hướng dẫn này, bạn đã nắm được cách cài đặt PHP trên các phiên bản Ubuntu, từ cơ bản đến nâng cao. Việc thiết lập môi trường PHP chính xác là nền tảng quan trọng để phát triển và vận hành các ứng dụng web hiệu quả. Dù bạn sử dụng phiên bản Ubuntu nào, chỉ cần làm theo các bước hướng dẫn, bạn sẽ nhanh chóng có một môi trường PHP sẵn sàng cho mọi dự án của mình.

      Authentication and Authorization Apache

      Giới thiệu

      Xác thực và phân quyền trong Apache đề cập đến quá trình xác minh danh tính của người dùng (Xác thực) và xác định quyền truy cập của họ đối với các tài nguyên (Phân quyền) trong môi trường máy chủ Apache. Apache cung cấp nhiều mô-đun khác nhau như mod_auth_basic, mod_auth_digest, và mod_authnz_ldap, cho phép quản lý việc truy cập dựa trên các phương thức xác thực cơ bản hoặc mã hóa hơn và tích hợp với các dịch vụ phân quyền bên ngoài như LDAP. Các mô-đun này giúp bảo vệ các phần khác nhau của website hoặc ứng dụng bằng cách yêu cầu người dùng đăng nhập và phân quyền truy cập dựa trên các thông tin xác thực được cung cấp.

      1. Tạo file password

      	sudo htpasswd -c /etc/apache2/.htpasswd <user_name> 
      		#<user_name> : username

      Server sẽ hỏi xác thực các thông tin và đặt file đó tại /etc/apache2/

      Nếu chúng ta nhìn content trong file, ta sẽ thấy tài khoản và mật khẩu đã được mã hoá

      	cat /etc/apache2/.htpasswd
      		Output
      		thanhnh:$apr1$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.
      		another_user:$apr1$p1E9MeAf$kiAhneUwr.MhAE2kKGYHK.

      2. Cấu hình Apache Password Authentication :

      <VirtualHost *:80>
          ServerAdmin webmaster@thanhnh.id.vn
          DocumentRoot /var/www/html
          ErrorLog ${APACHE_LOG_DIR}/error.log
          CustomLog ${APACHE_LOG_DIR}/access.log combined
      
          <Directory "/var/www/html">
              AuthType Basic
              AuthName "Restricted Content"
              AuthUserFile /etc/apache2/.htpasswd
              Require valid-user
          </Directory>
      </VirtualHost>

      AuthType Basic: Xác định loại xác thực được sử dụng. Trong trường hợp này, Basic là kiểu xác thực cơ bản, trong đó người dùng phải cung cấp tên người dùng và mật khẩu để truy cập tài nguyên.

      AuthName "Restricted Content": Xác định tên của khu vực bảo vệ. Đây là thông báo mà trình duyệt sẽ hiển thị cho người dùng khi yêu cầu họ nhập thông tin xác thực. Trong ví dụ này, tên khu vực là “Restricted Content” (Nội dung hạn chế).

      AuthUserFile /etc/apache2/.htpasswd: Chỉ định đường dẫn đến file chứa thông tin xác thực của người dùng. Tập tin .htpasswd lưu trữ các tên người dùng và mật khẩu được mã hóa. Đây là nơi Apache tra cứu thông tin xác thực để xác nhận người dùng.

      Require valid-user: Quy định yêu cầu người dùng phải cung cấp thông tin xác thực hợp lệ để được phép truy cập vào tài nguyên. valid-user có nghĩa là bất kỳ người dùng nào có thông tin xác thực hợp lệ trong file .htpasswd đều có quyền truy cập.

      Cấu hình khác với .htaccess file

      ##Access .htaccess file :
      	AuthType Basic
      	AuthName "Restricted Content"
      	AuthUserFile /etc/apache2/.htpasswd
      	Require valid-user
      apachectl -t
      apachectl -k restart

      Trong tổng quan, xác thực và phân quyền trong Apache là những công cụ mạnh mẽ giúp bảo vệ tài nguyên và quản lý quyền truy cập trên máy chủ web. Bằng cách sử dụng các mô-đun như mod_auth_basic, mod_auth_digest, và mod_authnz_ldap, Apache cung cấp nhiều phương pháp linh hoạt để xác minh danh tính người dùng và đảm bảo chỉ những người dùng có quyền mới có thể truy cập vào các phần quan trọng của trang web hoặc ứng dụng. Việc cấu hình chính xác các mô-đun này giúp tăng cường bảo mật, duy trì sự riêng tư, và kiểm soát truy cập hiệu quả, đáp ứng các yêu cầu bảo mật trong môi trường máy chủ ngày nay.

      Apache Virtual Host

      Giới thiệu

      Apache Virtual Host là một tính năng của máy chủ web Apache cho phép bạn chạy nhiều trang web trên cùng một máy chủ vật lý. Mỗi Virtual Host có thể có cấu hình riêng biệt như tên miền, thư mục gốc, cổng, và địa chỉ IP. Điều này giúp bạn dễ dàng quản lý nhiều trang web trên cùng một máy chủ, cho phép các trang web hoạt động độc lập và bảo mật tốt hơn. Virtual Host có thể được cấu hình để hoạt động dựa trên tên miền (Name-based Virtual Host) hoặc địa chỉ IP (IP-based Virtual Host).

      Cài đặt Virtual Host :

      cd /etc/apache2/sites-available
      <VirtualHost *:80>
      
      # Admin email, Server Name (domain name), and any aliases
      ServerName mysite.com
      ServerAlias www.mysite.com
      
      # Index file and Document Root (where the public files are located)
      DocumentRoot /home/mysite/
      <Directory /home/mysite/>
              DirectoryIndex index.php
              Options -Indexes -ExecCGI +FollowSymLinks -SymLinksIfOwnerMatch
              AllowOverride All
              Require all granted
              allow from all
      </Directory>
      
              Header set Access-Control-Allow-Origin "*"
              Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
              Header set Access-Control-Allow-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type"
              Header set Access-Control-Allow-Credentials "true"
      
      #set version php apply cho website
      <FilesMatch .php$>
      
      SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://thanhnh.id.vn/"
      
      </FilesMatch>
      
      # Log file locations
      LogLevel warn
      ErrorLog /home/mysite/logs/error.log
      CustomLog /home/mysite/logs/access.log combined
      
      </VirtualHost>

      Giải thích

      1. Indexes

      • Mô tả: Khi Indexes được bật, nếu không có tệp index (như index.html), Apache sẽ tự động tạo và hiển thị danh sách các tệp trong thư mục đó.
      <Directory /var/www/html>
          Options Indexes
      </Directory>
      

      2. FollowSymLinks

      • Mô tả: Cho phép Apache theo dõi các liên kết tượng trưng (symbolic links) để truy cập tệp hoặc thư mục mà liên kết tượng trưng trỏ tới.
      <Directory /var/www/html>
          Options FollowSymLinks
      </Directory>

      3. ExecCGI

      • Mô tả: Cho phép thực thi các tệp CGI (Common Gateway Interface) trong thư mục. Thường được sử dụng cho các tập lệnh Perl hoặc Python
      <Directory /var/www/cgi-bin>
          Options ExecCGI
          AddHandler cgi-script .cgi .pl .py
      </Directory>

      4. SymLinksIfOwnerMatch

      • Mô tả: Apache chỉ theo dõi các liên kết tượng trưng nếu chủ sở hữu của liên kết tượng trưng và mục tiêu là cùng một người. Điều này tăng cường bảo mật khi sử dụng symbolic links.
      <Directory /var/www/html>
          Options FollowSymLinks SymLinksIfOwnerMatch
      </Directory>

      5. Includes

      • Mô tả: Cho phép xử lý các chỉ thị Server-Side Includes (SSI), giúp bạn chèn nội dung từ tệp khác vào tệp HTML.
      <Directory /var/www/html>
          Options Includes
      </Directory>

      6. MultiViews

      • Mô tả: Cho phép Apache chọn phiên bản tệp dựa trên phần mở rộng. Ví dụ: nếu bạn yêu cầu một tệp tên file, Apache có thể trả về file.html hoặc file.php dựa trên cài đặt cấu hình.
      <Directory /var/www/html>
          Options MultiViews
      </Directory>

      7. All

      • Mô tả: Bật tất cả các tùy chọn ngoại trừ MultiViews. Đây là tùy chọn mặc định nếu bạn không chỉ định tùy chọn nào khác.
      <Directory /var/www/html>
          Options All
      </Directory>

      8. None

      • Mô tả: Vô hiệu hóa tất cả các tùy chọn cho thư mục. Điều này có thể hữu ích nếu bạn muốn khóa các quyền xử lý trong một thư mục cụ thể.
      <Directory /var/www/html/private>
          Options None

      Load Balancing Apache2, Nginx

      Giới thiệu

      Trong các hệ thống có lưu lượng truy cập cao, Load Balancing (cân bằng tải) là yếu tố cần thiết để đảm bảo hiệu suất và tính ổn định. nginx, với khả năng thiết lập Load Balancing mạnh mẽ, giúp phân phối lưu lượng truy cập giữa các server backend một cách đồng đều, giảm tải cho hệ thống và tăng cường trải nghiệm người dùng. Bài viết này sẽ hướng dẫn bạn chi tiết cách cấu hình Load Balancing với Apache2, giúp hệ thống của bạn hoạt động hiệu quả hơn.

      Yêu cầu ở bài này

      • 2 Node xử lý
      • 1 Node Source Code
      • 1 Node Redis Cache
      • 1 Node MySql

      1. Thiết lập sử dụng chung Share Source Code

      Thiết lập sử dụng chung Share Source Code cho Load Balancing là một phương pháp tối ưu hóa việc quản lý mã nguồn trong hệ thống cân bằng tải. Trong kiến trúc Load Balancing, các máy chủ backend (backend servers) xử lý lưu lượng truy cập được phân phối đều từ Load Balancer. Để đảm bảo tính đồng nhất trong việc xử lý, các máy chủ này cần sử dụng chung một bộ mã nguồn (source code).

      Mục đích của việc chia sẻ Source Code trong Load Balancing:

      1. Đảm bảo Tính Đồng Nhất:
        Tất cả các máy chủ backend sử dụng cùng một phiên bản mã nguồn, tránh tình trạng khác biệt giữa các máy chủ.
      2. Dễ Dàng Cập Nhật:
        Khi cần cập nhật hoặc triển khai phiên bản mới, bạn chỉ cần thực hiện trên một thư mục được chia sẻ thay vì cập nhật từng máy chủ riêng lẻ.
      3. Tăng Tính Hiệu Quả:
        Việc chia sẻ mã nguồn giúp giảm thiểu chi phí quản trị, nhất là với số lượng lớn máy chủ backend.

      Cài đặt NFS Server ở nơi quản lý Source Code (Node Source Code)

      sudo apt update
      sudo apt install nfs-kernel-server

      Tạo thư mục chia sẻ

      sudo mkdir /var/nfs/general
      sudo chown nobody:nogroup /var/nfs/general

      Cấu hình NFS Export

      sudo nano /etc/exports
      /var/nfs/general 192.168.1.10(rw,sync,no_subtree_check) 192.168.1.11(rw,sync,no_subtree_check) 192.168.1.12(rw,sync,no_subtree_check)
      • Replace 192.168.1.10, 192.168.1.11, and 192.168.1.12 with the IP addresses of your load-balanced servers.
      • rw: Read/write permission.
      • sync: Ensures changes are written to disk before responses are sent.
      • no_subtree_check: Improves reliability.

      Apply cấu hình

      sudo exportfs -a
      sudo systemctl restart nfs-kernel-server

      Cấu hình FIrewall (Tuỳ chọn)

      sudo ufw allow from 192.168.1.0/24 to any port nfs

      Cấu hình NFS Clients (các node xử lý source code)

      Cài đặt NFS Client

      sudo apt update
      sudo apt install nfs-common

      Mount vào thư mục được chia sẻ ở trên

      sudo mkdir /mnt/nfs/general
      sudo mount 192.168.1.100:/var/nfs/general /mnt/nfs/general
      • Replace 192.168.1.100 with the IP address of your control server

      Đảm bảo thư mục được Mount vĩnh viễn

      sudo nano /etc/fstab
      
      192.168.1.11:/var/nfs/general /mnt/nfs/general nfs rw,sync,hard,intr 0 0
      192.168.1.12:/var/nfs/general /mnt/nfs/general nfs rw,sync,hard,intr 0 0
      
      mount -a

      Cấu hình nâng cao (optional)

      192.168.1.11:/var/nfs/general /mnt/nfs/general nfs defaults,retry=5,timeo=14,hard,intr 0 0
      • retry=5: Tùy chọn này cố gắng kết nối lại với máy chủ NFS trong một số phút nhất định nếu kết nối bị mất.
      • timeo=14: Điều chỉnh khoảng thời gian chờ cho các yêu cầu NFS. Giá trị thấp hơn có nghĩa là phát hiện lỗi nhanh hơn.
      • hard: Điều này đảm bảo rằng máy khách sẽ tiếp tục cố gắng kết nối lại vô thời hạn cho đến khi máy chủ trực tuyến trở lại. Đối với các ứng dụng yêu cầu độ tin cậy, tùy chọn này được ưu tiên vì nó chờ máy chủ hoạt động trở lại
      • intr: Cho phép ngắt kết nối NFS, giúp ngăn máy khách không phản hồi trong thời gian máy chủ ngừng hoạt động.
      • Hard Mount (Khuyến nghị): Với tùy chọn cứng, nếu máy chủ NFS ngừng hoạt động, máy khách sẽ bị treo và tiếp tục cố gắng kết nối lại cho đến khi máy chủ trực tuyến trở lại. Điều này tốt hơn để đảm bảo tính toàn vẹn của dữ liệu vì nó tránh mất dữ liệu âm thầm nhưng có thể khiến các quy trình phải đợi cho đến khi máy chủ khả dụng trở lại.
      • Soft Mount: Với tùy chọn mềm, NFS sẽ cố gắng kết nối lại một vài lần và sau đó trả về lỗi nếu không thể kết nối với máy chủ. Điều này có thể gây mất dữ liệu nhưng có thể tốt hơn cho các ứng dụng ít quan trọng hơn.

      Automatic Remount với systemd (optional)

      Tạo mới 1 systemd

      sudo nano /etc/systemd/system/remount-nfs.service
      [Unit]
      Description=Remount NFS on connection failure
      After=network-online.target
      
      [Service]
      Type=oneshot
      ExecStart=/bin/mount -a
      
      [Install]
      WantedBy=multi-user.target

      Enable Service:

      sudo systemctl enable remount-nfs.service

      NGINX Reverse Proxy

      Truy cập Virtual Host Nginx:

      cd /etc/nginx/sites-available
      nano virtualhost.conf
      server {
              listen 80;
              listen [::]:80;
              server_name virtualhost;
      
              return 301 https://$host$request_uri;
      }
      
      server {
          listen 443 ssl http2;
          listen [::]:443 ssl http2;
          server_name virtualhost;
      
          ssl_certificate /etc/letsencrypt/live/virtualhost/fullchain.pem;
          ssl_certificate_key /etc/letsencrypt/live/virtualhost/privkey.pem;
      
          ssl_session_timeout 1d;
          ssl_session_cache shared:SSL:50m;
          ssl_session_tickets off;
      
          ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
      
          #block Googlebot
          if ($http_user_agent ~ "Googlebot") {
              return 410;
          }
      
          location / {
      
              auth_basic           "Private’s Area";
              auth_basic_user_file /etc/nginx/.htpasswd;
      
              #access_log off;
              access_log /var/log/nginx/access.log;
              error_log /var/log/nginx/error.log;
      
              proxy_set_header Accept-Encoding "";
      
              proxy_buffers 4 256k;
              proxy_buffer_size 128k;
              proxy_busy_buffers_size   256k;
      
              #1 hour timeout
              proxy_read_timeout 3600;
              #proxy_connect_timeout 600;
              #proxy_send_timeout 600;
              #send_timeout 600;
              proxy_pass http://virtualhost;
              proxy_set_header Host $host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-SSL on;
              proxy_set_header X-Forwarded-Proto $scheme;
              # Add HSTS header with preload.
              add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
          }
      }
      
      upstream virtualhost {
          ip_hash;
      
          # Primary servers
          server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
          server 192.168.1.12 max_fails=3 fail_timeout=30s;
      
          # Backup server
          server backup.example.com:80 backup;
      }

      Về cụ thể các thể loại Load Balancing, mình sẽ viết 1 bài riêng nhé

      Load Balancing Nginx mang lại sự linh hoạt và hiệu quả trong việc quản lý lưu lượng truy cập lớn, đảm bảo hệ thống hoạt động ổn định và tối ưu. Với các tính năng mạnh mẽ như upstream, health checks, và khả năng hỗ trợ nhiều phương pháp cân bằng tải, Nginx là công cụ lý tưởng cho mọi ứng dụng web. Hãy áp dụng ngay hôm nay để cải thiện hiệu suất và khả năng mở rộng của hệ thống bạn!

      MySQL

      SQL (Structured Query Language) là một ngôn ngữ chuẩn dùng để tương tác và quản lý dữ liệu trong các hệ quản trị cơ sở dữ liệu quan hệ (RDBMS), như MySQL, PostgreSQL, SQL Server, và Oracle.

       

      MariaDB/MySQL Performance Tuning: Tối ưu hóa InnoDB Buffer Pool cho RAM lớn trên CentOS

      MariaDB/MySQL Performance Tuning: Tối ưu hóa InnoDB Buffer Pool cho RAM lớn trên CentOS

      Giới thiệu

      Trong môi trường sản xuất chạy MariaDB hoặc MySQL, tối ưu hóa InnoDB Buffer Pool là một trong những hoạt động quan trọng nhất để tận dụng RAM lớn và đảm bảo hiệu năng ổn định cho các workload có lượng dữ liệu và truy vấn lớn. Buffer Pool là vùng nhớ được engine InnoDB dùng để lưu trữ dữ liệu và index đang được truy cập, giúp giảm I/O đĩa và tăng tốc độ trả kết quả truy vấn. Khi RAM trên máy chủ đủ lớn, việc điều chỉnh kích thước và cấu hình Buffer Pool có thể mang lại hiệu suất xử lý đáng kể, đặc biệt trên hệ thống CentOS/khác tương thích. Tài liệu tham khảo liên quan đến tối ưu hóa bộ nhớ đệm và đặc biệt là InnoDB Buffer Pool được đề cập trong tài liệu tối ưu hóa của MariaDB và tài liệu tối ưu hóa của MySQL.

      Kiến thức cốt lõi và kiến trúc liên quan đến InnoDB Buffer Pool

      InnoDB Buffer Pool là khu vực nhớ được InnoDB dùng để nắm giữ dữ liệu và các trang chỉ mục (index pages) đang được truy cập. Mục tiêu của Buffer Pool là tối ưu hóa tỷ lệ truy cập dữ liệu từ RAM thay vì phải đọc từ đĩa vật lý, từ đó giảm độ trễ và tăng thông lượng. Khi RAM lớn và workload đòi hỏi, việc phân bổ Buffer Pool thành nhiều khu vực (buffer pool instances) có thể cải thiện đồng thời truy cập từ nhiều CPU. Các tài liệu liên quan nhắc tới tầm quan trọng của Buffers, Caches và Threads cũng như cách tối ưu hóa tác động của các yếu tố này lên hiệu năng tổng thể của hệ thống. Ngoài ra, các hướng dẫn liên quan đến tối ưu hóa I/O và cấu hình lưu trữ của InnoDB đều được đề cập trong các tài liệu tham khảo của MySQL và MariaDB.

      Trong cấu trúc của InnoDB, Buffer Pool không chỉ lưu dữ liệu mà còn lưu các trang thuộc chỉ mục, dữ liệu đã ghi và các trang được truy cập gần đây theo nguyên tắc LRU. Khi RAM được cấp đủ lớn, việc tăng kích thước Buffer Pool và chia nó thành nhiều phiên bản (buffer pool instances) có thể giảm contention ở cấp cơ sở dữ liệu và tăng đồng thời thông lượng cho các multi-core hệ thống. Tuy nhiên, việc cấp quá nhiều RAM cho Buffer Pool có thể gây ra hiệu ứng ngược, khiến hệ điều hành không còn đủ RAM cho các tác vụ nền hoặc các tiến trình khác. Do đó, quá trình tối ưu cần căn cứ vào tổng RAM, đặc điểm workload và yêu cầu độ trễ mục tiêu.

      Chuẩn bị và xem xét hệ thống trước khi điều chỉnh

      Trước khi điều chỉnh, hãy thực hiện các bước chuẩn bị cơ bản để đảm bảo an toàn và có thể kiểm tra được tác động của thay đổi:

      • Xác định tổng RAM và trạng thái sử dụng bộ nhớ của hệ thống. Sử dụng các lệnh như free -h và top -bn1 để có cái nhìn tổng quan về memory và swap. Đối với CentOS/điểm đến tương thích, hãy ghi nhận lượng RAM có sẵn dành cho cơ sở dữ liệu và các tiến trình hệ thống.
      • Xác định phiên bản MariaDB/MySQL đang chạy và đường dẫn tới tệp cấu hình. Thông thường tệp cấu hình nằm ở /etc/my.cnf hoặc /etc/mysql/my.cnf, hoặc các tệp cấu hình bổ sung trong thư mục /etc/my.cnf.d/ (điều này phụ thuộc phân phối và gói cài đặt).
      • <liLưu trữ và sao lưu cấu hình trước khi thay đổi. Việc quay lại cấu hình cũ là bảo đảm nếu có sự cố khi cân chỉnh Buffer Pool. <liXác định workload và mục tiêu hiệu năng. Nếu workload chủ yếu đọc dữ liệu, Buffer Pool kích thước lớn có thể mang lại lợi ích lớn; với workload ghi nhiều, cần cân nhắc thêm tới kích thước log và cách flush dữ liệu ra đĩa.

      Cấu hình chính cho InnoDB Buffer Pool trên CentOS

      Theo khuyến nghị chung trong tài liệu tối ưu hóa InnoDB và các phần liên quan, mục tiêu là đảm bảo Buffer Pool đủ lớn để chứa tập dữ liệu làm việc nóng (working set) và giảm thiểu IO đĩa, đồng thời không chiếm quá mức RAM cho hệ điều hành và các process khác. Đối với hệ thống có RAM lớn và dành riêng cho database, bạn có thể xem xét tăng kích thước Buffer Pool và phân bổ số lượng buffer pool instances phù hợp với số lõi CPU để tối ưu hoá đồng thời truy cập. Việc chia Buffer Pool thành nhiều instances có thể giúp giảm contention giữa các worker threads khi hệ thống có lưu lượng truy cập cao.

      Dưới đây là các nguyên tắc và các biến cấu hình liên quan hay được đề cập trong tài liệu tối ưu hóa InnoDB. Bạn có thể áp dụng chúng như một khung tham khảo để xây dựng cấu hình phù hợp với hệ thống của mình. Lưu ý rằng các giá trị xuất hiện trong ví dụ là minh hoạ và cần được điều chỉnh dựa trên tổng RAM và workload thực tế.

      [mysqld]
      # Kích thước Buffer Pool cho InnoDB
      innodb_buffer_pool_size = 64G
      # Số lượng buffer pool instances (nên điều chỉnh theo number of CPU cores và RAM)
      innodb_buffer_pool_instances = 8
      # Kích thước log InnoDB để tối ưu I/O liên quan tới buffer pool
      innodb_log_file_size = 4G
      innodb_log_files_in_group = 2
      

      Ghi chú:

      • innodb_buffer_pool_size nên được cân nhắc dựa trên tổng RAM của hệ thống và mức độ dành cho hệ điều hành. Trong môi trường riêng biệt cho cơ sở dữ liệu, Buffer Pool chiếm phần lớn RAM nhằm giảm IO đĩa và tăng thông lượng đọc/ghi dữ liệu.
      • <liinnodb_buffer_pool_instances nên được xác định dựa trên số lõi CPU và kích thước Buffer Pool. Mục tiêu là phân tách vùng nhớ để giảm contention giữa các luồng truy cập đồng thời. <liinnodb_log_file_size và số lượng nhóm log InnoDB có thể ảnh hưởng tới I/O và thời gian phục hồi. Điều chỉnh chúng song song với Buffer Pool để tối ưu chu kỳ flush và checkpoint.

      Bên cạnh Buffer Pool, các yếu tố liên quan khác của InnoDB cần được xem xét để tối ưu hóa hiệu năng trên hệ thống RAM lớn, bao gồm tối ưu hóa I/O của đĩa và cấu hình log. Tài liệu đề cập đến các phần như tối ưu hoá I/O đĩa cho InnoDB và tối ưu hoá cấu hình InnoDB nói chung, nhằm cải thiện hiệu suất đọc/ghi và thời gian phản hồi. Bạn có thể tham khảo phần liên quan để điều chỉnh các tham số khác nếu workload của bạn đòi hỏi.

      Ví dụ thực hành trên CentOS

      Dưới đây là một quy trình thực hành thực tế để áp dụng tối ưu InnoDB Buffer Pool trên CentOS hoặc hệ điều hành tương thích, kèm theo các lệnh kiểm tra và xác thực cơ bản:

      1. Kiểm tra tổng quan hệ thống và xác định nhu cầu RAM cho database:
      free -h
      lscpu | grep -E "^Architecture|^CPU|^Socket|^Core|^Thread|^MHz"
      
      1. Sao lưu cấu hình hiện tại và tệp cấu hình MySQL/MariaDB:
      cp /etc/my.cnf /etc/my.cnf.bak.$(date +%F-%T)
      # Nếu có tệp cấu hình bổ sung, sao lưu thêm các tệp trong /etc/my.cnf.d/
      
      1. Chỉnh sửa tệp cấu hình để cập nhật Buffer Pool và các tham số liên quan. Ví dụ với MariaDB/MySQL ở CentOS, có thể thêm hoặc cập nhật các dòng sau trong phần [mysqld]:
      [mysqld]
      innodb_buffer_pool_size = 64G
      innodb_buffer_pool_instances = 8
      innodb_log_file_size = 4G
      innodb_log_files_in_group = 2
      
      1. Khởi động lại dịch vụ để áp dụng cấu hình:
      systemctl restart mariadb
      systemctl status mariadb -l
      
      1. Xác nhận cấu hình đã được áp dụng và hiệu năng được cải thiện:
      mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
      mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_instances';"
      
      1. Kiểm tra trạng thái và hiệu năng thời gian thực:
      SHOW ENGINE INNODB STATUS\G
      SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total';
      SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_free';
      SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
      

      Trong quá trình vận hành, theo dõi các chỉ số trên sẽ cho biết Buffer Pool có đang hoạt động như mong muốn hay không. Nếu buffer pool quá lớn so với RAM còn lại dành cho hệ điều hành và các process, hệ thống có thể bắt đầu swap và hiệu năng sẽ suy giảm. Ngược lại, nếu buffer pool quá nhỏ, workload sẽ phải đọc từ đĩa nhiều hơn và làm giảm thông lượng. Việc điều chỉnh là một quá trình lặp, dựa trên dữ liệu giám sát thực tế.

      Bảo mật và an toàn khi tối ưu hóa

      Khi thay đổi cấu hình liên quan đến bộ nhớ và I/O, cần đảm bảo quyền truy cập hợp lệ và không cấp quyền rộng rãi cho người dùng không đáng tin cậy. Cấu hình này ảnh hưởng đến toàn bộ tiến trình của máy chủ cơ sở dữ liệu và có thể ảnh hưởng đến thời gian hồi cứu (recovery) và bảo vệ dữ liệu trong trường hợp xảy ra mất điện hoặc hệ thống khởi động lại. Để giảm thiểu rủi ro, luôn sao lưu cấu hình và kiểm tra kỹ lưỡng trên môi trường staging trước khi áp dụng cho hệ thống sản xuất.

      Hiệu năng và giám sát liên tục

      Buffer Pool là thành phần then chốt trong hiệu năng InnoDB. Khi RAM lớn, mục tiêu là dựa vào kích thước Buffer Pool để giảm IO đĩa và tăng tốc độ truy vấn. Tuy vậy, bạn cần cân nhắc giữa kích thước Buffer Pool và RAM dành cho hệ điều hành, cũng như các tiến trình hệ thống khác. Các tài liệu (của MariaDB và MySQL) nhấn mạnh vai trò của Buffer Pool và các yếu tố liên quan như tối ưu hóa I/O, tối ưu hóa cấu hình biến và monitoring để có thể đánh giá và điều chỉnh đúng cách.

      Để giám sát hiệu năng và đảm bảo chúng ta đạt được mục tiêu, sử dụng các công cụ và phương pháp sau đây:

      • Giám sát kích thước Buffer Pool và số lượng trang được chứa bằng cách tra cứu các biến và trạng thái liên quan trong MySQL/MariaDB và InnoDB Status.
      • Kích hoạt và theo dõi performance_schema để có cái nhìn về hoạt động của các câu truy vấn và tài nguyên DB.
      • Theo dõi hoạt động IO và thời gian phản hồi qua các chỉ số về IO và log liên quan tới InnoDB.

      Validation và kiểm tra hiệu năng

      Để xác nhận rằng việc tối ưu Buffer Pool mang lại hiệu năng như mong đợi, thực hiện các bước kiểm tra sau:

      • So sánh thời gian đáp ứng trước và sau khi điều chỉnh với các truy vấn điển hình của workload thực tế.
      • Đánh giá thông lượng (throughput) và tổng số IO từ hệ điều hành và từ InnoDB.
      • Kiểm tra sự ổn định của memory usage và số lần swap nếu có; tối ưu Buffer Pool nếu thấy hệ thống bắt đầu swap quá nhiều.

      Kết luận và checklist vận hành

      Tối ưu hóa InnoDB Buffer Pool cho RAM lớn trên CentOS là một quá trình cân bằng giữa kích thước bộ nhớ dành cho InnoDB và nhu cầu của hệ điều hành cùng các process. Sử dụng các biến cấu hình như innodb_buffer_pool_size và innodb_buffer_pool_instances một cách thận trọng, kết hợp với việc tối ưu log và I/O, sẽ mang lại sự cải thiện về thông lượng và thời gian đáp ứng cho hầu hết các workload có dung lượng dữ liệu lớn. Hãy thực hiện các bước kiểm tra, giám sát và điều chỉnh một cách có hệ thống để đảm bảo an toàn, ổn định và hiệu quả cho môi trường sản xuất.

      Danh sách vận hành cuối cùng

        <li Xác định tổng RAM và workload để xác định kích thước Buffer Pool phù hợp. <li Sao lưu cấu hình và chuẩn bị quy trình khôi phục cấu hình. <li Cập nhật các tham số innodb_buffer_pool_size và innodb_buffer_pool_instances phù hợp với hệ thống. <li Khởi động lại dịch vụ và xác nhận cấu hình đã được áp dụng. <li Giám sát InnoDB Status và performance_schema để đánh giá hiệu năng và điều chỉnh thêm nếu cần. <li Thực hiện kiểm tra định kỳ và cập nhật cấu hình theo thay đổi workload hoặc phần cứng.

      Kết thúc

      Bài viết này cung cấp khung tham khảo dựa trên các nguyên tắc tối ưu hóa Buffer Pool đã được thảo luận trong tài liệu tối ưu hóa của MariaDB và MySQL. Việc áp dụng cần được điều chỉnh theo đặc thù của hệ thống, workload và ngân sách phần cứng của bạn. Luôn ưu tiên xác nhận bằng các thử nghiệm thực tế và giám sát liên tục để duy trì hiệu năng ổn định và an toàn dữ liệu.

      Một số MySQL Command Line

      Giới thiệu

      MySQL Command Line là công cụ mạnh mẽ và linh hoạt cho việc quản lý cơ sở dữ liệu, từ thao tác đơn giản đến các tác vụ phức tạp. Trong bài viết này, chúng ta sẽ khám phá một số lệnh MySQL hữu ích mà bạn có thể sử dụng trực tiếp từ dòng lệnh. Cho dù bạn là người mới bắt đầu hay một chuyên gia quản trị cơ sở dữ liệu, việc nắm vững các lệnh này sẽ giúp bạn làm việc hiệu quả hơn, tiết kiệm thời gian và tối ưu hóa hiệu suất hệ thống. Hãy cùng bắt đầu với những lệnh cơ bản nhất và tiến đến những lệnh nâng cao hơn để quản lý và điều hành cơ sở dữ liệu MySQL của bạn.

      USER COMMAND

      Danh sách tất cả người dùng trên máy chủ cơ sở dữ liệu:
      	mysql> Select user from mysql.user;  
      
      Xem thêm thông tin về bảng người dùng:
      	mysql> DESC user; 
      
      Truy vấn host, account_locked, password_expired của người dùng:
      	mysql> SELECT user, host, account_locked, password_expired FROM user;  
      
      Hiển thị người dùng hiện tại:
      	mysql> Select user();  
      	mysql> Select current_user();
      	
      Xem người dùng hiện tại đang đăng nhập vào máy chủ cơ sở dữ liệu:
      	mysql> SELECT user, host, db, command FROM information_schema.processlist;
      
      Tạo Người Dùng Mới:
      	CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';
      	CREATE USER 'sammy'@'thanhnh.id.vn' IDENTIFIED BY 'password';
      
      Cấp Quyền Cho Người Dùng:
      	GRANT PRIVILEGE ON database.table TO 'username'@'host';
      	GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'thanhnh.id.vn' WITH GRANT OPTION;
      
      Thu hồi quyền:
      	REVOKE type_of_permission ON database_name.table_name FROM 'username'@'host';
      
      Xem lại các quyền hiện tại của người dùng:
      	SHOW GRANTS FOR 'username'@'host';
      	
      Xóa Người Dùng:
      	DROP USER user [, user] ....
      	DROP USER 'jeffrey'@'thanhnh.id.vn';

      LIST PRIVILEGES :

      SELECT: Quyền cho phép người dùng truy vấn và lấy dữ liệu từ một bảng hoặc một tập hợp bảng.

      INSERT: Cho phép người dùng thêm dữ liệu mới vào bảng.

      UPDATE: Cho phép người dùng sửa đổi dữ liệu hiện có trong bảng.

      DELETE: Cho phép người dùng xóa dữ liệu khỏi bảng.

      CREATE: Cho phép người dùng tạo các đối tượng mới trong cơ sở dữ liệu, chẳng hạn như bảng, chỉ mục, hoặc cơ sở dữ liệu mới.

      ALTER: Cho phép người dùng thay đổi cấu trúc của các đối tượng trong cơ sở dữ liệu, chẳng hạn như thêm cột mới vào bảng hoặc thay đổi kiểu dữ liệu của một cột.

      DROP: Cho phép người dùng xóa các đối tượng khỏi cơ sở dữ liệu, chẳng hạn như xóa bảng, chỉ mục hoặc cơ sở dữ liệu.

      GRANT: Cho phép người dùng cấp quyền cho người dùng khác.

      REVOKE: Cho phép người dùng thu hồi quyền mà họ đã cấp cho người dùng khác.

      EXECUTE: Cho phép người dùng thực thi các stored procedures và functions trong cơ sở dữ liệu.

      INDEX: Cho phép người dùng tạo và xóa chỉ mục trên các bảng.

      REFERENCES: Cho phép người dùng tạo các khóa ngoại (foreign key) liên kết bảng này với bảng khác.

      LOCK TABLES: Cho phép người dùng khóa bảng để ngăn chặn các thao tác khác trong quá trình họ làm việc với bảng đó.

      SHOW VIEW: Cho phép người dùng xem định nghĩa của một view (một bảng ảo được tạo từ kết quả của một truy vấn SELECT).

      TRIGGER: Cho phép người dùng tạo và quản lý các triggers, là các hành động tự động được thực hiện khi có sự kiện xảy ra trong cơ sở dữ liệu.

      TABLE Command :

      Hiển thị cơ sở dữ liệu:
      	SHOW DATABASES;
      
      Tạo cơ sở dữ liệu mới có tên là ‘myfirstdb’:
      	mysql> CREATE DATABASE myfirstdb;
      
      Tạo cơ sở dữ liệu với các tùy chọn:
      	mysql> CREATE DATABASE myfirstdb character set utf8 collate utf8_bin;

      QUERRY DATABASE SIZE:

      SELECT table_schema "mydatabasename",
              ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" 
      FROM information_schema.tables 
      GROUP BY table_schema; 

      SQL AUTO INCREMENT :

      CREATE TABLE Persons (
          Personid int NOT NULL AUTO_INCREMENT,
          LastName varchar(255) NOT NULL,
          FirstName varchar(255),
          Age int,
          PRIMARY KEY (Personid)
      );
      
      Default auto_increment = 1 and will increment by 1 for each new record, if want auto_increment start with another value, use this :
      	ALTER TABLE Persons AUTO_INCREMENT=100;

      Trên đây là một số lệnh cơ bản và nâng cao trong MySQL Command Line giúp bạn quản lý cơ sở dữ liệu một cách hiệu quả. Việc nắm vững các lệnh này không chỉ giúp bạn thực hiện các tác vụ quản trị dễ dàng hơn mà còn tối ưu hóa hiệu suất và bảo mật cho hệ thống. Hãy thực hành thường xuyên để làm quen với các lệnh này, và đừng ngần ngại khám phá thêm các tùy chọn và tính năng khác của MySQL để khai thác tối đa tiềm năng của công cụ này trong công việc của bạn.

      Import & Export MySQL

      Giới thiệu

      Khi làm việc với cơ sở dữ liệu MySQL, việc xuất và nhập dữ liệu là những kỹ năng quan trọng giúp bạn sao lưu, di chuyển và chia sẻ dữ liệu một cách hiệu quả. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn các phương pháp để import (nhập) và export (xuất) dữ liệu trong MySQL. Bạn sẽ học cách sử dụng các công cụ và lệnh SQL để dễ dàng di chuyển dữ liệu giữa các cơ sở dữ liệu, sao lưu dữ liệu quan trọng và khôi phục dữ liệu khi cần thiết. Bài viết sẽ cung cấp hướng dẫn chi tiết từng bước, từ các lệnh cơ bản cho đến các tùy chọn nâng cao, giúp bạn thực hiện các thao tác này một cách chính xác và hiệu quả.

      Export & Import in Command Line

      EXPORT DATABASE :
      	mysqldump -uUSERNAME -p DB_NAME > exported.sql
      
      IMPORT DATABASE :
      	mysqldump -u username -p database_name < data-dump.sql

      Import & Export in Container Docker

      EXPORT DATABASE in Docker:
      	docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql
      
      IMPORT DATABASE in Docker :
      	docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql
      	
      docker run --name zabbix-server-mysql -t 
            -e DB_SERVER_HOST="mysql" 
            -e MYSQL_DATABASE="zabbixdb" 
            -e MYSQL_USER="zabbix" 
            -e MYSQL_PASSWORD="<password>" 
            -e MYSQL_ROOT_PASSWORD="<password>" 
            -e ZBX_JAVAGATEWAY="zabbix-java-gateway" 
            --network=zabbix-net 
            -p 10051:10051 
            --restart always 
            -d zabbix/zabbix-server-mysql:alpine-6.2-latest
      	  
      
      docker run --name zabbix-web-nginx-mysql -t 
            -e ZBX_SERVER_HOST="zabbix-server-mysql" 
            -e DB_SERVER_HOST="mysql" 
            -e MYSQL_DATABASE="zabbixdb" 
            -e MYSQL_USER="zabbix" 
            -e MYSQL_PASSWORD="<password>" 
            -e MYSQL_ROOT_PASSWORD="<password>" 
            --network=zabbix-net 
            -p 80:8080 
            --restart unless-stopped 
            -d zabbix/zabbix-web-nginx-mysql:alpine-6.2-latest

      Cronjob auto backup

      Create a cli file to run 
           nano auto-backup.sh
      
      # (1) set up all the mysqldump variables
      DATE=`date +"%d_%b_%Y_%H%M"`
      SQLFILE=/home/database/mydatabase-${DATE}.sql
      DATABASE=<database_name>
      USER=<user_name>
      PASSWORD=<password>
      
      # (2) do the mysql database backup (dump)
      sudo mysqldump -u ${USER} -p${PASSWORD} ${DATABASE}|gzip > ${SQLFILE}.gz

      Enter Cronjob and set

      crontab -e
      ##Database auto backup
      15 3 * * * sh /home/database/cli/auto-backup.sh

      Xoá backup cũ sau một khoảng thời gian

      crontab -e
      ##Clear Database wordpress when file older than 7 days
      0 0 * * * /usr/bin/find /home/database/ -name "*.sql.gz" -type f -mtime +7 -exec rm -f {} ;

      Bonus

      Install nano, update in Docker :
      	docker exec -it zabbix-web-nginx-mysql --user=root bash
      		apk add nano
      		apk update 

      Việc nắm vững các kỹ thuật import và export dữ liệu trong MySQL không chỉ giúp bạn quản lý cơ sở dữ liệu hiệu quả hơn mà còn đảm bảo tính an toàn và khả năng di động của dữ liệu quan trọng. Bằng cách áp dụng các lệnh và công cụ đã được giới thiệu, bạn có thể dễ dàng sao lưu, khôi phục và di chuyển dữ liệu giữa các hệ thống hoặc môi trường khác nhau. Hãy thực hành thường xuyên và làm quen với các tùy chọn khác nhau để tối ưu hóa quy trình làm việc của bạn. Đừng quên kiểm tra dữ liệu sau khi thực hiện các thao tác để đảm bảo mọi thứ hoạt động như mong muốn. Chúc bạn thành công trong việc quản lý dữ liệu MySQL của mình!

      Tối ưu hiệu năng MySQL

      Giới thiệu

      Tối ưu hóa hiệu năng MySQL là một yếu tố quan trọng để đảm bảo cơ sở dữ liệu của bạn hoạt động mượt mà và hiệu quả. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn các phương pháp và kỹ thuật để cải thiện hiệu suất của MySQL, từ việc tối ưu hóa cấu hình hệ thống đến việc điều chỉnh các truy vấn và chỉ mục. Với những mẹo và công cụ hữu ích, bài viết này sẽ giúp bạn nâng cao hiệu quả hoạt động của MySQL và giảm thiểu thời gian phản hồi của hệ thống.

      Swappiness in MySQL

      Swapping là tiến trình xuất hiện khi hệ thống phải sử dụng swap disk khi hết Ram. Hệ thống sẽ đưa các thông tin vào ổ đĩa. Mà ổ đĩa thì read chậm hơn ram rất nhiều

      Default :vm.swappiness = 60
      Disalbe by :
      	sysctl -w vm.swappiness=0

      Mysql query cache

      Nếu bạn có nhiều truy vấn được lập đi lập lại data mà dữ liệu của bạn không thay đổi thường xuyên thì dùng query cache.Thường thì đa phần sẽ không hiểu được khái niệm nàyvà sẽ set giái trị gigabytes.
      Websites lớn cần 256 -> 512MB . Còn nhỏ thì chỉ cần 64 – 128MB.

      Chỉnh sửa trong my.cnf :

      	query_cache_type=1
      	query_cache_limit=256K
      	query_cache_min_res_unit=2k
      	query_cache_size = 64M

      InnoDB file-per-table

      Tại sao lại tối ưu thông số trên vì MySQL mặc định sử dụng InnoDB (storage engine). InnoDB cung cấp cho chung ta khả năng xử lý linh hoạt database những thông tin được lưu bên trong file .IDB.
      Một lợi ít khác đó là nó cải thiện được tốc độ I/O trên VPS hoặc server của bạn.
      Mặt định innodb_file_per_table được bật trên version 5.6

      innodb_file_per_table=1

      InnoDB buffer pool

      Là vùng lưu trữ data và indexes trong bộ nhớ. Nó được sử dụng để lưu trữ dữ liệu thường xuyên truy cập trong bộ nhớ, và khi bạn đang chạy một máy chủ chuyên dụng hoặc máy ảo mà DB thường là bottleneck,và đây sẽ là phần chiếm nhiều ram nhất trong các ứng dụng mà bạn đang sử dụng. Do đó, chúng tôi cung cấp cho nó 50-70% của tất cả các RAM.
      Có một bộ tài liệu hướng dẫn định dạng butter pool có sẵn trong MySQL docs.

      innodb_buffer_pool_size = [Thông số ram]

      Max connections

      Max_connections sẽ thông báo với server bao nhiêu kết nối được cho phép. Quá nhiều kết nối thì sẽ làm cho Ram load cao, và nếu vượt quá thì MySQL sẽ treo tiến trình. Đối với những website vừa và nhỏ thì ta chỉ cần để max = 80 đến 200.
      Còn website có lượng kết nối lớn thì khoản 200 đến 600 hoặc hơn tùy thuộc vào resource của server.

      max_connections = 200

      MySQL thread_cache_size

      MySQL thread_cache_size cho chúng ta biết số lượng threads trên server sẽ được cache, cách tính như sau

      	# mysql -e "show status like 'Threads_created';"
      	# mysql -e "show status like 'Connections';"

      Sau khi có 2 thông số thì tính được cache hit :

      100 – ((Threads_created / Connections) * 100))

      Đưa vào file my.cnf

      thread_cache_size = [Thông số tìm được]

      MySQL reverse DNS lookups

      Mặc định thì MySQL thực hiện DNS lookup những IP connect tới. Với mỗi Client connect thì địa chỉ IP sẽ được kiểm tra và phân giải.Sau đó Hostname sẽ được phân giải và trả về IP. Điều này sẽ làm cho quá trình bị chậm trê khi DNS có vấn đề .Vậy ta nên tắt chức năng này để tăng khả năng phản hồi cho Server :

      skip-name-resolve

      MySQL idle connetions

      Idle kết nối tiêu hao resource và có thể sẽ bị gián đoạn hoặc phải frefreshed. Giống như nhiều connect trong tình trạng “sleep” và trong thời gian dài. Để kiểm tra các kết nối trên ta thực hiện như sau :

      mysqladmin processlist | grep "Sleep"

      Command sẽ cho chúng ta thấy được các trạng thái Sleep, Khi php thực hiện truy vấn vào mysql mở kết nối sau đó query , loại bỏ xác thực và mở kết nối. Điều này sẽ làm được lưu trên memory cho đến khi thread không hoạt động.Đối với vấn đề này bạn cần kiểm tra lại source code và fix. Nếu bạn không fix thì bạn có thể thay đổi source code hoặc không biết cách sửa lỗi, vậy cách tạm thời hãy thay đổi thông số mặc định của nó xuống khoản 60.

      wait_timeout=60

      MySQL slow query logs

      Logging query chậm có thể giúp bạn xác định các cơ sỡ dữ liệu và và debug

      	slow-query-log=1
      	slow-query-log-file=/var/lib/mysql/mysql-slow.log
      	long_query_time = 1

      Việc tối ưu hóa hiệu năng MySQL là một quá trình liên tục đòi hỏi sự chú ý và điều chỉnh thường xuyên để đạt được kết quả tốt nhất. Bằng cách áp dụng các kỹ thuật và phương pháp đã được đề cập trong bài viết này, bạn có thể cải thiện đáng kể tốc độ và hiệu quả của cơ sở dữ liệu của mình. Hãy luôn theo dõi hiệu suất hệ thống, điều chỉnh các cấu hình và tối ưu hóa các truy vấn để đảm bảo cơ sở dữ liệu hoạt động ổn định và nhanh chóng.

      Cài đặt MySQL, MariaDB trên Ubuntu

      Giới thiệu

      Cài đặt MySQL và MariaDB trên Ubuntu là một bước quan trọng để thiết lập một cơ sở dữ liệu mạnh mẽ và hiệu quả cho các ứng dụng và dịch vụ của bạn. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn từng bước để cài đặt cả MySQL và MariaDB trên hệ điều hành Ubuntu. Bạn sẽ tìm hiểu cách thực hiện cài đặt từ các kho lưu trữ chính thức, cấu hình cơ bản và các bước kiểm tra để đảm bảo rằng cơ sở dữ liệu của bạn hoạt động đúng cách. Dù bạn đang sử dụng MySQL hay MariaDB, hướng dẫn này sẽ giúp bạn thiết lập môi trường cơ sở dữ liệu ổn định và sẵn sàng cho các nhiệm vụ phát triển và quản lý.

      Install MySQL 5.7

      Add MySQL 5.7 APT Repository :

      wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb

      Install the repository :

      sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb

      Update the APT repository :

      sudo apt update

      Nếu bạn gặp lỗi ” signature couldn’t be verified ” hãy import lại GPG key :

      sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29

      Chạy lại apt update

      Kiểm tra lại MySQL repository :

      sudo apt-cache policy mysql-server

      Install MySQL 5.7 :

      sudo apt install -f mysql-client=5.7* mysql-community-server=5.7* mysql-server=5.7* -y

      INSTALL MySQL 8.0

      Install MySQL 8.0:

      apt -y install mysql-server-8.0

      Verify :

      sudo mysql_secure_installation
      [sudo] password for toor: 
      
      Securing the MySQL server deployment.
      
      Enter password for user root: 
      
      VALIDATE PASSWORD COMPONENT can be used to test passwords
      and improve security. It checks the strength of password
      and allows the users to set only those passwords which are
      secure enough. Would you like to setup VALIDATE PASSWORD component?
      
      Press y|Y for Yes, any other key for No: Y
      
      There are three levels of password validation policy:
      
      LOW    Length >= 8
      MEDIUM Length >= 8, numeric, mixed case, and special characters
      STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file
      
      Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
      Using existing password for root.
      
      Estimated strength of the password: 0 
      Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y
      
      New password: 
      
      Re-enter new password: 
      
      Estimated strength of the password: 100 
      Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
      By default, a MySQL installation has an anonymous user,
      allowing anyone to log into MySQL without having to have
      a user account created for them. This is intended only for
      testing, and to make the installation go a bit smoother.
      You should remove them before moving into a production
      environment.
      
      Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
      Success.
      
      
      Normally, root should only be allowed to connect from
      'thanhnh.id.vn'. This ensures that someone cannot guess at
      the root password from the network.
      
      Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
      Success.
      
      By default, MySQL comes with a database named 'test' that
      anyone can access. This is also intended only for testing,
      and should be removed before moving into a production
      environment.
      
      
      Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
       - Dropping test database...
      Success.
      
       - Removing privileges on test database...
      Success.
      
      Reloading the privilege tables will ensure that all changes
      made so far will take effect immediately.
      
      Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
      Success.
      
      All done! 

      MariaDB 11.4.x

      sudo apt-get install apt-transport-https curl
      sudo mkdir -p /etc/apt/keyrings
      sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'

      Sau khi đã Import Key, copy và paste dòng dưới vào /etc/apt/sources.list.d (for instance /etc/apt/sources.list.d/mariadb.sources):

      # MariaDB 11.4 repository list - created 2024-09-02 14:54 UTC
      # https://mariadb.org/download/
      X-Repolib-Name: MariaDB
      Types: deb
      # deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
      # URIs: https://deb.mariadb.org/11.4/ubuntu
      URIs: https://vn-mirrors.vhost.vn/mariadb/repo/11.4/ubuntu
      Suites: focal
      Components: main main/debug
      Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp

      Install MariaDB :

      sudo apt-get update
      sudo apt-get install mariadb-server

      Việc cài đặt MySQL và MariaDB trên Ubuntu không chỉ cung cấp cho bạn một nền tảng cơ sở dữ liệu mạnh mẽ mà còn giúp bạn bắt đầu nhanh chóng với các dự án phát triển và quản lý dữ liệu. Đừng quên kiểm tra và cập nhật hệ thống thường xuyên để duy trì sự ổn định và bảo mật !

      MySQL : Replicate Master - Master

      Giới thiệu.

      Thiết lập MySQL Master-Master Replication là một trong những giải pháp hiệu quả để đảm bảo tính khả dụng cao và đồng bộ hóa dữ liệu giữa hai máy chủ cơ sở dữ liệu. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách cài đặt và cấu hình hệ thống sao chép Master-Master trong MySQL, giúp bạn có thể đồng bộ dữ liệu theo cả hai chiều giữa các máy chủ với Master-Master Replication

      1. Cấu hình Master Database 1 à Database 2
      	sudo nano /etc/mysql/my.cnf
      		bind-address = 0.0.0.0

      Thay đổi tiếp theo đề cập đến các server-id :

      	[mysqld]
      	server-id = 1				# Đặt ID cho server mysql 
      	log_bin = /var/log/mysql/mysql-bin.log	# khai báo lưu trữ binlog

      Tạo User trên Master 1 . User này sẽ truy cập vào Master 1 và lấy binlog về :

      	mysql1@ubuntu:~$  mysql -u root -p
      	Password:
      	mysql> CREATE USER 'Username'@'IP_Slave_Server' IDENTIFIED BY 'password';
      	Query OK, 0 rows affected (0.00 sec)

      Cấp quyền Replication cho nó :

      mysql> GRANT REPLICATION SLAVE ON *.* TO 'Username'@'IP_Slave_Server';

      Xem thông tin Master Server :

      	mysql> show master status;
      	+------------------+----------+--------------+------------------+-------------------+
      	| File                         | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
      	+------------------+----------+--------------+------------------+-------------------+
      	| mysql-bin.000005 |      154 |              |                  |                   |
      	+------------------+----------+--------------+------------------+-------------------+
      	1 row in set (0.00 sec)

      Save lại thông tin “mysql-bin.000005” và Position “154“, 2 thông tin còn lại là Binlog_Do_DBBinlog_Ignore_DB để chỉ định DB nào được replicate và DB nào không được replicate

      Trên MySQL 2 -Slave 1 ( sẽ là Master 2) :

      Cấu hình file config Mysql 2 :

      	server-id = 2
      	log_bin = /var/log/mysql/mysql-bin.log

      Save lại và restart lại Mysql Server

              systemctl stop mysql && systemctl start mysql

      Khai báo Slave 1 để replicate data từ Master 1

      	$ mysql -u root -p
      	Password:
      
      	mysql> STOP SLAVE;                                  #Tắt Slave trước khi khai báo
      	Query OK, 0 rows affected, 1 warning (0.00 sec)
      
      	mysql> CHANGE MASTER TO
      		-> MASTER_HOST='IP_Master_Server',                 #Khai ip master1 server
      		-> MASTER_USER='Username',                               #Username dành cho Slave 1 tạo ở trên
      		-> MASTER_PASSWORD='password',                     #Password của nó, tất nhiên rồi @@
      		-> MASTER_PORT=3307,                                          #Port của Master_Server nhé, vì đã đổi rồi nên là 3307. Nếu chưa đổi thì ko cần khai chỗ này. 
      		-> MASTER_LOG_FILE='mysql-bin.000005',           #Thông tin file binlog lụm được từ Master 1 status
      		-> MASTER_LOG_POS=154;                                      # Thông tin position tương ứng
      	Query OK, 0 rows affected, 2 warnings (0.01 sec)
      
      	mysql> START SLAVE;                                                          #Sau khi khai báo xong thì khởi động lại Slave
      	Query OK, 0 rows affected (0.00 sec)

      Sau khi Start Slave thì check status:

      mysql> show slave status G
      *************************** 1. row ***************************
                     Slave_IO_State: Waiting for master to send event
                        Master_Host: 172.17.3.111
                        Master_User: repliuser
                        Master_Port: 3307
                      Connect_Retry: 60
                    Master_Log_File: mysql-bin.000005
                Read_Master_Log_Pos: 154
                     Relay_Log_File: ubuntu-relay-bin.000005
                      Relay_Log_Pos: 367
              Relay_Master_Log_File: mysql-bin.000005
                   Slave_IO_Running: Yes
                  Slave_SQL_Running: Yes
                    Replicate_Do_DB: 
                Replicate_Ignore_DB: 
                 Replicate_Do_Table: 
             Replicate_Ignore_Table: 
            Replicate_Wild_Do_Table: 
        Replicate_Wild_Ignore_Table: 
                         Last_Errno: 0
                         Last_Error: 
                       Skip_Counter: 0
                Exec_Master_Log_Pos: 154
                    Relay_Log_Space: 788
                    Until_Condition: None
                     Until_Log_File: 
                      Until_Log_Pos: 0
                 Master_SSL_Allowed: No
                 Master_SSL_CA_File: 
                 Master_SSL_CA_Path: 
                    Master_SSL_Cert: 
                  Master_SSL_Cipher: 
                     Master_SSL_Key: 
              Seconds_Behind_Master: 0
      Master_SSL_Verify_Server_Cert: No
                      Last_IO_Errno: 0
                      Last_IO_Error: 
                     Last_SQL_Errno: 0
                     Last_SQL_Error: 
        Replicate_Ignore_Server_Ids: 
                   Master_Server_Id: 1
                        Master_UUID: b05dfbb5-1463-11e7-8601-000c29042d55
                   Master_Info_File: /var/lib/mysql/master.info
                          SQL_Delay: 0
                SQL_Remaining_Delay: NULL
            Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
                 Master_Retry_Count: 86400
                        Master_Bind: 
            Last_IO_Error_Timestamp: 
           Last_SQL_Error_Timestamp: 
                     Master_SSL_Crl: 
                 Master_SSL_Crlpath: 
                 Retrieved_Gtid_Set: 
                  Executed_Gtid_Set: 
                      Auto_Position: 0
               Replicate_Rewrite_DB: 
                       Channel_Name: 
                 Master_TLS_Version: 
      1 row in set (0.00 sec)

      Check xem có đúng không, nếu không :

      	stop slave ;
      	reset slave ;

      Cấu hình Master 2 – Slave 2

      Tạo Username và gán quyền Replication :

      	$ mysql -u root -p
      	Password:
      
      	mysql> CREATE USER 'Username'@'IP_Slave_Server' IDENTIFIED BY 'password';
      	Query OK, 0 rows affected (0.00 sec)
      
      	mysql> GRANT REPLICATION SLAVE ON *.* TO 'Username'@'IP_Slave_Server';
      	Query OK, 0 rows affected (0.00 sec)

      Lấy thông tin của Master :

      	$ mysql -u root -p
      	Password:
      
      	mysql> STOP SLAVE;                                                            #Tắt Slave trước khi khai báo
      	Query OK, 0 rows affected, 1 warning (0.00 sec)
      
      	mysql> CHANGE MASTER TO
      		-> MASTER_HOST='IP_Master_Server',                          #Khai ip master2 server
      		-> MASTER_USER='Username',                                        #Username dành cho Slave 2 tạo ở trên
      		-> MASTER_PASSWORD='password', 
      		-> MASTER_PORT=3308,
      		-> MASTER_LOG_FILE='mysql-bin.000005',                   #Thông tin file binlog lụm được từ Master 2 status
      		-> MASTER_LOG_POS=154;                                              # Thông tin position tương ứng
      	Query OK, 0 rows affected, 2 warnings (0.01 sec)
      
      	mysql> START SLAVE;                                                           #Sau khi khai báo xong thì khởi động lại Slave
      	Query OK, 0 rows affected (0.00 sec)

      Check status của Slave 2:

      	mysql> show slave status G;
      	*************************** 1. row ***************************
      				   Slave_IO_State: Waiting for master to send event
      					  Master_Host: 172.17.3.112
      					  Master_User: repliuser
      					  Master_Port: 3308
      					Connect_Retry: 60
      				  Master_Log_File: mysql-bin.000001
      			  Read_Master_Log_Pos: 792
      				   Relay_Log_File: ubuntu-relay-bin.000005
      					Relay_Log_Pos: 320
      			Relay_Master_Log_File: mysql-bin.000001
      				 Slave_IO_Running: Yes
      				Slave_SQL_Running: Yes
      	......
      	Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
      	......
      	1 row in set (0.01 sec)

      Bonus

      LOG SLAVE UPDATE WHEN RUN SLAVE OF SLAVE :

      Cập nhật trong /etc/mysql/my.cnf

      log_slave_updates=ON
      sync_binlog=1
      sync_relay_log=1
      relay_log_purge=ON
      relay_log_recovery=ON

      MySQL Master-Master Replication mang lại nhiều lợi ích cho các hệ thống cơ sở dữ liệu lớn, đặc biệt là khả năng đảm bảo tính toàn vẹn và đồng bộ dữ liệu giữa các máy chủ. Khi cấu hình đúng cách, hệ thống này sẽ giúp giảm tải cho cơ sở dữ liệu và tăng tính sẵn sàng, giúp doanh nghiệp hoạt động liên tục mà không gặp gián đoạn. Để đạt hiệu quả tốt nhất, bạn cần thường xuyên kiểm tra và theo dõi các vấn đề có thể phát sinh trong quá trình đồng bộ.

      Multi-Node MySQL

      Giới thiệu

      Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

      Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

      https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

      https://mariadb.com/kb/en/galera-cluster

      Phần 1: Giới thiệu về Multi-node MySQL: Cách Hoạt Động và Ứng Dụng

      MySQL:

      • MySQL InnoDB Cluster cung cấp một giải pháp tăng tính sẵn sàng cao hoàn chỉnh cho MySQL.
      • MySQL Shell bao gồm AdminAPI cho phép dễ dàng cấu hình và quản trị một nhóm với ít nhất ba máy chủ MySQL, hoạt động như một InnoDB Cluster.
      • Mỗi máy chủ MySQL chạy MySQL Group Replication, cung cấp cơ chế sao chép dữ liệu trong InnoDB Cluster, với khả năng chuyển đổi dự phòng được tích hợp.
      • Trong trường hợp xảy ra lỗi không mong muốn của một máy chủ, cluster sẽ tự động cấu hình lại.
      • Trong chế độ single-primary mặc định, InnoDB cluster có một máy chủ đọc ghi – primary instance. Nhiều máy chủ thứ cấp secondary instance là bản sao của primary instance.
      • Nếu lỗi xảy ra ở máy chủ chính primary instance, một máy phụ secondary instance sẽ tự động được chuyển đổi vai trò thành primary instance.
      • MySQL Router tự động phát hiện điều này và chuyển tiếp các kết nối đến bản chính mới. Tính năng nâng cao cũng cho phép cấu hình một cluster có nhiều primary instance.
      • MySQL Router có thể tự động chuyển đổi cấu hình dựa trên cluster đã triển khai, đảm bảo kết nối đến các máy chủ không bị gián đoạn khi có máy chủ xảy ra sự cố.

      MariaDB:

      • Galera Cluster hỗ trợ tốt nhất với innoDB
      • Có thể có các bảng MYiSAM hoặc MEMORY nhưng không nhận được bản sao đồng bộ sang các nút khác, chỉ có thể làm được với innoDB
      • Cách Galera đồng bộ dữ liệu bản sao, yêu cầu RollBack phải khả thi kể cả đang COMMIT. Các keys trùng lặp sẽ là vấn đề khi cho phép ghi vào tất cả các nodes
      • NDB thực hiện cách tiếp cận khác ( Tính nhất quán cuối cùng ). Các keys trùng lặp có thể xâm nhập vào hệ thống nhưng client sẽ phải cung cấp thuật toán để khắc phục
      • MYiSAM không có cách nào để thực hiện RollBack vì phụ thuộc vào bảng khóa phía trước. Khóa các bảng trên node khác sẽ gây ra vấn đề và không hiệu quả
      • Galera có thể hoạt động hiệu quả ngay cả trong WAN nhờ hành động COMMIT đơn lẻ trên từng node

      Một số thông tin cần chú ý

      Binary Log Purging

      MySql Binary Log là một cơ chế của MySql dùng để lưu trữ các thay đổi của dữ liệu dưới dạng một file log.Tất cả các thay đổi sẽ được lưu thêm vào (append only) vào một file log được đánh số thứ tự.Mỗi thay đổi được đặc trưng bởi hai tham số: file log được ghi vào vị trí offset trên file log.

      • Mysql 8.0 : Binary Log tự động xoá ( binlog_expire_logs_seconds )
      • Version trước 8.0.1 Không tự động xoá binary log ( defaults =0 )
      • Version 8.0.1 -> 8.0.4 Xoá binary log sau 30 ngày ( defaults = 30 )
      • Version sau 8.0.10 xoá binary log sau 30 ngày ( defaults = 2592000 và default value expire_log_days = 0 )

      Thay đổi trên từng host :

      SET GLOBAL expire_logs_days = 10;

      Tóm lại

      Multi-node MySQL là lựa chọn lý tưởng cho những doanh nghiệp và tổ chức cần hệ thống cơ sở dữ liệu mạnh mẽ, ổn định và có khả năng mở rộng linh hoạt. Việc triển khai giải pháp này không chỉ giúp giảm thiểu tải cho máy chủ mà còn tối ưu hóa tốc độ xử lý và bảo đảm sự an toàn dữ liệu. Nếu bạn đang tìm kiếm cách tối ưu hóa hệ thống cơ sở dữ liệu của mình, Multi-node MySQL chính là giải pháp đáng để cân nhắc.

      Xem thêm

      Hướng Dẫn Cài Đặt MySQL và MySQL Shell: Bước Đầu Để Tạo Cluster

      Giới thiệu

      Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

      Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

      https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

      https://mariadb.com/kb/en/galera-cluster

      Phần 2 : Cài đặt MySQL và MySQL Shell

      Trước khi tạo MySQL Cluster, bạn cần thực hiện các bước pre-checking và chuẩn bị hệ thống để đảm bảo mọi thành phần hoạt động trơn tru. Bài viết này sẽ hướng dẫn bạn cách kiểm tra phần cứng, mạng và cấu hình phần mềm cần thiết.

      Cài đặt MySQL

      Installing MySQL with APT

      sudo apt-get install mysql-server

      Installing MySQL with Yum

      #Update
      sudo yum update

      Tải MySQL 8.0 RPM file

      curl -sSLO https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm

      Check Sum bản MySQL RPM vừa tải xuống

      md5sum mysql80-community-release-el7-5.noarch.rpm

      So sánh với Website tại : https://dev.mysql.com/downloads/repo/yum/

      Output
      e2bd920ba15cd3d651c1547661c60c7c  mysql80-community-release-el7-5.noarch.rpm

      Cài đặt package vừa tải

      sudo yum install mysql-server

      Khởi động MySQL :

      ##CENTOS
      sudo systemctl start mysqld
      ##UBUNTU
      sudo systemctl start mysql

      Cài đặt MySQL Shell

      Làm theo các bước được đưa ra trong Thêm MySQL APT Repository, chú ý đặc biệt đến các điểm sau:

      sudo apt-get update
      sudo apt-get install mysql-shell

      Nếu bạn đã có MySQL APT repository như một kho phần mềm trên hệ thống của mình, hãy thực hiện các bước sau:

      sudo apt-get update
      sudo apt-get install mysql-apt-config
      sudo apt-get install mysql-shell

      Cài đặt MySQL Shell với MySQL Yum Repository

      sudo yum install mysql-shell

      Đối với các hệ thống có hỗ trợ dnf, hãy làm như sau:

      sudo dnf install mysql-shell

      Tóm lại

      Việc cài đặt MySQL và MySQL Shell là nền tảng vững chắc để bắt đầu xây dựng MySQL Cluster. Sau khi hoàn thành cài đặt, bạn đã sẵn sàng để tiến hành các bước tiếp theo như kiểm tra hệ thống và tạo cluster.

      Xem thêm

      Pre-checking và Chuẩn Bị Hệ Thống Trước Khi Tạo MySQL Cluster

      Giới thiệu

      Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

      Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

      https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

      https://mariadb.com/kb/en/galera-cluster

      Phần 3 : Pre-checking và Chuẩn Bị Hệ Thống Trước Khi Tạo MySQL Cluster

      Trước khi tạo MySQL Cluster, bạn cần thực hiện các bước pre-checking và chuẩn bị hệ thống để đảm bảo mọi thành phần hoạt động trơn tru. Bài viết này sẽ hướng dẫn bạn cách kiểm tra phần cứng, mạng và cấu hình phần mềm cần thiết.

      Kiểm tra các thông số và chuẩn bị

      Cấu hình 3 host với thông số :

      node 0 : 192.168.33.20/24 ‘cluster’@’%’ apt install mysql-server mysql-shell(8.0)

      node 1 : 192.168.33.21/24 ‘cluster’@’%’ apt install mysql-server mysql-shell(8.0)

      node 2 : 192.168.33.22/24 ‘cluster’@’%’ apt install mysql-server mysql-shell(8.0)

      Phân Quyền cho InnoDB Cluster :

      GRANT CREATE USER, FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SELECT, SHUTDOWN, SUPER ON *.* TO 'cluster'@'%' WITH GRANT OPTION;
      GRANT DELETE, INSERT, UPDATE ON mysql.* TO 'cluster'@'%' WITH GRANT OPTION;
      GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata.* TO 'cluster'@'%' WITH GRANT OPTION;
      GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_bkp.* TO 'cluster'@'%' WITH GRANT OPTION;
      GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_previous.* TO 'cluster'@'%' WITH GRANT OPTION;

      Chuẩn bị trên các host 1, 2 ,3 các cấu hình như sau

      nano /etc/mysql/mysql.conf.d/my.cnf

      Host 1:

      #innodb-1
      binlog_checksum = NONE
      enforce_gtid_consistency = ON
      gtid_mode	= ON
      log_slave_updates	 = ON
      master_info_repository   = TABLE
      relay_log_info_repository	= TABLE
      server_id	= 55554
      transaction_write_set_extraction	= XXHASH64
      disable_log_bin
      log_bin	= ON

      Host 2:

      #innodb-2
      binlog_checksum = NONE
      enforce_gtid_consistency = ON
      gtid_mode	= ON
      log_slave_updates	 = ON
      master_info_repository   = TABLE
      relay_log_info_repository	= TABLE
      server_id	= 55555
      transaction_write_set_extraction	= XXHASH64
      disable_log_bin
      log_bin	= ON

      Host 3:

      #innodb-3
      binlog_checksum = NONE
      enforce_gtid_consistency = ON
      gtid_mode	= ON
      log_slave_updates	 = ON
      master_info_repository   = TABLE
      relay_log_info_repository	= TABLE
      server_id	= 55557
      transaction_write_set_extraction	= XXHASH64
      disable_log_bin
      log_bin	= ON

      Trên Mysql Shell đặt tham số và connect để config từng host

      Đặt các tham số :

      var c1 = 'cluster@192.168.33.20:3306'
      var c2 = 'cluster@192.168.33.21:3306'
      var c3 = 'cluster@192.168.33.22:3306'

      Connect từng host và kiểm tra :

      Host 1 : 
          shell.connect(c1)
          dba.configureInstance('cluster@192.168.33.20')
      Host 2 :
          shell.connect(c2)
          dba.configureInstance('cluster@192.168.33.21')
      Host 3 :
          shell.connect(c3)
          dba.configureInstance('cluster@192.168.33.22')

      Kiểm tra trạng thái tiêu chuẩn từng host :

      Host 1 :
      	dba.configureInstance('cluster@192.168.33.20:3306')           -> Status : Ok là đạt
      Host 2 :
      	dba.checkInstanceConfiguration('cluster@192.168.33.21:3306'); -> status OK 
      Host 3 :
      	dba.checkInstanceConfiguration('cluster@thanhnh.id.vn:3306'); 	  -> status OK

      Tóm lại

      Hoàn thành bước pre-checking và chuẩn bị hệ thống giúp bạn tránh các lỗi không mong muốn khi thiết lập MySQL Cluster. Đây là bước quan trọng để bảo đảm hệ thống hoạt động ổn định và hiệu quả.

      Xem thêm

      Tạo MySQL Cluster và Tham Gia Group

      Giới thiệu

      Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

      Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

      https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

      https://mariadb.com/kb/en/galera-cluster

      Phần 4: Tạo MySQL Cluster và Tham Gia Group: Hướng Dẫn Từng Bước

      MySQL Cluster giúp mở rộng quy mô và đảm bảo tính toàn vẹn của dữ liệu bằng cách phân phối trên nhiều nút. Bài viết này sẽ hướng dẫn bạn cách tạo MySQL Cluster và tham gia vào nhóm (group) bằng MySQL Shell.

      Đặt tham số:

      var c1 = 'cluster@192.168.33.20:3306'
      var c2 = 'cluster@192.168.33.21:3306'
      var c3 = 'cluster@192.168.33.22:3306'

      Host 1: Connect vào host và tạo Cluster

      shell.connect(c1)
      var cluster = dba.createCluster('groupa');

      Connect từng Cluster vào Group

      cluster.addInstance(c2) -> Incremental (I)
      cluster.addInstance(c3) -> Incremental (I)

      Cài đặt bầu chọn Node chính và Node phụ

      Bầu chọn node nào sẽ làm node chính, node phụ. Với những môi trường thiếu tài nguyên thì đây là một cách để tối ưu tài nguyên phần cứng. Tuy nhiên, khuyến nghị nhà cung cấp nên là các host tương đồng như nhau về mặt tài nguyên để đảm bảo hệ thống chạy thông suốt

      • Member Weight : 0 -> 100
      • Default 50 !
      • Member Weight càng cao -> Primary

      Có 3 cách như sau:

      Cách 1:

      dba.createCluster('cluster1', {memberWeight:35})
      var mycluster = dba.getCluster()
      mycluster.addInstance('icadmin@ic2', {memberWeight:25})
      mycluster.addInstance('icadmin@ic3', {memberWeight:50})

      Cách 2:

      Kiểm tra trên các node : sử dụng Heavy Weight . Heavy Weight càng CAO -> PRIMARY

      mysql> select member_host,member_state,member_role,member_version from performance_schema.replication_group_members;

      Kiểm tra Server Weight trên các node:

      [root@innodb1 ~]# mysql -e "select @@hostname, @@group_replication_member_weightG"
      [root@innodb2 ~]# mysql -e "select @@hostname, @@group_replication_member_weightG"
      [root@innodb3 ~]# mysql -e "select @@hostname, @@group_replication_member_weightG"

      Set trên host muốn đặt làm Primary node:

      mysql> set global group_replication_member_weight = 70;
      ## Default : 50

      Cách 3:

      Sử dụng group_replication_set_as_primary. Tại host muốn làm Primary:

      Show UUID:

      mysql> show global variables like 'server_uu%';

      Set primary:

      mysql> select group_replication_set_as_primary('c5aed435-d58d-11ea-bb26-5254004d77d3');

      Kiểm tra lại:

      mysql> select member_host,member_state,member_role,member_version from performance_schema.replication_group_members;

      Tóm lại

      Sau khi hoàn thành việc tạo cluster và tham gia group, hệ thống của bạn đã sẵn sàng xử lý lượng lớn dữ liệu với độ tin cậy cao. Tiếp theo, hãy đảm bảo rằng bạn cấu hình MySQL Router để tối ưu hóa kết nối.

      Xem thêm

      Cài Đặt và Cấu Hình MySQL Router: Kết Nối Cluster An Toàn

      Giới thiệu

      Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

      Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

      https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

      https://mariadb.com/kb/en/galera-cluster

      Phần 5 : Cài Đặt và Cấu Hình MySQL Router – Kết Nối Cluster An Toàn

      MySQL Router là công cụ quan trọng giúp điều hướng kết nối giữa các ứng dụng và cluster. Trong bài viết này, chúng ta sẽ tìm hiểu cách cài đặt và cấu hình MySQL Router để đảm bảo kết nối an toàn và tối ưu giữa các nút trong cluster.

      Cài đặt MySQL Router

      Sử dụng APT Package Manager(Ubuntu):

      sudo dpkg -i mysql-apt-config_0.8.30-1_all.deb

      Update  APT repository:

      sudo apt-get update

      Install  MySQL Router:

      sudo apt-get install mysql-router-community

      Sử dụng RPM packages (CentOS):

      install the MySQL Yum repository as described

      sudo rpm -Uvh mysql84-community-release-el7-1.noarch.rpm

      Cấu hình tuỳ chọn thay đổi phiên bản 8.4 hoặc 8.0

       sudo yum-config-manager --disable mysql-8.4-lts-community
       sudo yum-config-manager --enable  mysql80-community
      
       sudo yum-config-manager --disable mysql-tools-8.4-lts-community
       sudo yum-config-manager --enable  mysql-tools-community

       Install MySQL Router

      sudo yum install mysql-router-community

      Cấu hình MySQL Router:

      Tạo folder

      mkdir /etc/mysqlrouter/mysql-router

      Cấu hình sử dụng bootstrap

       mysqlrouter --bootstrap cluster@192.168.33.20:3306 --directory /etc/mysqlrouter/mysql-router --user=root

      Output như sau

      
      # Bootstrapping MySQL Router instance at '/etc/mysqlrouter/mysql-router'...
      
      Error: It appears that a router instance named '' has been previously configured in this host. If that instance no longer exists, use the --force option to overwrite it.
      root@dbrouter:/etc/mysqlrouter# mysqlrouter --bootstrap cluster@192.168.33.20:3306 --directory /etc/mysqlrouter/mysql-router --user=root --force
      Please enter MySQL password for cluster: 
      # Bootstrapping MySQL Router instance at '/etc/mysqlrouter/mysql-router'...
      
      - Creating account(s) (only those that are needed, if any)
      - Verifying account (using it to run SQL queries that would be run by Router)
      - Storing account in keyring
      - Adjusting permissions of generated files
      - Creating configuration /etc/mysqlrouter/mysql-router/mysqlrouter.conf
      
      # MySQL Router configured for the InnoDB Cluster 'groupa'
      
      After this MySQL Router has been started with the generated configuration
      
          $ mysqlrouter -c /etc/mysqlrouter/mysql-router/mysqlrouter.conf
      
      InnoDB Cluster 'bestprice' can be reached by connecting to:
      
      ## MySQL Classic protocol
      
      - Read/Write Connections: thanhnh.id.vn:6446
      - Read/Only Connections:  thanhnh.id.vn:6447
      
      ## MySQL X protocol
      
      - Read/Write Connections: thanhnh.id.vn:6448
      - Read/Only Connections:  thanhnh.id.vn:6449
      
      -----------------------
      Create a systemd service file to start the mysql router :
          nano /etc/systemd/system/mysqlrouter-cluster.service
      ----------------------- ## Paste to config file
      [Unit]
      
      Description=MySQL Router
      
      After=syslog.target
      
      After=network.target
       
      
      [Service]
      
      Type=simple
      
      User=root
      
      Group=root
      
      PIDFile=/etc/mysqlrouter/mysql-router/mysqlrouter.pid
      
      ExecStart=/bin/bash -c "/usr/bin/mysqlrouter -c /etc/mysqlrouter/mysql-router/mysqlrouter.conf"
      
       
      Restart=on-failure
      
      RestartPreventExitStatus=1
      
      PrivateTmp=true
       
      [Install]
      
      WantedBy=multi-user.target

      Khởi động lại MySQL Router:

      systemctl daemon-reload
      systemctl start mysqlrouter-groupa
      systemctl status mysqlrouter-groupa

      Tóm lại

      Với MySQL Router, bạn đã hoàn thành việc kết nối các ứng dụng với MySQL Cluster một cách an toàn và hiệu quả. Để đảm bảo hệ thống hoạt động trơn tru, hãy tiếp tục theo dõi và tối ưu hóa cluster của bạn.

      Xem thêm

      Giám Sát Hiệu Suất MySQL Cluster: Các Công Cụ và Phương Pháp Hiệu Quả

      Giới thiệu

      Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

      Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

      https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

      https://mariadb.com/kb/en/galera-cluster

      Phần 6: Giám Sát Hiệu Suất MySQL Cluster – Các Công Cụ và Phương Pháp Hiệu Quả

      Giám sát hiệu suất là yếu tố quyết định để đảm bảo MySQL Cluster hoạt động ổn định và hiệu quả. Bài viết này giới thiệu các công cụ và phương pháp giám sát hiệu suất của MySQL Cluster thông qua MySQL Shell.

      Trên Mysql Shell:

      var cluster = dba.getCluster()
      cluster.describe()
      cluster.status()

      Các thông tin hiện ra như sau:

      STATUS:

      • OK : Online và có thể hỗ trợ n node sập
      • OK_PARTIAL : Giống OK nhưng có một hoặc nhiều server chưa sẵn sàng là active members
      • OK_NO_TOLERANCE : Cluster chưa sẵn sàng để sập
      • OK_NO_TOLERANCE_PARTIAL : Cluster chưa sẵn sàng để sập và cluster có vài thành viên trong tình trạng offline , recovering, error, unreachable
      • NO_QUORUM : Member ko thể thực hiện những bản ghi Write
      • OFFLINE : offline
      • UNREACHABLE : Không có kết nối tới online members
      • UNKNOWN : Không có kết nối tới online members
      • FENCED_WRITES : cluster gặp vấn đề trong traffic ghi (WRITE)

      TOPOLOGY:

      • ONLINE : online
      • OFFLINE : offline
      • RECOVERING : đang đồng bộ với cluster trước khi online
      • UNREACHABLE : Mất kết nối
      • ERROR : Lỗi trong khi khôi phục hoặc apply những transactions mới
        * : Khi Srv ERROR, super_read_only sẽ set ON. Để thoát ERROR, sẽ phải thủ công cấu hình super_read_only=OFF
      • MISSING: Host đang là một phần trong cluster nhưng không có tại thời điểm hiện tại
      • MySQL Shell sử dụng state để biểu thị Instances được đăng kí trong metadata, nhưng ko thể tìm thấy ở trong cluster view

      Để hiện thị nhiều hơn thông tin

      Cluster.status({'extended':value})
      • 0 : Tắt những thông tin cơ bản ( defaults )
      • 1 : Bao gồm những thông tin về phiên bản, giao tiếp, UUIDS, Vai trò của thành viên và cluster được báo cáo bởi GRoup Replication
      • 2 : Bao gồm những thông tin về tiến trình transactions bởi kết nối và áp dụng
      • 3 : Nhiều data cụ thể hơn về hiệu năng replication bởi từng member cluster.

      Tóm lại

      Giám sát hiệu suất thường xuyên giúp bạn nắm bắt kịp thời các vấn đề tiềm ẩn, từ đó tối ưu hóa hệ thống. Đừng quên sử dụng các công cụ phù hợp để giữ MySQL Cluster của bạn ở trạng thái tốt nhất.

      Phần trước

      Xem tiếp

      Cấu Hình MySQL Shell Qua Command Line: Các Lệnh Quan Trọng Bạn Cần Biết

      Giới thiệu

      Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

      Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

      https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

      https://mariadb.com/kb/en/galera-cluster

      Phần 7: Cấu Hình MySQL Shell Qua Command Line – Các Lệnh Quan Trọng Bạn Cần Biết

      MySQL Shell là công cụ mạnh mẽ giúp quản lý và cấu hình hệ thống cơ sở dữ liệu thông qua command line. Bài viết này sẽ giới thiệu những lệnh quan trọng trong MySQL Shell mà bạn cần biết để quản lý hiệu quả.

      Command line to configureInstance:

      dba.configureInstance()
      
      dba.createCluster()
      
      Cluster.addInstance()
      
      Cluster.removeInstance()
      
      Cluster.rejoinInstance()
      	
      dba.checkInstanceConfiguration()
      	
      dba.configureInstance() 

      Dừng replication trên Slave:

      STOP SLAVE;

      Khởi động lại replication trên Slave:

      START SLAVE;

      Hiển thị trạng thái replication:

      SHOW SLAVE STATUSG;

      Đồng bộ master với slave:

      RESET SLAVE ALL;

      MySQL Group Replication

      Cài đặt Plugin Group Replication:

      INSTALL PLUGIN group_replication SONAME 'group_replication.so';

      Khởi động Group Replication trên mỗi node:

      START GROUP_REPLICATION;

      MySQL Shell cho InnoDB Cluster

      Truy cập MySQL Shell:

      mysqlsh --uri root@thanhnh.id.vn

      Tạo một Cluster mới:

      dba.createCluster('myCluster');

      Thêm các node vào Cluster:

      cluster = dba.getCluster('myCluster');
      cluster.addInstance('root@node_ip:3306');

      Kiểm tra trạng thái Cluster:

      cluster.status();

      Restoring and Rebooting Cluster

      Trong trường hợp Instances không thể kết nối lại sau khi sập thì

      Cluster.rejoinInstance(instance)

      Nếu instance super_read_only=on thì bạn cần chắc chắn rằng AdminAPI có thể set super_read_only=OFF. Trong trường hợp Instances không có cấu hình kết dính ( persisted ), khi restart instance sẽ không tự động join lại. Như vậy sẽ phải thủ công để rejoinInstance(instance)

      Trong trường hợp server_UUID thay đổi thì sẽ phải remove và thêm lại thủ công với option force

      cluster.removeInstance("root@instanceWithOldUUID:3306", {force: true})
      
      cluster.rescan()

      Reboot Cluster

      var cluster = dba.rebootClusterFromCompleteOutage()
      • Nếu toàn bộ members có cùng GTID, thì member đang kết nối sẽ là Primary
      • Nếu members đang RECOVERING hoặc ERROR và toàn bộ member khác OFFLINE hoặc ERROR
      • rebootClusterFromCompleteOutage() sẽ stop Group Replication, Nếu Group Replication fail to stop, command sẽ bị dừng và hiển thị Lỗi

      Tóm lại

      Việc nắm vững các lệnh command line trong MySQL Shell sẽ giúp bạn quản lý hệ thống cơ sở dữ liệu một cách dễ dàng và linh hoạt. Hãy áp dụng những lệnh này để tối ưu hiệu quả quản trị.

      Phần trước

      Xem tiếp

      Khắc Phục Lỗi Thường Gặp Và Mẹo Sử Dụng MySQL Shell Hiệu Quả

      Giới thiệu

      Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

      Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

      https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

      https://mariadb.com/kb/en/galera-cluster

      Phần 8: Khắc Phục Lỗi Thường Gặp Và Mẹo Sử Dụng MySQL Shell Hiệu Quả

      Trong quá trình sử dụng MySQL Shell, người dùng thường gặp phải một số lỗi phổ biến. Bài viết này sẽ cung cấp các mẹo hữu ích và giải pháp khắc phục nhanh chóng, giúp bạn làm chủ MySQL Shell hiệu quả hơn.

      Lỗi Libreadline7

      Trong một số trường hợp ( ubuntu 20.04 ) gặp trình trạng install mysql-shell sẽ dẫn đến lỗi thiếu thư viện libreadline7. Để tránh trường hợp xảy ra lỗi thì đây sẽ là giải pháp đơn giản để khắc phục

      sudo nano /etc/apt/sources.list

      Add to bottom:

      deb http://cz.archive.ubuntu.com/ubuntu bionic main

      Update repository:

      sudo apt update

      Install Libreadline7:

       apt install libreadline7 -y

      Cluster error

      Không remove hoặc delete table vì super_read_only=on

      Turn off group_replication:

      STOP GROUP_REPLICATION;

      Turn off super_read_only:

      SET GLOBAL read_only = OFF;

      Delete, remove table, database:

      Turn on super_read_only:

      SET GLOBAL read_only = ON;

      Turn on group_replication:

      START GROUP_REPLICATION;

      Gặp vấn đề với các table MyISAM

      Do MySQL InnoDB Cluster chỉ hoạt động với table type innodb nên ta cần convert toàn bộ table MyISAM về InnoDB

      List toàn bộ table myISAM ( Thực hiện trên host khác chạy độc lập), có 2 cách:

      Cách 1:

          mysql -u root -p
      
          SET @DATABASE_NAME = 'name_of_your_db';
      
          SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statements
          FROM    information_schema.tables AS tb
          WHERE   table_schema = @DATABASE_NAME
          AND     `ENGINE` = 'MyISAM'
          AND     `TABLE_TYPE` = 'BASE TABLE'
          ORDER BY table_name DESC;

      Tuy nhiên cách trên sẽ gặp lỗi những table, field date formart. Cách 2 sẽ xử lý triệt để

      Cách 2:

      List toàn bộ table MyISAM

          SELECT table_name FROM INFORMATION_SCHEMA.TABLES
          WHERE engine = 'MyISAM' 

      Convert toàn bộ sang InnoDB với options ignore lỗi formart

          SET SQL_MODE='ALLOW_INVALID_DATES';
      
          ALTER TABLE <Table> ENGINE=InnoDB;

      Sau đó convert table và import vào hệ thống innodb Cluster

          mysql -u root -h thanhnh.id.vn -P 6446 -p 
          create table database character set utf8 collate utf8_bin;
          create user 'database'@'%' identified by 'password';
          Grant all privileges on database.* to 'database'@'%';
          use database;
          source <path-to-database>

      Bằng cách nắm vững những mẹo khắc phục lỗi trong MySQL Shell, bạn có thể giải quyết vấn đề nhanh chóng và duy trì hiệu suất làm việc ổn định. Hãy lưu lại những mẹo này để tối ưu hóa trải nghiệm của bạn.

      Tham khảo các bài viết trước

      Linux

      Quản trị Linux là quá trình quản lý và vận hành hệ thống máy chủ và máy tính chạy trên nền tảng hệ điều hành Linux. Đây là một công việc quan trọng và phức tạp, đòi hỏi kiến thức sâu về cấu trúc hệ thống, quản lý người dùng, cài đặt và cấu hình phần mềm, bảo mật hệ thống, cùng với việc giám sát và khắc phục sự cố. Với ưu điểm là một hệ điều hành mã nguồn mở, Linux đem lại sự linh hoạt cao, chi phí thấp, và khả năng tùy chỉnh lớn, giúp nó trở thành lựa chọn phổ biến trong môi trường doanh nghiệp, các trung tâm dữ liệu, và đặc biệt trong lĩnh vực công nghệ thông tin. Người quản trị Linux cần am hiểu về dòng lệnh, quyền truy cập, và các công cụ quản lý hệ thống để duy trì sự ổn định, bảo mật và hiệu suất cao cho hệ thống, đảm bảo hoạt động trơn tru và đáp ứng yêu cầu của người dùng.

      Linux System Hardening: Chiến lược cấu hình Firewall với NFTables/IPtables trên Ubuntu 20.04+

      Linux System Hardening: Chiến lược cấu hình Firewall với NFTables/IPtables trên Ubuntu 20.04+

      Giới thiệu

      Linux System Hardening là quá trình củng cố an toàn hệ thống Linux bằng cách áp dụng các thực hành và chuẩn mực bảo mật được công nhận. Với nền tảng Ubuntu 20.04 trở lên, chiến lược cấu hình tường lửa và quản lý lưu lượng mạng thông qua NFTables hoặc IPTables đóng vai trò then chốt trong lớp phòng thủ phía biên. Bài viết này trình bày cách tiếp cận thực tế và có thể triển khai được, đồng thời tham chiếu các chuẩn bảo mật đáng tin cậy như CIS Benchmarks cho Ubuntu và các công cụ xác thực, quét tuân thủ để đảm bảo hệ thống vận hành an toàn trong production.

      Trong khuôn khổ tài liệu, chúng ta tập trung vào các khía cạnh thực tiễn: cách thiết lập và giám sát cấu hình kernel nhằm hạn chế rủi ro từ mạng, cách tham gia các chuẩn bảo mật và các hoạt động kiểm thử xác thực nhằm giảm thiểu sự lệ thuộc vào các cài đặt thủ công dễ bị bỏ sót. Nội dung dựa trên nguồn tài liệu được xác thực, đồng thời giữ nguyên tính thực tiễn cho quản trị viên hệ thống và đội ngũ bảo mật.

      Kiến trúc và khái niệm cốt lõi

      Khung làm việc và vai trò của sysctl trong hardening

      Sysctl là một cơ chế để cấu hình một số khía cạnh của kernel ở thời gian chạy, và thư mục /proc/sys/ cho phép quản trị viên thực hiện cấu hình mà không cần công cụ đặc thù. Thực hành này đặc biệt hữu ích trong công tác hardening hệ thống, cho phép tinh chỉnh hành vi mạng và tài nguyên hệ thống một cách linh hoạt. Quá trình khám phá và áp dụng các tham số mạng thường bắt đầu bằng việc liệt kê toàn bộ tham số có thể điều chỉnh thông qua sysctl và sau đó áp dụng các thay đổi theo đúng yêu cầu bảo mật.

      Tài liệu tham khảo cho khung này nhấn mạnh rằng việc điều chỉnh kernel từ run-time thông qua sysctl là một phần của quá trình bảo mật, và /proc/sys/ chứa nhiều subdir liên quan đến mạng, hệ thống tập tin, quản lý bộ nhớ và các yếu tố khác. Do đó, để thực thi chiến lược firewall và cứng hóa mạng, cần hiểu cách các tham số này tương tác với lưu lượng và hành vi bảo mật của hệ thống.

      Vai trò của CIS Benchmarks và chuẩn bảo mật cho Ubuntu

      Trong khuôn khổ hardening hệ thống Ubuntu, CIS (Center for Internet Security) cung cấp tập hợp các chuẩn cấu hình an toàn cho Ubuntu Linux. Các chuẩn này được cập nhật liên quan đến phiên bản Ubuntu 20.04 LTS và các phiên bản kế tiếp, kèm theo các công cụ kiểm tra tự động như CIS Build Kits và CIS-CAT Pro để tự động hoá đánh giá tuân thủ. Các chuẩn bảo mật này đóng vai trò làm khung tham chiếu cho việc thiết kế và triển khai firewall, quản lý quyền truy cập, và kiểm tra cấu hình hệ thống so với baseline an toàn đã được cộng đồng và CIS xác nhận.

      Ngoài các hướng dẫn cấu hình, CIS Benchmarks cung cấp các công cụ hỗ trợ tự động hoá đánh giá và kiểm tra tuân thủ. Điều này cho phép đội ngũ vận hành rà soát nhanh chóng các thiết lập firewall, cấu hình kernel và các biện pháp bảo mật liên quan đến mạng để đảm bảo hệ thống luôn ở trạng thái an toàn và ghi nhận được. Việc sử dụng CIS Benchmarks và các Build Kits tương ứng giúp đội ngũ bảo mật và quản trị viên có một tiêu chuẩn kiểm tra nhất quán khi triển khai firewall trên Ubuntu 20.04+.

      Yêu cầu và chuẩn bị

      Khảo sát môi trường và nền tảng

      Với nền tảng Ubuntu 20.04 LTS và các bản vá mới hơn, chiến lược hardening nên được thiết kế để tương thích với các công cụ và chuẩn bảo mật đã được công nhận. Việc xác nhận nền tảng trước khi bắt đầu triển khai firewall và các biện pháp bảo mật là bước căn bản nhằm đảm bảo các quy tắc và công cụ được áp dụng đúng ngữ cảnh và phù hợp với phiên bản hệ điều hành.

      Chuẩn bị công cụ và nguồn tham khảo

      Đối với hoạt động hardening và kiểm tra tuân thủ, việc tham khảo CIS Ubuntu Linux Benchmarks là rất quan trọng. CIS Benchmarks cho Ubuntu Linux bao gồm các gợi ý cấu hình an toàn và tối ưu cho hệ thống, và có sẵn dưới dạng các tài nguyên như CIS Build Kits và CIS-CAT Pro để tự động hoá đánh giá. Việc tiếp cận các bộ công cụ này giúp đội ngũ vận hành thiết lập baseline an toàn cho firewall, ghi nhận các thay đổi và theo dõi sự tuân thủ theo thời gian.

      Chuẩn bị công cụ kiểm tra và đánh giá tuân thủ

      Ngoài CIS, các hoạt động quét và kiểm tra tuân thủ có thể được thực hiện thông qua các công cụ quét và chuẩn SCAP. Quá trình rà soát cấu hình hệ thống, lỗ hổng, và sự phù hợp với baseline có thể được hỗ trợ bởi các công cụ như SCAP Workbench hoặc các giải pháp tương tự. Các bước này giúp đảm bảo rằng các thay đổi cấu hình firewall và các tham số kernel được rà soát và xác nhận theo chuẩn bảo mật hiện hành.

      Cấu hình và triển khai thực tiễn

      Do giới hạn về nguồn tài liệu gốc, phần này trình bày khung làm việc và nguyên tắc triển khai ở mức thực tiễn, cùng với cách áp dụng chuẩn từ CIS Benchmarks và các công cụ xác thực để đảm bảo tính tuân thủ. Lưu ý rằng nội dung này nhấn mạnh cách tiếp cận, không phải hướng dẫn chi tiết từng lệnh hay quy tắc cụ thể mà có thể thay đổi theo từng môi trường và phiên bản phát hành.

      Phác thảo chiến lược firewall và quản lý tuyến lưu lượng

      Khi xây dựng chiến lược firewall cho Ubuntu 20.04+, mục tiêu là đảm bảo biên bảo vệ ở mức phù hợp, đồng thời cho phép các dịch vụ cần thiết hoạt động mà không phơi bày hệ thống trước các rủi ro. Việc sử dụng các chuẩn cấu hình từ CIS Benchmarks cho Ubuntu giúp xác định baseline cho các tham số liên quan đến mạng, logging, và quản lý truy cập. Các nguyên tắc chung bao gồm thiết lập chính sách mặc định nghiêm ngặt, ghi nhận đầy đủ và giám sát quá trình thay đổi cấu hình, đồng thời đảm bảo khả năng khôi phục khi cần.

      Quản lý cấu hình kernel và tham số mạng

      Trong quá trình hardening, quản trị viên có thể xem và thay đổi các tham số kernel liên quan đến mạng thông qua sysctl. Các tham số này nằm trong các subdir của /proc/sys/ và có thể ảnh hưởng đến cách hệ thống xử lý lưu lượng và các cơ chế bảo vệ mạng. Việc sử dụng sysctl cho run-time tuning cho phép kiểm tra nhanh và áp dụng các thay đổi nếu cần thiết để tăng cường bảo mật mạng và hạn chế các vector tấn công phổ biến.

      Đối với các tham số mạng và hệ thống, quản trị viên nên bắt đầu từ việc liệt kê các tham số có thể điều chỉnh và xác định những tham số có ảnh hưởng trực tiếp đến an toàn của mạng và hệ thống. Sau khi xác định các tham số cần tối ưu, có thể áp dụng thay đổi ở thời gian chạy và theo dõi tác động của chúng, đồng thời ghi lại các thay đổi để phục vụ cho quá trình audit và tuân thủ.

      Triển khai và tuân thủ baseline

      Quá trình triển khai firewall và cấu hình hệ thống nên được đồng bộ với baseline bảo mật được xác nhận từ CIS Benchmarks cho Ubuntu. Điều này giúp đảm bảo rằng thiết lập firewall, các tham số mạng và các biện pháp kiểm soát truy cập đã được kiểm tra và xác nhận phù hợp với chuẩn công nhận. Sử dụng CIS Build Kits và CIS-CAT Pro hỗ trợ đánh giá tự động và theo dõi tuân thủ theo thời gian.

      Cách tiếp cận bằng công cụ kiểm tra và quét

      Trong khuôn khổ kiểm tra và xác thực, các công cụ SCAP và SCAP Workbench có thể được sử dụng để quét cấu hình hệ thống và đánh giá tuân thủ baseline. Các kết quả từ SCAP có thể được so sánh với chuẩn CIS hoặc các baseline nội bộ để phát hiện chênh lệch và lên kế hoạch remediate. Bên cạnh đó, các công cụ như AIDE hoặc các giải pháp kiểm tra integrity có thể được triển khai để đảm bảo tính toàn vẹn của hệ thống sau khi áp dụng firewall và thay đổi cấu hình.

      Ví dụ thực tiễn và diễn tập

      Trong khuôn khổ tài liệu, ta sẽ nêu các hướng dẫn thực tế chung về xác nhận và kiểm tra cấu hình bảo mật, đồng thời chỉ ra cách tiếp cận chuẩn để đảm bảo sự tuân thủ và sẵn sàng cho sản xuất.

      • Kiểm tra và đánh giá trạng thái hệ thống trước khi triển khai firewall: xác nhận phiên bản Ubuntu, tình trạng vá an toàn, và cấu hình baseline cho mạng.
      • Khởi tạo và xác nhận khung baseline bảo mật bằng CIS Benchmarks cho Ubuntu 20.04+ và Build Kits liên quan.
      • Thực hiện quét tuân thủ và cấu hình theo SCAP với SCAP Workbench hoặc công cụ tương tự; ghi nhận các báo cáo và theo dõi remediation.
      • Kiểm tra run-time và sự phù hợp của tham số kernel liên quan đến mạng bằng sysctl: liệt kê tham số, áp dụng thay đổi và xác nhận bằng sysctl -a.

      Dưới đây là các ví dụ cú pháp tham khảo mang tính khái quát và được dùng để minh họa quá trình làm việc:

      sysctl -a
      sysctl -w <tên_tham_số>=<giá_trị>

      Những lệnh trên cho phép quản trị viên xem toàn bộ tham số hiện có và áp dụng các thay đổi ở thời gian chạy. Sau khi thực hiện, có thể xác nhận lại bằng cách liệt kê tham số cần xem lại để đảm bảo thay đổi đã có hiệu lực.

      Đối với kiểm tra baseline và tuân thủ, hãy tham khảo các tài nguyên như CIS Benchmarks cho Ubuntu 20.04 và các Build Kits tương ứng. Quá trình này có thể được hỗ trợ bởi các công cụ kiểm tra tự động, giúp đội ngũ vận hành nhanh chóng nhận diện các cấu hình bất hợp lý so với chuẩn đã công nhận.

      Bảo mật, hiệu suất và giám sát

      Hardening không chỉ là thiết lập một vài tham số. Nó còn là việc cân bằng giữa bảo mật và hiệu suất, đảm bảo mạng vẫn đáp ứng yêu cầu dịch vụ mà không mở cửa cho rủi ro. Việc giám sát liên tục và kiểm tra tuân thủ là phần thiết yếu để duy trì tình trạng an toàn của hệ thống theo thời gian.

      Những khía cạnh sau đây là cần xem xét khi vận hành firewall và các biện pháp kernel-tuning trên Ubuntu 20.04+:

      • Đồng bộ với các chuẩn bảo mật: CIS Benchmarks cho Ubuntu và các biện pháp kiểm tra tự động để đảm bảo baseline luôn được duy trì qua các cập nhật và thay đổi môi trường.
      • Audit và giám sát: sử dụng các công cụ quét và kiểm tra tuân thủ để theo dõi sự xuất hiện của các thay đổi cấu hình không được chấp thuận và đánh giá ảnh hưởng lên bảo mật.
      • Hiệu suất và tài nguyên: kiểm tra tác động của các tham số mạng và quy tắc firewall đối với thông lượng và độ trễ, đảm bảo dịch vụ vẫn hoạt động ổn định.
      • Khôi phục khẩn cấp và ghi nhận: duy trì sổ nhật ký thay đổi và sẵn sàng cho việc phục hồi khi cần thiết, đồng thời ghi nhận các bước remediation cho audit trail.

      Kiểm tra, validates và vận hành

      Việc kiểm tra và xác thực là một phần không thể thiếu của chu kỳ vận hành hệ thống. Theo nguồn tài liệu tham khảo, CIS Benchmarks và SCAP cho phép tổ chức thực hiện các bước kiểm tra baseline một cách có hệ thống, từ đó phát hiện và khắc phục kịp thời các điểm yếu. Các hoạt động kiểm tra có thể bao gồm:

      • Đánh giá tuân thủ baseline cho Ubuntu 20.04+ bằng CIS Build Kits và CIS-CAT Pro để đảm bảo firewall và cấu hình liên quan đến mạng đã tuân thủ chuẩn.
      • Quét cấu hình và lỗ hổng bằng các công cụ SCAP hoặc SCAP Workbench; so sánh với baseline và lập kế hoạch remediation nếu có sự chênh lệch.
      • Kiểm tra tính toàn vẹn hệ thống bằng các công cụ như AIDE và các biện pháp bảo mật tích hợp khác để đảm bảo không có thay đổi trái phép sau khi cấu hình firewall được triển khai.

      Trong thực tế, khung kiểm tra có thể được tích hợp vào quy trình CI/CD hoặc quy trình vận hành hàng ngày để đảm bảo rằng mọi thay đổi trong cấu hình mạng, firewall và kernel được kiểm tra và xác nhận trước khi đưa vào sản xuất.

      Checklist vận hành cuối bài viết

      • Xác định và xác nhận nền tảng Ubuntu 20.04+ và các bản vá liên quan.
      • Áp dụng baseline bảo mật từ CIS Benchmarks cho Ubuntu và ghi nhận bằng Build Kits hoặc công cụ kiểm tra tương đương.
      • Định nghĩa chiến lược firewall ở mức high-level và sử dụng sysctl để tinh chỉnh các tham số kernel liên quan đến mạng khi cần.
      • Thực hiện quét tuân thủ và đánh giá cấu hình bằng SCAP Workbench hoặc công cụ tương đương; ghi nhận kết quả và remediation.
      • Kiểm tra và đảm bảo sự toàn vẹn hệ thống sau khi thay đổi cấu hình, sử dụng AIDE và các công cụ kiểm tra tích hợp khác.
      • Xây dựng quy trình ghi nhận thay đổi, backup cấu hình và khôi phục hệ thống khi xảy ra sự cố.

      Kết luận

      Chiến lược cấu hình firewall và các biện pháp hardening trên Ubuntu 20.04+ nên được xây dựng trên nền tảng chuẩn mực và kiểm tra tuân thủ. Việc sử dụng CIS Benchmarks cho Ubuntu, cùng với công cụ quét và đánh giá tự động, giúp vận hành viên gia tăng đáng kể khả năng nhận diện và khắc phục các rủi ro bảo mật liên quan đến firewall và lưu lượng mạng. Đồng thời, việc quản lý thông qua sysctl và các tham số kernel cho phép tinh chỉnh hành vi hệ thống theo nhu cầu bảo mật mà vẫn đảm bảo tính sẵn sàng và hiệu suất dịch vụ.

      Tìm hiểu Distro và các bản phân phối Linux

      Giới thiệu distro

      • Distro là từ viết tắt thay thế cho Linux Distribution – bản phân phối của Linux – là một hệ điều hành được tập hợp từ nhiều phần mềm dựa trên nhân Linux (Linux Kernel) và thường có một hệ thống quản lý các gói tin.
      • Thành phần: Một bản distro điển hình bao gồm: một kernel Linux, các công cụ và thư viện GNU, các phần mềm thêm vào, phần document, một hệ thống window system (mà phần lớn là sử dụng X Window System – hệ thống cửa sổ dùng để hiển thị đồ họa Bitmap), window manager và desktop environment.
      • Hiện tại, có khoảng 600 bản distro tồn tại, với gần 500 trong số đó phát triển tích cực, liên tục được sửa đổi và cải thiện. Bởi sự sẵn có của số lượng lớn phần mềm, distro khá là đa dạng về hình thức – phù hợp với từ desktop, server, laptop, netbooks, điện thoại di động, máy tính bảng cũng như môi trường tối thiếu thường để sử dụng trong các hệ thống nhúng.
      • Có nhiều bản phân phối thương mại như Fedora (Red hat), OpenSUSE (SUSE), Ubuntu (Canonical Ltd); và hoàn toàn phân phối dựa vào cộng đồng như Debian, Slackware, Gentoo hay Arch Linux.

      Loại hình và xu hướng phát triển

      Nói chung, các bản phân phối Linux thể là:

      • – Thương mại hoặc phi thương mại
      • – Thiết kế cho người dùng doanh nghiệp, người dùng chuyên nghiệp hay cho người dùng gia đình.
      • – Hỗ trợ nhiều nền tảng phần cứng, hoặc nền tảng riêng, thậm chí đến mức chứng nhận bởi các nhà cung cấp nền tảng.
      • – Thiết kế cho máy chủ, máy tính cá nhân, hoặc cho thiết bi nhúng.
      • – Mục đích chung hoặc có chuyên môn cao về phía các chức năng máy cụ thể (ví dụ: tường lửa, router mạng, và điện toán cụm).
      • – Nhắm đến nhóm người dùng cụ thể, ví dụ thông qua việc quốc tế và bản địa hóa ngôn ngữ, hoặc thông qua bao gồm nhiều sản phẩm âm nhạc hoặc các gói tính toán khoa học.
      • – Xây dựng chủ yếu cho an ninh, khả năng sử dụng, tính di động, hoặc toàn diện.

      Các nhánh distro phổ biến

      • Là một bản phân phối phi thương mại và là một trong những bản phân phối ra đời sớm nhất, duy trì bởi một cộng đồng phát triển tình nguyện với một cam kết mạnh mẽ cho nguyên tắc phần mềm miễn phí và quản lý dự án dân chủ.
      • Có 3 dạng khác nhau:
        • Phiên bản ổn định mà người dùng được khuyến khích sử dụng.
        • Phiên bản không ổn định.
        • Phiên bản thử nghiệm cho những ai mong muốn có được phần mềm mới nhất.
      • Hệ thống gói quản lý phần mềm sử dụng:
        • dpkg  cài đặt các gói phần mềm .deb
        • apt cài đặt phần mềm từ các kho trên mạng.

      Debian có chính sách nghiêm ngặt đối với chất lượng các gói và bản phát hành cũng như tiến trình phát triển và kiểm tra mở. Cách này giúp cho việc nâng cấp các bản phát hành cũng như việc đặt hay gỡ bỏ dễ dàng hơn.

      • Có khá nhiều distro phát triển dựa trên distro Debian như: Raspbian, Knoppix, Astra Linux, Kali Linux, … và phổ biến nhất là nhánh Ubuntu

      Ubuntu

      – Do công ty Canonical phân phối chỉ mới xuất hiện vào quý 3/2004 và không lâu sau đó HĐH này đã trở nên phổ biến, uy tín về chất lượng và dễ dàng sử dụng.

      – Dựa trên hệ thống quản lý gói mạnh mẽ APT của Debian, nhắm đến đối tượng người dùng đầu cuối, nhỏ gọn chỉ với 1 đĩa cài đặt. Người dùng Ubuntu có thể cảm nhận được sự tự do, tùy biến cao trong sử dụng, quản lý hệ thống.

      – Theo thống kê của trang Distrowatch, cho đến hiện nay Ubuntu là distro phổ biến nhất với khoảng hơn 2.000 lượt người truy cập/ngày.

      – Cứ 6 tháng, Ubuntu sẽ ra bản phát hành mới, còn với các phiên bản Long Term Support (LTS) thì việc cập nhật trình bảo mật sẽ từ 3 đến 5 năm.

      – Cách đặt tên của Ubuntu theo định dạng YY.MM trong đó YY là năm phát hành và MM là tháng phát hành.

      – Ubuntu sử dụng giao diện đồ họa thân thiện GNOME, hướng đến sự đơn giản hóa trong quá trình sử dụng. Ngoài ra, Ubuntu còn có bộ ứng dụng văn phòng OpenOffice, trình duyệt Firefox, trình gửi tin nhắn tức thời Pidgin, trình biên tập đồ họa GIMP…

      • Ngoài Ubuntu, các nhà phát triển còn sản sinh ra các distro mang hơi hướng tương tự Ubuntu như KubuntuXubuntu và LunbuntuLinux Mint. Các distro này chủ yếu khác biệt với Ubuntu ở giao diện màn hình.

      Fedora

      • Là một bản phân phối cộng đồng được “đỡ đầu” bởi một công ty của Mỹ – Red Hat. Nó được tạo ra nhằm kiểm thử các công nghệ cho một bản phân phối thương mại khác của Red Hat – nơi mà các phần mềm nguồn mở mới được tạo lập, phát triển và kiểm thử trong môi trường cộng đồng trước khi được đưa vào Red Hat Enterprise Linux.
      • Chu kì ra phiên bản mới của Fedora là 6 tháng. Phiên bản mới với các tính năng bảo mật mà các chuyên gia đánh giá khá tốt.
      • Có thể nâng cấp lên phiên bản mới mà không cần cài đặt lại.
      • Dùng yum để quản lý các gói phần mềm định dạng .rpm
      • Fedora có thể dùng cho máy tính để bàn và máy trạm, thậm chí máy chủ; dành cho những người mới tiếp cận PMTDNM hay những người đã có nhiều kinh nghiệm.
      • 2 distro phổ biến nhất được phát triển dựa trên Fedora là Red Hat Enterprise Linux – với đối tượng hướng tới là các doanh nghiệp và công ty lớn (tất nhiên là có tính phí) ; và CentOS – free và hướng tới đối tượng là người sử dụng cá nhân.

      Các nhóm Distro phổ biến

      • Linux có hàng trăm bản distro khác nhau đủ để phù hợp với nhu cầu của nhiều đối tượng sử dụng: từ người mới bắt đầu tới những người đã có hiểu biết chuyên sâu.
        • Với người sử dụng cá nhân thì các distro phổ biến là: Ubuntu, Linux Mint, Arch Linux, CentOS, Fedora, openSuSE …
        • Với đối tượng sử dụng là hệ thống sever có thể kể đến như là : Red Hat Enterprise Linux, Ubuntu Server, CentOS, SUSE Enterprise Linux..
      • Dựa trên các quy tắc, định hướng cũng như là mục tiêu mà Linux chia các distro phổ biến thành 4 nhóm:
        • Nhóm 1:
          • Nhắm vào người dùng am hiểu về hệ thống Linux. Hầu hết phương thức xây dựng và cấu hình hệ thống đều phải thực hiện qua môi trường dòng lệnh.
          • Đặc điểm: cấu trúc gọn nhẹ, uyển chuyển để có thể xây dựng một hệ thống hoàn toàn tuân theo ý của mình.
          • Các distro tiêu biểu: Arch, Gentoo, Slackware.
        • Nhóm 2:
          • Nhắm vào những người dùng am hiểu hệ thống, tuy nhiên cung cấp nhiều công cụ hơn cho những người chưa thật sự hiểu rõ hoàn toàn về Linux.
          • Nhóm này tương đối thân thiện với người dùng mới bắt đầu hơn nhóm 1. Tuy nhiên, các distro nhóm này lại có một quy trình phát triển và kiểm tra chất lượng các gói phần mềm cực kì khắt khe so với các distro còn lại.
          • Để trở thành một lập trình viên chính thức của Debian hay Fedora cần phải có thời gian đóng góp khá dài, và phải được chứng nhận bởi các lập trình viên khác. Do vậy, môi trường để lập trình và nghiên cứu ở 2 distro này khá tốt.
          • Distro tiêu biểu: Debian và Fedora.
        • Nhóm 3:
          • Chủ yếu nhắm vào thị trường doanh nghiệp, cơ quan, thị trường máy chủ… Các dòng distro này có nhiều đặc tính phù hợp cho mảng thị trường đòi hỏi sự ổn định cao như: thời gian ra phiên bản mới thường khá lâu, 3 – 5 năm tùy distro
          • Ít sử dụng các công nghệ mới nhất, thường tập trung phát triển các công nghệ lâu đời và đáng tin cậy.
          • Distro tiêu biểu: Centos, RHEL, SUSE EL…
        • Nhóm 4:
          • Nhắm đến người dùng cuối và người mới bắt đầu sử dụng Linux.
          • Đặc tính của các distro này là thời gian phát hành ngắn, ứng dụng liên tục các công nghệ mới với nhiều công cụ đồ họa để cấu hình hệ thống, thiết kế với mục đích dễ dùng, dễ làm quen, không cần đọc tài liệu đối với người mới.
          • Distro tiêu biểu: Ubuntu, Open SUSE, Linux Mint.

      Tổng quan lại: Các distro của Linux được mô tả như hình sau:

      Tài liệu tham khảo

      Cấu trúc thư mục Linux

      Giới thiệu :

      Trong Linux, hệ thống tệp được tổ chức thành một cấu trúc cây với thư mục gốc (“/”) là điểm khởi đầu. Mỗi thư mục trong cấu trúc này có chức năng và mục đích riêng, giúp hệ điều hành và người dùng quản lý dữ liệu, cài đặt phần mềm và tài nguyên một cách hiệu quả.

      Hệ thống file trong Linux

      • Trong hệ thống Linux, tất cả đều được cấu hình và coi như là file. Không chỉ bao gồm file text, ảnh, các chương trình biên dịch mà còn cả các thư mục, phân vùng và drive thiết bị phần cứng đều được hệ thống nhìn nhận như một file.
      • Tất cả các file và thư mục đều xuất hiện trong thư mục root, kể cả khi các thư mục còn lại được lưu trong các thiết bị vật lý khác nhau (trên ổ cứng khác, hoặc trên ổ cứng của máy tính khác)
      • Với nhân Linux, hệ thống file là phẳng. Nghĩa là – nó không là một cấu trúc phân cấp, phân biệt giữa các thư mục , tệp tin, hoặc các chương trình. Thay vào đó, kernel sử dụng khái niệm inode để đại diện cho từng file.
      • Mỗi inode chứa thông tin về một file bao gồm: số inode của nó (nhận dạng duy nhất trong hệ thống), các chủ sở hữu và nhóm liên kết với file, loại file (file thông thường, hay file link liên kết hay thư mục, …), quyền truy cập file, thời gian tạo file, kích thước tệp tin và địa chỉ nơi mà file được lưu trữ.
      • Dùng câu lệnh ls -li để xem thông tin một inode:
      • Khi liệt kê các inode, dùng lệnh ls, khi đó thông tin các inode được liệt kê ra và phân biệt các kiểu của inode theo màu. Sau đây là một số cách phân biệt kiểu file qua màu:

      Cấu trúc thư mục trong Linux

      Linux quản lý hệ thống trên một “hệ thống tệp tin” duy nhất, bắt đầu ở gốc là thư mục root (/) đây là thư mục ở cấp cao nhất. Cấu trúc cơ bản của hệ thống Linux như sau:

      Trong đó:

      • / : là thư mục root, nơi mở đầu logic cho hệ thống file của Linux. Mọi đường dẫn tuyệt đối của bất kì file nào đều bắt đầu từ /. Thư mục / chứa toàn bộ hệ điều hành. Chỉ có người dùng root mới có quyền truy cập và thay đổi trong thư mục này. (phân biệt giữa / và /root)
      • /bin: User binaries – thư mục lưu trữ các file nhị phân chương trình thực thi của người dùng như: pwd, cat, cp, …
      • /sbin: Chứa đựng các file thực thi dạng nhị phân của các chương trình cơ bản giúp hệ thống hoạt động. Các chương trình trong /sbin thường được sử dụng cho mục đích là duy trì và quản trị hệ thống => dành cho người dùng admin quản trị hệ thống – người dùng root hoặc superuser.Một số chương trình trong thư mục này như: init, iptables, fdisk, …
      • /boot: boot loader file – Chứa các tệp tin khởi động và cả nhân kernel là vmlinuz.
      • /dev: Các file thiết bị – nơi lưu trữ các phân vùng ổ cứng, thiết bị ngoại vi như usb, ổ đĩa cắm ngoài hay bất cứ thiết bị nào được gán vào hệ thống.
        • Các hard drive thường được mount tại thư mục /dev/sda , usb mount trong /dev/sde ; các phân vùng trên ổ địa được phân ra /dev/sda1, /dev/sda2…
      • /etc: Chứa file cấu hình cho các chương trình hoạt động. Chúng thường là các tệp tin dạng text thường. Chức năng gần giống “Control panel” trong Windows. Các cấu hình trong /etc thường ảnh hưởng tới tất cả người dùng trong hệ thống.Trong /etc còn chứa các shell scripts dùng để khởi động hoặc tắt các chương trình khác. Ví dụ: /etc/resolve.conf, sysctl.conf, …
      • /home: thư mục chứa các file cá nhân của từng user.
      • /lib: Chứa các file library hỗ trợ cho các file thực binary. Mỗi khi cài đặt phần mềm trên Linux, các thư viện cũng tự động được download, và chúng hầu hết được bắt đầu với lib*.. Đây là các thư viện cơ bản mà Linux cần đề làm việc. Không giống như trong Windows, các thư viện có thể chia sẻ và dùng chung cho các chương trình khác nhau. Đó là một lợi ích trong hệ thống tệp tin của Linux.
      • /media: Chứa thư mục dùng để mount cho các thiết bị có thể gỡ bỏ, di chuyển khỏi hệ thống được như CDROM, floppy, …
      • /mnt: Chứa các thư mục dùng để system admin thực hiện quá trình mount. Như đã nói, hệ điều hành Linux coi tất cả là các file và lưu giữ trên một cây chung. Đây chính nơi tạo ra các thư mục để ‘gắn’ các phân vùng ổ đĩa cứng cũng như các thiết bị khác vào. Sau khi được mount vào đây, các thiết bị hay ổ cứng được truy cập từ đây như là một thư mục. Trong một số hệ điều hành, các ổ đĩa chưa được gắn sẵn vào hệ thống bởi fstab sẽ được gắn ở đây.
      • /opt: Tên thư mục này nghĩa là optional (tùy chọn), nó chứa các ứng dụng thêm vào từ các nhà cung cấp độc lập khác. Các ứng dụng này có thể được cài ở /opt hoặc một thư mục con của /opt
      • /proc: Chứa đựng thông tin về quá trình xử lý của hệ thống.Đây là một pseudo filesystem chứa đựng các thông tin về các process đang chạy.Đây là một virtual filesystem chứa đựng các thông tin tài nguyên hệ thống.Ví dụ: /proc/cpuinfo cung cấp cho ta thông số kỹ thuật của CPU. Để xem dùng lệnh cat: $cat /proc/cpuinfo
      • /root: Thư mục home của người dùng root.
      • /tmp: Thư mục lưu trữ các file tạm của hệ thống và các user. Các file lưu tại đây sẽ bị xóa khi hệ thống khởi động lại.
      • /usr: Chứa các file binary, library, tài liệu, source-code cho các chương trình.
        • /usr/bin chứa file binary cho các chương trình của user. Nếu như một user trong quá trình thực thi một lệnh ban đầu sẽ tìm kiếm trong /bin, nếu như không có thì sẽ tiếp tục nhìn vào /usr/bin. Ví dụ một số lệnh như at. awk, cc…
        • /usr/sbin chứa các file binary cho system administrator. Nếu như ta không tìm thấy các file system binary bên dưới /sbin thì ta có thể tìm ở trong /usr/sbin. Ví dụ một số lệnh như cron, sshd, useradd, userdel
        • /usr/lib chứa các file libraries cho /usr/bin và /usr/sbin
        • /usr/local dùng để chứa chương trình của các user, các chương trình này được cài đặt từ source. Ví dụ khi ta install apache từ source thì nó sẽ nằm ở vị trí là /usr/local/apache2
      • /var: Chứa đựng các file có sự thay đổi trong quá trình hoạt động của hệ điều hành cũng như các ứng dụng. Ví dụ:
        • Nhật ký của hệ thống /var/log
        • database file /var/lib
        • email /var/mail
        • Các hàng đợi in ấn: /var/spool
        • lock file: /var/lock
        • Các file tạm thời cần cho quá trình reboot: /var/tmp
        • Dữ liệu cho trang web: /var/www
      • /srv: Chứa dữ liệu liên quan đến các dịch vụ máy chủ như /srv/svs, chứa các dữ liệu liên quan đến CVS.

      Kết bài

      Hiểu rõ cấu trúc thư mục trong Linux không chỉ giúp bạn quản lý hệ thống hiệu quả hơn mà còn tăng cường khả năng bảo mật và tối ưu hóa hiệu suất làm việc. Mỗi thư mục trong Linux đều có nhiệm vụ riêng, giúp hệ điều hành hoạt động mượt mà và ổn định. Dù bạn là người mới làm quen với Linux hay là một quản trị viên hệ thống chuyên nghiệp, nắm vững cấu trúc thư mục sẽ là nền tảng quan trọng để sử dụng hệ điều hành này một cách hiệu quả và thành công.

      Quá trình khởi động linux

      Giới thiệu

      Quá trình khởi động Linux là một chuỗi các bước cần thiết để hệ điều hành Linux có thể tải lên và sẵn sàng sử dụng. Từ lúc nhấn nút nguồn đến khi giao diện người dùng xuất hiện, Linux trải qua nhiều giai đoạn quan trọng bao gồm BIOS, Bootloader, Kernel và khởi động các dịch vụ hệ thống. Hiểu rõ quá trình này giúp chúng ta khám phá sâu hơn về cách Linux hoạt động, hỗ trợ giải quyết sự cố và tối ưu hóa hệ thống hiệu quả hơn.

      1. Power-on

      • BIOS (một phần mềm được nhúng (embedded) vào các chip PROM, EPROM hay các bộ nhớ flash nằm trên các bo mạch chủ) là chương trình được chạy đầu tiên khi bạn nhấn nút nguồn hoặc nút reset trên máy tính của mình. BIOS thực hiện một công việc gọi là POST (Power-on Self-test) nhằm kiểm tra các thông số và trạng thái của các phần cứng máy tính khác nhau như là bộ nhớ, CPU, thiết bị lưu trữ, card mạng, …
      • Đồng thười, BIOS cũng cho phép bạn thay đổi các thiết lập, cấu hình của nó.
      • Nếu quá trình POST thành công, thì sau đó BIOS sẽ cố gắng tìm kiếm và khởi chạy (boot) một hệ điều hành được chứa trong các thiết bị lưu trữ như ổ cứng, CD/DVD, USB, … Thứ tự tìm kiếm có thể được thay đổi bởi người dùng.

      2. Master Boot Record (MBR)

      • Sector đầu tiên (được đánh số 0) của một thiết bị lưu trữ dữ liệu được gọi là MBR, thường sector 0 này có kích thước là 512 byte. Sau khi BIOS xác định được thiết bị lưu trữ nào sẽ được ư tiên để tìm kiếm đầu tiên thì thực chất BIOS sẽ đọc trong MBR của thiết bị này để nạp vào bộ nhớ một chương trình rất nhỏ (dưới 512 byte). Chương trình nhỏ này sẽ định vị và khởi động boot loader – đây là chương trình chịu trách nhiệm cho việc tìm và nạp nhân (kernel) của hệ điều hành.

      3. Boot loader

      • Có 2 loại bootloader phổ biến trên linux là GRUB và LILO(tiền thân của Grub). Cả 2 chương trình này đều có chung mục đích: cho phép bạn lựa chọn một trong các hệ điều hành có trên máy tính để khởi động, sau đó chúng sẽ nạp kernel của hệ điều hành đó vao bộ nhớ và chuyển quyền điều khiển máy tính cho kernel này.
      • Grub hay LILO đều có thể khởi động cho cả Linux và Windows, nhưng ngược lại các bootloader trên Windows (như NTLDR, BOOTMGR) thì không hỗ trợ khởi động cho các hệ điều hành Linux. Trong thế giới Linux, các bôt loader cũng có thể nạp thêm các ramdisk hoặc các INITRD.

      4. Linux kernel được nạp và khởi chạy

      Bootloader nạp một phiên bản dạng nén của Linux kernel, và ngay lập tức nó tự giải nén và tự cài đặt mình lên đỉnh bộ nhớ hệ thống – nơi mà nó sẽ nằm ở đó cho đến khi bạn tắt máy.

      5. Các script trong INITRD được thực thi

      • Một vấn đề mà những người viết script đa mục đích phải đối mặt là: không thể nào đoán trước được chính xác cấu trúc máy tính của người sẽ sử dụng bản Linux của họ… Máy tính của người dùng có những thành phần linh kiện nào.
      • Các INITRD cung cấp một giải pháp: một tập các chương trình nhỏ sẽ được thực thi khi kernel vừa mới được khởi chạy. Các chương trình nhỏ này sẽ dò quyets phần cứng của hệ thống và xác định xem kernel cần được hỗ trợ thêm những gì dể có thể quản lý được các phần cứng đó. Chương trình INITRD có thể nạp thêm vào kernel các module bổ trợ. Khi chương trình INITRD kết thúc thì quá trình khởi động Linux sẽ tiếp diễn.

      6. Chương trình init được thực thi

      • Khi kernel được khởi chạy xong, nó triệu gọi duy nhất một chương trình tên là init.
      • Tiến trình này có tên PID = 1, init là cha của tất cả các tiến trình khác mà có trên hệ thống linux này. Do tính chất cực kỳ quan trọng này mà init sẽ không bao giờ bị chết (khi sử dụng lệnh kill) và không được phép chết.
      • Sau đó, init sẽ xem trong file /etc/inittab để biết được nó cần làm gì tiếp theo như: dựa vào runlevel mặc định để thực thi các script khởi động (initscript) tương ứng trong thư mục /etc/rc.d

      7. Các initscript được thực thi dựa trên runlevel được chọn

      • Nếu kiểm tra trong file /etc/inittab, bạn sẽ thấy nó bao gồm hầu hết các đặc tả, chỉ dẫn để cạy các chương trình nào đó. Các script có tên bắt đầu bằng kí tự S sẽ được thực thi, bằng cách này, init sẽ khởi động tất cả các hệ thống con (subsystem) hoặc các dịch vụ (daemon) để tạo thành một hệ thống linux hoạt động hoàn chỉnh.
      • Tại thời điểm này, về cơ bản Linux đã khởi động xong, init cũng hoàn thành vai trò của mình: tạm thời, nó sẽ “ngủ” (ở trạng thái chờ đợi) cho tới khi có chương trình nào đó chị chết hoặc cần được khởi động lại. Tất cả các hoạt động của hệ thống bây giờ sẽ được thực hiện bởi các daemon khác nhau.

      8. Đăng nhập với giao diện đồ họa

      • Subsystem cuối cùng được init khởi động lên là XWindow, đây là một hệ thống cung cấp giao diện đồ họa cho người dùng (GUI) của Linux.

      9. Khi người dùng đăng nhập thành công vào hệ thống

      • Một chương trình shell (bashshcsh, …) sẽ được bắt đầu.
      • Tất cả các chương trình mà bạn chạy và mọi thao tác khác mà bạn thực hiện trong suốt phiên làm việc sẽ được thực hiện bởi shell đó hoặc bởi chương trình khác mà được shell khởi động.
      • Khi bạn đăng xuất, shell đó và tất cả các tiến trình con của nó sẽ kết thúc. Sau đó, init sẽ “thức tỉnh” và bắt đầu một lời nhắc nhở đăng nhập mới.
      • Toàn bộ quá trình khởi động của hệ thống Linux được minh họa như hình sau



      Tóm lại :

      Quá trình khởi động Linux không chỉ đơn thuần là việc nạp hệ điều hành, mà còn là một quy trình phức tạp đảm bảo hệ thống hoạt động chính xác và ổn định. Nắm rõ từng giai đoạn trong quá trình khởi động giúp bạn quản lý và khắc phục sự cố hệ thống hiệu quả, đồng thời cải thiện hiệu suất. Dù bạn là người dùng cá nhân hay quản trị viên, việc hiểu biết về quá trình khởi động Linux sẽ là công cụ hữu ích trong việc khai thác tối đa sức mạnh của hệ điều hành mã nguồn mở này.

      Các lệnh Linux cơ bản (Phần 1)

      Giới thiệu

      Linux là một hệ điều hành mạnh mẽ, được sử dụng rộng rãi trong các máy chủ, hệ thống nhúng và các ứng dụng phát triển phần mềm. Để khai thác tối đa khả năng của Linux, việc nắm vững các lệnh cơ bản là điều cần thiết. Trong bài viết này, chúng ta sẽ tìm hiểu về những lệnh Linux cơ bản nhất mà mọi người dùng Linux đều nên biết để quản lý tập tin, thư mục và hệ thống một cách hiệu quả.

      File Commands :

      ls – Liệt kê tập tin và thư mục

      • Ý nghĩa: Hiển thị danh sách các tập tin và thư mục trong thư mục hiện tại.
      • Cách dùng:
      ls
      ls -l      # Hiển thị chi tiết với quyền truy cập, kích thước, ngày tháng
      ls -a      # Hiển thị tất cả các tập tin, bao gồm các tập tin ẩn
      ls -lh     # Hiển thị kích thước tập tin với định dạng dễ đọc (KB, MB, GB)

      cd – Thay đổi thư mục làm việc

      • Ý nghĩa: Di chuyển đến thư mục khác.
      • Cách dùng:
      cd /path/to/directory    # Di chuyển đến thư mục chỉ định
      cd ..                    # Di chuyển lên một thư mục cấp cao hơn
      cd ~                     # Di chuyển đến thư mục home của người dùng

      pwd – Hiển thị thư mục hiện tại

      • Ý nghĩa: In ra đường dẫn tuyệt đối của thư mục hiện tại.
      • Cách dùng
      pwd

      cp – Sao chép tập tin hoặc thư mục

      • Ý nghĩa: Sao chép một tập tin hoặc thư mục từ vị trí này sang vị trí khác.
      • Cách dùng
      cp file1.txt file2.txt          # Sao chép file1.txt thành file2.txt
      cp -r dir1/ dir2/               # Sao chép thư mục dir1 sang thư mục dir2

      mv – Di chuyển hoặc đổi tên tập tin/thư mục

      • Ý nghĩa: Di chuyển tập tin/thư mục hoặc đổi tên nó.
      • Cách dùng
      mv file1.txt /newpath/         # Di chuyển file1.txt vào thư mục mới
      mv oldname.txt newname.txt     # Đổi tên file từ oldname.txt sang newname.txt

      rm – Xóa tập tin hoặc thư mục

      • Ý nghĩa: Xóa tập tin hoặc thư mục.
      • Cách dùng
      rm file1.txt           # Xóa tập tin file1.txt
      rm -r dir1/            # Xóa thư mục dir1 và các tập tin trong đó
      rm -f file1.txt        # Xóa mà không có thông báo xác nhận

      cat – Hiển thị nội dung tập tin

      • Ý nghĩa: Hiển thị nội dung của một hoặc nhiều tập tin lên màn hình.
      • Cách dùng
      cat file1.txt                # Hiển thị nội dung của file1.txt
      cat file1.txt file2.txt      # Hiển thị nội dung của cả hai tập tin

      more – Hiển thị nội dung tập tin theo trang

      • Ý nghĩa: Hiển thị nội dung của tập tin theo từng trang để dễ đọc hơn.
      • Cách dùng
      more file1.txt

      head – Hiển thị các dòng đầu của tập tin

      • Ý nghĩa: Hiển thị các dòng đầu tiên của một tập tin (mặc định là 10 dòng).
      • Cách dùng
      head file1.txt              # Hiển thị 10 dòng đầu tiên của file1.txt
      head -n 20 file1.txt        # Hiển thị 20 dòng đầu tiên của file1.txt

      tail – Hiển thị các dòng cuối của tập tin

      • Ý nghĩa: Hiển thị các dòng cuối cùng của một tập tin (mặc định là 10 dòng).
      • Cách dùng
      tail file1.txt              # Hiển thị 10 dòng cuối của file1.txt
      tail -n 20 file1.txt        # Hiển thị 20 dòng cuối cùng của file1.txt

      ln – Tạo liên kết đến tập tin

      • Ý nghĩa: Tạo liên kết cứng (hard link) hoặc liên kết mềm (symbolic link) đến một tập tin.
      • Cách dùng
      ln file1.txt link1.txt        # Tạo liên kết cứng
      ln -s file1.txt link1.txt     # Tạo liên kết mềm (symbolic link)

      chmod – Thay đổi quyền truy cập tập tin

      • Ý nghĩa: Thay đổi quyền truy cập (read, write, execute) cho tập tin hoặc thư mục.
      • Cách dùng
      chmod 755 file1.txt           # Cấp quyền đọc, ghi, thực thi cho chủ sở hữu và đọc, thực thi cho người dùng khác
      chmod u+x file1.txt           # Thêm quyền thực thi cho chủ sở hữu

      chown – Thay đổi chủ sở hữu và nhóm của tập tin

      • Ý nghĩa: Thay đổi chủ sở hữu hoặc nhóm của tập tin hoặc thư mục.
      • Cách dùng
      chown user:group file1.txt   # Thay đổi chủ sở hữu và nhóm của tập tin

      stat – Hiển thị thông tin chi tiết về tập tin

      • Ý nghĩa: Hiển thị thông tin chi tiết của tập tin, bao gồm quyền, kích thước, thời gian tạo/sửa đổi.
      • Cách dùng
      stat file1.txt

      Việc làm quen với các lệnh Linux cơ bản sẽ giúp bạn thao tác và quản lý hệ thống một cách dễ dàng và nhanh chóng. Mặc dù Linux có rất nhiều lệnh mạnh mẽ và linh hoạt, nhưng việc thành thạo các lệnh cơ bản là bước đầu tiên để bạn có thể tận dụng tối đa các tính năng mà hệ điều hành này mang lại. Hãy tiếp tục khám phá và thực hành để nâng cao kỹ năng sử dụng Linux của bạn!

      Các lệnh Linux cơ bản (Phần 2)

      Giới thiệu

      Linux là một hệ điều hành mạnh mẽ, được sử dụng rộng rãi trong các máy chủ, hệ thống nhúng và các ứng dụng phát triển phần mềm. Để khai thác tối đa khả năng của Linux, việc nắm vững các lệnh cơ bản là điều cần thiết. Trong bài viết này, chúng ta sẽ tìm hiểu về những lệnh Linux cơ bản nhất mà mọi người dùng Linux đều nên biết để quản lý tập tin, thư mục và hệ thống một cách hiệu quả.

      KẾT NỐI SSH

      • ssh user@host – kết nối đến host với user
      • ssh -p port user@host – kết nối có chỉ ra port

      CÀI ĐẶT SOFTWARE

      • ./configure
        make
        make install

      LỆNH VỀ MẠNG – NETWORK

      • ping host – ping đến host
      • dig domain – lấy thông tin DNS cho domain
      • wget file – tải file
      • curl –head url – xem phần header của URL

      THÔNG TIN HỆ THỐNG

      • date – ngày/tháng giờ hiện tại
      • cal – lịch tháng hiện tại
      • uptime – thời gian hệ thống hoạt động (kể từ khi khởi động)
      • w – xem các user đang online trong hệ thống
      • whoami – tài khoản đang đăng nhập
      • uname -a – thông tin hệ thống linux
      • cat /proc/cpuinfo – thông tin CPU
      • cat /proc/meminfo – thông tin bộ nhớ
      • df – thông tin đĩa cứng
      • df -BM – thông tin đĩa cứng
      • du – thông tin thư mục
      • du -sh – thông tin thư mục
      • du –max-depth=1 -B M |sort -rn – thông tin thư mục, xếp theo dung lượng
      • free – thông tin bộ nhớ trống và swap

      TÌM KIẾM – SEARCHING

      • grep ‘word’ file1 file2 … – tìm kiếm ‘word’ trong file1, file2 …
      • grep -rnw ‘/path/to/somewhere/’ -e ‘word’ – tìm kiếm các file chứa ‘word’ trong thư mục
      • locate “*.png” – tìm vị trí theo tên file

      PROCESS

      • top – các tiến trình đang chạy
      • ps -aux – các tiến trình đang chạy
      • kill -9 PID – dừng tiến trình PID
      • killall [process name] – dừng tiến trình

      FILE PERMISSION

      • chmod octal file – thay đổi permission
        octal con số bát phân (1)(2)(3) thể hiện permision (rwx == read-write-execute)
      • chmod 775 file – rw cho owner, rx cho group/world
      • chmod 777 file – file rwx cho tất các các user
      • chmod -R 755 directory-name/ – thiết lập cho toàn thư mục
      • chown -R owner:group file/directory – đổi owner|group của file

      NÉN FILE

      • tar -cvf /tenfilenen.tar /thu-muc-can-nen – nén thư mực vào .tar
      • tar -xvf file-nen.tar – giải nén file .tar
      • gzip file – nén file thành file.gz
      • gzip -d file.gz – giải nén file.gz

      Cài đặt Composer, NVM, Node.js Linux

      Giới thiệu :

      Composer, NVM và Node.js là những công cụ phát triển phổ biến được sử dụng trong nhiều dự án phần mềm hiện nay. Composer giúp quản lý các thư viện PHP, NVM hỗ trợ quản lý các phiên bản Node.js, và Node.js là nền tảng cho việc phát triển các ứng dụng web mạnh mẽ. Việc cài đặt và cấu hình đúng cách những công cụ này trên hệ điều hành Linux sẽ giúp bạn tạo ra một môi trường phát triển mạnh mẽ và linh hoạt. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách cài đặt Composer, NVM và Node.js trên Linux một cách chi tiết.

      Tìm hiểu cơ bản nodeJS, NVM, Pm2, Composer

      1. Node.js

      • Node.js là một nền tảng JavaScript được phát triển trên động cơ V8 của Google Chrome. Nó cho phép chạy JavaScript bên ngoài trình duyệt, điều này có nghĩa là bạn có thể xây dựng các ứng dụng máy chủ, ứng dụng web hoặc các công cụ dòng lệnh bằng JavaScript.
      • Tính năng nổi bật: Node.js sử dụng mô hình bất đồng bộ, không chặn (non-blocking) và sự kiện (event-driven), giúp xử lý các yêu cầu đồng thời một cách hiệu quả, lý tưởng cho các ứng dụng web thời gian thực hoặc các ứng dụng cần tương tác nhanh.

      2. NVM (Node Version Manager)

      • NVM là một công cụ dòng lệnh giúp bạn quản lý nhiều phiên bản Node.js trên cùng một hệ thống. Nó cho phép bạn dễ dàng cài đặt, thay đổi và chuyển đổi giữa các phiên bản Node.js khác nhau mà không cần phải thay đổi cấu hình hệ thống.
      • Lý do sử dụng: Khi làm việc với nhiều dự án khác nhau, mỗi dự án có thể yêu cầu một phiên bản Node.js khác nhau. NVM giúp bạn dễ dàng chuyển đổi giữa các phiên bản Node mà không gặp phải vấn đề tương thích.

      3. PM2

      • PM2 là một trình quản lý tiến trình cho Node.js, giúp bạn dễ dàng chạy, giám sát và quản lý các ứng dụng Node.js trong môi trường sản xuất. Nó cho phép bạn giữ các ứng dụng Node.js chạy liên tục và tự động khởi động lại khi ứng dụng gặp sự cố.
      • Tính năng nổi bật:
        • Quản lý tiến trình: PM2 giúp bạn chạy ứng dụng Node.js trong nền và giám sát chúng.
        • Khởi động lại tự động: PM2 sẽ tự động khởi động lại ứng dụng nếu có sự cố.
        • Quản lý logs: PM2 cho phép bạn dễ dàng xem và quản lý log của ứng dụng.
        • Cluster mode: PM2 hỗ trợ chạy ứng dụng Node.js trong chế độ phân tán (cluster), giúp tận dụng tối đa các lõi CPU.

      4. Composer

      • Composer là một công cụ quản lý thư viện (dependency manager) cho PHP. Nó giúp bạn quản lý các thư viện mà dự án của bạn phụ thuộc vào, tự động tải về và cài đặt các thư viện này từ các kho lưu trữ (như Packagist).
      • Tính năng nổi bật:
        • Quản lý phụ thuộc: Composer giúp quản lý và cài đặt các thư viện cần thiết cho ứng dụng PHP của bạn.
        • Cập nhật thư viện: Composer có thể tự động cập nhật các thư viện khi có phiên bản mới.
        • Autoloading: Composer cung cấp tính năng autoloading, giúp tự động tải các lớp PHP khi cần thiết mà không cần phải gọi thủ công.

      Cài đặt NodeJS phiên bản cố định :

      NodeJS v16.x:

      curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - &&
      sudo apt-get install -y nodejs
      
      ## AS root :
      curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
      apt-get install -y nodejs

      NodeJS v18.x:

      curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&
      sudo apt-get install -y nodejs
      
      ##As root :
      curl -fsSL https://deb.nodesource.com/setup_18.x | bash - &&
      	apt-get install -y nodejs

      NodeJS LTS newest:

      curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - &&
      sudo apt-get install -y nodejs
      
      ##As root:
      curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - &&
      	apt-get install -y nodejs

      Cài đặt NodeJS bằng NVM (Node Version Manager)

      curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
      source ~/.bashrc
      nvm list-remote

      List Remote sẽ trả về rất nhiều phiên bản, sau đó chỉ cần chọn phiên bản cần cài :

      Output
      . . .
             v20.15.0   (LTS: Iron)
             v20.15.1   (LTS: Iron)
             v20.16.0   (LTS: Iron)
             v20.17.0   (LTS: Iron)
             v20.18.0   (Latest LTS: Iron)
              v21.0.0
              v21.0.0
              v21.1.0
              v21.2.0
              v21.3.0
              v21.4.9
              v21.5.0
              v21.6.0
              v21.6.1
              v21.6.2
              v21.7.0
              v21.7.1
              v21.7.2
              v21.7.3
              v22.0.0
              v22.1.0
              v22.2.0
              v22.3.0
              v22.4.0
              v22.4.1
              v22.5.0
              v22.5.1
              v22.6.0
              v22.7.0
              v22.8.0
              v22.9.0
      nvm install v20.18.0
      nvm use 20.18.0 ##Switch Version of Node will use

      Cài đặt Composer

      Downloading Composer:
          cd ~
          curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
          HASH=`curl -sS https://composer.github.io/installer.sig`
          php -r "if (hash_file('SHA384', '/tmp/composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
          sudo php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer

      Test composer

      composer

      Cài đặt PM2 :

      sudo npm i -g pm2

      Testing command với node project :

      pm2 --name c1 start "PORT=3400 node build/server.js"
      pm2 --name c2 start "PORT=3401 node build/server.js"

      Sau khi cài đặt thành công Composer, NVM và Node.js, bạn sẽ có một môi trường phát triển mạnh mẽ để làm việc với các dự án PHP và JavaScript trên Linux. Việc sử dụng các công cụ này sẽ giúp bạn quản lý các thư viện và phiên bản dễ dàng hơn, đồng thời hỗ trợ tối ưu cho các ứng dụng web của mình. Hy vọng rằng với hướng dẫn này, bạn sẽ nhanh chóng thiết lập được môi trường phát triển lý tưởng cho công việc của mình trên hệ điều hành Linux.

      Docker

      Docker là công cụ mạnh mẽ giúp tạo, triển khai và quản lý các container phần mềm một cách hiệu quả. Tìm hiểu cách Docker đơn giản hóa quy trình phát triển ứng dụng!

      Tối ưu hóa Docker Image với Multi-stage Builds trên Ubuntu 20.04+: Chiến lược Hardening cho Production

      Tối ưu hóa Docker Image với Multi-stage Builds trên Ubuntu 20.04+: Chiến lược Hardening cho Production

      Giới thiệu

      Trong môi trường sản xuất hiện đại, tối ưu hóa Docker image và tăng cường an ninh cho container là yếu tố then chốt để đảm bảo hiệu năng, dễ bảo trì và tuân thủ quy trình vận hành. Đối với nền tảng Ubuntu 20.04 trở lên, chiến lược multi‑stage builds cung cấp một phương pháp hiệu quả để giảm kích thước hình ảnh, hạn chế surface area và cải thiện hardening cho production container. Bài viết này trình bày khung tham chiếu kỹ thuật cho sysadmins và đội DevOps muốn triển khai hình ảnh Docker được tối ưu và an toàn, đồng thời nêu ra các thực hành, mẫu Dockerfile và các bước kiểm thử, giám sát sau khi triển khai.

      Khái niệm cốt lõi và kiến trúc tổng quát

      Multi‑stage builds là kỹ thuật cho phép định nghĩa nhiều giai đoạn xây dựng trong một Dockerfile. Mỗi giai đoạn có một hình ảnh cơ sở riêng và có thể sao chép artefacts từ giai đoạn này sang giai đoạn khác. Mục tiêu chính là giữ lại các phần cần thiết cho runtime và loại bỏ phần phụ thuộc, công cụ build và mã nguồn khỏi image cuối cùng. Với Ubuntu 20.04 trở lên, bạn có thể tận dụng các base image tối giản ở giai đoạn runtime đồng thời giữ được tính tương thích và khả năng bảo trì của hệ thống.

      Kiến trúc điển hình với multi‑stage bao gồm các phần sau:

      • Stage builder (stage xây dựng): chứa các công cụ và thư viện cần để biên dịch, biên tập và đóng gói ứng dụng. Đây là nơi tập trung toàn bộ phụ thuộc phát triển và các file nguồn.
      • Stage runtime (stage chạy): hình ảnh nhẹ, chỉ chứa các phần mềm cần thiết cho chạy ứng dụng ở môi trường production. Không mang theo các công cụ build hay mã nguồn thô.
      • Quá trình sao chép artefacts từ stage builder sang stage runtime, chỉ sao chép các tệp cần thiết cho vận hành (binary, script, tài nguyên) và loại bỏ các dependences không cần thiết.

      Việc tách biệt giữa build và runtime giúp giảm kích thước image, giảm surface area tấn công và cải thiện khả năng nhận diện rủi ro. Đây là ý tưởng cốt lõi của hardening Docker image cho production trên nền tảng Ubuntu 20.04 và các hệ thống tương đương.

      Yêu cầu và chuẩn bị

      Trước khi bắt đầu, xác định rõ môi trường mục tiêu và phạm vi ứng dụng. Với nền tảng Ubuntu 20.04+, các khuyến nghị dưới đây sẽ hỗ trợ bạn xây dựng pipeline ổn định và an toàn:

      • Có Docker Engine được cài đặt trên máy chủ chạy Ubuntu 20.04 hoặc các phiên bản tương đương.
      • Sử dụng Dockerfile theo mẫu multi‑stage để tách biệt build và runtime.
      • Đảm bảo quyền truy cập và quản trị người dùng được kiểm soát chặt chẽ, ưu tiên chạy ứng dụng dưới tài khoản người dùng không phải root.
      • Xem xét tích hợp công cụ quét bảo mật và kiểm tra hình ảnh (image scanning) như một phần của chu trình CI/CD.
      • Thiết lập các công cụ giám sát và logging để đảm bảo khả năng vận hành và phát hiện sự cố.

      Trong phạm vi bài viết, chúng ta sẽ đi qua một quy trình thực hành với một Dockerfile mẫu và các bước kiểm thử đi kèm, phù hợp với nền tảng Ubuntu 20.04+.

      Cấu hình và mẫu Dockerfile với multi‑stage builds

      Ý tưởng cơ bản là sử dụng hai hoặc nhiều stage trong Dockerfile. Stage builder sẽ chứa các dependency cần thiết để biên dịch hoặc đóng gói, trong khi stage runtime sẽ chỉ chứa những gì cần thiết để chạy ứng dụng. Dưới đây là một mẫu Dockerfile minh họa cho một ứng dụng nền tảng Linux tổng quát mà có thể được điều chỉnh cho các ngôn ngữ phổ biến như Go, C/C++, hoặc Node.js. Lưu ý rằng các khung lược bỏ phụ thuộc ở stage runtime giúp giảm kích thước và tăng mức độ an toàn của hình ảnh.

      FROM ubuntu:20.04 AS builder
      RUN apt-get update && apt-get install -y --no-install-recommends \
          build-essential \
          pkg-config \
          && rm -rf /var/lib/apt/lists/*
      
      WORKDIR /src
      COPY . /src
      
      # Giả định build một binary ứng dụng
      RUN ./build-script.sh
      
      FROM ubuntu:20.04
      RUN apt-get update && apt-get install -y --no-install-recommends \
          ca-certificates \
          && rm -rf /var/lib/apt/lists/*
      
      # Sao chép artefacts từ stage builder
      COPY --from=builder /src/bin/app /usr/local/bin/app
      
      # Tạo người dùng và vận hành với non-root
      RUN groupadd -r appuser && useradd -r -g appuser appuser
      USER appuser
      
      ENTRYPOINT ['/usr/local/bin/app']
      

      Giải thích nhanh về cấu hình trên:

      • Stage builder cài đặt các công cụ cần thiết cho quá trình build và biên dịch.
      • Stage runtime dùng base image ubuntu:20.04 và chỉ bao gồm các dependency cần thiết để chạy ứng dụng, không mang theo công cụ build hay mã nguồn đầy đủ.
      • Các artefacts được sao chép từ stage builder sang stage runtime, điều này giúp loại bỏ các file nguồn và thư viện build khỏi image cuối cùng.
      • Quy trình chạy với user non-root nhằm giảm thiểu rủi ro bảo mật tại runtime.

      Điểm mấu chốt là chỉ sao chép những gì thực sự cần cho runtime và tránh mang toàn bộ mã nguồn hoặc công cụ biên dịch vào image sản xuất.

      Một ví dụ chi tiết cho Dockerfile cho ứng dụng Go hoặc ngôn ngữ biên dịch khác

      Đối với các dự án Go hoặc các ngôn ngữ biên dịch khác, mẫu Dockerfile có thể được điều chỉnh để tận dụng staged builds. Dưới đây là phiên bản tham khảo có thể áp dụng cho các dự án cần build và chạy ở runtime nghiêm ngặt:

      FROM ubuntu:20.04 AS builder
      RUN apt-get update && apt-get install -y --no-install-recommends \
          build-essential git ca-certificates \
          && rm -rf /var/lib/apt/lists/*
      
      WORKDIR /src
      COPY go.mod go.sum ./
      RUN go mod download
      COPY . .
      RUN go build -trimpath -o app ./cmd/app
      
      FROM ubuntu:20.04
      RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates
      RUN useradd -m -s /bin/bash appuser
      USER appuser
      COPY --from=builder /src/app /usr/local/bin/app
      ENTRYPOINT ["/usr/local/bin/app"]
      

      Trong mẫu trên, Go toolchain hoặc runtime build các dépendances ở stage builder. Stage runtime chỉ chứa binary đã biên dịch và các thư viện runtime cần thiết, giúp giảm thiểu kích thước và tăng tính bảo mật.

      Bảo mật và hardening cho Docker image với multi‑stage builds

      Bảo mật đóng vai trò then chốt trong production. Các biện pháp sau đây được khuyến nghị khi làm việc với multi‑stage builds trên Ubuntu 20.04+:

      • Sử dụng base image tối giản cho stage runtime; tránh mang theo các công cụ phát triển và thư viện không cần thiết.
      • Chạy ứng dụng ở chế độ non-root và cấp phát quyền tối thiểu cho hành động cần thiết, ví dụ tạo user riêng và gán quyền vào thư mục làm việc.
      • Sử dụng .dockerignore để loại trừ mã nguồn, dữ liệu nhị phân tạm thời và các file nhạy cảm khỏi quá trình build.
      • Hạn chế quyền truy cập mạng cho container nếu có thể, và cân nhắc áp dụng thiết lập seccomp, AppArmor hoặc SELinux tùy thuộc vào hạ tầng và mức độ ràng buộc bảo mật.
      • Đảm bảo việc cập nhật hình ảnh runtime được tích hợp trong chu trình CI/CD để nhận các bản vá bảo mật mới nhất.
      • Kiểm tra hạn mức và giới hạn tài nguyên cho container ở môi trường production để giảm thiểu tác động từ các cuộc tấn công từ chối dịch vụ hoặc lỗi vận hành.

      Những nguyên tắc này giúp tăng cường độ an toàn cho hình ảnh Docker và giảm nguy cơ bị khai thác từ các lỗ hổng có thể có trong các công cụ build hoặc dependencies không cần thiết ở runtime.

      Hiệu năng và tối ưu hoá hình ảnh

      Hiệu năng là một phần thiết yếu của vận hành hệ thống. Các thực hành tối ưu hoá bao gồm:

      • Chỉ giữ lại những artefacts cần thiết cho chạy ứng dụng ở stage runtime; loại bỏ file nguồn, build cache và các dependency không cần thiết.
      • Gộp các lệnh RUN hợp lý để tối ưu hoá số lượng layers và tận dụng cache của Docker trong quá trình build.
      • Chọn base image phù hợp với ứng dụng và tối giản các gói cài đặt. Ví dụ sử dụng các base image có kích thước nhỏ và có sẵn runtime cho Linux.
      • Đảm bảo hình ảnh ở trạng thái có thể lặp lại trong CI/CD và không phụ thuộc vào biến môi trường vượt quá phạm vi được kiểm soát.

      Với các áp dụng thực tế, bạn có thể kiểm tra kích thước hình ảnh và tối ưu hoá thêm bằng cách xem lịch sử từng layer và loại bỏ các layer không cần thiết. Quá trình này giúp giảm không chỉ dung lượng tải xuống mà còn thời gian triển khai và chi phí vận hành.

      Giám sát và observability cho container chạy ở production

      Việc giám sát và ghi nhận là phần không thể bỏ qua để duy trì chất lượng dịch vụ trong dài hạn. Các thực hành liên quan đến multi‑stage builds tập trung vào runtime ít hơn vào giai đoạn build:

      • Cấu hình Healthcheck cho container để xác định tình trạng hoạt động của ứng dụng và tự động tái khởi động khi cần thiết.
      • Ghi log ra stdout và stderr để tích hợp với hệ thống quản lý logs và phân tích logs tập trung.
      • Giải pháp theo dõi hiệu năng và sự cố ở mức hệ điều hành và ứng dụng, bao gồm giám sát tiêu thụ CPU, memory và I/O.
      • Áp dụng giới hạn tài nguyên cho container nhằm ngăn tình huống lún lõm tài nguyên khi có tải cao hoặc lỗ hổng bảo mật bị khai thác.

      Việc tích hợp Healthcheck và logging chuẩn giúp đội vận hành nhanh chóng xác định và xử lý sự cố, đồng thời cung cấp dữ liệu cho quá trình tối ưu hoá và bảo mật.

      Kiểm tra, xác thực và vận hành sau triển khai

      Để đảm bảo hình ảnh multi‑stage hoạt động đúng như mong đợi trên nền tảng Ubuntu 20.04+, tiến hành các bước kiểm tra sau trước khi đẩy lên môi trường production:

      • Xây dựng lại hình ảnh và xác nhận không còn các file build hoặc thư viện phát triển trong stage runtime.
      • Chạy container ở chế độ thử nghiệm với các trường hợp sử dụng thực tế của ứng dụng, kiểm tra chức năng và hiệu năng.
      • Kiểm tra tính khả dụng của các dịch vụ liên quan, xác thực logging và healthcheck hoạt động đúng cách.
      • Đánh giá bảo mật với các công cụ quét hình ảnh và xác thực rằng non‑root user được áp dụng và các quyền truy cập được giới hạn.
      • Ghi nhận và phân tích kích thước hình ảnh, thời gian tải xuống và thời gian khởi động để đánh giá hiệu quả tối ưu hóa.

      Ví dụ các lệnh kiểm tra có thể được thực hiện trong môi trường CI/CD và sau khi triển khai bao gồm kiểm tra kích thước image, xem lịch sử builder và xác nhận tài nguyên runtime được giới hạn phù hợp.

      Checklist vận hành và triển khai

      • Đảm bảo Dockerfile được thiết kế theo chuẩn multi‑stage và ubuntu:20.04 là base image cho cả stage build và stage runtime.
      • Áp dụng người dùng non‑root cho runtime và cấp quyền tối thiểu cho thư mục làm việc.
      • Sử dụng .dockerignore để loại bỏ mã nguồn và file nhạy cảm khỏi quá trình build.
      • Kiểm tra và giới hạn tài nguyên cho container ở production (CPU, memory, I/O).
      • Áp dụng Healthcheck và logging cho khả năng vận hành và phát hiện sự cố nhanh chóng.
      • Sử dụng quy trình CI/CD để tự động quét bảo mật và xác thực version của image trước khi triển khai.
      • Theo dõi kích thước và surface area của image sau mỗi lần tối ưu hóa và cập nhật dependency.

      Kết luận

      Kỹ thuật multi‑stage builds là một phần cốt lõi để tối ưu hóa kích thước và an ninh cho Docker image khi làm việc trên Ubuntu 20.04+. Bằng cách tách biệt stage build và stage runtime, bạn có thể giảm đáng kể surface area, loại bỏ công cụ phát triển và các file nguồn khỏi image sản xuất, đồng thời tăng cường khả năng kiểm soát an ninh và vận hành. Để đạt hiệu quả tối đa, hãy kết hợp chiến lược này với các thực tiễn bảo mật và quản trị container như chạy dưới non‑root, sử dụng .dockerignore, cấu hình healthcheck, và tích hợp CI/CD cho kiểm tra bảo mật và xác thực version trước khi đẩy lên production.

      Cài đặt Docker trên Linux

      Giới thiệu

      Docker đã trở thành một trong những công cụ hàng đầu trong lĩnh vực công nghệ phần mềm, đặc biệt là đối với các nhà phát triển và quản trị hệ thống. Với khả năng tạo và quản lý các container phần mềm, Docker không chỉ giúp tối ưu hóa quy trình phát triển mà còn đảm bảo tính linh hoạt, nhất quán trong môi trường triển khai. Vậy Docker là gì và tại sao nó lại quan trọng trong thế giới công nghệ hiện nay?

      Docker là một dự án mã nguồn mở giúp tự động triển khai các ứng dụng Linux và Windows vào trong các container ảo hóa. Các thay đổi được lưu trữ trong các Docker image, các lớp tệp hệ thống được tạo ra và lưu lại dựa theo từng lớp (layer). Điều này giúp cho Docker Image giảm dung lượng đáng kể so với máy ảo (VM).

      Các ứng dụng muốn chạy bằng Docker phải là ứng dụng chạy được trên Linux. Gần đây, Docker có hỗ trợ thêm việc chạy ứng dụng Windows trong các Windows container.

      Thành phần

      • Docker Engine: dùng để tạo ra Docker image và chạy Docker container.
      • Docker Hub: dịch vụ lưu trữ giúp chứa các Docker image.
      • Docker Machine: tạo ra các Docker engine trên máy chủ.
      • Docker Compose: chạy ứng dụng bằng cách định nghĩa cấu hình các Docker container thông qua tệp cấu hình
      • Docker image: một dạng tập hợp các tệp của ứng dụng, được tạo ra bởi Docker engine. Nội dung của các Docker image sẽ không bị thay đổi khi di chuyển. Docker image được dùng để chạy các Docker container.
      • Docker container: một dạng runtime của các Docker image, dùng để làm môi trường chạy ứng dụng.

      Cài đặt trên Linux

      Set up Docker’s apt repository

      # Add Docker's official GPG key:
      sudo apt-get update
      sudo apt-get install ca-certificates curl
      sudo install -m 0755 -d /etc/apt/keyrings
      sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
      sudo chmod a+r /etc/apt/keyrings/docker.asc
      
      # Add the repository to Apt sources:
      echo 
        "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu 
        $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | 
        sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
      sudo apt-get update

      Install Docker

      Latest Version :

      sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

      Specific version :

      List all available versions :

      # List the available versions:
      apt-cache madison docker-ce | awk '{ print $3 }'
      
      5:27.3.1-1~ubuntu.24.04~noble
      5:27.3.0-1~ubuntu.24.04~noble
      ...

      Install specific version :

      VERSION_STRING=5:27.3.1-1~ubuntu.24.04~noble
      sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin

      Verify Docker :

      sudo docker run hello-world

      Dù bạn là người mới bắt đầu hay một chuyên gia trong lĩnh vực công nghệ, Docker mang đến những giải pháp mạnh mẽ và linh hoạt để đơn giản hóa quy trình phát triển và triển khai ứng dụng. Việc hiểu rõ và áp dụng Docker không chỉ giúp nâng cao hiệu suất làm việc mà còn mở ra những cơ hội phát triển lớn trong tương lai. Hãy bắt đầu khám phá Docker ngay hôm nay!

      Nguồn tham khảo :

      https://en.wikipedia.org/wiki/Docker_(software)

      https://docs.docker.com/engine/install/ubuntu

      Các câu lệnh cơ bản trong Docker

      Giới thiệu

      Docker là công cụ mạnh mẽ được sử dụng rộng rãi trong việc tạo và quản lý container phần mềm. Để làm việc hiệu quả với Docker, việc nắm rõ các câu lệnh cơ bản là điều không thể thiếu. Những lệnh này không chỉ giúp bạn quản lý container mà còn hỗ trợ triển khai và theo dõi ứng dụng một cách dễ dàng. Trong bài viết này, chúng ta sẽ cùng khám phá các câu lệnh cơ bản trong Docker để bạn có thể sử dụng công cụ này một cách thành thạo.

      Các câu lệnh cơ bản như sau:

        liệt kê danh sách containers đang chạy.

      docker ps

      liệt kê danh sách tất cả các container kể cả đã stop.

      docker ps -a

      Tải một Docker image từ Docker Hub registry. Link của nó các bạn có thể vào Docker Hub để lấy. Hãy search từng image rồi vào chi tiết của chúng để xem.

      docker pull

      Được dung để tạo ra một image dựa trên một file Dockerfile. Thường dùng docker build . để build một image dựa trên Dockerfile trong thư mục hiện tại (dấu chấm). docker build -t “myimage:latest” . dùng để tạo một image và lưu image dưới tên được đặt.

      docker build

      Hiển thị danh sách image ở máy bạn.

      docker images
      docker images ls

      Chạy một container từ một image, i. e. docker run myimage -it bash. Nếu không có image nào được tìm thấy thì Docker run sẽ download nó tự động ở Docker hub.

      docker run

      Hiển thị logs của một container mà bạn chỉ ra.

      docker logs

      Để tiếp tục show log được cập nhật them thì bạn chỉ cần dùng

      docker logs -f mycontainer

      Hiển thị danh sách volumes, cái này dùng để lưu trữ dữ liệu trong container, tránh trường hợp restart container thì mất dữ liệu.

      docker volume ls

      Liệt kê tất cả các network có sẵn

      docker network ls

      Vào một network. Nó giúp container giao tiếp được với một container khác qua tên thay vì IP.

      docker network connect

       Loại bỏ một hoặc nhiều container. Ví dụ: docker rm mycontainer nhưng chắc chắn là container đang không ở trạng thái running.

      docker rm

      Xóa bỏ một hay nhiều image., xóa image tên là myimage nhưng phải đảm bảo không có container nào đang chạy sử dụng image này.

      docker rmi
       docker rmi myimage

      Stop một hay nhiều container. docker stop mycontainer stop 1 container trong khi docker stop $(docker ps -a -q) stop tất cả các container đang chạy. 

      docker stop

      Start một container đã được stop với trạng thái giữ nguyên.

      docker start

      Cập nhật một cài đặt container, nó đặc biệt hữu ích khi container của bạn lặp liên tục.

      docker update --restart=no

      Copy các file từ một container đang chạy ra ngoài host. docker cp :/etc/file . để copy /etc/file ra thư mục hiện tại.

      docker cp

      Một số kết hợp câu lệnh hữu ích:

      • Stop toàn bộ các container docker kill $(docker ps -q)
      • Xóa toàn bộ các container docker rm $(docker ps -a -q)
      • Xóa toàn bộ các image docker rmi $(docker images -q)
      • Xóa và stop một container bị lặp vô tận docker update –restart=no && docker stop
      • Chạy câu lệnh bên trong container docker exec -i -t /bin/bash – nếu không có bash thì dùng /bin/sh
      • Chạy bash với user root nếu container đang chạy với một user khác docker exec -i -t -u root /bin/bash

      Hiểu rõ và sử dụng thành thạo các câu lệnh cơ bản trong Docker sẽ giúp bạn tối ưu hóa quá trình quản lý container, từ đó nâng cao hiệu quả làm việc. Dù bạn đang bắt đầu học Docker hay đã có kinh nghiệm, việc làm chủ những lệnh này sẽ mang lại nhiều lợi ích trong phát triển và triển khai ứng dụng. Hãy thực hành ngay hôm nay để thành thạo Docker!

      Lưu, Nạp Images Docker

      Giới thiệu

      Trong hệ sinh thái Docker, images đóng vai trò cốt lõi, là nền tảng để tạo và triển khai các container. Biết cách lưu và nạp images Docker không chỉ giúp bạn quản lý dự án dễ dàng mà còn đảm bảo tính linh hoạt khi làm việc trên nhiều môi trường khác nhau. Bài viết này sẽ hướng dẫn bạn từng bước cách thực hiện lưu và nạp images Docker một cách chính xác và hiệu quả.

      1. Lưu Container thành images

      Để lưu một Container thành Image trong Docker, bạn cần sử dụng lệnh docker commit. Dưới đây là các bước chi tiết:

      Lệnh docker commit được sử dụng để tạo một Image từ Container đang chạy hoặc đã dừng.

      docker commit [OPTIONS] <container_id> <repository_name>:<tag>

      ví dụ: Giả sử bạn có một Container với ID abc123 và muốn lưu nó thành Image tên là my-image với tag v1.0:

      docker commit abc123 my-image:v1.0
      • <container_id>: ID hoặc tên của Container mà bạn muốn lưu.
      • <repository_name>:<tag>: Tên và tag cho Image mới.

        Kiểm tra:

        docker images

        Tùy chọn bổ sung với docker commit

        Thêm lời nhắn mô tả (-m): Bạn có thể thêm lời nhắn để mô tả Image:

        docker commit -m "Snapshot of my container" abc123 my-image:v1.0

        Chỉ định tác giả (-a): Bạn có thể chỉ định thông tin tác giả:

        docker commit -a "Your Name <your.email@example.com>" abc123 my-image:v1.0

        Giữ trạng thái không dừng Container: Nếu bạn không muốn dừng Container trước khi commit, bạn có thể tạo snapshot của Container khi nó đang chạy.

        2. Lưu Images ra file

        Trong Docker, bạn có thể lưu trữ (save) một Image ra file và sau đó nạp lại (load) Image từ file

        Cú pháp:

        docker save -o <tên_file>.tar <tên_image>:<tag>

        Exp :

        Giả sử bạn có một Image tên là my-app với tag v1.0:

        docker save -o my-app-v1.0.tar my-app:v1.0

        -o: Chỉ định đường dẫn và tên file đầu ra.

        File my-app-v1.0.tar sẽ được tạo trong thư mục hiện tại.

        Nạp Image từ file

        docker load -i <tên_file>.tar

        Ví dụ

        Nạp lại Image từ file my-app-v1.0.tar:

        docker load -i my-app-v1.0.tar
        • -i: Chỉ định đường dẫn file đầu vào.
        • Sau khi nạp, Image sẽ xuất hiện trong danh sách Images (docker images).

        Kiểm tra images

        docker images

        Lưu ý

        • Dung lượng lớn: Nếu Container của bạn chứa nhiều dữ liệu, Image được tạo sẽ có kích thước lớn.
        • Không tối ưu: Image được tạo bằng docker commit không có file Dockerfile, do đó khó quản lý hoặc xây dựng lại.
        • Tốt nhất: Sử dụng Dockerfile để tạo Image khi triển khai lâu dài. Dùng docker commit trong trường hợp cần snapshot nhanh.

        Lưu và nạp images Docker là kỹ năng quan trọng giúp bạn quản lý các dự án Docker dễ dàng hơn. Việc thành thạo các thao tác này không chỉ tối ưu hóa công việc mà còn giúp bạn xử lý linh hoạt trong các tình huống thực tế. Hãy bắt đầu thực hành ngay hôm nay để làm chủ công cụ Docker một cách hiệu quả!

        Chia sẻ dữ liệu giữa Docker Host và Container

        Giới thiệu

        Việc chia sẻ dữ liệu giữa Docker Host và Container là một trong những tính năng hữu ích, cho phép bạn đồng bộ hóa và quản lý thông tin một cách hiệu quả trong môi trường Docker. Nhờ đó, dữ liệu có thể dễ dàng được cập nhật, lưu trữ và sử dụng giữa hệ thống chủ và các container. Trong bài viết này, chúng ta sẽ khám phá các phương pháp chia sẻ dữ liệu phổ biến như VolumeBind Mounts, cùng các bước thực hiện chi tiết để bạn áp dụng vào công việc một cách thuận tiện.

        Container – ánh xạ thư mục máy Host:

        docker run -it -v /home/sitesdata:/home/data ubuntu

        Lúc này, dữ liệu trên thư mục /home/sitesdata/ của máy Host thì trong container có thể truy cập, cập nhật sửa đổi … thông qua đường dẫn /home/data

        Chia sẻ dữ liệu giữa các Container :

        Có container với id hoặc name là container_first, trong đó nó có mount thư mục Host vào. Giờ chạy, tạo container khác cũng nhận thư mục chia sẻ dữ liệu như container_first

        docker run -it --volumes-from container_first ubuntu

        Bạn đã tạo ra một Container nhận thư mục chia sẻ như container có ID hoặc tên là container_first tạo trước đó.

        Quản lý các ổ đĩa với docker volume

        Liệt kê danh sách các ổ đĩa:

        docker volume ls

        Tạo một ổ đĩa:

        docker volume create name_volume

        Xem thông tin chi tiết về đĩa:

        docker volume inspect name_volume

        Xóa một ổ đĩa:

        docker volume rm name_volume

        Mount một ổ đĩa vào container (–mount)

        # Tạo ổ đĩa có tên firstdisk
        docker volume create firstdisk

        Mount ổ đĩa vào container, container truy cập tại /home/firstdisk

        docker run -it --mount source=firstdisk,target=/home/firstdisk  ubuntu

        Gán ổ đĩa vào container khi tạo container (-v)

        docker volume create --opt device=path_in_host --opt type=none --opt o=bind  volumename

        Xóa tất cả các ổ đĩa không được sử dụng bởi container nào:

        docker volume prune

        Chia sẻ dữ liệu giữa Docker Host và Container là một kỹ thuật quan trọng, giúp tối ưu hóa quá trình làm việc với Docker. Bằng cách sử dụng Volume hoặc Bind Mounts, bạn có thể quản lý dữ liệu một cách linh hoạt và hiệu quả. Hãy áp dụng ngay các kiến thức này vào dự án của bạn để tận dụng tối đa sức mạnh của Docker trong việc phát triển và triển khai ứng dụng!

        Network trong Docker

        Giới thiệu

        Trong môi trường Docker, network đóng vai trò quan trọng trong việc kết nối và giao tiếp giữa các container. Hiểu rõ cách thiết lập và quản lý mạng không chỉ giúp các container tương tác hiệu quả mà còn đảm bảo tính bảo mật và hiệu suất của hệ thống. Bài viết này sẽ hướng dẫn bạn chi tiết về các loại mạng trong Docker, cách sử dụng chúng và cách tùy chỉnh để phù hợp với yêu cầu của dự án.

        Để liệt kê các network đang có:

        docker network ls

        Các network được tạo ra theo một driver nào đó như bridge, none, overlay, macvlan.

        • bridge : Dạng cầu, sử dụng khi nhiều Container đang chạy và giao tiếp với nhau
        • Host : Containers sẽ dùng mạng trực tiếp của máy host. Network configuration bên trong container đồng nhất với host.
        • None : Vô hiệu hóa mạng cho COntainer
        • Overlay : Overlay network là mạng có thể kết nối nhiều container trên các Docker Engine lại với nhau, trong môi trường cluster.
        • Macvlan : Gắn địa chỉ MAC cho container, hoạt động như thiết bị vật lý trong mạng

        Tạo Bridge network:

        docker network create --driver bridge name-network
        	
        docker network create --subnet 192.168.200.0/24 --ip-range 192.168.200.0/24 zabbix-net --driver bridge

        Kết nối Container với network :

        docker network connect name-network name-container

        Cấu hình IP tĩnh cho Container :

        docker run --net customnetwork --ip 172.20.0.10 -d container

        Port:

        Map Port Public với Port Container :

        docker run -p public-port:target-port/protocol ...
        • public-port : cổng public ra ngoài (ví dụ 80, 8080 …)
        • target-port : cổng bên trong container, cổng public-port sẽ ánh xạ vào cổng này.

        Network trong Docker là một thành phần không thể thiếu, giúp tạo ra sự linh hoạt trong việc kết nối các container và hệ thống bên ngoài. Bằng cách hiểu và sử dụng hiệu quả các loại mạng như Bridge, Host, hay Overlay, bạn có thể xây dựng một môi trường làm việc tối ưu và an toàn hơn. Hãy thực hành ngay hôm nay để nắm vững kiến thức về Docker networking và áp dụng thành công vào dự án của bạn!

        Docker File

        Giới thiệu

        Dockerfile là một trong những thành phần quan trọng nhất trong Docker, cho phép bạn định nghĩa cách tạo Docker image một cách tự động và chính xác. Với Dockerfile, bạn có thể kiểm soát toàn bộ quy trình, từ việc cài đặt hệ điều hành, thêm phần mềm, cho đến cấu hình môi trường. Trong bài viết này, chúng ta sẽ tìm hiểu cách tạo và sử dụng Dockerfile hiệu quả để xây dựng và triển khai ứng dụng của bạn một cách nhanh chóng và tối ưu.


        FROMmọi Docker file đều có chỉ thị này, chỉ định image cơ sở
        COPY ADDsao chép dữ liệu
        ENVthiết lập biến môi trường
        RUNchạy các lệnh.
        VOLUMEgắn ổ đĩa, thư mục
        USERuser
        WORKDIRthư mục làm việc
        EXPOSEthiết lập cổng

        FROM

        Như trên đã nói, chỉ thị này chỉ ra image cơ sở để xây dựng nên image mới. Để xây dựng từ image nào đó thì bạn cần đọc document của Image đó để biết trong đó đang chứa gì, có thể chạy các lệnh gì trong đó … Ví dụ, nếu bạn chọn xây dựng từ image centos:laste thì bạn bắt đầu bằng hệ điều hành CentOS và bạn có thể cài đặt, cập nhật các gói với yum, ngược lại nếu bạn chọn ubuntu:latest thì trình quản lý gói của nó là APT …

        COPY và ADD

        Được dùng để thêm thư mục, file vào Image

        ADD thưmục_nguồn thư_mụcđích

        Trong đó thưmục_nguồn là thư mục ở máy chạy Dockerfile, chứa dữ liệu cần thêm vào. thư_mụcđích là nơi dữ liệu được thêm vào ở container.

        ENV

        Chỉ thị này dùng để thiết lập biến môi trường, như biến môi trường PATH …, tùy hệ thống hay ứng dụng yêu cầu biến môi trường nào thì căn cứ vào đó để thiết lập.

        ENV biến giá_trị

        RUN

        Thi hành các lệnh, tương tự bạn chạy lệnh shell trên OS từ terminal.

        RUN lệnh-và-tham-số-cần-chạy
        RUN ["lệnh", "tham số1", "tham số 2" ...]

        VOLUME

        Chỉ thi tạo một ổ đĩa chia sẻ được giữa các container.

        VOLUME /dir_vol

        USER

        Bạn thêm user được dùng khi chạy các lệnh ở chỉ thị RUN CMD WORKDIR.

        USER private

        WORKDIR

        Thiết lập thư mục làm việc hiện tại chi các chỉ thị CMD, ENTRYPOINT, ADD thi hành.

        WORKDIR path_current_dir

        EXPOSE

        Để thiết lập cổng mà container lắng nghe, cho phép các container khác trên cùng mạng liên lạc qua cổng này hoặc đỉ ánh xạ cổng host vào cổng này.

        EXPOSE port

        ENTRYPOINT, CMD

        Chạy lệnh trong chỉ thị này khi container được chạy.

        ENTRYPOINT commnad_script
        ENTRYPOINT ["command", "tham-số", ...]

        CMD ý nghĩa tương tự như ENTRYPOINT, khác là lệnh chạy bằng shell của container.

        CMD command param1 param2
        #Chú ý ở dạng sau của CMD thì nó lại là thiết lập tham số cho ENTRYPOINT
        CMD ["tham-số1", "tham-số2"]

        EXAMPLE :

        FROM ubuntu:20.04 
        
        RUN apt update && apt upgrade -y 
            && apt install nano -y 
            && apt install htop -y 
            && apt install nginx -y 
            && service nginx start
        
        ADD ./test.html /etc/nginx/sites-available/
        
        EXPOSE 80
        EXPOSE 8080
        EXPOSE 443
        
        ENTRYPOINT service nginx start && /bin/bash

        Dockerfile giúp tự động hóa và đơn giản hóa việc tạo Docker image, làm cho quá trình phát triển và triển khai trở nên nhất quán và dễ dàng hơn. Hiểu rõ cấu trúc và cách sử dụng Dockerfile sẽ giúp bạn tận dụng tối đa sức mạnh của Docker trong các dự án của mình. Hãy bắt đầu áp dụng ngay hôm nay để khám phá tiềm năng vô tận của Docker!

        Docker Compose

        Giới thiệu

        Trong các dự án sử dụng Docker, việc quản lý nhiều container có thể trở nên phức tạp. Đây là lúc Docker Compose phát huy tác dụng, giúp bạn dễ dàng cấu hình, triển khai và quản lý các container một cách nhất quán. Với tệp cấu hình docker-compose.yml, bạn có thể định nghĩa và tự động hóa toàn bộ hệ thống chỉ với vài dòng lệnh. Hãy cùng khám phá cách sử dụng Docker Compose để tối ưu hóa quy trình làm việc của bạn!


        File docker-compose.yml gần giống ý nghĩa với file Dockerfile đã tìm hiểu trong Sử dụng Dockerfile, là một file text, viết với định dạng YAML (Ain’t Markup Language, đọc nhanh định dạng Định dạng YML) là cấu hình để tử đó lệnh docker compose sinh ra và quản lý các service (container), các network, các ổ đĩa … cho một ứng dụng hoàn chỉnh.

        Các lệnh docker compose:

        Tạo và chạy các thành phần định nghĩa trong docker-compose.yml (các dịch vụ, image, container, mạng, đĩa …)

        docker-compose up

        Dừng và xóa: image, container, mạng, đĩa tạo ra bởi docker-compose up

        docker-compose down

        Theo dõi logs từ các dịch vụ

        docker-compose logs [SERVICES]

        Tuỳ chọn

        docker-compose up -d <ten-dich-vu>

        Lệnh này để chạy background

        Example

        Ở đây tôi sẽ ví dụ với một ứng dụng Zabbix hoàn chỉnh:

        version: '3'
        
        services:
          zabbix-server-mysql:
            image: zabbix-server-mysql:2023
            ports:
              - 10051:10051
            networks:
              zabbix-network:
                ipv4_address: 192.168.200.4
            restart: always
            environment:
              - DB_SERVER_HOST=mysql
              - MYSQL_DATABASE=zabbixdb
              - MYSQL_USER=zabbixuser
              - MYSQL_PASSWORD=password
              - MYSQL_ROOT_PASSWORD=password
              - ZBX_JAVAGATEWAY=zabbix-java-gateway
              - StartVMwareCollectors=5
        
          zabbix-web-nginx-mysql:
            image: zabbix-web-nginx-mysql:2023
            ports:
              - 80:8080
            environment:
              - ZBX_SERVER_HOST="zabbix-server-mysql"
              - DB_SERVER_HOST="mysql"
              - MYSQL_DATABASE="zabbixdb"
              - MYSQL_USER="zabbixuser"
              - MYSQL_PASSWORD="password"
              - MYSQL_ROOT_PASSWORD="password"
            networks:
              zabbix-network:
                ipv4_address: 192.168.200.5
            restart: always
          
          zabbix-java-gateway:
            image: zabbix/zabbix-java-gateway:2023
            networks:
              zabbix-network:
                ipv4_address: 192.168.200.3
            restart: always
          
          zabbix-agent:
            image: zabbix-agent2:2023
            networks:
              zabbix-network:
                ipv4_address: 192.168.200.6
            restart: always
        
        networks:
          zabbix-network:
            driver: bridge
            ipam:
             config:
               - subnet: 192.168.200.0/24
                 gateway: 192.168.200.1

        Docker Compose là công cụ mạnh mẽ giúp đơn giản hóa việc triển khai và quản lý nhiều container, đặc biệt trong các ứng dụng phức tạp. Bằng cách sử dụng file docker-compose.yml, bạn có thể tiết kiệm thời gian và giảm thiểu lỗi cấu hình. Hãy bắt đầu áp dụng Docker Compose vào dự án của bạn để nâng cao hiệu suất và hiệu quả làm việc ngay hôm nay!

        Giám sát Container

        Giới thiệu

        Trong môi trường Docker, việc giám sát container là yếu tố quan trọng để đảm bảo hiệu suất và tính ổn định của hệ thống. Khi các ứng dụng được triển khai trong container, khả năng theo dõi tài nguyên, log, và hiệu suất giúp bạn kịp thời phát hiện và xử lý sự cố. Bài viết này sẽ giới thiệu các công cụ giám sát container phổ biến và hướng dẫn chi tiết cách triển khai giám sát hiệu quả trong Docker.

        Xem danh sách các Container

        Chỉ Container đang chạy

        docker ps
        • Hiển thị các Container đang chạy cùng thông tin như ID, tên, trạng thái, thời gian khởi chạy, cổng được ánh xạ, v.v.

        Tất cả Container (bao gồm cả Container đã dừng)

        docker ps -a

        Kiểm tra logs của Container

        Xem logs từ Container

        docker logs <container_id_or_name>
        • Hiển thị logs của một Container cụ thể.

        Theo dõi logs theo thời gian thực

        docker logs -f <container_id_or_name>

        Giới hạn số dòng logs

        docker logs --tail <number> <container_id_or_name>

        Kiểm tra trạng thái Container

        docker inspect <container_id_or_name>
        • Cung cấp thông tin chi tiết về Container như cấu hình mạng, volume, trạng thái, cổng, và môi trường.

        Theo dõi tài nguyên Container đang sử dụng

        Xem nhanh tài nguyên của một hoặc nhiều Container

        docker stats
        • Hiển thị việc sử dụng CPU, bộ nhớ, mạng, và I/O của tất cả Container đang chạy.

        Để theo dõi một Container cụ thể:

        docker stats <container_id_or_name>

        Kiểm tra tiến trình trong Container

        Liệt kê các tiến trình đang chạy bên trong Container

        docker top <container_id_or_name>

        Xem cấu hình mạng của Container

        docker network inspect <network_name>
        • Hiển thị chi tiết về mạng Docker và các Container đang kết nối với mạng đó.

        Kiểm tra thay đổi trong filesystem của Container

        docker port <container_id_or_name>
        
        • Hiển thị các cổng đang được ánh xạ từ Container ra host.

        Theo dõi sự kiện Docker

        docker events
        • Hiển thị các sự kiện trong Docker như Container khởi động, dừng, tạo mới, xóa, v.v.

        Ví dụ: Theo dõi các sự kiện liên quan đến Container cụ thể

        docker events --filter 'container=<container_id_or_name>'

        Kiểm tra tài nguyên hệ thống Docker

        docker system df
        • Hiển thị thông tin về việc sử dụng tài nguyên của Docker như dung lượng của images, containers, volumes

        Theo dõi realtime logs với cấu hình output format

        docker logs <container_id_or_name> --since <time>
        • Giám sát logs từ một khoảng thời gian cụ thể (time có thể là 10m, 2h, 2023-11-20T10:00:00).

        Kiểm tra restart policies

        docker inspect <container_id_or_name> --format '{{.HostConfig.RestartPolicy}}'
        • Hiển thị thông tin về chính sách restart được thiết lập cho Container.

        Giám sát container không chỉ giúp đảm bảo hệ thống hoạt động ổn định mà còn cung cấp những thông tin quan trọng để tối ưu hóa hiệu suất. Bằng cách sử dụng các công cụ như Prometheus, Grafana, hoặc các lệnh tích hợp sẵn của Docker, bạn có thể dễ dàng quản lý và theo dõi container của mình. Hãy áp dụng ngay hôm nay để nâng cao hiệu quả vận hành hệ thống Docker của bạn!

        Docker Plugin Hostnic

        Giới thiệu

        docker-plugin-hostnic là một plugin mạng cho Docker, được phát triển bởi Yunify, cho phép gắn trực tiếp một card mạng vật lý (NIC) của máy chủ vào container. Điều này giúp container có thể giao tiếp trực tiếp qua giao diện mạng của máy chủ mà không cần thông qua lớp mạng ảo hóa.

        Tính năng chính:

        • Gắn NIC trực tiếp:
          Plugin cho phép bạn chỉ định một NIC cụ thể từ máy chủ để gắn vào container.
        • Hiệu năng mạng cao:
          Bỏ qua các lớp ảo hóa mạng (bridge, overlay), giúp giảm độ trễ và tăng thông lượng mạng.
        • Cấu hình mạng đơn giản:
          Container sử dụng cấu hình mạng trực tiếp từ NIC của máy chủ mà không cần cấu hình phức tạp.

        Plugin yêu cầu Docker phiên bản 1.9 trở lên. Đảm bảo Docker của bạn tương thích bằng lệnh:

        docker --version

        Cài đặt plugin:

        docker pull qingcloud/docker-plugin-hostnic
        docker run -v /run/docker/plugins:/run/docker/plugins -v /etc/docker/hostnic:/etc/docker/hostnic --network host --privileged qingcloud/docker-plugin-hostnic docker-plugin-hostnic

        Tạo một mạng Docker sử dụng plugin hostnic:

        docker network create -d hostnic --subnet=192.168.1.0/24 --gateway 192.168.1.1 hostnic
        • --subnet: Phạm vi IP của mạng Docker.
        • --gateway: Cổng mặc định của mạng (thường là địa chỉ IP của NIC trên máy chủ).

        Khởi chạy một container sử dụng mạng hostnic:

        docker run -it --ip 192.168.1.5 --mac-address 52:54:0e:e5:00:f7 --network hostnic ubuntu:14.04 bash
        • --ip: Chỉ định địa chỉ IP cho container (nên nằm trong subnet đã tạo ở bước trên).
        • --mac-address: Chỉ định địa chỉ MAC cho container để tránh xung đột.

        Lưu ý quan trọng:

        1. IP và MAC phải duy nhất:
          Nếu bạn không chỉ định --ip, Docker sẽ tự động gán IP, nhưng bạn cần đảm bảo không có xung đột IP hoặc MAC trên mạng.
        2. Lưu cấu hình mạng:
          Các cấu hình mạng được lưu tại tệp /etc/docker/hostnic/config.json. Nếu plugin bị xóa hoặc khởi động lại, bạn có thể khôi phục cấu hình từ tệp này.
        3. Sử dụng cẩn thận với một NIC duy nhất:
          Nếu máy chủ chỉ có một NIC, việc gắn trực tiếp NIC này vào container có thể làm gián đoạn kết nối mạng của máy chủ.

        Tham khảo thêm:

        Monitoring

        Trong quản lý hệ thống và ứng dụng, việc sử dụng công cụ monitor để theo dõi hiệu suất đóng vai trò vô cùng quan trọng. Các giải pháp monitor giúp bạn giám sát tài nguyên, xác định các vấn đề tiềm ẩn, và đảm bảo hệ thống luôn hoạt động ổn định. Từ việc giám sát CPU, RAM, và lưu trữ, đến theo dõi log và hiệu suất ứng dụng, monitor là chìa khóa giúp bạn tối ưu hóa quy trình làm việc.

        Prometheus Alertmanager: Thiết lập cảnh báo thông minh trên Ubuntu 20.04+

        [Thực chiến] Prometheus Alertmanager: Thiết lập cảnh báo thông minh trên Ubuntu 20.04+

        Giới thiệu và khi nào nên dùng Prometheus Alertmanager

        Prometheus Alertmanager là thành phần quản lý cảnh báo trong hệ sinh thái Prometheus. Vai trò của Alertmanager là nhận cảnh báo từ Prometheus, thực hiện tổ chức và định tuyến chúng tới các kênh thông báo phù hợp, đồng thời hỗ trợ gom nhóm, ẩn cảnh báo (inhibition) và quản lý thời gian cảnh báo một cách hiệu quả. Trong bối cảnh triển khai trên Ubuntu 20.04+ hoặc hệ thống tương đương, Alertmanager giúp giảm nhiễu cảnh báo bằng cách gom nhóm các cảnh báo liên quan và gửi thông báo tới đội ngũ vận hành đúng lúc và đúng kênh nói chuyện.

        Bản chất của Alertmanager là tập hợp các quy tắc định tuyến (routes), các receivers (kênh nhận thông báo), và các cơ chế tối ưu hóa như group_by, group_wait, group_interval và repeat_interval. Ngoài ra Alertmanager còn hỗ trợ quản lý tính sẵn có (High Availability), tích hợp nhiều kênh thông báo (email, Slack, PagerDuty, webhook, v.v.), và có thể làm việc phối hợp với các công cụ giám sát và thông báo khác như Prometheus và Pushgateway. Các nguyên tắc thiết kế được mô tả trong tài liệu Prometheus nhấn mạnh việc: giữ cho cảnh báo đơn giản, cảnh báo theo triệu chứng của sự cố người dùng, có liên kết tới các console cho nhanh chóng xác định nguyên nhân, và tránh cảnh báo khi không có hành động cần thực hiện.

        Kiến trúc và khái niệm cốt lõi

        Kiến trúc của hệ thống cảnh báo với Alertmanager xoay quanh vài khái niệm then chốt sau đây, được nêu rõ trong tài liệu của Prometheus:

        • Alerting và quy trình định tuyến: Alertmanager nhận cảnh báo từ Prometheus, sau đó phân bổ chúng theo các tuyến (route) và danh sách nhận (receivers). Các quy tắc gom nhóm (group_by, group_wait, group_interval) giúp hợp nhất nhiều cảnh báo liên quan thành một thông báo duy nhất để giảm nhiễu.
        • Những kênh nhận thông báo (notification integrations): Alertmanager có thể gửi cảnh báo qua nhiều kênh khác nhau như email, webhook, Slack hoặc các dịch vụ thông báo khác. Việc định tuyến có thể tùy biến dựa trên nhãn (labels) của cảnh báo để gửi tới đúng đội ngũ hoặc hệ thống liên quan.
        • Quản lý High Availability (HA): Đảm bảo dịch vụ cảnh báo luôn sẵn sàng bằng cách triển khai nhiều instance Alertmanager và phân phối tải hoặc bật chế độ HA theo thiết kế của hệ thống.
        • Templates và cấu hình thông báo: Alertmanager hỗ trợ các template thông báo để tùy biến nội dung và định dạng thông báo trước khi gửi tới receiver. Các tham chiếu template và ví dụ template được đưa ra nhằm giúp người vận hành điều chỉnh nội dung thông báo cho phù hợp với quy trình vận hành.
        • Quản trị và an ninh: Cấu hình có thể hỗ trợ xác thực và bảo mật khi trao đổi thông tin thông báo, cùng với khả năng phân quyền và quản lý các luồng cảnh báo nhạy cảm.

        Yêu cầu và tiền đề triển khai với Ubuntu 20.04+

        Để triển khai Prometheus Alertmanager trên nền Ubuntu 20.04+ (hoặc các hệ điều hành tương thích), cần lưu ý các yếu tố sau để đảm bảo vận hành ổn định và an toàn:

        • Hệ điều hành tối thiểu là Ubuntu 20.04 hoặc phiên bản tương thích với kernel và giao thức mạng hiện đại.
        • Prometheus đang hoạt động và có các rules cảnh báo được định nghĩa để gửi tới Alertmanager.
        • Kênh nhận thông báo (receivers) phải được định nghĩa rõ ràng và có quyền truy cập tới dịch vụ nhận thông báo (ví dụ máy chủ SMTP cho email hoặc endpoints của webhook).
        • Cân nhắc triển khai High Availability cho Alertmanager để đảm bảo khả năng sẵn sàng và giảm thiểu thời gian gián đoạn cảnh báo.
        • Cân nhắc an toàn mạng và bảo mật khi truyền nhận cảnh báo qua mạng, đặc biệt khi dùng HTTPS và xác thực cho các kênh nhận thông báo.

        Cài đặt và triển khai tổng quan

        Tài liệu nhấn mạnh vai trò của Alertmanager là quản lý cảnh báo một cách có tổ chức và cung cấp các kênh nhận thông báo linh hoạt. Đối với Ubuntu 20.04+, quy trình triển khai thường bao gồm cài đặt Alertmanager cùng với cấu hình để định tuyến cảnh báo tới kênh nhận phù hợp, sau đó kết nối với Prometheus để nhận các cảnh báo từ các rule được đánh giá trong Prometheus. Quá trình triển khai nên xem xét khả năng sẵn có (HA) và cơ chế quản lý cấu hình để dễ bảo trì trong môi trường sản xuất.

        Dưới đây là một khung minh họa cho cấu hình Alertmanager ở mức tối giản nhằm hình dung các khối cơ bản. Lưu ý đây là ví dụ tham khảo; nội dung thực tế nên được điều chỉnh cho phù hợp với quy trình vận hành và các kênh nhận được hỗ trợ trong tổ chức của bạn.

        global:
          resolve_timeout: 5m
        
        route:
          group_by: ['alertname']
          group_wait: 30s
          group_interval: 5m
          repeat_interval: 4h
          receiver: 'default-receiver'
        
        receivers:
        - name: 'default-receiver'
          email_configs:
          - to: 'ops@example.com'
            send_resolved: true
        

        Trong thực tế, cấu hình có thể mở rộng với nhiều receivers và quy tắc định tuyến phức tạp hơn để đáp ứng phạm vi hệ thống và yêu cầu vận hành của tổ chức.

        Cấu hình Alertmanager và cách thức tích hợp với Prometheus

        Alertmanager được thiết kế để làm việc cùng Prometheus nhằm tối ưu hoá việc gửi cảnh báo trên các kênh phù hợp. Prometheus sẽ đánh giá các alerting rules và gửi các cảnh báo tới Alertmanager. Tại đây, Alertmanager sẽ xử lý theo các route đã được định nghĩa, ghép nhóm cảnh báo tương tự, và đẩy thông báo tới receiver phù hợp. Việc định tuyến dựa vào các nhãn (labels) của cảnh báo cho phép phân phối cảnh báo đến đúng đội ngũ hoặc dịch vụ liên quan. Đây là yếu tố quan trọng giúp giảm noise và nâng cao thời gian phản hồi của đội ngũ vận hành.

        Trong chủ đề an ninh và xác thực, cấu hình Alertmanager có thể được mở rộng với các cơ chế bảo mật để đảm bảo an toàn khi trao đổi thông báo qua mạng, bao gồm việc thiết lập HTTPS và xác thực cho các kênh nhận thông báo nếu cần thiết.

        Ví dụ thiết kế và vận hành thực tế

        Một kịch bản điển hình trong môi trường sản xuất là một ứng dụng phục vụ người dùng có độ trễ cao đột biến. Dưới đây là cách tiếp cận ở mức vận hành:

        1. Định nghĩa một alert rule trong Prometheus để phát hiện tăng latency vượt ngưỡng và/hoặc tỉ lệ lỗi tăng lên. Rule này sẽ gửi cảnh báo tới Alertmanager.
        2. Alertmanager nhận cảnh báo, kiểm tra các điều kiện để ghép nhóm và xác định receiver phù hợp với nhóm vận hành (ví dụ on-call hoặc the on-call channel).
        3. Route được cấu hình để gửi thông báo tới người chịu trách nhiệm qua kênh email và Slack, hoặc tới một webhook tích hợp hệ thống vận hành trung tâm.
        4. Khi sự cố được resolves, cảnh báo sẽ được đóng và một thông báo gửi tới receiver xác nhận tình trạng đã được khắc phục.

        Trong quá trình triển khai, điều quan trọng là đảm bảo có thể kiểm thử luồng cảnh báo để xác nhận rằng Alertmanager có thể nhận được cảnh báo từ Prometheus, xử lý đúng bằng cách ghép nhóm và gửi thông báo tới receiver phù hợp. Một nguyên tắc được nhắc tới trong tài liệu Prometheus là cảnh báo nên tập trung vào triệu chứng thay vì cố gắng theo dõi mọi nguyên nhân có thể gây ra sự cố.

        Bảo mật và hiệu năng

        Với mô hình vận hành thực tế, các yếu tố bảo mật và hiệu năng là cần thiết để đảm bảo cảnh báo được gửi đúng người đúng lúc mà không rò rỉ thông tin hay gặp gián đoạn. Các yêu cầu quan trọng theo nguyên tắc được đề cập bao gồm:

        • Cấu hình an toàn cho kênh nhận thông báo: đảm bảo đường truyền tới receiver được bảo mật, đặc biệt khi gửi qua mạng công khai hoặc qua các hệ thống bên ngoài tổ chức.
        • Quản lý naming và tổ chức alert: đặt tên theo Camel Case cho các cảnh báo, hạn chế số lượng cảnh báo và đảm bảo mỗi cảnh báo liên quan tới một triệu chứng cụ thể có thể dễ dàng xác định. Việc này giúp giảm nhiễu và tăng khả năng đo lường tình trạng hệ thống.
        • Metamonitoring cho hệ thống cảnh báo: có các cảnh báo liên quan đến Prometheus servers, Alertmanager instances và các thành phần liên quan (ví dụ Pushgateway) nhằm đảm bảo toàn bộ chu trình cảnh báo đang hoạt động đúng cách.
        • Thiết kế cảnh báo theo ngữ cảnh người dùng: ưu tiên cảnh báo ở mức latency và error rate ở tầng cao nhất có thể, đồng thời liên kết với các console liên quan để dễ xem nguyên nhân.

        Vận hành và giám sát hệ thống cảnh báo

        Để đảm bảo Alertmanager vận hành liên tục, cần có các hoạt động giám sát và kiểm thử định kỳ. Các khía cạnh cần kiểm tra thường gặp bao gồm:

        • Kiểm tra tính sẵn có của Alertmanager ở chế độ HA và khả năng chịu lỗi khi có node bị lỗi.
        • Đảm bảo các receivers nhận đúng dạng cảnh báo và có thời gian đáp ứng phù hợp với mức độ nghiêm trọng của cảnh báo.
        • Kiểm tra các template thông báo để đảm bảo nội dung và định dạng phù hợp với thực tiễn vận hành và ghi nhận chi tiết giúp debugging nhanh chóng.
        • Kiểm tra luồng cảnh báo từ Prometheus tới Alertmanager và từ Alertmanager tới receiver, với các test nhỏ mô phỏng cảnh báo và xác nhận phản hồi.

        Thông qua các nguyên tắc và khuyến nghị trên, quá trình vận hành Alertmanager trên Ubuntu 20.04+ có thể được duy trì ổn định và dễ bảo trì trong thời gian dài.

        Kiểm thử, xác nhận và xác thực vận hành

        Để đảm bảo chất lượng và tính đúng đắn của cấu hình Alertmanager, thực hiện một chu kỳ kiểm thử có thể bao gồm các bước sau:

        • Kiểm tra cú pháp cấu hình bằng cách xác nhận file cấu hình Alertmanager trước khi chạy trong môi trường sản xuất.
        • Thực hiện cảnh báo mô phỏng (test alert flow) bằng cách kích hoạt một cảnh báo trong Prometheus và xác nhận Alertmanager nhận và gửi thông báo tới receiver được định nghĩa.
        • Kiểm tra log của Alertmanager để xác nhận các hành động định tuyến và các thông báo nhận được bởi receiver.
        • Đảm bảo khả năng phục hồi khi một node trong chế độ HA bị lỗi và cảnh báo vẫn được định tuyến tới receiver còn hoạt động.

        Checklist vận hành cuối bài

        • Đảm bảo Prometheus và Alertmanager được triển khai đúng với chu trình cảnh báo phù hợp với yêu cầu vận hành.
        • Cấu hình route và receivers phù hợp với tổ chức, team và SLAs.
        • Thiết lập TLS và xác thực cho các kênh nhận thông báo nếu cần thiết.
        • Thiết lập cơ chế High Availability cho Alertmanager và theo dõi sức khỏe của các node.
        • Thiết lập và kiểm tra templates thông báo để đảm bảo nội dung có thể đọc được và actionable.
        • Thực hiện kiểm thử luồng cảnh báo định kỳ và cập nhật cấu hình khi cần.

        Kết luận

        Prometheus Alertmanager cung cấp cơ chế quản lý cảnh báo tập trung, giúp định tuyến và tối ưu hóa các thông báo đến đúng người và đúng kênh. Khi triển khai trên Ubuntu 20.04+ hoặc hệ thống tương đương, cần chú ý tới các nguyên tắc thiết kế: định tuyến có ngữ cảnh, gom nhóm để giảm nhiễu, và ưu tiên cảnh báo theo triệu chứng có tác động lên người dùng. Bên cạnh đó, sự tích hợp giữa Alertmanager và Prometheus, cùng với các kênh thông báo và cơ chế HA, là nền tảng cho một hệ thống giám sát và vận hành mạnh mẽ và đáng tin cậy.

        Bảo mật và Hardening Grafana trên Docker: Hướng dẫn cho Sysadmin

        Bảo mật và Hardening Grafana trên Docker: Hướng dẫn cho Sysadmin

        Grafana chạy trong Docker mang lại sự linh hoạt cho triển khai giám sát và phân tích telemetry ở quy mô doanh nghiệp. Tuy nhiên, để đảm bảo hệ thống vận hành an toàn và đáng tin cậy, việc hardening và bảo mật Grafana trên môi trường container cần được xem trọng. Bài viết này trình bày các khuyến nghị, thực hành tốt nhất và các bước triển khai bảo mật Grafana khi chạy trên Docker, với tham chiếu từ tài liệu Grafana và các khuyến nghị bảo mật chung cho hệ thống container.

        Giới thiệu và khi nào nên áp dụng

        Đối với các tổ chức triển khai Grafana trên Docker để theo dõi hệ thống, có nhiều yếu tố bảo mật cần cân nhắc trước khi đưa vào vận hànhProduction. Grafana cung cấp các tùy chọn xác thực đa dạng (LDAP, SAML, OAuth2) và khả năng tích hợp với các giải pháp quản lý bí mật như HashiCorp Vault, Google Cloud KMS, AWS KMS và Azure Key Vault để bảo vệ khóa và bí mật cơ sở dữ liệu. Việc hardening nên bắt đầu từ cấu hình xác thực, quản lý bí mật, hạn chế truy cập và thiết lập kênh TLS cho giao tiếp giữa Grafana và client hoặc giữa Grafana với nguồn dữ liệu.

        Kiến trúc cơ bản và các yếu tố bảo mật cốt lõi

        • Grafana chạy trong Docker thường làm việc với một cơ sở dữ liệu nội bộ và các nguồn dữ liệu từ bên ngoài (Prometheus, OpenTelemetry, các nguồn SQL, v.v.). Việc bảo vệ bí mật và quản lý ai có quyền truy cập vào Grafana là bắt buộc.
        • Grafana hỗ trợ xác thực từ nhiều nguồn ngoài (LDAP, SAML, OAuth2) và có khả năng quản lý người dùng/nhóm thông qua RBAC, LBAC và các cơ chế cấp phát người dùng.
        • Bảo mật dữ liệu bí mật và khóa: Grafana cho phép mã hóa bí mật trong cơ sở dữ liệu và tích hợp với các kho bí mật/khóa an toàn như Google Cloud KMS, HashiCorp Vault, AWS KMS và Azure Key Vault.
        • Giao tiếp bảo mật: thiết lập HTTPS/TLS cho Grafana và/hoặc qua reverse proxy để đảm bảo truyền tải dữ liệu an toàn giữa client, Grafana và các nguồn dữ liệu.

        Yêu cầu và chuẩn bị trước khi triển khai

        • Hệ điều hành và môi trường: sẵn sàng một máy chủ Linux (điển hình Ubuntu 20.04+ hoặc hệ CentOS tương thích) cho chạy Docker. Đảm bảo Docker được cập nhật và có hỗ trợ networking phù hợp cho Grafana và các nguồn dữ liệu.
        • Chứng chỉ TLS: chuẩn bị chứng chỉ TLS hợp lệ cho Grafana hoặc cho reverse proxy để phục vụ HTTPS. Grafana có thể được cấu hình qua reverse proxy để TLS termination hoặc thiết lập TLS trực tiếp tại Grafana theo hướng dẫn từ tài liệu “Set up HTTPS”.
        • Bí mật và khóa: xác định chiến lược quản lý bí mật cho Grafana (ví dụ: lưu trữ bí mật trong Vault hoặc KMS), đặc biệt khi Grafana lưu trữ khóa và các bí mật liên quan đến dữ liệu nguồn và cài đặt xác thực.
        • Quản lý xác thực: lựa chọn phương thức xác thực phù hợp với tổ chức (LDAP cho danh tính nội bộ, SAML cho SSO qua IdP, hoặc OAuth/OIDC cho tích hợp với nhà cung cấp OAuth2).
        • Quản trị quyền và RBAC: định nghĩa vai trò, nhóm và quyền truy cập vào dashboard, folder và data source theo nguyên tắc tối thiểu đặc quyền.

        Cấu hình bảo mật và hardening Grafana trên Docker

        Phần này tập trung vào các cấp độ cấu hình quan trọng để harden Grafana khi chạy trên Docker, dựa trên các hướng dẫn bảo mật và tính năng được Grafana hỗ trợ.

        1. Chọn và cấu hình các phương thức xác thực

        Grafana hỗ trợ nhiều phương thức xác thực ngoài. Bạn có thể chọn một hoặc kết hợp các phương thức sau để đáp ứng yêu cầu tổ chức:

        • LDAP: đồng bộ danh tính từ hệ thống thư mục doanh nghiệp.
        • SAML: SSO qua Service Provider (SP) và Identity Provider (IdP) với khả năng khôi phục và bảo vệ phiên làm việc.
        • OAuth/OIDC: xác thực qua các nhà cung cấp OAuth2/OIDC (ví dụ Google, Entra ID, GitHub, Okta, v.v.).

        Theo tài liệu Grafana, các tùy chọn LDAP, SAML và OAuth2 được nêu rõ trong các mô-đun cấu hình bảo mật và quản lý xác thực. Việc triển khai xác thực ngoài giúp cô lập quản trị người dùng, giảm thiểu việc lưu trữ mật khẩu trong Grafana và tăng cường kiểm soát truy cập.

        Khuyến nghị thực hành:

        • Đánh giá khung xác thực phù hợp với tổ chức (ví dụ tích hợp LDAP cho danh tính nội bộ hoặc SSO qua IdP với SAML).
        • Tách biệt quyền truy cập quản trị khỏi tài khoản người dùng bình thường và áp dụng RBAC để điều tiết quyền quản trị dashboard, thư mục, nguồn dữ liệu.
        • Kiểm tra và đảm bảo các cấu hình xác thực được đồng bộ với nguồn dữ liệu người dùng và tổ chức quản trị danh tính.

        2. Bảo mật dữ liệu bí mật và khóa

        Grafana cho phép mã hóa bí mật cơ sở dữ liệu và tích hợp với các kho bí mật/khóa an toàn. Bạn nên cấu hình để bí mật (ví dụ khóa, chứng chỉ, khóa truy cập) được lưu và quản lý bởi một hệ thống lưu trữ bí mật ngoài Grafana:

        • Google Cloud KMS
        • HashiCorp Vault
        • AWS KMS
        • Azure Key Vault

        Ví dụ tham khảo (không phải cú pháp trực tiếp từ tài liệu Grafana, nhưng phản ánh nguyên tắc triển khai):

        // Cấu hình tham khảo cho provider mã hóa bí mật (điểm cốt lõi là chỉ định nguồn lưu trữ bí mật ngoài Grafana)
        secret_storage_provider = Vault
        vault_address = https://vault.example.com
        vault_auth_method = token
        vault_token = <token>
        

        Đảm bảo các kết nối đến kho bí mật được bảo mật (TLS) và trợ giúp xác thực mạnh mẽ cho vault/kms.

        3. Thiết lập TLS và HTTPS

        Để bảo vệ dữ liệu khi người dùng truy cập Grafana, hãy thiết lập TLS cho giao tiếp giữa người dùng và Grafana. Grafana có thể được triển khai qua reverse proxy để xử lý TLS hoặc cấu hình TLS trực tiếp theo hướng dẫn “Set up HTTPS” trong tài liệu Grafana. Việc này giúp bảo vệ dữ liệu đăng nhập và các truy vấn tới nguồn dữ liệu khi di chuyển trên mạng.

        Gợi ý thực hành:

        • Sử dụng chứng chỉ TLS hợp lệ và được tin cậy.
        • Định kỳ gia hạn chứng chỉ và tự động làm mới khi có thể.
        • Định cấu hình plugin/người dùng proxy để chỉ cho phép TLS và chặn TLS versions yếu.

        4. Quản trị truy cập và RBAC/LBAC

        Grafana hỗ trợ RBAC (quản lý vai trò và quyền) và LBAC (Label Based Access Control) để phân quyền truy cập vào dashboard, thư mục và nguồn dữ liệu. Áp dụng RBAC/LBAC giúp giới hạn người dùng chỉ với các tài nguyên cần thiết và giảm thiểu rủi ro lạm quyền trên hệ thống Docker.

        Theo tài liệu Grafana, việc thiết lập quyền và phân quyền là một phần quan trọng của bảo mật và quản trị hệ thống Grafana.

        5. Cấu hình nâng cao bảo mật và quản lý truy cập

        Bạn có thể cấu hình việc cấp phát người dùng và nhóm bằng SCIM để đồng bộ danh sách người dùng với hệ thống quản trị danh tính, đồng thời đảm bảo các quy trình cấp phát/thu hồi tài khoản được tự động hoá. Grafana cung cấp các tùy chọn liên quan đến quản trị người dùng, nhóm và quyền qua API và giao diện quản trị.

        Khuyến nghị: kết nối Grafana với SCIM để tự động đồng bộ danh sách người dùng và nhóm, đồng thời quản lý vai trò và quyền truy cập một cách nhất quán.

        6. Bảo vệ và quản lý log, audit

        Việc theo dõi và ghi nhận sự kiện bảo mật là một phần thiết yếu của vận hành an toàn. Grafana cho phép xuất日志 và audit các hoạt động liên quan đến hệ thống. Bạn nên bật và định tuyến logs đến hệ thống quản lý log an toàn, đồng thời đảm bảo có cơ chế kiểm tra và phân tích các sự kiện bảo mật khi cần.

        7. Zuất triển và kiểm tra tính sẵn sàng bảo mật

        Để đảm bảo độ tin cậy của hệ thống bảo mật, hãy thực hiện các bước kiểm thử sau:

        • Kiểm tra khả năng đăng nhập qua các provider được cấu hình (LDAP, SAML, OAuth2) và xác nhận hoạt động SSO khi cần.
        • Kiểm tra kết nối TLS và xác thực chứng chỉ ở cả phía Grafana và nguồn dữ liệu.
        • Kiểm tra cấp phát quyền và RBAC/LBAC cho người dùng và nhóm, đảm bảo quyền tối thiểu phù hợp với vai trò.
        • Kiểm tra tích hợp với kho bí mật (Vault/KMS) và xác thực máy chủ bí mật.
        • Kiểm tra log và audit để phát hiện bất thường và vận hành đúng quy trình incident response.

        Cấu hình Docker và thực hành vận hành an toàn

        Để vận hành Grafana an toàn trong Docker, cần cân nhắc các thực hành container security cơ bản, đồng thời áp dụng các khuyến nghị từ tài liệu Grafana về bảo mật và hardening. Dưới đây là các yếu tố đáng xem xét, dựa trên các khuyến nghị tổng quát và các mục trong tài liệu Grafana:

        • Chạy Grafana bằng phiên bản Docker image được duy trì, theo dõi các bản vá và cập nhật bảo mật từ nhà cung cấp Grafana.
        • Kiểm soát truy cập máy chủ Docker, giới hạn quyền truy cập vào host và mạng liên quan đến Grafana.
        • Thiết lập TLS cho giao tiếp người dùng và các kết nối đến nguồn dữ liệu, và cân nhắc dùng reverse proxy để quản lý TLS và chứng chỉ.
        • Quản lý bí mật ngoài Grafana, thông qua Vault/Cloud KMS hoặc tương tự, và tránh lưu trữ bí mật nhạy cảm trong container.
        • Thiết lập auditing/logging và định tuyến logs sang hệ thống quản trị logs tập trung.

        Ví dụ thực hành và minh họa triển khai (khung tham chiếu)

        Dựa trên các hướng dẫn và tính năng được Grafana công bố, dưới đây là khung tham chiếu cho một triển khai Grafana an toàn trên Docker. Lưu ý: các tham số chi tiết có thể thay đổi tùy theo phiên bản Grafana và môi trường vận hành. Bạn nên tham khảo tài liệu cập nhật khi triển khai:

        // Sơ đồ triển khai tham khảo (không phải cú pháp cấu hình chính thức)
        - Grafana chạy trong Docker, nằm sau reverse proxy (người dùng truy cập qua HTTPS)
        - Xác thực qua một hoặc nhiều provider: LDAP/SAML/OAuth2
        - Bí mật và khóa được lưu trữ ngoài Grafana (Vault/KMS)
        - RBAC/LBAC được cấu hình cho người dùng và nhóm
        - SCIM được bật để đồng bộ người dùng từ IdP
        - Logs được gửi tới hệ thống quản trị logs và audit
        

        Để kiểm tra nhanh sau triển khai, bạn có thể thực hiện các bước sau:

        1. Kiểm tra TLS: curl -I https://grafana.example.com và xác nhận trả về mã 200/301 với TLS được thiết lập đúng.
        2. Kiểm tra xác thực: thực hiện đăng nhập bằng tài khoản được cấp từ IdP và xác nhận hệ thống ghi nhận sự kiện đăng nhập.
        3. Kiểm tra quyền: đăng nhập bằng tài khoản thuộc nhóm có quyền truy cập dashboard và xác nhận không thể truy cập các tài nguyên ngoài phạm vi được cấp.
        4. Kiểm tra bí mật: xác thực rằng bí mật được Vault/KMS cấp phát và Grafana có thể truy cập khi cần.

        Đo lường hiệu suất và giám sát an toàn

        Ngoài bảo mật, hiệu suất và tính sẵn sàng là yếu tố quan trọng. Grafana và hệ sinh thái của nó cung cấp các công cụ để giám sát và kiểm tra hiệu suất dưới tải cao:

        • Đánh giá và thực hiện các bài kiểm tra tải để đảm bảo phản hồi và thời gian truy cập ở mức chấp nhận được, đặc biệt khi có nhiều người dùng hoặc nhiều nguồn dữ liệu đồng thời kết nối.
        • Kết nối Grafana với các nguồn dữ liệu và kiểm soát truy vấn để tránh ảnh hưởng đến nguồn dữ liệu gốc.
        • Giám sát an toàn, audit và log để nhanh chóng nhận diện và xử lý các sự kiện bảo mật hoặc bất thường.

        Kiểm tra, xác thực và đánh giá sau khi triển khai

        Quy trình kiểm tra sau triển khai nên bao gồm:
        – Xác thực tích hợp với IdP và các provider xác thực đã chọn.
        – Kiểm tra TLS ở cả phía người dùng và phía nguồn dữ liệu.
        – Kiểm tra quyền truy cập và RBAC/LBAC theo vai trò thực tế.
        – Kiểm tra tích hợp với kho bí mật và cơ chế quản lý khóa.
        – Kiểm tra log và audit để đảm bảo ghi nhận đầy đủ các sự kiện bảo mật.

        Checklist vận hành cuối cùng

        • Grafana được cập nhật và chạy bằng Docker image được duy trì.
        • TLS/HTTPS được thiết lập và chứng chỉ được gia hạn định kỳ.
        • Xác thực ngoài được cấu hình và đồng bộ với IdP/LDAP/OAuth2.
        • Bí mật và khóa được lưu trữ an toàn ngoài Grafana (Vault/KMS) và Grafana có quyền truy cập đúng.
        • Quyền truy cập người dùng, nhóm và dashboard được quản lý bằng RBAC/LBAC, với nguyên tắc tối đa đặc quyền.
        • SCIM được bật (nếu có) để đồng bộ danh sách người dùng từ IdP.
        • Logging và audit được định tuyến tới hệ thống quản trị logs và có kế hoạch phản ứng sự cố.

        Kết luận

        Hardening Grafana trong Docker là quá trình liên tục và cần kết hợp giữa xác thực an toàn, quản lý bí mật, bảo mật mạng và giám sát vận hành. Việc cấu hình đúng các lựa chọn xác thực, bảo vệ bí mật và quản lý quyền truy cập sẽ giúp giảm thiểu rủi ro an ninh và tăng tính sẵn sàng cho môi trường quan trọng của bạn. Bởi Grafana cung cấp hỗ trợ cho LDAP, SAML và OAuth2, cùng với khả năng tích hợp bí mật với Vault/KMS và khả năng bảo mật qua TLS, tổ chức có thể thiết lập một nền tảng giám sát an toàn trên Docker mà vẫn linh hoạt cho quy mô và nhu cầu ngày càng tăng.

        Tối ưu hiệu năng Zabbix trên Ubuntu 22.04+: Chiến lược cho môi trường production

        Tối ưu hiệu năng Zabbix trên Ubuntu 22.04+: Chiến lược cho môi trường production

        Giới thiệu

        Bài viết này trình bày chiến lược tối ưu hóa hiệu năng cho Zabbix trên Ubuntu 22.04+ trong môi trường production. Với mô hình triển khai hiện đại, Zabbix cho phép phân tán tải bằng cách kết hợp máy chủ, agent và các máy chủ proxy được phân bổ ở nhiều vị trí, đồng thời tận dụng các tính năng an ninh và tối ưu hóa hiệu suất có sẵn trong hệ sinh thái Zabbix. Nội dung tập trung vào các khía cạnh kiến trúc, cài đặt, cấu hình tối ưu, triển khai thực tế và quy trình vận hành để đảm bảo hiệu năng ổn định và có thể mở rộng.

        Kiến trúc và khái niệm cốt lõi

        Hiệu năng của hệ thống giám sát phụ thuộc vào cách bạn sắp đặt các thành phần chính của Zabbix và cách chúng giao tiếp với nhau:

        • Zabbix server: Thành phần xử lý chính, nhận dữ liệu từ các agent/proxy, thực thi các biểu thức cảnh báo và lưu trữ lịch sử.
        • Agent: Thực thi trên các máy chủ/máy đích để cung cấp dữ liệu giám sát cho server hoặc proxy.
        • Proxy: Lưu trữ và đệm dữ liệu ở mức trung gian; giúp phân tán tải và tăng khả năng mở rộng cho hệ thống ở quy mô lớn.
        • Java gateway (nếu có): Thành phần bổ sung cho các trường hợp tích hợp Java.
        • High availability (HA): Môi trường production thường yêu cầu cơ chế sẵn sàng cao cho server và/hoặc proxy để giảm thời gian ngừng dịch vụ và mất dữ liệu trong khi bảo toàn hiệu suất hoạt động.
        • Distributed monitoring: Khả năng giám sát phân tán qua multiple proxies và sự đồng bộ cấu hình giữa các thành phần, giúp mở rộng quy mô và tăng tính resilience.
        • Encryption: Bảo mật kết nối giữa các thành phần thông qua các cơ chế mã hóa và khóa chia sẻ (TLS/PSK theo tài liệu Zabbix).

        Chuẩn bị và cài đặt trên Ubuntu 22.04+

        Đối với nền tảng ubuntu-22.04-plus, Zabbix có thể cài đặt từ các gói Debian/Ubuntu. Quá trình này bao gồm cài đặt các thành phần cần thiết và cấu hình ban đầu để có thể đi vào vận hành. Khi triển khai cho production, bạn có thể cân nhắc sử dụng một hoặc nhiều proxy để phân tán tải và thiết lập cơ chế giao tiếp an toàn giữa server và proxy.

        Yêu cầu và chuẩn bị

        • Hệ điều hành: Ubuntu 22.04+ (64-bit) hoặc các bản phân phối tương thích khác được hỗ trợ.
        • Môi trường chạy Zabbix server và frontend (web server và môi trường PHP) đủ đáp ứng tải giám sát dự kiến.
        • Sơ đồ mạng cho phép kết nối giữa Zabbix server, proxies và agents.

        Cài đặt từ gói Debian/Ubuntu

        Quá trình cài đặt từ gói đóng gói cho Debian/Ubuntu được mô tả trong tài liệu Zabbix. Dưới đây là các bước thực tế ở mức khung tham khảo cho hệ thống Ubuntu 22.04+:

        sudo apt update
        sudo apt install -y zabbix-server zabbix-frontend-php zabbix-agent
        

        Trong trường hợp bạn mở rộng với mô hình phân tán, có thể thêm zabbix-proxy hoặc các thành phần khác theo nhu cầu, sau đó khởi động và bật tự động các dịch vụ:

        sudo systemctl enable --now zabbix-server zabbix-agent

        Kiểm tra trạng thái dịch vụ để đảm bảo các thành phần đang hoạt động bình thường:

        systemctl status zabbix-server
        systemctl status zabbix-agent

        Cấu hình ban đầu và liên kết với cơ sở dữ liệu

        Với mô hình cài đặt từ gói, bạn sẽ cần cấu hình kết nối cơ sở dữ liệu và tích hợp với giao diện web. Trong các bài hướng dẫn chi tiết của Zabbix, các bước này được mô tả rõ ràng cho từng ngữ cảnh cài đặt (cơ sở dữ liệu và phiên bản frontend). Đối với mục tiêu tối ưu hóa hiệu năng ở production, bạn có thể xem xét việc tách biệt cơ sở dữ liệu và tối ưu đường dẫn truy vấn giữa server và cơ sở dữ liệu.

        Cấu hình tối ưu hiệu năng cho production

        Để tối ưu hiệu năng cho Zabbix trên Ubuntu 22.04+, tập trung vào các nguyên tắc sau đây, được hỗ trợ bởi các khía cạnh kiến trúc của Zabbix và các chức năng phân tán/điện tử của hệ thống:

        Phân tán tải và sử dụng proxies

        • Sử dụng proxy ở các vùng địa lý hoặc phân khu dữ liệu để thu thập dữ liệu từ các hosts và gửi lên server ở cấp cao hơn. Distributed monitoring giúp giảm tải cho Zabbix server, đồng thời tăng tốc độ xử lý và đảm bảo tính sẵn sàng cao.
        • Thiết lập đồng bộ cấu hình giữa server và proxies để đảm bảo các rule, templates và discovery được áp dụng nhất quán trên toàn hệ thống.

        Quản lý ha và redundancy

        • Áp dụng cơ chế High availability cho các thành phần then chốt (server và/hoặc proxy) để giảm thiểu thời gian gián đoạn dịch vụ khi thay đổi hoặc gặp sự cố.
        • Thiết kế topology sao cho proxy có thể hoạt động độc lập khi server gặp sự cố, và dữ liệu được đồng bộ khi khôi phục.

        Bảo mật và mã hóa liên lạc

        Đảm bảo liên lạc giữa các thành phần được bảo mật bằng các cơ chế mã hóa. Zabbix hỗ trợ Encryption với các hình thức:

        • Sử dụng chứng chỉ (certificates) để thiết lập TLS giữa các thành phần.
        • Sử dụng khóa chia sẻ trước (PSK) khi thiết lập kết nối giữa các thành phần.

        Làm chủ vòng đời và hiệu suất truy vấn

        • Cân nhắc số lượng poller, trappers và các yếu tố xử lý liên quan trong Zabbix server để phù hợp với tải mong đợi. Các yếu tố này được đề cập trong khung quản trị chung của tài liệu Zabbix và có thể được điều chỉnh thông qua cấu hình phù hợp với môi trường của bạn.
        • Sử dụng template và discovery để tinh gọn dữ liệu thu thập được, tránh tạo quá nhiều item tĩnh ngoài phạm vi cần thiết.

        Cấu hình và triển khai thực tế

        Để vận hành trên môi trường production, hãy cân nhắc các kịch bản triển khai phổ biến sau:

        Mô hình một server, nhiều proxy

        Đối với quy mô vừa và lớn, bạn có thể triển khai một Zabbix server duy nhất phối hợp với nhiều proxy ở các khu vực khác nhau. Server chịu trách nhiệm tổng hợp dữ liệu, trong khi proxies đảm bảo thu thập dữ liệu và gửi về server. Quá trình đồng bộ cấu hình giữa server và proxies được hỗ trợ để đảm bảo tính nhất quán.

        Mô hình HA cho server hoặc proxy

        Trong môi trường yêu cầu mức sẵn sàng cao, xem xét triển khai các giải pháp HA cho server và/hoặc proxy. Tài liệu Zabbix mô tả rõ ràng khái niệm HA ở các thành phần khác nhau của hệ thống.

        Tiêu chuẩn hóa và quản trị cấu hình

        Quản lý cấu hình từ một nguồn duy nhất và sử dụng các template, discovery rule, và prototypes để tự động hóa việc mở rộng giám sát, giảm thiểu công sức vận hành và tránh sai lệch cấu hình giữa các máy chủ và proxy.

        An ninh thông tin và quản trị access

        Đảm bảo quyền truy cập phù hợp cho người dùng và nhóm người dùng, đồng thời áp dụng cơ chế bảo mật liên lạc như đã nêu ở phần Encryption và chuẩn bị khóa và chứng chỉ cho hệ thống.

        <h2 Cấu hình chi tiết cho hành động và giám sát hiệu năng

        Trong tài liệu Zabbix có phần Quickstart và phần khám phá (Discovery) cũng như các công cụ quản trị khác. Đây là cơ sở để bạn thiết lập các yếu tố nhằm tối ưu hóa hiệu năng:

        • Quickstart hướng dẫn cách đăng nhập, thêm host, tạo item và trigger để có được nền tảng giám sát nhanh chóng và có thể mở rộng sau này.
        • Discovery và low-level discovery (LLD) cho tự động phát hiện và đưa ra các prototypes cho item, trigger và graph, giúp giảm thời gian vận hành và tăng hiệu quả quản trị.
        • Templates và template groups để chuẩn hóa cách giám sát cho các hệ thống khác nhau, đồng thời dễ dàng nhân rộng khi mở rộng hạ tầng.
        <h2 Ví dụ triển khai thực tế

        Dưới đây là một bối cảnh minh họa cho việc tối ưu hiệu năng trên quy mô trung bình đến lớn:

        • Một Zabbix server chịu trách nhiệm tổng hợp và phân tích dữ liệu từ các proxies ở 3 khu vực, mỗi proxy đảm nhận dữ liệu từ 10–50 hosts tùy khu vực.
        • Sử dụng TLS cho liên lạc giữa server và proxies; sử dụng PSK cho kết nối giữa các thành phần khi cần thiết.
        • Thiết lập discovery rules và item prototypes để tự động mở rộng giám sát mà không phụ thuộc vào việc cấu hình thủ công từng host.
        <h2 Bảo mật và quản trị quyền truy cập

        Trong các triển khai production, cần thực hiện các biện pháp bảo mật được Zabbix nêu trong phần Encryption:

        • Thiết lập chứng chỉ (certificates) để mã hóa liên lạc giữa các thành phần.
        • Sử dụng khóa chia sẻ trước (PSK) cho các thiết lập liên lạc giữa server và proxy khi phù hợp.
        <h2 Giám sát và observability

        Để đảm bảo hệ thống hoạt động ổn định, cần theo dõi các chỉ số liên quan đến hiệu năng và sức khỏe của Zabbix runtime, cũng như trạng thái của các thành phần trong kiến trúc phân tán. Việc kiểm tra các log, trạng thái dịch vụ và sự sẵn sàng của front-end (web interface) là các hoạt động vận hành hàng ngày. Bạn có thể dựa vào các phần Quickstart và các phần cấu hình trong tài liệu Zabbix để thiết lập các báo cáo và cảnh báo phù hợp với nhu cầu và SLAs của tổ chức.

        <h2 Validation và kiểm tra vận hành

        Để xác thực hoạt động tối ưu của hệ thống sau khi triển khai, thực hiện theo các bước sau:

        1. Kiểm tra trạng thái của các dịch vụ Zabbix: server, agent và proxy nếu có.
          systemctl status zabbix-server
          systemctl status zabbix-agent
          systemctl status zabbix-proxy <if_used>
        2. Đăng nhập vào giao diện web và xác nhận các host đã được liệt kê đúng theo cấu hình.
        3. Tạo mới một host và một item đơn giản, rồi xác nhận item chạy và dữ liệu được lưu trữ.
        4. Kiểm tra discovery và templates để đảm bảo tự động hóa đang hoạt động đúng như mong đợi.
        5. Kiểm tra cơ chế gửi thông báo khi có sự cố (media types, actions) phù hợp với quy trình vận hành.
        <h2 Final operational checklist
        • Kiểm tra topology và sự có mặt của server và proxies (nếu có) trong hệ thống phân tán.
        • Đảm bảo TLS/PSK được thiết lập cho các kết nối giữa các thành phần và tuân thủ chính sách bảo mật của bạn.
        • Đảm bảo Discovery và Templates đang được áp dụng đúng cho các hệ thống mới và đang mở rộng.
        • Theo dõi các log của Zabbix để kịp thời phát hiện sự cố và điều chỉnh cấu hình nếu cần.
        • Rà soát cấu hình và vận hành hàng tuần để đảm bảo không có lỗ hổng cấu hình và hiệu suất đáp ứng nhu cầu.
        <h2 Kết luận

        Việc tối ưu hiệu năng Zabbix trên Ubuntu 22.04+ liên quan đến thiết kế kiến trúc phân tán, sử dụng proxy để phân tải, áp dụng bảo mật mạnh mẽ và tận dụng các công cụ tự động hóa như discovery, templates và low-level discovery. Bằng cách kết hợp các yếu tố này với quản trị và vận hành chuẩn mực, bạn có thể đạt được hiệu năng giám sát ổn định và khả năng mở rộng phù hợp cho môi trường production của mình. Hướng dẫn và các khuyến nghị ở trên dựa trên các khía cạnh được mô tả trong tài liệu Zabbix 7.4 và các phần liên quan, và được trình bày ở mức khung thực tiễn cho hệ thống Ubuntu 22.04+.

        Zabbix Monitoring

        Giới thiệu

        Trong thế giới công nghệ hiện đại, việc giám sát hệ thống và ứng dụng đóng vai trò thiết yếu trong việc duy trì hiệu suất và độ tin cậy. Zabbix Monitoring là một công cụ mã nguồn mở mạnh mẽ, cho phép bạn theo dõi tài nguyên, hiệu suất và sức khỏe của toàn bộ hệ thống, từ các server vật lý đến môi trường đám mây. Với tính năng mạnh mẽ, Zabbix hỗ trợ quản trị viên dễ dàng phát hiện và xử lý các vấn đề trước khi chúng trở thành sự cố lớn.

        Zabbix là một giải pháp giám sát hạ tầng (mã nguồn mở) cấp độ doanh nghiệp (high-level enterprise) cực kỳ mạnh mẽ và phổ biến. Chính vì vậy đội ngũ phát triển của Zabbix thường xuyên bổ xung thêm nhiều tính năng, template và hỗ trợ nhiều service mới trong các bản cập nhật để bắt kịp tốc độ “sinh sôi” SaaS của những “ông lớn” công nghệ.

        Tuy nhiên, với một đòn đau từ Red Hat (ngưng hỗ trợ CentOS 7 đến hết 30/6/2024 và CentOS 8 đến hết năm 2021) nhằm mục đích ép một lượng lớn người dùng chuyển sang bản OS trên nền tảng cloud (bản quyền).

        Bài viết này sử dụng :

        • Ubuntu Server 20.04
        • Zabbix 5.4
        • PHP 7.4
        • Nginx 1.8
        • MariaDB 10.0

        Cài đặt LEMP STACK ( Nginx Web Server, PHP7.4, PHP7.4-FPM, MARIADB)

        1. Cài đặt nginx
        2. Zabbix 5.4 yêu cầu chạy trên web server nên ta cần cập nhật ubuntu và cài đặt nginx
        $ sudo apt update
        $ sudo apt install nginx
        •  Sau khi quá trình cài đặt nginx server hoàn tất, bạn khởi động Nginx, kích hoạt Nginx (tự động khởi động khi hệ thống reboot) và kiểm tra trạng thái Nginx bằng những tập lệnh bên dưới.
        $ sudo systemctl start nginx
        $ sudo systemctl enable nginx
        $ sudo systemctl status nginx
        • Cấu hình tường lửa cho phép HTTP & HTTPS đi qua bằng tập lệnh dưới đây
        $ sudo ufw allow 80/tcp
        $ sudo ufw allow 443/tcp
        $ sudo ufw reload
        • Kiểm tra lại hoạt động của nginx bằng http(s)://IP-Address/
        • Cài đặt PHP7 hỗ trợ cho nginx.
          • Kích hoạt PPA cho PHP trên trên hệ thống Ubuntu bằng tập lệnh sau :
        $ sudo apt-get install software-properties-common
        $ sudo add-apt-repository ppa:ondrej/php
        • Server của bạn đã được thiết lập để cài đặt PHP từ PPA repository. Sử dụng một trong những lệnh bên dưới để cài đặt PHP 7.0, PHP 7.1, PHP 7.2 hoặc PHP 7.3:
        $ sudo apt-get update
        ## Install PHP 7.4
        $ sudo apt-get install -y php7.4
        $ sudo php -v
        • Kiểm tra cài đặt PHP modules.

        Sau khi cài đặt một phiên bản PHP 7.x trên server, bạn có thể sử dụng lệnh bên dưới để tìm những PHP modules có sẵn trong gói PPA repository:

        $ sudo apt-cache search php7*
        • Cài đặt module cần thiết cho Zabbix
        $ sudo apt-get install php7.4-mysql php7.4-curl php7.4-json php7.4-cgi php7.4-xsl
        • Kiểm tra hoạt động của PHP
        $ sudo systemctl status php7.4-fpm
        • Mở file cấu hình Nginx mặc định /etc/nginx/sites-available/default bằng lệnh sau:
        # nano /etc/nginx/sites-available/default

        Để Nginx server có thể xử lý được các file kịch bản PHP (fastcgi script), bạn cần tìm đến giá trị location trong server block và thêm những dòng như bên dưới.

        location ~ .php$ {
                 include snippets/fastcgi-php.conf;
        #       # With php-fpm (or other unix sockets):
                 fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        }
        • Để xem toàn bộ hệ thống PHP trên ubuntu, ta tạo file php.info trong Nginx Document Root, khởi động lại nginx và php-fpm rồi mở trình duyệt truy cập.
        $ sudo echo "<?php phpinfo();?>" > /var/www/html/info.php 
        $ sudo systemctl restart nginx 
        $ sudo systemctl restart php7.3-fpm

        Http://<ip-address>/info.php

        • Cài đặt và cấu hình Maria Database.

        8.1 Cài đặt thêm repository vào hệ thống :

        $ sudo apt-get install software-properties-common

        8.2 Thực thi lệnh để thêm Repsitory Key vào hệ thống :

        $ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

        8.3 Sau khi thêm Repository Key vào hệ thống, ta add URL Repository URL vào hệ thống :

        sudo add-apt-repository 'deb [arch=amd64] http://mirror.zol.co.zw/mariadb/repo/10.3/ubuntu bionic main'

        8.4. Thực thi cài đặt Maria Database

        $ sudo apt update
        
        $ sudo apt -y install mariadb-server mariadb-client

        8.5. Kiểm tra trạng thái MariaDB

        8.6. Kiểm tra trạng thái Database

        $ sudo mysql -u root -p
        MariaDB > show databases;
        • Bật chạy nền cho nginx, php, mariadb
        $ sudo systemctl enable mariadb 
        $ sudo systemctl enable nginx
        $ sudo systemctl enable php7.4-fpm
        • Cài đặt Zabbix-Server, Zabbix-PHP-Frontend, Zabbix-Agent

        10.1 Cài đặt Zabbix Repository

        wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.4-1%2Bfocal_all.deb
        dpkg -i zabbix-release_5.0-1+focal_all.deb
        apt update

        10.2 Cài đặt Zabbix Server, Zabbix PHP Frontend

        # apt install zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-sql-scripts zabbix-agent
        1. Tạo Database lưu trữ dữ liệu Zabbix

        11.1 Bạn cần tạo một RDBMS database để lưu trữ dữ liệu của Zabbix. Truy cập vào MySQL/MariaDB. khởi tạo một Zabbix database và gán quyền quản lý database cho một user bằng cách thực thi lần lượt những lệnh sau:

        # mysql -u root -p
        
        MariaDB [(none)]> create database zabbixdb character set utf8 collate utf8_bin;
        MariaDB [(none)]> grant all privileges on zabbixdb.* to 'zabbixuser'@'thanhnh.id.vn' identified by 'your_password';
        MariaDB [(none)]> flush privileges;
        MariaDB [(none)]> exit

        11.2 Import cấu trúc Zabbix Server vào Maria DB

        # zcat /usr/share/doc/zabbix-sql-scripts/mysql/create.sql.gz | mysql -uzabbix -p zabbix

             11.3 Mở File cấu hình Zabbix-Server và thiết lập tham số

        # nano  /etc/zabbix/zabbix_server.conf

        Tìm và điều chỉnh các giá trị kết nối database như DBHost, DBName, DBUser  DBPassword trong file zabbix_server.conf tương tự như hình ảnh bên dưới.

        11.4 Khởi động lại Zabbix Server để áp dụng các thiết lập

        # systemct restart zabbix-server

        11.5 Mở File Zabbix Agent để thiết lập Listen Port

        # nano  /etc/zabbix/zabbix_agentd.conf

        11.6 Khởi động lại Zabbix Agent để áp dụng các thiết lập

        # systemctl restart zabbix-agent

        11.7 Tạo một Virtual Host để Nginx có thể hosting với Zabbix với domain. Tạo một file nano /etc/sites-available/zabbix.conf

        server {
        
            listen       81;
        
            server_name  zabbix.domain.local;
            #charset koi8-r;
            access_log  /var/log/nginx/zabbix.domain.local.access.log;
            error_log  /var/log/nginx/zabbix.domain.local.error.log;
        
            location / {
                root   /usr/share/zabbix/;
                index  index.php index.html index.htm;
             # include the "?$args" part so non-default permalinks doesn't break when using query string
                try_files $uri $uri/ /index.php?$args;
            }
        
            location ~ .php$ {
                root   /usr/share/zabbix/;
                fastcgi_index  index.php;
                # With php-fpm (or other unix sockets):
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
                fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
                include        fastcgi_params;
            }
        }

        11.8 Kế đến, tạo một symbolic link từ /etc/nginx/sites-available/zabbix.conf tới /etc/nginx/sites-enable/zabbix.conf

        ln -s /etc/nginx/sites-available/zabbix.conf /etc/nginx/sites-enabled/
        1.  Khởi động lại Nginx
        systemctl restart nginx
        1.  Mở web cài đặt : http://<ip-address>:81

        Bấm Next, kiểm tra các điều kiện của PHP. Nếu sai, hãy chỉnh sửa trong file

          sudo nano /etc/php/7.4/fpm/php.ini

        1. Sau khi kiểm tra các cài đặt thành công, bấm Next để tiếp tục cài đặt.

        Kiểm tra các cài đặt khớp với các cài đặt ở trên rồi bấm Next để Zabbix connect với Database.

        Đăng nhập với :

                 Username : Admin

                 Password  : zabbix

        Vậy đã hoàn thành cài đặt Zabbix Monitoring 5.4 trên Ubuntu 20.04

        Zabbix Monitoring không chỉ là công cụ giám sát mạnh mẽ mà còn là trợ thủ đắc lực giúp bạn duy trì hiệu suất tối ưu và đảm bảo tính ổn định cho hệ thống. Bằng cách triển khai Zabbix một cách hiệu quả, bạn có thể chủ động phát hiện và giải quyết các vấn đề kịp thời. Hãy bắt đầu khám phá Zabbix Monitoring ngay hôm nay để nâng cao năng lực quản lý hệ thống của bạn!

        Cài đặt Zabbix Agent trên các hệ thống

        Giới thiệu

        Zabbix Agent là một thành phần quan trọng trong hệ thống giám sát của Zabbix, giúp thu thập thông tin từ các máy chủ và ứng dụng để gửi về Zabbix Server. Việc cài đặt Zabbix Agent đúng cách trên các hệ thống như Windows, Linux, hay macOS không chỉ đảm bảo dữ liệu được giám sát chính xác mà còn giúp bạn tối ưu hóa hoạt động của toàn bộ hạ tầng CNTT. Trong bài viết này, chúng ta sẽ đi qua từng bước cài đặt Zabbix Agent trên các nền tảng phổ biến.

        Giám sát tường lửa Pfsense sử dụng Zabbix_Agent

        Truy cập Pfsense /Systems/PackageManager/Availabe Package

        Tìm kiếm Zabbix-Agent phù hợp với Zabbix-Server hiện tại và Install

        Sau khi cài đặt thành công kiểm tra tại /Service/Zabbix_Agent.

        • Server : Server của Zabbix-Server
        • Server Active : 127.0.0.1
        • Hostname : Zabbix
        • Listen IP : 0.0.0.0
        • Listen Port : 10050

        Trên Firewall Open Port 10050 trên WAN

        Để đảm bảo bảo mật, ta sử dụng phương thức key psk

        TLS PSK identity : “Tên Key”

        TLS PSK : “Key mã hóa “ ( Sử dụng Key Generator PSK trên mạng )

        Trên Zabbix, truy cập Confriguration/Host/Create Host

        • Hostname : Home_Pfsense
        • Groups : Linux Server
        • Interface : Agent – IP của Pfsense – Port :10050

        Mục Template, chọn hđh FreeBSD

        Mục PSK, ta điền TLS PSK identity và PSK khớp với Pfsense

        Hoàn thành xong, bấm Update đợi một lúc để Zabbix connect đến và đợi 30-60p để lấy hết dữ liệu hiện tại.

        Kiểm tra status : Host Available là thành công!

        Giám sát Windows với Zabbix Agent

        Tải ZabbixAgent.exe tại https://www.zabbix.com/download_agents

        Cài đặt

        Kiểm tra service hoạt động ở TaskManager/ Service

        Mở Port 10050 trên firewall của windows . Ta mở Windows PowerShell với quyền quản trị :

        netsh advfirewall firewall add rule name="ICMP Allow incoming V4 echo request" protocol="icmpv4:8,any" dir=in action=allow
        netsh advfirewall firewall add rule name="Open Port 10050" dir=in action=allow protocol=TCP localport=10050

        Add Window Host to Zabbix Server

        • Hostname : Đặt tên cho Host ( Home_Win7_ThinPC)
        • Groups : TemplatesOperatingSystems
        • Interface : Agent IP : IP của win 7 – Port : 10050
        • Templates : Windows by Zabbix Agent

        Bấm Update.

        Kiểm tra kết nối, nếu status : Available là đã thành công

        Giám sát Synology NAS với Zabbix

        Tải Template NAS Synology trên trang chủ Zabbix :

        https://www.zabbix.com/integrations/synology

        Import Templates.xml lên Zabbix : Zabbix/Hosts/ Import

        Trên Synology NAS bật SNMP để Zabbix Monitor :

        NAS / Control Panel / Terminal & SNMP / SNMP

        Add NAS vào Zabbix :

                 Zabbix / Configuration / Hosts / Create Host

        • Host name : Đặt tên : NAS
        • Groups : Linux Server
        • Interfaces : Giao thức SNMP & IP & Port

        Add Templates Synology mà chúng ta vừa tải ở trên về

        • Marcos : {$SNMP_COMMUNITY}
        • Value : Tên Community đặt ở trên NAS

        Việc cài đặt Zabbix Agent trên các hệ thống là bước đầu tiên để xây dựng một môi trường giám sát mạnh mẽ và hiệu quả. Dù bạn sử dụng Windows, Linux hay macOS, Zabbix Agent sẽ là công cụ đắc lực giúp bạn theo dõi hiệu suất và phát hiện sớm các vấn đề tiềm ẩn. Hãy triển khai Zabbix Agent ngay hôm nay để tối ưu hóa khả năng quản lý hệ thống của bạn!

        Cài đặt Prometheus + Grafana

        Giới thiệu

        Prometheus và Grafana là bộ đôi công cụ giám sát và trực quan hóa mạnh mẽ được sử dụng rộng rãi trong các hệ thống hiện đại. Trong khi Prometheus chịu trách nhiệm thu thập và lưu trữ dữ liệu từ các ứng dụng và hệ thống, Grafana cung cấp giao diện trực quan để phân tích và hiển thị dữ liệu đó dưới dạng biểu đồ. Bài viết này sẽ hướng dẫn bạn từng bước cài đặt Prometheus và Grafana trên hệ thống, giúp bạn xây dựng một nền tảng giám sát hiệu quả và toàn diện.

        Update package & Timedatectl

        apt update
        timedatectl set-timezone "Asia/Ho_Chi_Minh"
        timedatectl set-ntp true
        systemctl restart systemd-timesyncd

        Xác định phiên bản của prometheus

        https://github.com/prometheus/prometheus/releases
        export RELEASE="2.20.1"

        Tải và giải nén gói cài đặt

        wget https://github.com/prometheus/prometheus/releases/download/v${RELEASE}/prometheus-${RELEASE}.linux-amd64.tar.gz
        tar xvf prometheus-${RELEASE}.linux-amd64.tar.gz
        cd prometheus-${RELEASE}.linux-amd64/

        Tạo user cho dịch vụ Prometheus

        groupadd --system prometheus
        grep prometheus /etc/group
        useradd -s /sbin/nologin -r -g prometheus prometheus

        Tạo thư mục chứa file cấu hình Prometheus

        mkdir -p /etc/prometheus/{rules,rules.d,files_sd}  /var/lib/prometheus

        Chuyển các file thực thi binary vào thư mục local bin và copy thư mục consoles, file config

        cp prometheus promtool /usr/local/bin/
        cp -r consoles/ console_libraries/ /etc/prometheus/
        cp prometheus.yml /etc/prometheus/

        Gán quyền cho user prometheus

        chown -R prometheus:prometheus /etc/prometheus/  /var/lib/prometheus/
        chmod -R 775 /etc/prometheus/ /var/lib/prometheus/

        Tạo file systemd cho dịch vụ prometheus

        nano /etc/systemd/system/prometheus.service
        [Unit]
        Description=Prometheus systemd service unit
        Wants=network-online.target
        After=network-online.target
        [Service]
        Type=simple
        User=prometheus
        Group=prometheus
        ExecReload=/bin/kill -HUP $MAINPID
        ExecStart=/usr/local/bin/prometheus 
        --config.file=/etc/prometheus/prometheus.yml 
        --storage.tsdb.path=/var/lib/prometheus 
        --web.console.templates=/etc/prometheus/consoles 
        --web.console.libraries=/etc/prometheus/console_libraries 
        --web.listen-address=0.0.0.0:9090 
        --storage.tsdb.retention.time=1y
        SyslogIdentifier=prometheus
        Restart=always
        [Install]
        WantedBy=multi-user.target

        Enable và khởi động dịch vụ prometheus

        systemctl daemon-reload
        systemctl start prometheus
        systemctl enable prometheus

        Truy cập tại : http://<IP_HOST>:9090

        Cài đặt Grafana trên Ubuntu 18

        Đầu tiên, bạn thêm repository của Grafana vào máy chủ

        echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
        wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add

        Update các gói phần mềm từ repository này và cài đặt Grafana.

        apt-get update
        apt-get install grafana -y

        Kích hoạt và khởi động dịch vụ

        systemctl start grafana-server
        systemctl enable grafana-server.service

        Truy cập <IP_HOST>: :3000


        Việc cài đặt Prometheus và Grafana là bước quan trọng để xây dựng một hệ thống giám sát hiện đại và mạnh mẽ. Với Prometheus thu thập dữ liệu chính xác và Grafana trực quan hóa thông tin, bạn có thể dễ dàng theo dõi, phân tích và tối ưu hóa hiệu suất hệ thống. Hãy bắt đầu triển khai ngay hôm nay để tận dụng tối đa lợi ích từ bộ công cụ giám sát hàng đầu này!

        Prometheus: Monitoring VmWare

        Giới thiệu

        Hạ tầng ảo hóa như VMware đóng vai trò quan trọng trong các hệ thống hiện đại, giúp tối ưu hóa tài nguyên và tăng hiệu quả hoạt động. Tuy nhiên, việc giám sát hiệu suất và tình trạng của VMware là một thách thức lớn. Prometheus, kết hợp với các Exporter chuyên dụng, là giải pháp lý tưởng để theo dõi dữ liệu từ VMware, giúp bạn chủ động quản lý và tối ưu hóa hệ thống. Trong bài viết này, chúng ta sẽ tìm hiểu cách tích hợp Prometheus để giám sát VMware chi tiết nhất.

        Cài đặt python3

        apt install python3 -y
        apt install python3-pip -y

        Cài đặt vmware_exporter

        pip3 install vmware_exporter
        pip3 install --ignore-installed PyYAML

        Sau khi cài xong, thư mục chứa source vmware_exporter nằm ở /usr/local/lib/python3.8/dist-packages/vmware_exporter

        Tạo file config cho vmware_exporter

        nano /usr/local/lib/python3.6/dist-packages/vmware_exporter/config.yml
        default:
            vsphere_host: vcenter.yourdomain.com
            vsphere_user: 'usermonitor@vcenterdomain.local'
            vsphere_password: 'usermonitorpass'
            ignore_ssl: True
            specs_size: 5000
            fetch_custom_attributes: True
            fetch_tags: True
            fetch_alarms: True
            collect_only:
                vms: True
                vmguests: True
                datastores: True
                hosts: True
                snapshots: True

        Tạo file service systemd cho vmware_exporter

        nano /etc/systemd/system/vmware_exporter.service
        [Unit]
        Description=Prometheus VMWare Exporter
        Wants=network-online.target
        After=network-online.target
        
        [Service]
        Type=simple
        User=root
        Group=root
        ExecReload=/bin/kill -HUP $MAINPID
        ExecStart=/usr/bin/python3 /usr/local/bin/vmware_exporter -c /usr/local/lib/python3.6/dist-packages/vmware_exporter/config.yml
        SyslogIdentifier=vmware_exporter
        Restart=always
        
        [Install]
        WantedBy=multi-user.target

        Reload daemon và khởi động dịch vụ

        systemctl daemon-reload
        systemctl enable vmware_exporter.service
        systemctl start vmware_exporter.service

        Thiết lập Prometheus cho vmware_exporter, thiết lập prometheus gọi tới cổng dịch vụ của vmware_exporter

        nano /etc/prometheus/prometheus.yml
          - job_name: 'dc_vcenter'
            scrape_timeout: 1m
            scrape_interval: 2m
            metrics_path: '/metrics'
            static_configs:
              - targets:
                - 'vcenter.yourdomain.com'
            relabel_configs:
              - source_labels: [__address__]
                target_label: __param_target
              - source_labels: [__param_target]
                target_label: instance
              - target_label: __address__
                replacement: thanhnh.id.vn:9272

        Tiếp theo, bạn tìm trong file prometheus.yml đoạn như dưới và thêm file rule cho vcenter.

        rule_files:
          # - "first_rules.yml"
          # - "second_rules.yml"
            - "/etc/prometheus/rules/vcenter.yml"

        Thiết lập rule alertmanager cho vmware, tạo một file chứa các rule alert cho vcenter

        nano /etc/prometheus/rules/vcenter.yml

        Bạn copy nội dung giống như dưới vào file (Vcenter.yml đính kèm file)

        Bây giờ bạn reload dịch vụ prometheus và dịch vụ alertmanager

        systemctl reload prometheus
        systemctl reload alertmanager

        Import Template JSON Vcenter đính kèm theo file vào , chọn datasource Prometheus -> Done

        Prometheus cung cấp một cách tiếp cận hiệu quả và linh hoạt để giám sát VMware, cho phép bạn theo dõi hiệu suất hạ tầng ảo hóa một cách chính xác và đáng tin cậy. Bằng cách sử dụng các Exporter phù hợp và tích hợp Prometheus, bạn có thể đảm bảo hệ thống luôn hoạt động ổn định và đạt hiệu suất cao nhất. Hãy bắt đầu thiết lập ngay hôm nay để tận dụng sức mạnh của Prometheus trong giám sát VMware!

        Caching Solutions

        Tối Ưu Hóa Bộ Nhớ Redis: Cấu Hình Eviction Policies Chi Tiết Trên Ubuntu 20.04+

        Tối Ưu Hóa Bộ Nhớ Redis: Cấu Hình Eviction Policies Chi Tiết Trên Ubuntu 20.04+

        Giới thiệu

        Khi làm việc với Redis trên nền Ubuntu 20.04 trở lên, việc tối ưu bộ nhớ và xử lý hoạt động từ các chính sách eviction là yếu tố quyết định cho hiệu suất và độ ổn định của hệ thống. Eviction policies quyết định cách Redis phản ứng khi bộ nhớ đạt ngưỡng, để đảm bảo dữ liệu quan trọng vẫn có sẵn trong phạm vi bộ nhớ giới hạn. Bài viết này trình bày các khái niệm, khung kiến trúc và hướng tiếp cận thực tiễn để cấu hình eviction policy một cách an toàn và có kiểm soát trên môi trường Ubuntu 20.04+ trong bối cảnh quản trị Redis cấp doanh nghiệp.

        Các khái niệm cốt lõi

        Đến với Redis, quản lý bộ nhớ là một phần thiết yếu của vận hành hệ thống. Khi kích thước dữ liệu tăng lên hoặc lưu lượng truy cập tăng cao, Redis có thể hết bộ nhớ vật lý. Lúc này eviction policy sẽ quyết định hành vi của máy chủ Redis: loại bỏ dữ liệu cũ hay những mục ít được truy cập để nhường chỗ cho dữ liệu mới. Các yếu tố liên quan bao gồm:

        • Giới hạn bộ nhớ tối đa của Redis và cách mà nó áp dụng khi giới hạn này bị vượt quá.
        • Chiến lược loại bỏ dữ liệu khi bộ nhớ đầy nhằm duy trì tính khả dụng cho các dữ liệu quan trọng.
        • Ảnh hưởng của persistence và snapshotting lên hành vi giải phóng bộ nhớ trong quy trình eviction.
        • Quan hệ giữa eviction và cơ chế bảo mật, đảm bảo dữ liệu nhạy cảm không bị loại bỏ một cách trái phép khi hệ thống hoạt động ở chế độ mất dữ liệu.

        Kiến trúc và mô hình triển khai

        Kiến trúc Redis có thể ở mức đơn node hoặc ở mức có sao chép và tính sẵn sàng cao. Trong bối cảnh eviction và tối ưu bộ nhớ, một số mô hình triển khai phổ biến bao gồm:

        • Single-node Redis với giới hạn bộ nhớ được cấu hình để đảm bảo hiệu suất ổn định.
        • Cluster hoặc thiết lập sao chép để tăng tính sẵn sàng và phân bổ tải, đồng thời quản lý giới hạn bộ nhớ trên từng nút.
        • Giải pháp high availability như Sentinel hỗ trợ theo dõi trạng thái dịch vụ và tự động chuyển đổi khi cần thiết, giúp duy trì dịch vụ khi có sự cố và đảm bảo đúng quy trình làm việc với eviction.

        Yêu cầu và chuẩn bị trên Ubuntu 20.04+

        Trước khi bắt đầu cấu hình eviction, hãy đảm bảo hệ thống đáp ứng các yêu cầu sau:

        • Hệ điều hành: Ubuntu 20.04 hoặc phiên bản tương thích trở đi.
        • Trình quản lý gói: apt-get được cập nhật để cài đặt Redis từ kho lưu trữ chính thức của Ubuntu.
        • Quyền vận hành: quyền root hoặc quyền sudo để cài đặt và cấu hình dịch vụ Redis.
        • Mạng và bảo mật: xác định địa chỉ lắng nghe, giới hạn kết nối để tránh truy cập trái phép và đảm bảo an toàn khi lưu trữ dữ liệu.

        Cấu hình chính cho eviction policies

        Trong môi trường sản xuất, cấu hình eviction cần cân nhắc cẩn thận để cân bằng giữa dung lượng bộ nhớ, tính sẵn dùng dữ liệu và hiệu suất. Các yếu tố chính cần xem xét:

        • Thiết lập giới hạn bộ nhớ để Redis biết khi nào cần bắt đầu giải phóng dữ liệu.
        • Chọn chiến lược eviction phù hợp với đặc thù ứng dụng, ví dụ các trường hợp dữ liệu có TTL ngắn hoặc dữ liệu quan trọng càng ít thay đổi.
        • Kết hợp eviction với cơ chế Persistency và replication để giảm thiểu rủi ro mất mát dữ liệu.
        • Đảm bảo các thiết lập bảo mật và mạng liên quan không bị ảnh hưởng tiêu cực khi eviction diễn ra.

        Ví dụ minh họa về cấu hình ở mức khung sẽ có dạng như sau để tham khảo, không phải là quy chuẩn bắt buộc và có thể điều chỉnh theo thực tế triển khai:

        # Ví dụ cấu hình minh họa
        maxmemory 2gb
        maxmemory-policy allkeys-lru
        appendonly yes
        

        Ví dụ thực tế trên Ubuntu 20.04

        Quy trình triển khai trên hệ điều hành Ubuntu 20.04+ có thể theo các bước sau, bao gồm cài đặt Redis và cấu hình ban đầu:

        1. Cập nhật hệ thống và cài đặt Redis từ kho chuẩn của Ubuntu.
        2. Kích hoạt và khởi động dịch vụ Redis để tự động chạy tại khởi động.
        3. Chỉnh sửa tệp cấu hình Redis để thiết lập giới hạn bộ nhớ và eviction policy.
        4. Khởi động lại Redis để áp dụng cấu hình mới.

        Gợi ý các lệnh tham khảo cho môi trường Debian/Ubuntu tương ứng (không phải hướng dẫn chi tiết về mọi phiên bản):

        sudo apt update
        sudo apt install redis-server
        sudo systemctl enable redis-server
        sudo systemctl start redis-server
        

        Sau khi cài đặt, bạn có thể chỉnh sửa tệp cấu hình phổ biến ở vị trí mặc định và đảm bảo Redis nhận các thiết lập mới khi khởi động lại. Trong môi trường thực tế, hãy cân nhắc áp dụng cấu hình ngay tại tệp cấu hình của Redis hoặc trong mẫu cấu hình của hệ quản trị cấu hình mà bạn đang dùng.

        Kiểm tra và xác nhận

        Để xác nhận rằng eviction policy và giới hạn bộ nhớ đã được áp dụng đúng cách, thực hiện các bước kiểm tra sau:

        • Kiểm tra cấu hình hiện tại của Redis liên quan đến giới hạn bộ nhớ và chính sách eviction.
        • Theo dõi hoạt động của bộ nhớ sau khi tải hệ thống hoặc xung đột dữ liệu xảy ra.
        • Đảm bảo dữ liệu vẫn có sẵn và hệ thống phục hồi đúng theo kỳ vọng sau khi eviction diễn ra.

        Phương án kiểm tra phổ biến bao gồm các lệnh kiểm tra trạng thái bộ nhớ và cấu hình hiện tại từ trình khách Redis, tập trung vào thông tin liên quan đến bộ nhớ và chính sách eviction.

        Bảo mật và vận hành an toàn

        Khi triển khai eviction trên Redis, bảo mật là một phần không thể bỏ qua. Cân nhắc các biện pháp sau để đảm bảo an toàn vận hành:

        • Hạn chế truy cập mạng đến Redis bằng cách chỉ cho phép các máy chủ đáng tin cậy kết nối. Sử dụng tường lửa hoặc vùng mạng an toàn để quản lý lưu lượng.
        • Chỉ lắng nghe Redis từ các địa chỉ nội bộ hoặc trên các mạng riêng để giảm rủi ro truy cập trái phép.
        • Thiết lập cơ chế xác thực để ngăn người dùng trái phép thực thi các lệnh có thể ảnh hưởng đến bộ nhớ.
        • Kích hoạt lưu trữ persistence và sao lưu định kỳ để đảm bảo có thể khôi phục dữ liệu sau sự cố mà eviction gây ra.

        Đối với các tính năng quản trị nâng cao và tình trạng hoạt động, tham khảo tài liệu quản trị Redis liên quan đến bảo mật và Sentinel để hỗ trợ quản lý HA và bảo đảm dịch vụ luôn sẵn sàng trong các môi trường phức tạp.

        Giám sát và quan trắc hiệu suất

        Quan sát các chỉ số liên quan đến bộ nhớ và eviction là phần cốt lõi của vận hành hiệu quả. Các yếu tố cần theo dõi gồm:

        • Dung lượng bộ nhớ đang sử dụng và mức giới hạn.
        • Tần suất và phạm vi eviction diễn ra trong thời gian thực.
        • Tình trạng replication và khả năng sao lưu để đảm bảo dữ liệu ít bị mất khi eviction xảy ra trong môi trường đa nút.

        Việc tích hợp Redis với các công cụ giám sát hệ thống và chất lượng mạng sẽ giúp bạn nhanh chóng phát hiện các điểm nghẽn và điều chỉnh cấu hình cho phù hợp với tải thực tế.

        Xác thực vận hành và thử nghiệm

        Để đảm bảo cấu hình eviction hoạt động đúng như mong đợi trong môi trường thực tế, hãy thực hiện quy trình kiểm thử có kiểm soát:

        • Chạy các bài kiểm tra tải nhằm mô phỏng các trường hợp dữ liệu phát sinh nhanh và truy cập cao.
        • Kiểm tra hành vi của hệ thống khi bộ nhớ đạt ngưỡng và eviction được kích hoạt.
        • Đảm bảo các cơ chế backup và phục hồi hoạt động đúng sau eviction và trong trạng thái khởi động lại.

        Checklist vận hành cuối cùng

          <li Xác định ngưỡng bộ nhớ phù hợp với tải dự kiến và giới hạn phần mềm/hardware. <li Chọn chiến lược eviction phù hợp với tính chất dữ liệu và yêu cầu hiệu suất của ứng dụng. <li Đảm bảo bảo mật mạng và quyền truy cập, cùng với thiết lập xác thực cho Redis. <li Thiết lập sao lưu và cơ chế phục hồi dữ liệu thích hợp để giảm thiểu tổn thất dữ liệu khi eviction diễn ra. <li Thi công giám sát bộ nhớ và cấp phép cho cảnh báo khi vượt ngưỡng.

        Kết luận

        Việc tối ưu bộ nhớ Redis thông qua cấu hình eviction policies trên Ubuntu 20.04+ là một phần quan trọng của quản trị cơ sở dữ liệu nhanh nhạy và ổn định. Phân tích đúng nhu cầu dữ liệu, tải hệ thống và đặc thù ứng dụng sẽ giúp bạn chọn lựa chiến lược eviction phù hợp, đồng thời đảm bảo an ninh, tính sẵn sàng và khả năng mở rộng của hệ thống. Trong khuôn khổ quản trị Redis, các tài liệu về bảo mật và Sentinel có thể hỗ trợ bạn xây dựng nền tảng an toàn và có độ tin cậy cao cho môi trường sản xuất.

        Tối Ưu Hiệu Suất Redis trên CentOS

        Tối Ưu Hiệu Suất Redis trên CentOS

        Tối Ưu Hiệu Suất Redis trên CentOS

        Redis là một kho lưu trữ dữ liệu in-memory mạnh mẽ cho việc cache và streaming. Trong bài viết này, chúng ta sẽ khám phá các kỹ thuật tối ưu hiệu suất cho Redis trên nền tảng CentOS.

        1. Cài Đặt Redis trên CentOS

        sudo yum install epel-release
        sudo yum install redis
        

        2. Tối Ưu Hóa Hiệu Suất

        Sử dụng tệp cấu hình redis.conf để tối ưu hóa hiệu suất. Các tham số quan trọng bao gồm:

        • maxmemory: Giới hạn bộ nhớ mà Redis sử dụng.
        • maxmemory-policy: Chính sách khi đạt giới hạn bộ nhớ.
        # Ví dụ cài đặt maxmemory
        maxmemory 256mb
        maxmemory-policy allkeys-lru
        

        3. Bảo Mật Redis

        Bảo mật là yếu tố quan trọng để bảo vệ dữ liệu. Hãy đảm bảo:

        • Thay đổi mật khẩu mặc định trong redis.conf.
        • Sử dụng cấu hình bind để chỉ cho phép địa chỉ IP cụ thể truy cập.
        requirepass your_secure_password
        bind 127.0.0.1
        

        4. Giám Sát Redis

        Các công cụ giám sát như Redis Monitoring giúp theo dõi hiệu suất và phát hiện các vấn đề nhanh chóng. Sử dụng redis-cli để kiểm tra:

        redis-cli info
        

        5. Lưu Trữ Dữ Liệu

        Redis hỗ trợ một số phương pháp lưu trữ dữ liệu, bao gồm:

        • RDB Persistence: Lưu trữ dữ liệu ở định dạng snapshot.
        • AOF Persistence: Lưu mọi lệnh để khôi phục lại dữ liệu.
        # Ví dụ cấu hình AOF
        appendonly yes
        appendfsync everysec
        

        6. Kiểm Soát Lỗi Tổn Thất Thông Tin

        Một trong những sai lầm phổ biến là không sao lưu cấu hình. Đảm bảo bạn thường xuyên sao lưu redis.conf và dữ liệu của bạn.

        Checklist Tối Ưu:

        • Đã cấu hình maxmemory?
        • Bảo mật với requirepass?
        • Thiết lập giám sát?
        • Lưu trữ dữ liệu được cấu hình đúng?

        Giám sát Container

        Giới thiệu

        Trong môi trường Docker, việc giám sát container là yếu tố quan trọng để đảm bảo hiệu suất và tính ổn định của hệ thống. Khi các ứng dụng được triển khai trong container, khả năng theo dõi tài nguyên, log, và hiệu suất giúp bạn kịp thời phát hiện và xử lý sự cố. Bài viết này sẽ giới thiệu các công cụ giám sát container phổ biến và hướng dẫn chi tiết cách triển khai giám sát hiệu quả trong Docker.

        Xem danh sách các Container

        Chỉ Container đang chạy

        docker ps
        • Hiển thị các Container đang chạy cùng thông tin như ID, tên, trạng thái, thời gian khởi chạy, cổng được ánh xạ, v.v.

        Tất cả Container (bao gồm cả Container đã dừng)

        docker ps -a

        Kiểm tra logs của Container

        Xem logs từ Container

        docker logs <container_id_or_name>
        • Hiển thị logs của một Container cụ thể.

        Theo dõi logs theo thời gian thực

        docker logs -f <container_id_or_name>

        Giới hạn số dòng logs

        docker logs --tail <number> <container_id_or_name>

        Kiểm tra trạng thái Container

        docker inspect <container_id_or_name>
        • Cung cấp thông tin chi tiết về Container như cấu hình mạng, volume, trạng thái, cổng, và môi trường.

        Theo dõi tài nguyên Container đang sử dụng

        Xem nhanh tài nguyên của một hoặc nhiều Container

        docker stats
        • Hiển thị việc sử dụng CPU, bộ nhớ, mạng, và I/O của tất cả Container đang chạy.

        Để theo dõi một Container cụ thể:

        docker stats <container_id_or_name>

        Kiểm tra tiến trình trong Container

        Liệt kê các tiến trình đang chạy bên trong Container

        docker top <container_id_or_name>

        Xem cấu hình mạng của Container

        docker network inspect <network_name>
        • Hiển thị chi tiết về mạng Docker và các Container đang kết nối với mạng đó.

        Kiểm tra thay đổi trong filesystem của Container

        docker port <container_id_or_name>
        
        • Hiển thị các cổng đang được ánh xạ từ Container ra host.

        Theo dõi sự kiện Docker

        docker events
        • Hiển thị các sự kiện trong Docker như Container khởi động, dừng, tạo mới, xóa, v.v.

        Ví dụ: Theo dõi các sự kiện liên quan đến Container cụ thể

        docker events --filter 'container=<container_id_or_name>'

        Kiểm tra tài nguyên hệ thống Docker

        docker system df
        • Hiển thị thông tin về việc sử dụng tài nguyên của Docker như dung lượng của images, containers, volumes

        Theo dõi realtime logs với cấu hình output format

        docker logs <container_id_or_name> --since <time>
        • Giám sát logs từ một khoảng thời gian cụ thể (time có thể là 10m, 2h, 2023-11-20T10:00:00).

        Kiểm tra restart policies

        docker inspect <container_id_or_name> --format '{{.HostConfig.RestartPolicy}}'
        • Hiển thị thông tin về chính sách restart được thiết lập cho Container.

        Giám sát container không chỉ giúp đảm bảo hệ thống hoạt động ổn định mà còn cung cấp những thông tin quan trọng để tối ưu hóa hiệu suất. Bằng cách sử dụng các công cụ như Prometheus, Grafana, hoặc các lệnh tích hợp sẵn của Docker, bạn có thể dễ dàng quản lý và theo dõi container của mình. Hãy áp dụng ngay hôm nay để nâng cao hiệu quả vận hành hệ thống Docker của bạn!

        Prometheus: Monitoring VmWare

        Giới thiệu

        Hạ tầng ảo hóa như VMware đóng vai trò quan trọng trong các hệ thống hiện đại, giúp tối ưu hóa tài nguyên và tăng hiệu quả hoạt động. Tuy nhiên, việc giám sát hiệu suất và tình trạng của VMware là một thách thức lớn. Prometheus, kết hợp với các Exporter chuyên dụng, là giải pháp lý tưởng để theo dõi dữ liệu từ VMware, giúp bạn chủ động quản lý và tối ưu hóa hệ thống. Trong bài viết này, chúng ta sẽ tìm hiểu cách tích hợp Prometheus để giám sát VMware chi tiết nhất.

        Cài đặt python3

        apt install python3 -y
        apt install python3-pip -y

        Cài đặt vmware_exporter

        pip3 install vmware_exporter
        pip3 install --ignore-installed PyYAML

        Sau khi cài xong, thư mục chứa source vmware_exporter nằm ở /usr/local/lib/python3.8/dist-packages/vmware_exporter

        Tạo file config cho vmware_exporter

        nano /usr/local/lib/python3.6/dist-packages/vmware_exporter/config.yml
        default:
            vsphere_host: vcenter.yourdomain.com
            vsphere_user: 'usermonitor@vcenterdomain.local'
            vsphere_password: 'usermonitorpass'
            ignore_ssl: True
            specs_size: 5000
            fetch_custom_attributes: True
            fetch_tags: True
            fetch_alarms: True
            collect_only:
                vms: True
                vmguests: True
                datastores: True
                hosts: True
                snapshots: True

        Tạo file service systemd cho vmware_exporter

        nano /etc/systemd/system/vmware_exporter.service
        [Unit]
        Description=Prometheus VMWare Exporter
        Wants=network-online.target
        After=network-online.target
        
        [Service]
        Type=simple
        User=root
        Group=root
        ExecReload=/bin/kill -HUP $MAINPID
        ExecStart=/usr/bin/python3 /usr/local/bin/vmware_exporter -c /usr/local/lib/python3.6/dist-packages/vmware_exporter/config.yml
        SyslogIdentifier=vmware_exporter
        Restart=always
        
        [Install]
        WantedBy=multi-user.target

        Reload daemon và khởi động dịch vụ

        systemctl daemon-reload
        systemctl enable vmware_exporter.service
        systemctl start vmware_exporter.service

        Thiết lập Prometheus cho vmware_exporter, thiết lập prometheus gọi tới cổng dịch vụ của vmware_exporter

        nano /etc/prometheus/prometheus.yml
          - job_name: 'dc_vcenter'
            scrape_timeout: 1m
            scrape_interval: 2m
            metrics_path: '/metrics'
            static_configs:
              - targets:
                - 'vcenter.yourdomain.com'
            relabel_configs:
              - source_labels: [__address__]
                target_label: __param_target
              - source_labels: [__param_target]
                target_label: instance
              - target_label: __address__
                replacement: thanhnh.id.vn:9272

        Tiếp theo, bạn tìm trong file prometheus.yml đoạn như dưới và thêm file rule cho vcenter.

        rule_files:
          # - "first_rules.yml"
          # - "second_rules.yml"
            - "/etc/prometheus/rules/vcenter.yml"

        Thiết lập rule alertmanager cho vmware, tạo một file chứa các rule alert cho vcenter

        nano /etc/prometheus/rules/vcenter.yml

        Bạn copy nội dung giống như dưới vào file (Vcenter.yml đính kèm file)

        Bây giờ bạn reload dịch vụ prometheus và dịch vụ alertmanager

        systemctl reload prometheus
        systemctl reload alertmanager

        Import Template JSON Vcenter đính kèm theo file vào , chọn datasource Prometheus -> Done

        Prometheus cung cấp một cách tiếp cận hiệu quả và linh hoạt để giám sát VMware, cho phép bạn theo dõi hiệu suất hạ tầng ảo hóa một cách chính xác và đáng tin cậy. Bằng cách sử dụng các Exporter phù hợp và tích hợp Prometheus, bạn có thể đảm bảo hệ thống luôn hoạt động ổn định và đạt hiệu suất cao nhất. Hãy bắt đầu thiết lập ngay hôm nay để tận dụng sức mạnh của Prometheus trong giám sát VMware!

        Docker Plugin Hostnic

        Giới thiệu

        docker-plugin-hostnic là một plugin mạng cho Docker, được phát triển bởi Yunify, cho phép gắn trực tiếp một card mạng vật lý (NIC) của máy chủ vào container. Điều này giúp container có thể giao tiếp trực tiếp qua giao diện mạng của máy chủ mà không cần thông qua lớp mạng ảo hóa.

        Tính năng chính:

        • Gắn NIC trực tiếp:
          Plugin cho phép bạn chỉ định một NIC cụ thể từ máy chủ để gắn vào container.
        • Hiệu năng mạng cao:
          Bỏ qua các lớp ảo hóa mạng (bridge, overlay), giúp giảm độ trễ và tăng thông lượng mạng.
        • Cấu hình mạng đơn giản:
          Container sử dụng cấu hình mạng trực tiếp từ NIC của máy chủ mà không cần cấu hình phức tạp.

        Plugin yêu cầu Docker phiên bản 1.9 trở lên. Đảm bảo Docker của bạn tương thích bằng lệnh:

        docker --version

        Cài đặt plugin:

        docker pull qingcloud/docker-plugin-hostnic
        docker run -v /run/docker/plugins:/run/docker/plugins -v /etc/docker/hostnic:/etc/docker/hostnic --network host --privileged qingcloud/docker-plugin-hostnic docker-plugin-hostnic

        Tạo một mạng Docker sử dụng plugin hostnic:

        docker network create -d hostnic --subnet=192.168.1.0/24 --gateway 192.168.1.1 hostnic
        • --subnet: Phạm vi IP của mạng Docker.
        • --gateway: Cổng mặc định của mạng (thường là địa chỉ IP của NIC trên máy chủ).

        Khởi chạy một container sử dụng mạng hostnic:

        docker run -it --ip 192.168.1.5 --mac-address 52:54:0e:e5:00:f7 --network hostnic ubuntu:14.04 bash
        • --ip: Chỉ định địa chỉ IP cho container (nên nằm trong subnet đã tạo ở bước trên).
        • --mac-address: Chỉ định địa chỉ MAC cho container để tránh xung đột.

        Lưu ý quan trọng:

        1. IP và MAC phải duy nhất:
          Nếu bạn không chỉ định --ip, Docker sẽ tự động gán IP, nhưng bạn cần đảm bảo không có xung đột IP hoặc MAC trên mạng.
        2. Lưu cấu hình mạng:
          Các cấu hình mạng được lưu tại tệp /etc/docker/hostnic/config.json. Nếu plugin bị xóa hoặc khởi động lại, bạn có thể khôi phục cấu hình từ tệp này.
        3. Sử dụng cẩn thận với một NIC duy nhất:
          Nếu máy chủ chỉ có một NIC, việc gắn trực tiếp NIC này vào container có thể làm gián đoạn kết nối mạng của máy chủ.

        Tham khảo thêm:

        Pre-checking và Chuẩn Bị Hệ Thống Trước Khi Tạo MySQL Cluster

        Giới thiệu

        Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

        Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

        https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

        https://mariadb.com/kb/en/galera-cluster

        Phần 3 : Pre-checking và Chuẩn Bị Hệ Thống Trước Khi Tạo MySQL Cluster

        Trước khi tạo MySQL Cluster, bạn cần thực hiện các bước pre-checking và chuẩn bị hệ thống để đảm bảo mọi thành phần hoạt động trơn tru. Bài viết này sẽ hướng dẫn bạn cách kiểm tra phần cứng, mạng và cấu hình phần mềm cần thiết.

        Kiểm tra các thông số và chuẩn bị

        Cấu hình 3 host với thông số :

        node 0 : 192.168.33.20/24 ‘cluster’@’%’ apt install mysql-server mysql-shell(8.0)

        node 1 : 192.168.33.21/24 ‘cluster’@’%’ apt install mysql-server mysql-shell(8.0)

        node 2 : 192.168.33.22/24 ‘cluster’@’%’ apt install mysql-server mysql-shell(8.0)

        Phân Quyền cho InnoDB Cluster :

        GRANT CREATE USER, FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SELECT, SHUTDOWN, SUPER ON *.* TO 'cluster'@'%' WITH GRANT OPTION;
        GRANT DELETE, INSERT, UPDATE ON mysql.* TO 'cluster'@'%' WITH GRANT OPTION;
        GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata.* TO 'cluster'@'%' WITH GRANT OPTION;
        GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_bkp.* TO 'cluster'@'%' WITH GRANT OPTION;
        GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_previous.* TO 'cluster'@'%' WITH GRANT OPTION;

        Chuẩn bị trên các host 1, 2 ,3 các cấu hình như sau

        nano /etc/mysql/mysql.conf.d/my.cnf

        Host 1:

        #innodb-1
        binlog_checksum = NONE
        enforce_gtid_consistency = ON
        gtid_mode	= ON
        log_slave_updates	 = ON
        master_info_repository   = TABLE
        relay_log_info_repository	= TABLE
        server_id	= 55554
        transaction_write_set_extraction	= XXHASH64
        disable_log_bin
        log_bin	= ON

        Host 2:

        #innodb-2
        binlog_checksum = NONE
        enforce_gtid_consistency = ON
        gtid_mode	= ON
        log_slave_updates	 = ON
        master_info_repository   = TABLE
        relay_log_info_repository	= TABLE
        server_id	= 55555
        transaction_write_set_extraction	= XXHASH64
        disable_log_bin
        log_bin	= ON

        Host 3:

        #innodb-3
        binlog_checksum = NONE
        enforce_gtid_consistency = ON
        gtid_mode	= ON
        log_slave_updates	 = ON
        master_info_repository   = TABLE
        relay_log_info_repository	= TABLE
        server_id	= 55557
        transaction_write_set_extraction	= XXHASH64
        disable_log_bin
        log_bin	= ON

        Trên Mysql Shell đặt tham số và connect để config từng host

        Đặt các tham số :

        var c1 = 'cluster@192.168.33.20:3306'
        var c2 = 'cluster@192.168.33.21:3306'
        var c3 = 'cluster@192.168.33.22:3306'

        Connect từng host và kiểm tra :

        Host 1 : 
            shell.connect(c1)
            dba.configureInstance('cluster@192.168.33.20')
        Host 2 :
            shell.connect(c2)
            dba.configureInstance('cluster@192.168.33.21')
        Host 3 :
            shell.connect(c3)
            dba.configureInstance('cluster@192.168.33.22')

        Kiểm tra trạng thái tiêu chuẩn từng host :

        Host 1 :
        	dba.configureInstance('cluster@192.168.33.20:3306')           -> Status : Ok là đạt
        Host 2 :
        	dba.checkInstanceConfiguration('cluster@192.168.33.21:3306'); -> status OK 
        Host 3 :
        	dba.checkInstanceConfiguration('cluster@thanhnh.id.vn:3306'); 	  -> status OK

        Tóm lại

        Hoàn thành bước pre-checking và chuẩn bị hệ thống giúp bạn tránh các lỗi không mong muốn khi thiết lập MySQL Cluster. Đây là bước quan trọng để bảo đảm hệ thống hoạt động ổn định và hiệu quả.

        Xem thêm

        Tạo MySQL Cluster và Tham Gia Group

        Giới thiệu

        Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

        Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

        https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

        https://mariadb.com/kb/en/galera-cluster

        Phần 4: Tạo MySQL Cluster và Tham Gia Group: Hướng Dẫn Từng Bước

        MySQL Cluster giúp mở rộng quy mô và đảm bảo tính toàn vẹn của dữ liệu bằng cách phân phối trên nhiều nút. Bài viết này sẽ hướng dẫn bạn cách tạo MySQL Cluster và tham gia vào nhóm (group) bằng MySQL Shell.

        Đặt tham số:

        var c1 = 'cluster@192.168.33.20:3306'
        var c2 = 'cluster@192.168.33.21:3306'
        var c3 = 'cluster@192.168.33.22:3306'

        Host 1: Connect vào host và tạo Cluster

        shell.connect(c1)
        var cluster = dba.createCluster('groupa');

        Connect từng Cluster vào Group

        cluster.addInstance(c2) -> Incremental (I)
        cluster.addInstance(c3) -> Incremental (I)

        Cài đặt bầu chọn Node chính và Node phụ

        Bầu chọn node nào sẽ làm node chính, node phụ. Với những môi trường thiếu tài nguyên thì đây là một cách để tối ưu tài nguyên phần cứng. Tuy nhiên, khuyến nghị nhà cung cấp nên là các host tương đồng như nhau về mặt tài nguyên để đảm bảo hệ thống chạy thông suốt

        • Member Weight : 0 -> 100
        • Default 50 !
        • Member Weight càng cao -> Primary

        Có 3 cách như sau:

        Cách 1:

        dba.createCluster('cluster1', {memberWeight:35})
        var mycluster = dba.getCluster()
        mycluster.addInstance('icadmin@ic2', {memberWeight:25})
        mycluster.addInstance('icadmin@ic3', {memberWeight:50})

        Cách 2:

        Kiểm tra trên các node : sử dụng Heavy Weight . Heavy Weight càng CAO -> PRIMARY

        mysql> select member_host,member_state,member_role,member_version from performance_schema.replication_group_members;

        Kiểm tra Server Weight trên các node:

        [root@innodb1 ~]# mysql -e "select @@hostname, @@group_replication_member_weightG"
        [root@innodb2 ~]# mysql -e "select @@hostname, @@group_replication_member_weightG"
        [root@innodb3 ~]# mysql -e "select @@hostname, @@group_replication_member_weightG"

        Set trên host muốn đặt làm Primary node:

        mysql> set global group_replication_member_weight = 70;
        ## Default : 50

        Cách 3:

        Sử dụng group_replication_set_as_primary. Tại host muốn làm Primary:

        Show UUID:

        mysql> show global variables like 'server_uu%';

        Set primary:

        mysql> select group_replication_set_as_primary('c5aed435-d58d-11ea-bb26-5254004d77d3');

        Kiểm tra lại:

        mysql> select member_host,member_state,member_role,member_version from performance_schema.replication_group_members;

        Tóm lại

        Sau khi hoàn thành việc tạo cluster và tham gia group, hệ thống của bạn đã sẵn sàng xử lý lượng lớn dữ liệu với độ tin cậy cao. Tiếp theo, hãy đảm bảo rằng bạn cấu hình MySQL Router để tối ưu hóa kết nối.

        Xem thêm

        Cài Đặt và Cấu Hình MySQL Router: Kết Nối Cluster An Toàn

        Giới thiệu

        Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

        Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

        https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

        https://mariadb.com/kb/en/galera-cluster

        Phần 5 : Cài Đặt và Cấu Hình MySQL Router – Kết Nối Cluster An Toàn

        MySQL Router là công cụ quan trọng giúp điều hướng kết nối giữa các ứng dụng và cluster. Trong bài viết này, chúng ta sẽ tìm hiểu cách cài đặt và cấu hình MySQL Router để đảm bảo kết nối an toàn và tối ưu giữa các nút trong cluster.

        Cài đặt MySQL Router

        Sử dụng APT Package Manager(Ubuntu):

        sudo dpkg -i mysql-apt-config_0.8.30-1_all.deb

        Update  APT repository:

        sudo apt-get update

        Install  MySQL Router:

        sudo apt-get install mysql-router-community

        Sử dụng RPM packages (CentOS):

        install the MySQL Yum repository as described

        sudo rpm -Uvh mysql84-community-release-el7-1.noarch.rpm

        Cấu hình tuỳ chọn thay đổi phiên bản 8.4 hoặc 8.0

         sudo yum-config-manager --disable mysql-8.4-lts-community
         sudo yum-config-manager --enable  mysql80-community
        
         sudo yum-config-manager --disable mysql-tools-8.4-lts-community
         sudo yum-config-manager --enable  mysql-tools-community

         Install MySQL Router

        sudo yum install mysql-router-community

        Cấu hình MySQL Router:

        Tạo folder

        mkdir /etc/mysqlrouter/mysql-router

        Cấu hình sử dụng bootstrap

         mysqlrouter --bootstrap cluster@192.168.33.20:3306 --directory /etc/mysqlrouter/mysql-router --user=root

        Output như sau

        
        # Bootstrapping MySQL Router instance at '/etc/mysqlrouter/mysql-router'...
        
        Error: It appears that a router instance named '' has been previously configured in this host. If that instance no longer exists, use the --force option to overwrite it.
        root@dbrouter:/etc/mysqlrouter# mysqlrouter --bootstrap cluster@192.168.33.20:3306 --directory /etc/mysqlrouter/mysql-router --user=root --force
        Please enter MySQL password for cluster: 
        # Bootstrapping MySQL Router instance at '/etc/mysqlrouter/mysql-router'...
        
        - Creating account(s) (only those that are needed, if any)
        - Verifying account (using it to run SQL queries that would be run by Router)
        - Storing account in keyring
        - Adjusting permissions of generated files
        - Creating configuration /etc/mysqlrouter/mysql-router/mysqlrouter.conf
        
        # MySQL Router configured for the InnoDB Cluster 'groupa'
        
        After this MySQL Router has been started with the generated configuration
        
            $ mysqlrouter -c /etc/mysqlrouter/mysql-router/mysqlrouter.conf
        
        InnoDB Cluster 'bestprice' can be reached by connecting to:
        
        ## MySQL Classic protocol
        
        - Read/Write Connections: thanhnh.id.vn:6446
        - Read/Only Connections:  thanhnh.id.vn:6447
        
        ## MySQL X protocol
        
        - Read/Write Connections: thanhnh.id.vn:6448
        - Read/Only Connections:  thanhnh.id.vn:6449
        
        -----------------------
        Create a systemd service file to start the mysql router :
            nano /etc/systemd/system/mysqlrouter-cluster.service
        ----------------------- ## Paste to config file
        [Unit]
        
        Description=MySQL Router
        
        After=syslog.target
        
        After=network.target
         
        
        [Service]
        
        Type=simple
        
        User=root
        
        Group=root
        
        PIDFile=/etc/mysqlrouter/mysql-router/mysqlrouter.pid
        
        ExecStart=/bin/bash -c "/usr/bin/mysqlrouter -c /etc/mysqlrouter/mysql-router/mysqlrouter.conf"
        
         
        Restart=on-failure
        
        RestartPreventExitStatus=1
        
        PrivateTmp=true
         
        [Install]
        
        WantedBy=multi-user.target

        Khởi động lại MySQL Router:

        systemctl daemon-reload
        systemctl start mysqlrouter-groupa
        systemctl status mysqlrouter-groupa

        Tóm lại

        Với MySQL Router, bạn đã hoàn thành việc kết nối các ứng dụng với MySQL Cluster một cách an toàn và hiệu quả. Để đảm bảo hệ thống hoạt động trơn tru, hãy tiếp tục theo dõi và tối ưu hóa cluster của bạn.

        Xem thêm

        Giám Sát Hiệu Suất MySQL Cluster: Các Công Cụ và Phương Pháp Hiệu Quả

        Giới thiệu

        Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

        Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

        https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

        https://mariadb.com/kb/en/galera-cluster

        Phần 6: Giám Sát Hiệu Suất MySQL Cluster – Các Công Cụ và Phương Pháp Hiệu Quả

        Giám sát hiệu suất là yếu tố quyết định để đảm bảo MySQL Cluster hoạt động ổn định và hiệu quả. Bài viết này giới thiệu các công cụ và phương pháp giám sát hiệu suất của MySQL Cluster thông qua MySQL Shell.

        Trên Mysql Shell:

        var cluster = dba.getCluster()
        cluster.describe()
        cluster.status()

        Các thông tin hiện ra như sau:

        STATUS:

        • OK : Online và có thể hỗ trợ n node sập
        • OK_PARTIAL : Giống OK nhưng có một hoặc nhiều server chưa sẵn sàng là active members
        • OK_NO_TOLERANCE : Cluster chưa sẵn sàng để sập
        • OK_NO_TOLERANCE_PARTIAL : Cluster chưa sẵn sàng để sập và cluster có vài thành viên trong tình trạng offline , recovering, error, unreachable
        • NO_QUORUM : Member ko thể thực hiện những bản ghi Write
        • OFFLINE : offline
        • UNREACHABLE : Không có kết nối tới online members
        • UNKNOWN : Không có kết nối tới online members
        • FENCED_WRITES : cluster gặp vấn đề trong traffic ghi (WRITE)

        TOPOLOGY:

        • ONLINE : online
        • OFFLINE : offline
        • RECOVERING : đang đồng bộ với cluster trước khi online
        • UNREACHABLE : Mất kết nối
        • ERROR : Lỗi trong khi khôi phục hoặc apply những transactions mới
          * : Khi Srv ERROR, super_read_only sẽ set ON. Để thoát ERROR, sẽ phải thủ công cấu hình super_read_only=OFF
        • MISSING: Host đang là một phần trong cluster nhưng không có tại thời điểm hiện tại
        • MySQL Shell sử dụng state để biểu thị Instances được đăng kí trong metadata, nhưng ko thể tìm thấy ở trong cluster view

        Để hiện thị nhiều hơn thông tin

        Cluster.status({'extended':value})
        • 0 : Tắt những thông tin cơ bản ( defaults )
        • 1 : Bao gồm những thông tin về phiên bản, giao tiếp, UUIDS, Vai trò của thành viên và cluster được báo cáo bởi GRoup Replication
        • 2 : Bao gồm những thông tin về tiến trình transactions bởi kết nối và áp dụng
        • 3 : Nhiều data cụ thể hơn về hiệu năng replication bởi từng member cluster.

        Tóm lại

        Giám sát hiệu suất thường xuyên giúp bạn nắm bắt kịp thời các vấn đề tiềm ẩn, từ đó tối ưu hóa hệ thống. Đừng quên sử dụng các công cụ phù hợp để giữ MySQL Cluster của bạn ở trạng thái tốt nhất.

        Phần trước

        Xem tiếp

        Cấu Hình MySQL Shell Qua Command Line: Các Lệnh Quan Trọng Bạn Cần Biết

        Giới thiệu

        Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

        Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

        https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

        https://mariadb.com/kb/en/galera-cluster

        Phần 7: Cấu Hình MySQL Shell Qua Command Line – Các Lệnh Quan Trọng Bạn Cần Biết

        MySQL Shell là công cụ mạnh mẽ giúp quản lý và cấu hình hệ thống cơ sở dữ liệu thông qua command line. Bài viết này sẽ giới thiệu những lệnh quan trọng trong MySQL Shell mà bạn cần biết để quản lý hiệu quả.

        Command line to configureInstance:

        dba.configureInstance()
        
        dba.createCluster()
        
        Cluster.addInstance()
        
        Cluster.removeInstance()
        
        Cluster.rejoinInstance()
        	
        dba.checkInstanceConfiguration()
        	
        dba.configureInstance() 

        Dừng replication trên Slave:

        STOP SLAVE;

        Khởi động lại replication trên Slave:

        START SLAVE;

        Hiển thị trạng thái replication:

        SHOW SLAVE STATUSG;

        Đồng bộ master với slave:

        RESET SLAVE ALL;

        MySQL Group Replication

        Cài đặt Plugin Group Replication:

        INSTALL PLUGIN group_replication SONAME 'group_replication.so';

        Khởi động Group Replication trên mỗi node:

        START GROUP_REPLICATION;

        MySQL Shell cho InnoDB Cluster

        Truy cập MySQL Shell:

        mysqlsh --uri root@thanhnh.id.vn

        Tạo một Cluster mới:

        dba.createCluster('myCluster');

        Thêm các node vào Cluster:

        cluster = dba.getCluster('myCluster');
        cluster.addInstance('root@node_ip:3306');

        Kiểm tra trạng thái Cluster:

        cluster.status();

        Restoring and Rebooting Cluster

        Trong trường hợp Instances không thể kết nối lại sau khi sập thì

        Cluster.rejoinInstance(instance)

        Nếu instance super_read_only=on thì bạn cần chắc chắn rằng AdminAPI có thể set super_read_only=OFF. Trong trường hợp Instances không có cấu hình kết dính ( persisted ), khi restart instance sẽ không tự động join lại. Như vậy sẽ phải thủ công để rejoinInstance(instance)

        Trong trường hợp server_UUID thay đổi thì sẽ phải remove và thêm lại thủ công với option force

        cluster.removeInstance("root@instanceWithOldUUID:3306", {force: true})
        
        cluster.rescan()

        Reboot Cluster

        var cluster = dba.rebootClusterFromCompleteOutage()
        • Nếu toàn bộ members có cùng GTID, thì member đang kết nối sẽ là Primary
        • Nếu members đang RECOVERING hoặc ERROR và toàn bộ member khác OFFLINE hoặc ERROR
        • rebootClusterFromCompleteOutage() sẽ stop Group Replication, Nếu Group Replication fail to stop, command sẽ bị dừng và hiển thị Lỗi

        Tóm lại

        Việc nắm vững các lệnh command line trong MySQL Shell sẽ giúp bạn quản lý hệ thống cơ sở dữ liệu một cách dễ dàng và linh hoạt. Hãy áp dụng những lệnh này để tối ưu hiệu quả quản trị.

        Phần trước

        Xem tiếp

        Khắc Phục Lỗi Thường Gặp Và Mẹo Sử Dụng MySQL Shell Hiệu Quả

        Giới thiệu

        Multi-node MySQL là giải pháp tiên tiến giúp nâng cao khả năng mở rộng và tăng cường hiệu suất cho các hệ thống cơ sở dữ liệu. Bằng cách phân tán dữ liệu và xử lý trên nhiều nút (node), Multi-node MySQL không chỉ giảm tải cho một máy chủ mà còn đảm bảo tính toàn vẹn và tính sẵn sàng cao hơn. Đây là một công nghệ quan trọng đối với các doanh nghiệp cần xử lý lượng lớn dữ liệu trong thời gian thực mà vẫn đảm bảo tính ổn định của hệ thống.

        Về chi tiết các bạn có thể tham khảo tại trang chủ của MySQL & MariaDB :

        https://dev.mysql.com/doc/mysql-cluster-excerpt/8.0/en/mysql-cluster-general-info.html

        https://mariadb.com/kb/en/galera-cluster

        Phần 8: Khắc Phục Lỗi Thường Gặp Và Mẹo Sử Dụng MySQL Shell Hiệu Quả

        Trong quá trình sử dụng MySQL Shell, người dùng thường gặp phải một số lỗi phổ biến. Bài viết này sẽ cung cấp các mẹo hữu ích và giải pháp khắc phục nhanh chóng, giúp bạn làm chủ MySQL Shell hiệu quả hơn.

        Lỗi Libreadline7

        Trong một số trường hợp ( ubuntu 20.04 ) gặp trình trạng install mysql-shell sẽ dẫn đến lỗi thiếu thư viện libreadline7. Để tránh trường hợp xảy ra lỗi thì đây sẽ là giải pháp đơn giản để khắc phục

        sudo nano /etc/apt/sources.list

        Add to bottom:

        deb http://cz.archive.ubuntu.com/ubuntu bionic main

        Update repository:

        sudo apt update

        Install Libreadline7:

         apt install libreadline7 -y

        Cluster error

        Không remove hoặc delete table vì super_read_only=on

        Turn off group_replication:

        STOP GROUP_REPLICATION;

        Turn off super_read_only:

        SET GLOBAL read_only = OFF;

        Delete, remove table, database:

        Turn on super_read_only:

        SET GLOBAL read_only = ON;

        Turn on group_replication:

        START GROUP_REPLICATION;

        Gặp vấn đề với các table MyISAM

        Do MySQL InnoDB Cluster chỉ hoạt động với table type innodb nên ta cần convert toàn bộ table MyISAM về InnoDB

        List toàn bộ table myISAM ( Thực hiện trên host khác chạy độc lập), có 2 cách:

        Cách 1:

            mysql -u root -p
        
            SET @DATABASE_NAME = 'name_of_your_db';
        
            SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statements
            FROM    information_schema.tables AS tb
            WHERE   table_schema = @DATABASE_NAME
            AND     `ENGINE` = 'MyISAM'
            AND     `TABLE_TYPE` = 'BASE TABLE'
            ORDER BY table_name DESC;

        Tuy nhiên cách trên sẽ gặp lỗi những table, field date formart. Cách 2 sẽ xử lý triệt để

        Cách 2:

        List toàn bộ table MyISAM

            SELECT table_name FROM INFORMATION_SCHEMA.TABLES
            WHERE engine = 'MyISAM' 

        Convert toàn bộ sang InnoDB với options ignore lỗi formart

            SET SQL_MODE='ALLOW_INVALID_DATES';
        
            ALTER TABLE <Table> ENGINE=InnoDB;

        Sau đó convert table và import vào hệ thống innodb Cluster

            mysql -u root -h thanhnh.id.vn -P 6446 -p 
            create table database character set utf8 collate utf8_bin;
            create user 'database'@'%' identified by 'password';
            Grant all privileges on database.* to 'database'@'%';
            use database;
            source <path-to-database>

        Bằng cách nắm vững những mẹo khắc phục lỗi trong MySQL Shell, bạn có thể giải quyết vấn đề nhanh chóng và duy trì hiệu suất làm việc ổn định. Hãy lưu lại những mẹo này để tối ưu hóa trải nghiệm của bạn.

        Tham khảo các bài viết trước