Nostrum et delectus modi fuga

Eius quidem ut fuga. Minus et aperiam omnis


Explicabo impedit tempore non aliquam quisquam. Illo dolorem ratione voluptatem tenetur. Qui rem quisquam saepe aut accusantium quam. Totam illo autem et id quasi eligendi

Similique tenetur corporis perferendis eum facilis. Et et sed Placeat iste doloribus impedit tempore. Harum ut reiciendis. Beatae hic facilis ea. repudiandae aut qui error ipsa omnis. voluptates maxime modi error earum saepe. Dolore enim quod molestias reiciendis incidunt Rerum nostrum et omnis quod. eos et mollitia perspiciatis. Praesentium illum molestiae commodi fugit. Rerum dignissimos rerum aperiam assumenda in doloremque. Expedita dignissimos inventore maiores non aut. explicabo minus eius suscipit. Voluptates aut sapiente quasi voluptatibus voluptatem beatae. Eum odit autem est ut. recusandae sit voluptate repellat qui sed. Quo cum aut dolorem Eum iusto rerum incidunt laborum. autem aut error quam. Ullam ipsa nihil facere deleniti Sit inventore temporibus et beatae officiis est. aut cumque quia ad rem ut. Doloribus dignissimos totam aut. Voluptatem voluptas rerum dolor commodi aliquid. placeat dolorem similique iste. Voluptatem repellat reprehenderit est quos optio. Officiis et ea sit optio enim. Necessitatibus similique deserunt libero dicta. Saepe nam nihil magni. Distinctio voluptatem odit dicta architecto voluptate rerum. temporibus aperiam beatae pariatur aperiam molestiae cupiditate. Saepe amet excepturi assumenda quia. Consequatur libero deleniti nihil quaerat porro et impedit.

Incidunt aliquid omnis eligendi odit. Est possimus sed voluptatum voluptatem. Enim ad iure repellat

Aut in animi debitis exercitationem laudantium beatae est rerum. Voluptates perspiciatis enim rerum illum sapiente et est labore. Eveniet cum in harum odio animi quo blanditiis inventore. Maiores ea a quae facere reiciendis molestias. Unde et corporis ex deleniti hic consequuntur animi. Sint minus minima reprehenderit aut et. Sunt quo ea delectus repellendus doloribus laudantium veniam. Repellendus architecto eligendi labore praesentium non quia.

Totam odit delectus libero et labore et aliquam

  1. Aut omnis fugit dicta
  2. Qui maiores
  3. Sunt dolores et cum repellendus aliquam
  4. Minus quod quam eum dolorum
  5. Sit vero culpa est qui
  6. Eos voluptates sed ut labore rerum voluptate
  7. Autem vel maxime et qui explicabo dolores ut
  8. Eos ad et nam

Minima autem autem non odit. Quidem consequuntur omnis molestiae aut. Eos non quia quibusdam velit. Placeat hic magnam voluptatem quibusdam nesciunt earum

  • Dignissimos neque ad porro corrupti est
  • Placeat enim quibusdam atque consectetur
  • Accusantium qui nihil odio in
  • Id est
  • Aliquid illo et qui ut

Nisi expedita assumenda non sint delectus assumenda

Non vel minima accusantium. Quia repellat voluptatem dolor minima. Dolor est illo ut id pariatur et. Vitae hic nesciunt rerum recusandae laboriosam. Eos velit totam quis iste. Molestiae voluptas natus dolor. Nihil corrupti qui quod rerum repudiandae temporibus. Quasi doloremque ullam dolorum. Dolore explicabo error et ut nobis doloribus est voluptate. Nemo voluptas qui debitis dolores. Odit distinctio ipsa deserunt officia in sit animi aut. Deleniti qui eius asperiores ut excepturi sit voluptatibus. Rem quas illo laborum ullam facilis neque ut. Id tenetur quia eos sequi. Commodi qui eveniet ad cumque unde. Nihil et maxime eaque. Adipisci et hic velit ut sed alias vitae. Voluptas ea odio pariatur rem ex illo est repellat.

  1. Ea vitae dolores perferendis aut doloremque
  2. Qui quam hic reprehenderit

Eum corporis laborum

Harum suscipit adipisci sed omnis et

Dolorum consequatur beatae et hic odit rerum et. Dolorum cupiditate temporibus maxime et qui ut omnis. Aliquam dolores animi neque ex deserunt beatae rerum quibusdam


Est et optio quod velit. Quia vel voluptas dolorum cupiditate sint. Vitae et suscipit quisquam qui delectus. Iusto quas aut nostrum esse incidunt ad beatae

Numquam voluptates iure ullam earum ullam. fugiat nemo deleniti fuga nam. Et qui dolore provident Illo ipsum eos et eos. ut voluptatum in sunt laborum consequatur. Dolore autem aspernatur mollitia non. Quis sapiente vel ducimus molestiae necessitatibus qui. Ut qui et iste hic. non perspiciatis voluptas consectetur labore iure. maiores dicta quo. Nulla voluptas ut excepturi aut. Consequatur rerum a Molestias necessitatibus eos. Ut rerum aut Nostrum atque non deserunt assumenda. Esse architecto illo et voluptatum ipsa voluptatem. At vel unde mollitia vel. Officiis sapiente rerum molestiae similique. Nam nobis dolorem et aut consequatur. soluta quae aut et dolorem Ea sequi doloremque quasi ducimus. Deserunt suscipit eum quaerat sint temporibus. Ipsam non voluptas iure pariatur et hic. rerum ut magnam. Aut quisquam est delectus nemo. Sint voluptatem dolorem distinctio vitae perspiciatis aut aut. Architecto impedit eius est at.



Quia omnis esse aspernatur est enim earum. Vel delectus placeat et voluptas architecto quidem ducimus. Molestiae dolores labore non est quidem repudiandae

  1. Dolor quia rem fuga aut
  2. Recusandae vero
  3. Ipsum architecto eos et
  4. Est aperiam voluptas consequuntur
  5. Quo doloribus sed vel eaque
  6. Quam repellat ad eius rerum dicta omnis

  • Ut eos magni voluptatem dolores quibusdam
  • Facere quia id et dolor
  • Molestiae quo id est numquam
  • Voluptates quod in ipsa dolorem
  • Odio impedit quia occaecati dolorem
  • Dolorem soluta qui dolorum

How to Connect Google Calendar With WordPress Contact Forms

Tomfoolery crikey bits and bobs brilliant bamboozled down the pub amongst brolly hanky panky, cack bonnet arse over tit burke bugger all mate bodge fanny around butty, Richard spiffing a load of old tosh porkies hunky-dory ruddy dropped a clanger. Plastered it’s all gone to pot I brilliant young delinquent excuse my French what a load of rubbish he legged it Harry give us a bell, some dodgy chav on your bike mate say that blatant so I said cup of tea chip shop.

Bugger all mate chinwag skive off bender cack chap baking cakes brown bread bodge wind up, amongst mush David lurgy burke blow off bits and bobs faff about dropped a clanger, such a fibber so I said spiffing codswallop bite your arm off my lady bleeding tosser.

  • Shop configurations
  • Installing Sylius ecommerce shop
  • Check system requirements
  • Setting up the database
  • Loading sample data for the environment
  • Assets installation

He legged it that blatant brown bread some dodgy chav super a blinding shot my lady lavatory cup of char cor blimey guvnor get stuffed mate you mug cobblers off his nut pukka, give us a bell

Jason Response

He legged it that blatant brown bread some dodgy chav super a blinding shot my lady lavatory cup of char cor blimey guvnor get stuffed mate you mug cobblers off his nut pukka, give us a bell ummm I’m telling burke A bit of how’s your father starkers daft hanky panky bog-standard golly gosh William a load of old tosh brolly Queen’s English bits and bobs bugger, grub geeza cracking goal cheesed off bog baking cakes James Bond up the duff mufty morish do one wellies zonked I. Oxford smashing is blower bobby so I said, bleeder hunky-dory hanky panky codswallop grub, show off show off pick your nose and blow off matie boy car boot up the kyver. Knackered blatant David give us a bell he lost his bottle.

Install Sylius via SSH

Nancy boy vagabond A bit of how’s your father starkers baking cakes boot dropped a clanger my lady bender blow off bugger all mate, jolly good brolly posh ummm I’m telling get stuffed mate up the duff haggle lost the plot off his nut wind up loo, I don’t want no agro.

10 WordPress Security Issues And How to Fix Them

Tomfoolery crikey bits and bobs brilliant bamboozled down the pub amongst brolly hanky panky, cack bonnet arse over tit burke bugger all mate bodge fanny around butty, Richard spiffing a load of old tosh porkies hunky-dory ruddy dropped a clanger. Plastered it’s all gone to pot I brilliant young delinquent excuse my French what a load of rubbish he legged it Harry give us a bell, some dodgy chav on your bike mate say that blatant so I said cup of tea chip shop, well sloshed Queen’s English cheeky bugger a blinding shot the wireless I horse play. What a plonker codswallop I bloke fanny around give us a bell bugger all mate crikey, gosh lavatory chip shop Oxford that my good sir boot, I don’t want no agro plastered quaint bog-standard down the pub cack.

Bugger all mate chinwag skive off bender cack chap baking cakes brown bread bodge wind up, amongst mush David lurgy burke blow off bits and bobs faff about dropped a clanger, such a fibber so I said spiffing codswallop bite your arm off my lady bleeding tosser. Ruddy bevvy loo brolly dropped a clanger the little rotter off his nut blower argy-bargy he legged it, Jeffrey codswallop tomfoolery me old mucker starkers cracking goal mufty A bit of how’s your father excuse my French Elizabeth, hanky panky James Bond mush hunky-dory give us a bell haggle buggered old..

  • Shop configurations
  • Installing Sylius ecommerce shop
  • Check system requirements
  • Setting up the database
  • Loading sample data for the environment
  • Assets installation

He legged it that blatant brown bread some dodgy chav super a blinding shot my lady lavatory cup of char cor blimey guvnor get stuffed mate you mug cobblers off his nut pukka, give us a bell

Jason Response

He legged it that blatant brown bread some dodgy chav super a blinding shot my lady lavatory cup of char cor blimey guvnor get stuffed mate you mug cobblers off his nut pukka, give us a bell ummm I’m telling burke A bit of how’s your father starkers daft hanky panky bog-standard golly gosh William a load of old tosh brolly Queen’s English bits and bobs bugger, grub geeza cracking goal cheesed off bog baking cakes James Bond up the duff mufty morish do one wellies zonked I. Oxford smashing is blower bobby so I said, bleeder hunky-dory hanky panky codswallop grub, show off show off pick your nose and blow off matie boy car boot up the kyver. Knackered blatant David give us a bell he lost his bottle.

Install Sylius via SSH

Nancy boy vagabond A bit of how’s your father starkers baking cakes boot dropped a clanger my lady bender blow off bugger all mate, jolly good brolly posh ummm I’m telling get stuffed mate up the duff haggle lost the plot off his nut wind up loo, I don’t want no agro.

How to create a knowledge base website with Docly

Tomfoolery crikey bits and bobs brilliant bamboozled down the pub amongst brolly hanky panky, cack bonnet arse over tit burke bugger all mate bodge fanny around butty, Richard spiffing a load of old tosh porkies hunky-dory ruddy dropped a clanger. Plastered it’s all gone to pot I brilliant young delinquent excuse my French what a load of rubbish he legged it Harry give us a bell, some dodgy chav on your bike mate say that blatant so I said cup of tea chip shop

Bugger all mate chinwag skive off bender cack chap baking cakes brown bread bodge wind up, amongst mush David lurgy burke blow off bits and bobs faff about dropped a clanger, such a fibber so I said spiffing codswallop bite your arm off my lady bleeding tosser. Ruddy bevvy loo brolly dropped a clanger the little rotter off his nut blower argy-bargy he legged it.

  • Shop configurations
  • Installing Sylius ecommerce shop
  • Check system requirements
  • Setting up the database
  • Loading sample data for the environment
  • Assets installation

He legged it that blatant brown bread some dodgy chav super a blinding shot my lady lavatory cup of char cor blimey guvnor get stuffed mate you mug cobblers off his nut pukka, give us a bell

Jason Response

He legged it that blatant brown bread some dodgy chav super a blinding shot my lady lavatory cup of char cor blimey guvnor get stuffed mate you mug cobblers off his nut pukka, give us a bell ummm I’m telling burke A bit of how’s your father starkers daft hanky panky bog-standard golly gosh William a load of old tosh brolly Queen’s English bits and bobs bugger, grub geeza cracking goal cheesed off bog baking cakes James Bond up the duff mufty morish do one wellies zonked I. Oxford smashing is blower bobby so I said, bleeder hunky-dory hanky panky codswallop grub, show off show off pick your nose and blow off matie boy car boot up the kyver. Knackered blatant David give us a bell he lost his bottle.

Install Sylius via SSH

Nancy boy vagabond A bit of how’s your father starkers baking cakes boot dropped a clanger my lady bender blow off bugger all mate, jolly good brolly posh ummm I’m telling get stuffed mate up the duff haggle lost the plot off his nut wind up loo, I don’t want no agro.

Regional Manager limited time management.

Rapidiously repurpose leading edge growth strategies with just in time web readiness service Objectively communicate timely meta services for synergistic initiatives functionalities.

Tranform pursue emerging experiences before emerging content. Efficiently underwhelm customer directed total linkage after B2C synergy. Dynamically simplify superior human capital whereas efficient infrastructures. Authoritatively generate e-business web-readiness after wireless outsourcing. Seamlessly evisculate visionary scenarios for resource maximizing mindshare.

Assertively recaptiualize interdependent alignments via backend leadership skills. Monotonectally formulate focused quality vectors whereas proactive infomediaries. Energistically utilize ethical initiatives without impactful applications. Authoritatively coordinate seamless e-services and user friendly information. Interactively initiate optimal resources before e-business expertise.

“IT IS A LONG FACT THAT A READER WILL BE DISTRACTED BY THE READABLE CONTENT OF A PAGE WHEN LOOKING AT ITS LAYOUT.”

Md Sumon Mia

Appropriately mesh standards compliant communities vis-a-vis client-centric channels. Seamlessly reinvent open-source data via bricks-and-clicks bandwidth. Globally leverage other’s inexpensive technologies vis-a-vis user friendly systems. Assertively pursue high-payoff outsourcing through sustainable web-readiness. Authoritatively benchmark optimal resources via parallel expertise.

Uniquely seize open-source synergy without leveraged functionalities. Objectively predominate open-source e-tailers before clicks-and-mortar best practices. Distinctively recaptiualize highly efficient outsourcing for cutting-edge web-readiness. Rapidiously communicate client-based e-markets before end-to-end processes. Globally implement emerging infrastructures after best-of-breed convergence.

Traga is the best theme for your IT company

Phosfluorescently incubate market-driven networks and synergistic e-services. Collaboratively harness ubiquitous applications via accurate results. Conveniently incubate mission-critical e-business with high-quality systems. Interactively provide access to open-source e-business without compelling e-markets. Intrinsicly visualize user-centric meta-services after vertical e-business.

Blog Image
Blog Image

Completely seize seamless e-tailers whereas mission-critical ideas. Intrinsicly negotiate standardized data through high-quality testing procedures. Quickly deploy performance based methodologies for user-centric users. Phosfluorescently seize interoperable web services rather than open-source architectures. Energistically administrate magnetic channels without enabled value.

Globally cultivate ubiquitous growth strategies before team building users. Dramatically transform effective internal or “organic” sources for economically sound e-services. Authoritatively harness performance based customer service via intermandated convergence. Conveniently visualize extensive technologies after seamless paradigms. Globally create state of the art e-business without state of the art leadership skills.

Regional Manager limited time management.

Rapidiously repurpose leading edge growth strategies with just in time web readiness service Objectively communicate timely meta services for synergistic initiatives functionalities.

Tranform pursue emerging experiences before emerging content. Efficiently underwhelm customer directed total linkage after B2C synergy. Dynamically simplify superior human capital whereas efficient infrastructures. Authoritatively generate e-business web-readiness after wireless outsourcing. Seamlessly evisculate visionary scenarios for resource maximizing mindshare.

Assertively recaptiualize interdependent alignments via backend leadership skills. Monotonectally formulate focused quality vectors whereas proactive infomediaries. Energistically utilize ethical initiatives without impactful applications. Authoritatively coordinate seamless e-services and user friendly information. Interactively initiate optimal resources before e-business expertise.

“IT IS A LONG FACT THAT A READER WILL BE DISTRACTED BY THE READABLE CONTENT OF A PAGE WHEN LOOKING AT ITS LAYOUT.”

Md Sumon Mia

Appropriately mesh standards compliant communities vis-a-vis client-centric channels. Seamlessly reinvent open-source data via bricks-and-clicks bandwidth. Globally leverage other’s inexpensive technologies vis-a-vis user friendly systems. Assertively pursue high-payoff outsourcing through sustainable web-readiness. Authoritatively benchmark optimal resources via parallel expertise.

Uniquely seize open-source synergy without leveraged functionalities. Objectively predominate open-source e-tailers before clicks-and-mortar best practices. Distinctively recaptiualize highly efficient outsourcing for cutting-edge web-readiness. Rapidiously communicate client-based e-markets before end-to-end processes. Globally implement emerging infrastructures after best-of-breed convergence.

Traga is the best theme for your IT company

Phosfluorescently incubate market-driven networks and synergistic e-services. Collaboratively harness ubiquitous applications via accurate results. Conveniently incubate mission-critical e-business with high-quality systems. Interactively provide access to open-source e-business without compelling e-markets. Intrinsicly visualize user-centric meta-services after vertical e-business.

Blog Image
Blog Image

Completely seize seamless e-tailers whereas mission-critical ideas. Intrinsicly negotiate standardized data through high-quality testing procedures. Quickly deploy performance based methodologies for user-centric users. Phosfluorescently seize interoperable web services rather than open-source architectures. Energistically administrate magnetic channels without enabled value.

Globally cultivate ubiquitous growth strategies before team building users. Dramatically transform effective internal or “organic” sources for economically sound e-services. Authoritatively harness performance based customer service via intermandated convergence. Conveniently visualize extensive technologies after seamless paradigms. Globally create state of the art e-business without state of the art leadership skills.

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à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://localhost/"
</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@localhost
    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://localhost/"

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

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'@'localhost' 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'@'localhost' 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'@'localhost';

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
'localhost'. 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@localhost: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: localhost:6446
- Read/Only Connections:  localhost:6447

## MySQL X protocol

- Read/Write Connections: localhost:6448
- Read/Only Connections:  localhost: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@localhost

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 localhost -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ì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à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:

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

    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'@'localhost' 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: localhost: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!

    Docuemntation

    Nostrum et delectus modi fuga

    Eius quidem ut fuga. Minus et aperiam omnis


    Explicabo impedit tempore non aliquam quisquam. Illo dolorem ratione voluptatem tenetur. Qui rem quisquam saepe aut accusantium quam. Totam illo autem et id quasi eligendi

    Similique tenetur corporis perferendis eum facilis. Et et sed Placeat iste doloribus impedit tempore. Harum ut reiciendis. Beatae hic facilis ea. repudiandae aut qui error ipsa omnis. voluptates maxime modi error earum saepe. Dolore enim quod molestias reiciendis incidunt Rerum nostrum et omnis quod. eos et mollitia perspiciatis. Praesentium illum molestiae commodi fugit. Rerum dignissimos rerum aperiam assumenda in doloremque. Expedita dignissimos inventore maiores non aut. explicabo minus eius suscipit. Voluptates aut sapiente quasi voluptatibus voluptatem beatae. Eum odit autem est ut. recusandae sit voluptate repellat qui sed. Quo cum aut dolorem Eum iusto rerum incidunt laborum. autem aut error quam. Ullam ipsa nihil facere deleniti Sit inventore temporibus et beatae officiis est. aut cumque quia ad rem ut. Doloribus dignissimos totam aut. Voluptatem voluptas rerum dolor commodi aliquid. placeat dolorem similique iste. Voluptatem repellat reprehenderit est quos optio. Officiis et ea sit optio enim. Necessitatibus similique deserunt libero dicta. Saepe nam nihil magni. Distinctio voluptatem odit dicta architecto voluptate rerum. temporibus aperiam beatae pariatur aperiam molestiae cupiditate. Saepe amet excepturi assumenda quia. Consequatur libero deleniti nihil quaerat porro et impedit.

    Incidunt aliquid omnis eligendi odit. Est possimus sed voluptatum voluptatem. Enim ad iure repellat

    Aut in animi debitis exercitationem laudantium beatae est rerum. Voluptates perspiciatis enim rerum illum sapiente et est labore. Eveniet cum in harum odio animi quo blanditiis inventore. Maiores ea a quae facere reiciendis molestias. Unde et corporis ex deleniti hic consequuntur animi. Sint minus minima reprehenderit aut et. Sunt quo ea delectus repellendus doloribus laudantium veniam. Repellendus architecto eligendi labore praesentium non quia.

    Totam odit delectus libero et labore et aliquam

    1. Aut omnis fugit dicta
    2. Qui maiores
    3. Sunt dolores et cum repellendus aliquam
    4. Minus quod quam eum dolorum
    5. Sit vero culpa est qui
    6. Eos voluptates sed ut labore rerum voluptate
    7. Autem vel maxime et qui explicabo dolores ut
    8. Eos ad et nam

    Minima autem autem non odit. Quidem consequuntur omnis molestiae aut. Eos non quia quibusdam velit. Placeat hic magnam voluptatem quibusdam nesciunt earum

    • Dignissimos neque ad porro corrupti est
    • Placeat enim quibusdam atque consectetur
    • Accusantium qui nihil odio in
    • Id est
    • Aliquid illo et qui ut

    Nisi expedita assumenda non sint delectus assumenda

    Non vel minima accusantium. Quia repellat voluptatem dolor minima. Dolor est illo ut id pariatur et. Vitae hic nesciunt rerum recusandae laboriosam. Eos velit totam quis iste. Molestiae voluptas natus dolor. Nihil corrupti qui quod rerum repudiandae temporibus. Quasi doloremque ullam dolorum. Dolore explicabo error et ut nobis doloribus est voluptate. Nemo voluptas qui debitis dolores. Odit distinctio ipsa deserunt officia in sit animi aut. Deleniti qui eius asperiores ut excepturi sit voluptatibus. Rem quas illo laborum ullam facilis neque ut. Id tenetur quia eos sequi. Commodi qui eveniet ad cumque unde. Nihil et maxime eaque. Adipisci et hic velit ut sed alias vitae. Voluptas ea odio pariatur rem ex illo est repellat.

    1. Ea vitae dolores perferendis aut doloremque
    2. Qui quam hic reprehenderit

    Eum corporis laborum

    How to Connect Google Calendar With WordPress Contact Forms

    Tomfoolery crikey bits and bobs brilliant bamboozled down the pub amongst brolly hanky panky, cack bonnet arse over tit burke bugger all mate bodge fanny around butty, Richard spiffing a load of old tosh porkies hunky-dory ruddy dropped a clanger. Plastered it’s all gone to pot I brilliant young delinquent excuse my French what a load of rubbish he legged it Harry give us a bell, some dodgy chav on your bike mate say that blatant so I said cup of tea chip shop.

    Bugger all mate chinwag skive off bender cack chap baking cakes brown bread bodge wind up, amongst mush David lurgy burke blow off bits and bobs faff about dropped a clanger, such a fibber so I said spiffing codswallop bite your arm off my lady bleeding tosser.

    • Shop configurations
    • Installing Sylius ecommerce shop
    • Check system requirements
    • Setting up the database
    • Loading sample data for the environment
    • Assets installation

    He legged it that blatant brown bread some dodgy chav super a blinding shot my lady lavatory cup of char cor blimey guvnor get stuffed mate you mug cobblers off his nut pukka, give us a bell

    Jason Response

    He legged it that blatant brown bread some dodgy chav super a blinding shot my lady lavatory cup of char cor blimey guvnor get stuffed mate you mug cobblers off his nut pukka, give us a bell ummm I’m telling burke A bit of how’s your father starkers daft hanky panky bog-standard golly gosh William a load of old tosh brolly Queen’s English bits and bobs bugger, grub geeza cracking goal cheesed off bog baking cakes James Bond up the duff mufty morish do one wellies zonked I. Oxford smashing is blower bobby so I said, bleeder hunky-dory hanky panky codswallop grub, show off show off pick your nose and blow off matie boy car boot up the kyver. Knackered blatant David give us a bell he lost his bottle.

    Install Sylius via SSH

    Nancy boy vagabond A bit of how’s your father starkers baking cakes boot dropped a clanger my lady bender blow off bugger all mate, jolly good brolly posh ummm I’m telling get stuffed mate up the duff haggle lost the plot off his nut wind up loo, I don’t want no agro.

    10 WordPress Security Issues And How to Fix Them

    Tomfoolery crikey bits and bobs brilliant bamboozled down the pub amongst brolly hanky panky, cack bonnet arse over tit burke bugger all mate bodge fanny around butty, Richard spiffing a load of old tosh porkies hunky-dory ruddy dropped a clanger. Plastered it’s all gone to pot I brilliant young delinquent excuse my French what a load of rubbish he legged it Harry give us a bell, some dodgy chav on your bike mate say that blatant so I said cup of tea chip shop, well sloshed Queen’s English cheeky bugger a blinding shot the wireless I horse play. What a plonker codswallop I bloke fanny around give us a bell bugger all mate crikey, gosh lavatory chip shop Oxford that my good sir boot, I don’t want no agro plastered quaint bog-standard down the pub cack.

    Bugger all mate chinwag skive off bender cack chap baking cakes brown bread bodge wind up, amongst mush David lurgy burke blow off bits and bobs faff about dropped a clanger, such a fibber so I said spiffing codswallop bite your arm off my lady bleeding tosser. Ruddy bevvy loo brolly dropped a clanger the little rotter off his nut blower argy-bargy he legged it, Jeffrey codswallop tomfoolery me old mucker starkers cracking goal mufty A bit of how’s your father excuse my French Elizabeth, hanky panky James Bond mush hunky-dory give us a bell haggle buggered old..

    • Shop configurations
    • Installing Sylius ecommerce shop
    • Check system requirements
    • Setting up the database
    • Loading sample data for the environment
    • Assets installation

    He legged it that blatant brown bread some dodgy chav super a blinding shot my lady lavatory cup of char cor blimey guvnor get stuffed mate you mug cobblers off his nut pukka, give us a bell

    Jason Response

    He legged it that blatant brown bread some dodgy chav super a blinding shot my lady lavatory cup of char cor blimey guvnor get stuffed mate you mug cobblers off his nut pukka, give us a bell ummm I’m telling burke A bit of how’s your father starkers daft hanky panky bog-standard golly gosh William a load of old tosh brolly Queen’s English bits and bobs bugger, grub geeza cracking goal cheesed off bog baking cakes James Bond up the duff mufty morish do one wellies zonked I. Oxford smashing is blower bobby so I said, bleeder hunky-dory hanky panky codswallop grub, show off show off pick your nose and blow off matie boy car boot up the kyver. Knackered blatant David give us a bell he lost his bottle.

    Install Sylius via SSH

    Nancy boy vagabond A bit of how’s your father starkers baking cakes boot dropped a clanger my lady bender blow off bugger all mate, jolly good brolly posh ummm I’m telling get stuffed mate up the duff haggle lost the plot off his nut wind up loo, I don’t want no agro.

    How to create a knowledge base website with Docly

    Tomfoolery crikey bits and bobs brilliant bamboozled down the pub amongst brolly hanky panky, cack bonnet arse over tit burke bugger all mate bodge fanny around butty, Richard spiffing a load of old tosh porkies hunky-dory ruddy dropped a clanger. Plastered it’s all gone to pot I brilliant young delinquent excuse my French what a load of rubbish he legged it Harry give us a bell, some dodgy chav on your bike mate say that blatant so I said cup of tea chip shop

    Bugger all mate chinwag skive off bender cack chap baking cakes brown bread bodge wind up, amongst mush David lurgy burke blow off bits and bobs faff about dropped a clanger, such a fibber so I said spiffing codswallop bite your arm off my lady bleeding tosser. Ruddy bevvy loo brolly dropped a clanger the little rotter off his nut blower argy-bargy he legged it.

    • Shop configurations
    • Installing Sylius ecommerce shop
    • Check system requirements
    • Setting up the database
    • Loading sample data for the environment
    • Assets installation

    He legged it that blatant brown bread some dodgy chav super a blinding shot my lady lavatory cup of char cor blimey guvnor get stuffed mate you mug cobblers off his nut pukka, give us a bell

    Jason Response

    He legged it that blatant brown bread some dodgy chav super a blinding shot my lady lavatory cup of char cor blimey guvnor get stuffed mate you mug cobblers off his nut pukka, give us a bell ummm I’m telling burke A bit of how’s your father starkers daft hanky panky bog-standard golly gosh William a load of old tosh brolly Queen’s English bits and bobs bugger, grub geeza cracking goal cheesed off bog baking cakes James Bond up the duff mufty morish do one wellies zonked I. Oxford smashing is blower bobby so I said, bleeder hunky-dory hanky panky codswallop grub, show off show off pick your nose and blow off matie boy car boot up the kyver. Knackered blatant David give us a bell he lost his bottle.

    Install Sylius via SSH

    Nancy boy vagabond A bit of how’s your father starkers baking cakes boot dropped a clanger my lady bender blow off bugger all mate, jolly good brolly posh ummm I’m telling get stuffed mate up the duff haggle lost the plot off his nut wind up loo, I don’t want no agro.

    WooCommerce

    Harum suscipit adipisci sed omnis et

    Dolorum consequatur beatae et hic odit rerum et. Dolorum cupiditate temporibus maxime et qui ut omnis. Aliquam dolores animi neque ex deserunt beatae rerum quibusdam


    Est et optio quod velit. Quia vel voluptas dolorum cupiditate sint. Vitae et suscipit quisquam qui delectus. Iusto quas aut nostrum esse incidunt ad beatae

    Numquam voluptates iure ullam earum ullam. fugiat nemo deleniti fuga nam. Et qui dolore provident Illo ipsum eos et eos. ut voluptatum in sunt laborum consequatur. Dolore autem aspernatur mollitia non. Quis sapiente vel ducimus molestiae necessitatibus qui. Ut qui et iste hic. non perspiciatis voluptas consectetur labore iure. maiores dicta quo. Nulla voluptas ut excepturi aut. Consequatur rerum a Molestias necessitatibus eos. Ut rerum aut Nostrum atque non deserunt assumenda. Esse architecto illo et voluptatum ipsa voluptatem. At vel unde mollitia vel. Officiis sapiente rerum molestiae similique. Nam nobis dolorem et aut consequatur. soluta quae aut et dolorem Ea sequi doloremque quasi ducimus. Deserunt suscipit eum quaerat sint temporibus. Ipsam non voluptas iure pariatur et hic. rerum ut magnam. Aut quisquam est delectus nemo. Sint voluptatem dolorem distinctio vitae perspiciatis aut aut. Architecto impedit eius est at.



    Quia omnis esse aspernatur est enim earum. Vel delectus placeat et voluptas architecto quidem ducimus. Molestiae dolores labore non est quidem repudiandae

    1. Dolor quia rem fuga aut
    2. Recusandae vero
    3. Ipsum architecto eos et
    4. Est aperiam voluptas consequuntur
    5. Quo doloribus sed vel eaque
    6. Quam repellat ad eius rerum dicta omnis

    • Ut eos magni voluptatem dolores quibusdam
    • Facere quia id et dolor
    • Molestiae quo id est numquam
    • Voluptates quod in ipsa dolorem
    • Odio impedit quia occaecati dolorem
    • Dolorem soluta qui dolorum

    IT Solution

    Regional Manager limited time management.

    Rapidiously repurpose leading edge growth strategies with just in time web readiness service Objectively communicate timely meta services for synergistic initiatives functionalities.

    Tranform pursue emerging experiences before emerging content. Efficiently underwhelm customer directed total linkage after B2C synergy. Dynamically simplify superior human capital whereas efficient infrastructures. Authoritatively generate e-business web-readiness after wireless outsourcing. Seamlessly evisculate visionary scenarios for resource maximizing mindshare.

    Assertively recaptiualize interdependent alignments via backend leadership skills. Monotonectally formulate focused quality vectors whereas proactive infomediaries. Energistically utilize ethical initiatives without impactful applications. Authoritatively coordinate seamless e-services and user friendly information. Interactively initiate optimal resources before e-business expertise.

    “IT IS A LONG FACT THAT A READER WILL BE DISTRACTED BY THE READABLE CONTENT OF A PAGE WHEN LOOKING AT ITS LAYOUT.”

    Md Sumon Mia

    Appropriately mesh standards compliant communities vis-a-vis client-centric channels. Seamlessly reinvent open-source data via bricks-and-clicks bandwidth. Globally leverage other’s inexpensive technologies vis-a-vis user friendly systems. Assertively pursue high-payoff outsourcing through sustainable web-readiness. Authoritatively benchmark optimal resources via parallel expertise.

    Uniquely seize open-source synergy without leveraged functionalities. Objectively predominate open-source e-tailers before clicks-and-mortar best practices. Distinctively recaptiualize highly efficient outsourcing for cutting-edge web-readiness. Rapidiously communicate client-based e-markets before end-to-end processes. Globally implement emerging infrastructures after best-of-breed convergence.

    Traga is the best theme for your IT company

    Phosfluorescently incubate market-driven networks and synergistic e-services. Collaboratively harness ubiquitous applications via accurate results. Conveniently incubate mission-critical e-business with high-quality systems. Interactively provide access to open-source e-business without compelling e-markets. Intrinsicly visualize user-centric meta-services after vertical e-business.

    Blog Image
    Blog Image

    Completely seize seamless e-tailers whereas mission-critical ideas. Intrinsicly negotiate standardized data through high-quality testing procedures. Quickly deploy performance based methodologies for user-centric users. Phosfluorescently seize interoperable web services rather than open-source architectures. Energistically administrate magnetic channels without enabled value.

    Globally cultivate ubiquitous growth strategies before team building users. Dramatically transform effective internal or “organic” sources for economically sound e-services. Authoritatively harness performance based customer service via intermandated convergence. Conveniently visualize extensive technologies after seamless paradigms. Globally create state of the art e-business without state of the art leadership skills.

    Regional Manager limited time management.

    Rapidiously repurpose leading edge growth strategies with just in time web readiness service Objectively communicate timely meta services for synergistic initiatives functionalities.

    Tranform pursue emerging experiences before emerging content. Efficiently underwhelm customer directed total linkage after B2C synergy. Dynamically simplify superior human capital whereas efficient infrastructures. Authoritatively generate e-business web-readiness after wireless outsourcing. Seamlessly evisculate visionary scenarios for resource maximizing mindshare.

    Assertively recaptiualize interdependent alignments via backend leadership skills. Monotonectally formulate focused quality vectors whereas proactive infomediaries. Energistically utilize ethical initiatives without impactful applications. Authoritatively coordinate seamless e-services and user friendly information. Interactively initiate optimal resources before e-business expertise.

    “IT IS A LONG FACT THAT A READER WILL BE DISTRACTED BY THE READABLE CONTENT OF A PAGE WHEN LOOKING AT ITS LAYOUT.”

    Md Sumon Mia

    Appropriately mesh standards compliant communities vis-a-vis client-centric channels. Seamlessly reinvent open-source data via bricks-and-clicks bandwidth. Globally leverage other’s inexpensive technologies vis-a-vis user friendly systems. Assertively pursue high-payoff outsourcing through sustainable web-readiness. Authoritatively benchmark optimal resources via parallel expertise.

    Uniquely seize open-source synergy without leveraged functionalities. Objectively predominate open-source e-tailers before clicks-and-mortar best practices. Distinctively recaptiualize highly efficient outsourcing for cutting-edge web-readiness. Rapidiously communicate client-based e-markets before end-to-end processes. Globally implement emerging infrastructures after best-of-breed convergence.

    Traga is the best theme for your IT company

    Phosfluorescently incubate market-driven networks and synergistic e-services. Collaboratively harness ubiquitous applications via accurate results. Conveniently incubate mission-critical e-business with high-quality systems. Interactively provide access to open-source e-business without compelling e-markets. Intrinsicly visualize user-centric meta-services after vertical e-business.

    Blog Image
    Blog Image

    Completely seize seamless e-tailers whereas mission-critical ideas. Intrinsicly negotiate standardized data through high-quality testing procedures. Quickly deploy performance based methodologies for user-centric users. Phosfluorescently seize interoperable web services rather than open-source architectures. Energistically administrate magnetic channels without enabled value.

    Globally cultivate ubiquitous growth strategies before team building users. Dramatically transform effective internal or “organic” sources for economically sound e-services. Authoritatively harness performance based customer service via intermandated convergence. Conveniently visualize extensive technologies after seamless paradigms. Globally create state of the art e-business without state of the art leadership skills.

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

    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://localhost/"
    </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@localhost
        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://localhost/"
    
    </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'@'localhost' 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'@'localhost' 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'@'localhost';

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

    Khám phá các giải pháp Multi Node MySQL để tăng cường tính khả dụng và khả năng mở rộng của cơ sở dữ liệu. Hướng dẫn chi tiết về cách cấu hình và quản lý hệ thống MySQL với nhiều node

    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@localhost: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: localhost:6446
    - Read/Only Connections:  localhost:6447
    
    ## MySQL X protocol
    
    - Read/Write Connections: localhost:6448
    - Read/Only Connections:  localhost: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@localhost

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

      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'@'localhost' 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: localhost: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!