Bạn đã quá quen thuộc với các web server truyền thống như: Nginx, Apache, … Mình nghĩ bạn nên thử qua caddyserver. Bạn sẽ không còn lo lắng, mệt mỏi khi phải đi tìm đọc tài liệu, tìm kiếm thông cài đặt cấu hình để hệ thống hoạt động một cách trơn tru. Mà thay vào đó, bạn chỉ việc dành 1 phút để tạo và config server chỉ với một vài dòng code để hệ thống server bắt đầu chạy
Caddy là một nền tảng web server mạnh mẽ, được viết bằng Go là 1 open-source và đang được cộng đồng phát triển rất mạnh mẽ. Nó hướng tới HTTP/2.0 và mặc định sử dụng HTTPS. Ngoài ra còn là một lựa chọn tuyệt vời cho: load balancing, cổng api, ingress controller, process supervisor, task scheduler.
I: Cài đặt xcaddy
Với kinh nghiệm của mình thì các bạn nên dùng cách xây dựng chúng từ mã nguồn đây là một cách để chúng ta sẽ có thể quản lý tùy chỉnh được.
Theo những gì được khuyến cáo thì chúng ta nên xây dựng mã nguồn thông qua công cụ xcaddy để xây dựng mã nguồn của mình, để bắt đầu chúng ta cần cài đặt go làm môi trường chạy tools
root@caddy:~# rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.3.linux-amd64.tar.gz
root@caddy:~# export PATH=$PATH:/usr/local/go/binSau khi cài song chúng ta tiến hành cài xcaddy
root@caddy:~# go install github.com/caddyserver/xcaddy/cmd/xcaddy@latestSau khi chạy lệnh song chúng ta lấy file xcaddy cho vào hệ thống
root@caddy:~# mv /go/bin/xcaddy /usr/bin/xcaddyGiờ chúng ta đã cài song chúng ta đã có xcaddy để tiến hành build
II: Cài đặt caddy
Sau khi có xcaddy chúng ta tiến hành build caddy thông qua các lệnh sau
root@caddy:~# cd /usr/bin/
root@caddy:/usr/bin/# xcaddy build \
--with github.com/RussellLuo/caddy-ext/ratelimit \
--with github.com/corazawaf/coraza-caddy \
--with github.com/RussellLuo/caddy-ext/requestbodyvar \
--with github.com/caddyserver/cache-handlerỞ đây mình mặc định cài thêm 3 thành phần
- Rate limit: Ngăn chặn http flood
- Caddy Server WAF: ngăn chặn tấn công hack website
- Cache: tăng tốc website
Trong bài này mình chỉ hướng dẫn build, phần cấu hình sẽ có trong bài 4 cấu hình WAF hướng dẫn chi tiết
Sau đó chúng ta chờ cho công cụ chạy song thì chúng ta sẽ cài song kết quả nó như bên dưới

Bây giờ chúng ta cần cấu hình cho caddy chạy nền như service để có thể để cho máy chủ chạy liên tục
đầu tiên chúng ta cần tạo file /etc/caddy/Caddyfile
root@caddy:~# mkdir -p /etc/caddy/
root@caddy:~# touch /etc/caddy/CaddyfileBây giờ chúng ta sẽ tạo user caddy để chạy code cho an toàn
root@caddy:~# groupadd --system caddy
root@caddy:~# sudo useradd --system --gid caddy --create-home --home-dir /home/caddy --shell /usr/sbin/nologin --comment "Caddy web server" caddyTrong file Caddyfile trên vừa tạo chúng ta điền nội dung như sau:
http:// {
root * /home/caddy/web/index.html
encode gzip
file_server
}Tiếp tới chúng ta tạo một file thư mục web và thư mục log
root@caddy:~# mkdir -p /home/caddy/web
root@caddy:~# mkdir -p /home/caddy/logTạo một file index để test /home/caddy/index.html
<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1 style="font-family: sans-serif">This page is being served via Caddy</h1>
</body>
</html>Khởi tạo file service /etc/systemd/system/caddy.service
# caddy.service
#
# For using Caddy with a config file.
#
# Make sure the ExecStart and ExecReload commands are correct
# for your installation.
#
# See https://caddyserver.com/docs/install for instructions.
#
# WARNING: This service does not use the --resume flag, so if you
# use the API to make changes, they will be overwritten by the
# Caddyfile next time the service is restarted. If you intend to
# use Caddy's API to configure it, add the --resume flag to the
# `caddy run` command or use the caddy-api.service file instead.
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target
[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
StandardOutput=append:/home/caddy/log/caddy.log.error
StandardError=append:/home/caddy/log/caddy.error
[Install]
WantedBy=multi-user.targetCác bạn lưu ý cấu hình hai cái này
StandardOutput=append:/home/caddy/log/caddy.log.error
StandardError=append:/home/caddy/log/caddy.errorĐây chính là cấu hình error của caddy các bạn cần lưu ý cài đặt để lưu lại sau này có vấn đề thì mò lại cũng nhanh đặc biệt khi dùng kèm theo waf
Khởi tạo file service /etc/systemd/system/caddy-api.service
# caddy-api.service
#
# For using Caddy with its API.
#
# This unit is "durable" in that it will automatically resume
# the last active configuration if the service is restarted.
#
# See https://caddyserver.com/docs/install for instructions.
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target
[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --resume
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.targetBây giờ chúng at cần reload lại hệ thống để cấu hình được nghi nhận
root@caddy:~# sudo systemctl daemon-reload
root@caddy:~# sudo systemctl enable --now caddysau đó chúng ta kiểm tra trạng thái như sau
root@caddy:~# systemctl status caddyKết quả chúng ta được một web html như sau

Để test xem cấu hình API đã hoàn thành chưa chúng ta tạo 1 file caddy.json nội dung như sau
{
"apps": {
"http": {
"servers": {
"example": {
"listen": [":2015"],
"routes": [
{
"handle": [{
"handler": "static_response",
"body": "Hello, world!"
}]
}
]
}
}
}
}
}Tiến hành upload cấu hình test thông qua api
root@caddy:~# curl localhost:2019/load -H "Content-Type: application/json" -d @caddy.jsonkiểm tra cấu hình
root@caddy:~# curl localhost:2019/configKiểm tra xem đã thành công chưa thì các bạn vào IP:2015 để kiểm tra nếu như bên dưới thì có nghĩa chúng ta đã thành công

vậy là chúng ta đã triển khai song caddy trên máy chủ ở phần sau chúng ta sẽ tiến hành cấu hình