09/09/2024

Cấu hình load balancing wordpress – nginx với HaProxy

HAproxy là gì?

HAproxy (Hight Available proxy) là ứng dụng cân bằng tải với khả năng mở rộng cao, được cài đặt cho những website chạy các ứng dụng dựa trên TCP và HTTP, được phát triển trên hệ điều hành Linux. Nó hỗ trợ chuyển mạch ngữ cảnh (content switching) cho phép người quản trị webiste có thể thiết đặt các luật chuyển mạch trong file cấu hình. HAproxy cũng hỗ trợ nhiều thuật toán phân tải phong phú, hỗ trợ cài đặt cookie và health check. HAproxy hỗ trợ cài đặt một số thuật toán Load Balancing như round robin, weighted round robin, least connection, source,… HAproxy là ứng dụng chạy độc lập. Để sử dụng HAproxy thiết lập hệ thống cân bằng tải, cần cài đặt HAproxy lên một máy chủ và thiết lập cài đặt trong file cấu hình.

Nếu muốn tìm hiểu rõ về các thuật toán cân bằng tải cũng như công nghệ tạo nên sự khác biệt của HAProxy thì bạn có thể tham khảo trên trang chủ của nó. Trước khi bắt đầu chúng ta cần có những thành phần sau đây:

  • VPS1 (103.124.92.123): chạy MySQL.
  • VPS2 (103.159.50.124): chạy Nginx và source WordPress 1.
  • VPS3 (103.124.94.2): chạy Nginx và Source WordPress 2.
  • VPS4 (103.170.123.17): chạy HAproxy làm Load balancing.

1.Tiến hành update cho 4 VPS trên

yum update -y

2. Cài đặt máy chủ database mysql cho VPS1

Cài đăt trên VPS:

  • VPS1 (103.124.92.123): chạy MySQL

Download file cài đặt phù hợp:

wget https://repo.mysql.com//mysql84-community-release-el7-1.noarch.rpm

Lệnh này thêm hai repository MySQL yum mới :

sudo rpm -ivh mysql84-community-release-el7-1.noarch.rpm

Sau đó tiến hành cài đặt:

sudo yum install mysql-server -y

Start service mysqld:

sudo systemctl start mysqld

Sau khi cài đặt xong thì hệ thống sẽ tự động random password có thể dùng lệnh sau để thấy password: sudo grep 'temporary password' /var/log/mysqld.log

Sau đó tiến hành cấu hình mysql:

sudo mysql_secure_installation

Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y

Nhập password mới (Mật khẩu mạnh là 8-12 ký tự, bao gồm số, ký tự đặc biệt, in hoa, in thường) sau đó chọn y để next qua bước này.

Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

Các bước còn lại chọn y cho đến khi Done.

Tiếp đến tiến hành tạo database và user để tí kết nối vào VPS2, VPS3

Đăng nhập vào mysql server: mysql -u root -p

Tạo database tên wordpressdb: CREATE DATABASE wordpressdb;

Tạo user database tên wpuser và allow 2 IP VPS2, VPS3:

CREATE USER 'wpuser'@'103.159.50.124' IDENTIFIED BY 'k-5c7$zDfFQU';

CREATE USER 'wpuser'@'103.124.94.2' IDENTIFIED BY 'k-5c7$zDfFQU';

Phân quyền truy cập vào database:

GRANT ALL PRIVILEGES ON wordpressdb.* TO 'wpuser'@'103.159.50.124';
GRANT ALL PRIVILEGES ON wordpressdb.* TO 'wpuser'@'103.124.94.2';

Sau đó, áp dụng thay đổi quyền truy cập: FLUSH PRIVILEGES;

Exit thoát ra và edit file /etc/my.cnf

Thêm dòng bind-address = 0.0.0.0 nếu chưa có.

Rồi restart lại service mysqld để áp dụng.

systemctl restart mysqld

3. Cài đặt nginx và môi trường chứa source WordPress cho VPS2, VPS3

Trong demo này sẽ cài đặt trên 2 VPS:

  • VPS2 (103.159.50.124): chạy Nginx và source WordPress 1.
  • VPS3 (103.124.94.2): chạy Nginx và Source WordPress 2.

Cài đặt các lệnh trên 2 máy giống nhau:

Tiến hành cài đặt kho lưu trữ, các gói phụ thuộc và công cụ phát triển cần thiết:

yum install epel-release -y

Cài đặt web server NGINX

yum install nginx -y

Mở port cho port 80 và 443:

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

Cho phép khởi động dịch vụ Nginx

sudo systemctl enable nginx

sudo systemctl enable nginx

Sau đó truy cập vào IP hoặc tên miền thì thấy như thế này là đã setup thành công.

Cấu hình PHP-FPM

sudo vi /etc/php-fpm.d/www.conf
chỉnh dòng
user = apache
group = apache
thành:
user = nginx
group = nginx

Cài đặt PHP 7.4

sudo yum install yum-utils -y
sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm -y
sudo yum-config-manager --enable remi-php74
sudo yum install php php-cli php-fpm php-mysqlnd php-xml php-mbstring php-json php-gd php-curl php-zip php-intl php-xmlrpc -y

Start php-fpm

sudo systemctl start php-fpm
sudo systemctl enable php-fpm

Download và config wordpress

Config đường dẫn chứa source:

cd /etc/nginx/conf.d

vi wordpress.conf

Thêm vào nội dung:

server {
       listen 80;
       server_name _;

       root /var/www/wordpress;
       index index.php index.html index.htm;

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

       location ~ \.php$ {
              include /etc/nginx/fastcgi_params;
              fastcgi_pass 127.0.0.1:9000;
              fastcgi_index index.php;
              fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      }

      location ~ /\.ht {
            deny all;
      }
}

Comment config port 80 trong /etc/nginx/nginx.conf

vi /etc/nginx/nginx.conf

# các dòng sau:

Sau đó tiến hành bỏ source WordPress vào đường dẫn sau /var/www/wordpress

cd /var/www
sudo wget https://wordpress.org/latest.tar.gz
sudo tar -xzvf latest.tar.gz
sudo chown -R nginx:nginx /var/www/wordpress
sudo chmod -R 755 /var/www/wordpress

cd wordpress

mv wp-config-sample.php wp-config.php

Edit file wp-config.php thêm vào database, user database, password user database.

define( 'DB_NAME', 'wordpressdb' );

define( 'DB_USER', 'wpuser' );

define( 'DB_PASSWORD', 'k-5c7$zDfFQU' );

define( 'DB_HOST', '103.124.92.123' );

4. Cài đặt wordpress trên VPS2

  • VPS2 (103.159.50.124)

 

 

5. Config giữ nguyên IP hoặc tên miền cho VPS3 khi click vào link con mà không bị chuyển hướng về VPS2

  • VPS3 (103.124.94.2)

Tại VPS3 thêm vào file wp-config.php dòng:

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);
/* That's all, stop editing! Happy publishing. */

6. Config đồng bộ dữ liệu hình ảnh, file khi up lên của 2 VPS2 và VPS3

  • VPS2 (103.159.50.124)
  • VPS3 (103.124.94.2)

Có nhiều cách để đồng bộ dữ liệu các bạn có thể tham khảo.

  • Sử dụng rsync trên 2 server để đồng bộ dữ liệu cho thư mục /var/www/wordpress, đặt cronjob để đồng bộ thường xuyên. Các bạn có thể tham khảo bài viết này: Hướng dẫn đồng bộ dữ liệu 2 máy chủ centos 7 bằng rsync
  • Sử dụng GlusterFS để đồng bộ theo thời gian thực, tạo volume /var/www/wordpress trên VPS2. Mount Volume đó cho VPS3.

7. Cài đặt HAProxy để load balancing cho VPS2 và VPS3.

  • VPS4 (103.170.123.17): chạy HAproxy làm Load balancing.

Tiến hành add host VPS2 và VPS3 vào trong VPS4

vi /etc/hosts

thêm vào dưới cùng dòng

103.159.50.124 wp1
103.124.94.2 wp2
103.170.123.17 ha

Khởi động lại hệ thống

init 6

Cài đặt Haproxy bằng lệnh:

yum -y install haproxy

Tạo file cấu hình mới cho dịch vụ:

cd /etc/haproxy
mv haproxy.cfg haproxy.cfg.bak
vi haproxy.cfg Thêm vào config nội dung:

global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats timeout 30s
user haproxy
group haproxy
daemon

defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000

frontend http_front
bind *:80
stats uri /haproxy?stats
default_backend http_back
backend http_back
balance roundrobin
#balance leastconn
mode http
server wp1 103.159.50.124:80 check
server wp2 103.124.94.2:80 check

Sau đó khởi động dịch vụ Haproxy lên

systemctl enable haproxy

systemctl start haproxy

Test kiểm tra bằng cách truy cập vào http://<IP VPS4> F5 nhiều lần để xem kết quả

Kiểm tra trên trang theo dõi Haproxy: http://<IP VPS4>/haproxy?stats

8. Thay tên miền đại diện cho IP Haproxy là trang web cần sử dụng

Trỏ tên miền hirontrailer.vn về  IP VPS4 (103.170.123.17)

Sau đó có thể truy cập vào web wordpress bằng tên miền bình thường.