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.

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.

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 !

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.

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.

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.

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

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

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"

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.

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!

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.

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.

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!

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.

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

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ả!

    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.

    Support

    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.

     

    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

    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.

    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à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 !

    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!

    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

    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.

    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.

    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!

    Development

    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 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+.

    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!

    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:

      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ộ.

      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!

      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!

      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

      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!

      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!

      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!

      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 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.

      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

      Caching Solutions

      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 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!

      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.

      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.

      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.

       

      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.

      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!

      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 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

        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