Phản chiếu trang web của bạn với rsync

theanh

Administrator
Nhân viên
Bài hướng dẫn này cho thấy cách bạn có thể sao chép trang web của mình từ máy chủ web chính sang máy chủ dự phòng có thể tiếp quản nếu máy chủ chính bị lỗi. Chúng tôi sử dụng công cụ rsync cho mục đích này và chạy nó thông qua một tác vụ cron kiểm tra cứ sau x phút xem có gì cần cập nhật trên bản sao không. Do đó, máy chủ dự phòng của bạn thường phải được cập nhật nếu phải tiếp quản.

rsync chỉ cập nhật các tệp đã thay đổi, do đó bạn không cần phải chuyển 5 GB dữ liệu bất cứ khi nào bạn chạy rsync. Nó chỉ sao chép các tệp mới/đã thay đổi và cũng có thể xóa các tệp khỏi bản sao đã bị xóa trên máy chủ chính. Ngoài ra, nó có thể bảo toàn quyền và quyền sở hữu của các tệp và thư mục được sao chép; để bảo toàn quyền sở hữu, chúng ta cần chạy rsync với tư cách là root, đó là những gì chúng ta làm ở đây. Nếu quyền và/hoặc quyền sở hữu thay đổi trên máy chủ chính, rsync cũng sẽ thay đổi chúng trên máy chủ dự phòng.

Trong hướng dẫn này, chúng ta sẽ tạo đường hầm rsync thông qua SSH, an toàn hơn; điều này cũng có nghĩa là bạn không phải mở một cổng khác trong tường lửa của mình cho rsync - chỉ cần mở cổng 22 (SSH). Vấn đề là SSH yêu cầu mật khẩu để đăng nhập, điều này không tốt nếu bạn muốn chạy rsync dưới dạng công việc cron. Nhu cầu về mật khẩu đòi hỏi sự tương tác của con người mà chúng ta không muốn.

Nhưng may mắn thay, có một giải pháp: sử dụng khóa công khai. Chúng ta tạo một cặp khóa (trên máy chủ dự phòng mirror.example.com), một trong số đó được lưu trong tệp trên hệ thống từ xa (server1.example.com). Sau đó, chúng ta sẽ không bị nhắc nhập mật khẩu nữa khi chạy rsync. Điều này cũng bao gồm các công việc cron mà chính xác là những gì chúng ta muốn.

Như bạn có thể đã đoán từ những gì tôi đã viết cho đến nay, khái niệm là chúng ta khởi tạo bản sao lưu server1.example.com trực tiếp từ mirror.example.com; server1.example.com không cần phải làm gì để được phản chiếu.

Tôi sẽ sử dụng thiết lập sau đây:
  • Máy chủ chính: server1.example.com (server1) - Địa chỉ IP: 192.168.0.100
  • Máy chủ phản chiếu/sao lưu: mirror.example.com (mirror) - Địa chỉ IP: 192.168.0.175
  • Trang web sẽ được phản chiếu nằm trong /var/www trên server1.example.com.
rsync chỉ dành cho việc phản chiếu các tệp và thư mục; nếu bạn muốn sao chép cơ sở dữ liệu MySQL của mình, hãy sử dụng sao chép/sao chép MySQL thay thế.

Trước tiên, tôi muốn nói rằng đây không phải là cách duy nhất để thiết lập một hệ thống như vậy. Có nhiều cách để đạt được mục tiêu này, nhưng đây là cách tôi sẽ thực hiện.

Bước đầu tiên là đăng nhập hoặc trở thành người dùng root trên hệ thống của bạn. Trên Debian và centOS, hãy sử dụng:
Mã:
su -
Nếu bạn đăng nhập bằng một người dùng khác với root. Trên Ubuntu, hãy sử dụng:
Mã:
sudo -s
thay vào đó.

1 Cài đặt rsync​

Đầu tiên, chúng ta phải cài đặt rsync trên cả server1.example.com và mirror.example.com. Đối với hệ thống Debian và Ubuntu, lệnh này trông như sau:

server1/mirror:

(Chúng tôi thực hiện lệnh này với tư cách là root!)
Mã:
apt install rsync
Trên các bản phân phối Linux khác, bạn sẽ sử dụng yum / dnf (Fedora/CentOS) hoặc yast (SuSE) để cài đặt rsync.

Trên CentOS / Rocky Linux hoặc AlmaLinux, sử dụng:
Mã:
dnf install rsync

2 Tạo người dùng không có đặc quyền trên server1.example.com​

Bây giờ chúng ta tạo một người dùng không có đặc quyền có tên là someuser trên server1.example.com sẽ được rsync sử dụng trên mirror.example.com để phản chiếu thư mục /var/www (tất nhiên, someuser phải có quyền đọc trên /var/www trên server1.example.com).

server1:

(Chúng tôi thực hiện điều này với tư cách là root!)
Mã:
sudo useradd -d /home/someuser -m -s /bin/bash someuser
Điều này sẽ tạo người dùng someuser với thư mục gốc /home/someuser và shell đăng nhập /bin/bash (điều quan trọng là someuser phải có shell đăng nhập hợp lệ - shell như /bin/false sẽ không hoạt động!). Bây giờ hãy cung cấp cho someuser một mật khẩu:
Mã:
passwd someuser

3 Kiểm tra rsync​

Tiếp theo, chúng ta kiểm tra rsync trên mirror.example.com. Với tư cách là root, chúng ta thực hiện như sau:

mirror:
Mã:
rsync -avz -e ssh [emailprotected]:/var/www/ /var/www/
Bạn sẽ thấy nội dung tương tự như thế này. Trả lời bằng có:
Mã:
The authenticity of host 'server1.example.com (192.168.0.100)' can't be established.
RSA key fingerprint is 32:e5:79:8e:5f:5a:25:a9:f1:0d:ef:be:5b:a6:a6:23.
Are you sure you want to continue connecting (yes/no)?
Mã:
> authorized_keys
Bằng cách thực hiện như vậy, chúng tôi đã thêm nội dung của mirror-rsync-key.pub vào tệp /home/someuser/.ssh/authorized_keys. /home/someuser/.ssh/authorized_keys sẽ trông tương tự như thế này:

server1:

(Vẫn là someuser!)
Mã:
vi /home/someuser/.ssh/authorized_keys
Mã:
ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
mirror
Bây giờ chúng ta muốn chỉ cho phép kết nối từ mirror.example.com, và người dùng kết nối chỉ được phép sử dụng rsync, vì vậy chúng tôi thêm
Mã:
command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty
ngay đầu /home/someuser/.ssh/authorized_keys:

server1:

(Vẫn là một số người dùng!)
Mã:
vi /home/someuser/.ssh/authorized_keys
Mã:
command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
mirror
Bạn phải sử dụng FQDN như mirror.example.com thay vì địa chỉ IP sau from=, nếu không, tính năng phản chiếu tự động sẽ không hoạt động!

Bây giờ chúng ta tạo tập lệnh /home/someuser/rsync/checkrsync từ chối tất cả các lệnh ngoại trừ rsync.

server1:

(Chúng ta vẫn thực hiện điều này như một số người dùng!)
Mã:
mkdir ~/rsync
vi ~/rsync/checkrsync
Mã:
chmod 700 ~/rsync/checkrsync

6 Kiểm tra rsync trên mirror.example.com​

Bây giờ chúng ta phải kiểm tra trên mirror.example.com xem chúng ta có thể phản chiếu server1.example.com mà không cần phải nhập mật khẩu của someuser hay không. Chúng tôi thực hiện điều này:

mirror:

(Chúng tôi thực hiện điều này với tư cách là root!)
Mã:
rsync -avz --delete --exclude=**/stats --exclude=**/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [emailprotected]:/var/www/ /var/www/
(Tùy chọn --delete có nghĩa là các tệp đã bị xóa trên server1.example.com cũng sẽ bị xóa trên mirror.example.com. Tùy chọn --exclude có nghĩa là các tệp/thư mục này không được phản chiếu; ví dụ: --exclude=**/error có nghĩa là "không phản chiếu /var/www/error". Bạn có thể sử dụng nhiều tùy chọn --exclude. Tôi đã liệt kê các tùy chọn này làm ví dụ; bạn có thể điều chỉnh lệnh theo nhu cầu của mình. Hãy xem
Mã:
man rsync
để biết thêm thông tin.)

Bây giờ bạn sẽ thấy quá trình phản chiếu diễn ra:
Mã:
receiving file list ... done

sent 71 bytes received 643 bytes 476.00 bytes/sec
total size is 64657 speedup is 90.56
mà không cần phải nhập mật khẩu! Đây chính là điều chúng tôi muốn.

7 Tạo công việc cron​

Chúng tôi muốn tự động hóa việc phản chiếu, đó là lý do tại sao chúng tôi tạo một công việc cron cho việc này trên mirror.example.com. Chạy crontab -e với tư cách root:

mirror:

(Chúng tôi thực hiện việc này với tư cách là root!)
Mã:
crontab -e
và tạo một tác vụ cron như thế này:
Mã:
*/5 * * * * /usr/bin/rsync -azq --delete --exclude=**/stats --exclude=**/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [emailprotected]:/var/www/ /var/www/
Điều này sẽ chạy rsync cứ 5 phút một lần; điều chỉnh theo nhu cầu của bạn (xem
Mã:
man 5 crontab
). Tôi sử dụng đường dẫn đầy đủ đến rsync tại đây (/usr/bin/rsync) chỉ để đảm bảo rằng cron biết tìm rsync ở đâu. Vị trí rsync của bạn có thể khác. Chạy

mirror:

(Chúng tôi thực hiện việc này với tư cách là root!)
Mã:
which rsync
để tìm ra vị trí của bạn.

8 Liên kết​

 
Back
Bên trên