Xin chào,
Nếu là lần đầu bạn tới với series này, hãy thử bắt đầu theo thứ tự trong danh sách các bài viết thuộc series:
Phần 1: Giới thiệu, đăng ký và thiết lập tài khoản
Phần 2: EC2 và triển khai dự án Laravel trên EC2
Phần 3: Elastic Load Balancing - Aplication Load Balancer
Phần 4: Cài đặt dự án Wordpress - Kusanagi
Phần 5: Vận hành dự án Wordpress - Kusanagi
1. Kusanagi Cache
Kusanagi là một nền tảng tối ưu hóa cho WordPress, được thiết kế để cải thiện hiệu suất và tăng tốc độ của các trang web WordPress.
Trong Kusanagi, có hai công nghệ quan trọng để tối ưu hiệu suất: bcache và fcache
Bcache
Bcache là tên viết tắt của bộ đệm khối và thao tác được thực hiện bởi plugin KUSANAGI trong WordPress.
Cơ chế này tương tự như plugin bộ đệm trang WordPress (WP Super Cache, WP Super Cache, v.v.).
Khi bộ đệm được truy cập lần đầu tiên, HTML (dữ liệu bộ đệm) của trang được lưu trữ trong cơ sở dữ liệu.
(Dữ liệu bộ đệm nằm trong bảng wp_site_cache.)
Và từ lần sau, trước khi tệp chủ đề được đọc, dữ liệu bộ đệm thu được từ cơ sở dữ liệu sẽ được hiển thị và chương trình kết thúc.
Nếu bộ đệm hoạt động, không thể đọc tệp chủ đề, vì vậy nó có thể được tăng tốc.
Command
Bật Bcache
kusanagi bcache on {{profile}}
Sau khi chạy command, kiểm tra database, chúng ta có thể thấy bảng wp_site_cache
đã được tạo, đây sẽ là nơi lưu trữ cache của hệ thống kusanagi.
Xóa dữ liệu Bcache
kusanagi bcache clear {{profile}}
Kiểm tra trạng thái Bcache
kusanagi bcache status {{profile}}
Tắt Bcache
kusanagi bcache off {{profile}}
Có thể truy cập và cài đặt cache tại wp-admin.
Fcache
Fcache là tên viết tắt của Fast CGI Cache và hoạt động của nó được thực hiện bởi một máy chủ (Nginx).
Cơ chế tương tự như bcache, nhưng sự khác biệt chính là dữ liệu bộ đệm được lưu trữ trên máy chủ.
Trước hết, HTML (dữ liệu được lưu trong bộ nhớ cache) của trang được lưu trữ trên máy chủ ở lần truy cập đầu tiên.
(Dữ liệu bộ đệm được lưu trữ trong thư mục /var/cache/nginx/wordpress
dưới dạng tên tệp được băm với md5)
Và từ lần tiếp theo, khi nó được truy cập, bộ nhớ cache được lưu trữ trên máy chủ sẽ được trả về.
Trong trường hợp này, trang được hiển thị nhanh hơn bcache vì ngay cả WordPress cũng không được truy cập.
Việc lưu cache trên máy chủ cũng sẽ khiến memory của hệ thống tăng cao, có thể dẫn tới tràn memory.
Command
Bật fcache
kusanagi fcache on {{profile}}
Sau khi bật fcache, hệ thống sẽ tự động chuyển qua sử dụng Nginx.
Kiểm tra trạng thái Fcache
kusanagi fcache status {{profile}}
Xoá dữ liệu Fcache
kusanagi fcache clear {{profile}}
Tắt Fcache
kusanagi fcache off {{profile}}
2. Giải pháp Caching Kusanagi trong dự án thực tế
Hệ thống sử dụng 1 instance
Fcache sẽ là sự lựa chọn phù hợp để tăng tốc độ truy cập cho trang web.
Bạn cần quan tâm tới cấu hình máy chủ để đưa ra giới cho phù hợp. Tránh khiến máy chủ bị tràn memory.
Bạn có thể cấu hình ratelimit tại đây: /etc/opt/kusanagi/nginx/conf.d/ratelimit.inc
Bên cạnh đó, bạn sẽ cần xử lý thêm xóa cache tại wordpress admin, thay vì phải truy cập vào server và xóa cache.
Hệ thống Loadbalancer
Đây là một hệ thống phổ biến với các website, hệ thông bao gồm:
- 1 máy chủ điều phối lưu lượng truy cập.
- 1 hoặc nhiều máy chủ xử lý truy cập.
- 1 Database riêng biệt sử dụng cho các máy chủ xử lý ở trên.
Tại AWS, cấu hình trên có thể mô tả như sau:
- 1 Application Load Balancer.
- 1 hoặc nhiều EC2 instances.
- 1 RDS database.
Bạn có thể xem lại phần 3 về Load Balancer tại đây
Đối với hệ thống load balancer trên, nếu cài đặt Fcache, ta sẽ gặp phải vấn đề với việc xóa dữ liệu của nó.
Điều này có nghĩa là, khi muốn cập nhật nội dung mới cho website, bạn sẽ phải thực hiện công việc xóa Fcache trên nhiều server khác nhau.
Sử dụng Bcache sẽ giải quyết được vấn đề này một cách đơn giản, bởi lẽ Bcache sẽ lưu trữ dữ liệu tại Database, nếu cần xóa dữ liệu, chỉ cần thực hiện tại wordpress admin.
Điều kiện để cài đặt Bcache là các EC2 instances của bạn đều có quyền ghi tới database.
Việc cấu hình cho các EC2 instances của bạn với quyền ghi vào database sẽ phát sinh những mối nguy hiểm tiềm ẩn.
3. Kusanagi Caching Application Load Balancer + RDS Read-Wirte Connection
Hãy thiết kế lại một chút cho hệ thống Application Load Balancer:
- 1 ALB.
- 1 CMS EC2 instance.
- 1 hoặc nhiều WEB EC2 instances.
- 1 RDS database với (1 writer connection, 1 reader connection).
Chúng ta sẽ cấu hình CMS instance sử dụng writer connection và WEB instances sử dụng reader connection.
Đối với hệ thống trên, việc sử dụng Bcache là không thể, bởi lẽ, các instance WEB cần phải ghi cache vào Database.
Do đó, Fcache sẽ là lựa chọn duy nhất trong trường hợp này.
Nhưng, vấn đề quay trở lại, làm thế nào để xóa Fcache trên toàn bộ các EC2 instances mà không phải truy cập tới từng instance?
Với AWS ta có thể giải quyết câu hỏi trên bằng Amazon Lambda Function và Amazon Systems Manager.
Amazon Lambda Function sẽ đóng nhiệm vụ gửi yêu cầu tới Systems Manager và Systems Manager sẽ thực hiện command xóa cache trên các EC2 instances.
Triển khai
Tạo tag name cho các EC2 instances, Lambda sẽ căn cứ vào tag name để yêu cầu Systems Manager xóa cache.
Cấu hình IAM Role cho các EC2 instances.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:GetServiceSetting",
"ssm:ResetServiceSetting",
"ssm:UpdateServiceSetting"
],
"Resource": "arn:aws:ssm:region:account-id:servicesetting/ssm/managed-instance/default-instance-management-role"
},
{
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": "arn:aws:iam::account-id:role/service-role/AWSSystemsManagerDefaultEC2InstanceManagementRole",
"Condition": {
"StringEquals": {
"iam:PassedToService": [
"ssm.amazonaws.com"
]
}
}
}
]
}
Cài đặt SSM agent vào các EC2 instances: https://docs.aws.amazon.com/systems-manager/latest/userguide/agent-install-centos-stream.html
Sau khi cài đặt, truy cập Systems Manager >> Fleet Manager để kiểm tra.
Tạo Lambda function với code python dưới đây:
import boto3
import json
import datetime
def lambda_handler(event, context):
# Extract filter parameters from the input event
tag_key = event.get('tagKey')
tag_values = event.get('tagValues')
# Validate if both tagKey and tagValues are provided
if not tag_key or not tag_values:
return {
'statusCode': 400,
'body': json.dumps('Both tagKey and tagValues parameters are required.')
}
# Split tagValues into individual values
tag_values_list = tag_values.split(',')
ssm_client = boto3.client('ssm')
ec2_client = boto3.client('ec2')
# List to store instance IDs for all matching tag values
instance_ids = []
# Describe instances using the provided tag filter
for tag_value in tag_values_list:
instances = ec2_client.describe_instances(Filters=[{'Name': f'tag:{tag_key}', 'Values': [tag_value.strip()]}])
for reservation in instances['Reservations']:
for instance in reservation['Instances']:
instance_ids.append(instance['InstanceId'])
# Specify the command to execute
command = f"sudo /opt/kusanagi/bin/kusanagi fcache clear tsalad-core-kusanagi"
# Send command to instances
response = ssm_client.send_command(
InstanceIds=instance_ids,
DocumentName="AWS-RunShellScript", # Specify the correct SSM document name
Parameters={'commands': [command]}
)
# Convert response to JSON-serializable format
response_json = {
'statusCode': 200,
'body': {
'message': 'Command sent to instances',
'commandId': response['Command']['CommandId'],
'timestamp': datetime.datetime.now().isoformat() # Include the current timestamp in ISO 8601 format
}
}
# Convert response_json to JSON string
response_str = json.dumps(response_json)
return response_str
Giải thích code:
Dữ liệu đầu vào sẽ là cặp key-value của tag đã setting cho EC2 instances.
Lambda căn cứ vào tag, tìm ra các instance phù hợp điều kiện và trigger Systems Manager thực hiện command xóa cache.
Config permission cho Lambda Function
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:ap-northeast-1:919980617067:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:ap-northeast-1:919980617067:log-group:/aws/lambda/tsalad-clear-kusanagi-fcache-by-instance-tag:*"
]
},
{
"Sid": "AllowToExcuteEC2Command",
"Effect": "Allow",
"Action": [
"ssm:*",
"ec2:*"
],
"Resource": [
"*"
]
}
]
}
EC2 CMS xử lý thêm chức năng, để chạy command dưới đây:
aws lambda invoke --function-name YourLambdaFunctionName \
--payload '<base64-encoded-tag-value>' \
output.txt
Thay thế YourLambdaFunctionName
và <base64-encoded-tag-value>
của bạn.
Ví dụ sử dụng code PHP để encode tag value:
$base64Payload = base64_encode('{"tagKey": "Name ", "tagValue": "Kusanagi-WEB-instances"}');
Thay thế Name
và Kusanagi-WEB-instances
bằng giá trị key-value của bạn.
Với hệ thống trên, chúng ta có thể thực hiện xóa Fcache trên toàn bộ các instances WEB bằng việc bấm nút đơn giản trên instance CMS, giải quyết được câu hỏi đã đặt ra.
4. Tổng kết
Trên đây là tổng quan về Kusanagi Caching và ứng dụng trong thực tế.
Hãy chia sẻ kết quả của bạn dưới phần bình luận nhé.
Lưu ý: Hãy terminate instance, delete loadbalancer sau khi sử dụng để tránh cost thêm chi phí nhé
Happy Coding !!!