Thứ năm, 12/04/2018 | 00:00 GMT+7

Cách lưu trữ một trang web với Caddy trên Ubuntu 16.04

Caddy là một web server được thiết kế dựa trên sự đơn giản và bảo mật đi kèm với một số tính năng hữu ích cho việc lưu trữ các trang web. Ví dụ: nó có thể tự động lấy và quản lý certificate TLS từ Let's Encrypt để kích hoạt HTTPS và hỗ trợ HTTP / 2. HTTPS là một hệ thống đảm bảo lưu lượng truy cập giữa user và server của bạn và đang nhanh chóng trở thành kỳ vọng cơ bản của bất kỳ trang web nào đang chạy trong quá trình production - nếu không có nó, Chrome và Firefox sẽ cảnh báo rằng trang web là "Không an toàn" nếu user cố gắng gửi thông tin đăng nhập thông tin.

Trước đây, phương pháp được khuyến khích để cài đặt Caddy là download các file binary dựng sẵn từ trang web của dự án Caddy. Tuy nhiên, những thay đổi gần đây về cách hoạt động của giấy phép Caddy nghĩa là bạn không còn được phép sử dụng các mã binary dựng sẵn này cho mục đích thương mại trừ khi bạn trả phí cấp phép, ngay cả khi bạn chỉ sử dụng Caddy trong nội bộ doanh nghiệp. May mắn là mã nguồn Caddy vẫn hoàn toàn là open-souce và bạn có thể tự xây dựng Caddy để tránh gặp phải các vấn đề về cấp phép.

Trong hướng dẫn này, bạn sẽ xây dựng Caddy từ nguồn và sử dụng nó để lưu trữ một trang web được bảo mật bằng HTTPS. Sau đó, bạn sẽ cấu hình Caddy bằng cách sử dụng Caddyfile , cài đặt các plugin Caddy và tìm hiểu cách nâng cấp cài đặt của bạn khi version mới được phát hành.

Yêu cầu

Trước khi bắt đầu hướng dẫn này, bạn cần có những điều sau:

  • Server Ubuntu 16.04 được cấu hình theo hướng dẫn Cài đặt Server Ban đầu của ta . Bạn có thể kết nối với server qua SSH, đăng nhập với quyền user không phải root với các quyền sudo và cài đặt firewall hoạt động bằng UFW.
  • Tên domain được cài đặt để sử dụng quản lý DNS của DigitalOcean. Bạn có thể mua domain từ bất kỳ công ty đăng ký domain nào và làm theo hướng dẫn của ta về Cách trỏ domain tới server tên DigitalOcean để quản lý DNS của bạn thông qua DigitalOcean.
  • Bản ghi “A” trỏ từ domain của bạn đến server của bạn và, tùy chọn, bản ghi “AAAA” nếu bạn muốn bật IPv6. Hướng dẫn của ta về Cài đặt Tên Server với DigitalOcean giải thích cách thực hiện việc này.
  • Chuỗi công cụ ngôn ngữ Go được cài đặt trên server của bạn. Làm theo hướng dẫn của ta về Cách cài đặt Go 1.6 để cài đặt Go. Bạn cũng nên có một số hiểu biết về cách biên dịch mã Go và cách chức năng của công cụ dòng lệnh go . Làm theo hướng dẫn của ta về Xây dựng Go Executables để tìm hiểu về điều này.

Bước 1 - Xây dựng Caddy

Trong bước này, bạn sẽ tìm nạp mã nguồn của Caddy và đảm bảo bạn có thể biên dịch nó. Caddy được viết bằng Go, vì vậy hãy sử dụng công cụ dòng lệnh go get để tìm nạp nguồn của Caddy từ GitHub và lưu nó vào $GOPATH/src/github.com/mholt/caddy :

  • go get github.com/mholt/caddy/caddy

go get sử dụng Git để sao chép mã từ GitHub. Git là một hệ thống kiểm soát version , nghĩa là nó ghi lại trạng thái của dự án khi bạn áp dụng các thay đổi và cho phép bạn quay lại bất kỳ trạng thái nào trước đó trong lịch sử của dự án. Theo mặc định, lệnh go get download version mới nhất của mã nguồn, nhưng bạn nên sử dụng bản phát hành ổn định mới nhất của Caddy thay vì bản bổ sung mới nhất cho repository , có thể sẽ ở giữa các bản phát hành. Các version chưa được phát hành có thể có lỗi hoặc các tính năng bị hỏng, được triển khai một nửa. Mặt khác, version ổn định mới nhất có nhiều khả năng biên dịch và chạy chính xác hơn.

Để xem tất cả các version trước, trước tiên hãy chuyển đến folder bạn đã lưu nguồn của Caddy:

  • cd $GOPATH/src/github.com/mholt/caddy

Tiếp theo, xem tất cả các bản phát hành trước của Caddy bằng git tag :

  • git tag

Bạn sẽ thấy kết quả tương tự như sau:

Output
v0.10.0 v0.10.1 v0.10.10 v0.10.11 v0.10.12 v0.10.2 v0.10.3 v0.10.4 v0.10.5 . . .

Khi nào một version Caddy ổn định được phát hành, các tác giả sẽ biểu thị điều này trong Git bằng cách thêm một thẻ. Bạn có thể sử dụng Git để hoàn nguyên mã về trạng thái tại thời điểm phát hành ổn định cuối cùng. Tìm số version cao nhất trong kết quả ; tại thời điểm viết bài, đây là v0.10.12 .

Vì bạn sẽ sửa đổi nguồn sau này để cài đặt một số plugin, hãy tạo một nhánh mới để lưu trữ các thay đổi . Trong Git, các nhánh là các cách làm việc trên các version mã khác nhau đồng thời. Chúng cho phép bạn chuyển đổi giữa version mã có các thay đổi cá nhân của bạn và version "chính thức" của mã. Để tạo một nhánh mới, hãy sử dụng git checkout , lệnh này sẽ chuyển các nhánh. Tùy chọn -b sẽ hướng dẫn Git tạo một nhánh mới với tên adding_plugins từ version v0.10.12 . Thay thế adding_plugins bằng bạn muốn đặt tên cho nhánh và v0.10.12 bằng version ổn định mới nhất mà bạn đã xác định trước đó:

  • git checkout -b "adding_plugins" "v0.10.12"

Thao tác này sẽ hoàn nguyên version mã nguồn Caddy của bạn về version ổn định cuối cùng và bạn sẽ ở trong một chi nhánh mới, nơi bạn có thể giữ các thay đổi của bạn đối với mã. Khi bạn cập nhật Caddy trong tương lai, bạn sẽ hợp nhất các thay đổi vào chi nhánh mới này.

Đến đây, bạn đã sẵn sàng xây dựng Caddy bằng cách sử dụng công cụ go install để biên dịch mã nguồn thành một file binary . Mặc dù cú pháp lệnh có vẻ giống như nó sẽ cài đặt Caddy từ một trang web (github.com), điều này thực sự đề cập đến đường dẫn local trên server nơi ta vừa làm việc với repository Git ( $GOPATH/src/github.com/mholt/caddy ):

  • go install github.com/mholt/caddy/caddy

Sau khi biên dịch mã nguồn, hãy chạy lệnh caddy để khởi động server . Lưu ý để điều này hoạt động chính xác, đường dẫn Go của bạn phải được đặt thành $GOPATH/bin , như được mô tả trong yêu cầu :

  • caddy

Lệnh này sẽ tạo ra kết quả sau:

Output
Activating privacy features... done. http://:2015 WARNING: File descriptor limit 1024 is too low for production servers. At least 8192 is recommended. Fix with "ulimit -n 8192".

Cảnh báo có thể được bỏ qua trong thời gian này, vì ta sẽ giải quyết nó khi ta cài đặt các file cấu hình khác nhau theo yêu cầu của Caddy. Nhấn CTRL+C để thoát lệnh này.

Để chứng minh rằng Caddy đang được xây dựng từ nguồn của bạn, hãy thêm một dòng vào mã nguồn Caddy để in một số văn bản khi Caddy được chạy. Sử dụng nano hoặc trình soạn thảo bạn muốn để mở $GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go .:

  • nano $GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go

Tệp này xử lý bất kỳ tùy chọn nào được chuyển đến lệnh Caddy và là một trong những điều đầu tiên được thực thi khi bạn chạy Caddy.

Định vị hàm Run() và thêm văn bản được đánh dấu làm dòng đầu tiên trong dấu ngoặc nhọn. Điều này sẽ in ra dòng chữ "Xin chào từ Caddy!" trước khi server chạy:

$ GOPATH / src / github.com / mholt / caddy / caddy / caddymain / run.go
. . . // Run is Caddy's main() function. func Run() {         fmt.Println("Hello from Caddy!")          flag.Parse()          caddy.AppName = appName         . . . } 

Nhấn CTRL + X , Y , sau đó ENTER để lưu file . Nếu bạn chạy lại lệnh go installcaddy , bạn sẽ thấy thông báo bạn đã thêm vào hàm Run() ở đầu kết quả :

  • go install github.com/mholt/caddy/caddy
  • caddy
Output
Hello from Caddy! Activating privacy features... done. http://:2015 WARNING: File descriptor limit 1024 is too low for production servers. At least 8192 is recommended. Fix with "ulimit -n 8192".

Như vậy là bạn đã xây dựng thành công Caddy bay từ nguồn. Bạn có thể xóa dòng đã thêm khỏi $GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go nếu muốn, nhưng nếu làm như vậy, bạn cần phải biên dịch lại mã. Trong bước tiếp theo, bạn sẽ cài đặt Caddy như một dịch vụ để nó tự động khởi động khi server khởi động , sau đó điều chỉnh cài đặt quyền sở hữu và quyền đảm bảo tính bảo mật của server .

Bước 2 - Cài đặt Caddy

Đến đây bạn đã xác minh bạn có thể tạo Caddy, đã đến lúc cấu hình dịch vụ systemd để Caddy có thể được chạy tự động khi khởi động hệ thống. Systemd là một giải pháp toàn diện để quản lý các quy trình trên Linux. Caddy được cài đặt với một file caddy.service mà systemd có thể sử dụng để quản lý dịch vụ Caddy. Tệp dịch vụ này đưa ra một số giả định về môi trường mà Caddy sẽ chạy, vì vậy có một số điều mà bạn có thể sẽ muốn thay đổi trước khi cài đặt nó.

Để bắt đầu, hãy sao chép file binary Caddy sang /usr/local/bin , vị trí chuẩn cho các file binary không được quản lý bởi trình quản lý gói của Ubuntu và không phải là key cho hoạt động của hệ thống:

  • sudo cp $GOPATH/bin/caddy /usr/local/bin/

Tiếp theo, thay đổi quyền sở hữu binary Caddy cho user root . Lưu ý mặc dù root sẽ sở hữu Caddy, nhưng bạn không nên chạy Caddy bằng account root vì đây có thể là một vấn đề bảo mật lớn nếu có lỗ hổng trong Caddy. Tuy nhiên, việc root sở hữu binary sẽ ngăn các account khác sửa đổi nó với các quyền mà ta sẽ đặt. Điều này là mong muốn vì nếu một quy trình khác có quyền thấp hơn Caddy bị xâm phạm, nó sẽ không thể sửa đổi Caddy để giành quyền kiểm soát hệ thống nhiều hơn:

  • sudo chown root:root /usr/local/bin/caddy

Tiếp theo, cài đặt quyền file của hệ binary để 755 - điều này mang lại gốc đầy đủ đọc / ghi / thực hiện quyền cho các file , trong khi những user khác sẽ chỉ có thể đọc và thực hiện nó:

  • sudo chmod 755 /usr/local/bin/caddy

Vì quy trình Caddy sẽ không chạy dưới quyền root , Linux sẽ ngăn nó liên kết với các cổng :80 hoặc :443 (các cổng tiêu chuẩn cho HTTP và HTTPS, tương ứng), vì đây là các hoạt động quyền . Để có thể xem được trên web, Caddy cần phải có một trong các cổng này. Nếu không, user cần thêm một số cổng cụ thể vào URL của server trong trình duyệt của họ để xem nội dung mà nó sẽ phân phát.

Sử dụng lệnh setcap có thể cho phép tiến trình Caddy liên kết với các cổng thấp mà không cần chạy dưới quyền root . setcap rất hữu ích để cho phép một quy trình thực hiện một hoạt động quyền cụ thể mà không cấp cho nó toàn quyền user . cap_net_bind_service=+ep chỉ định rằng bạn muốn cấp cho quá trình quyền CAP_NET_BIND_SERVICE , cho phép liên kết với các cổng quyền :

  • sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

Sau khi đặt quyền cho file binary Caddy, hãy tạo một folder nơi bạn sẽ lưu trữ các file cấu hình của Caddy. Chúng phải được lưu trữ trong folder con của /etc/ , là vị trí được đề xuất của Tiêu chuẩn phân cấp hệ thống file cho các file cấu hình:

  • sudo mkdir /etc/caddy

Đặt chủ sở hữu của folder này thành root và group của nó thành www-data . www-data là account user tiêu chuẩn để chạy các web server và là account sẽ chạy Caddy. Đặt quyền sở hữu theo cách này sẽ đảm bảo bạn có quyền đọc và ghi vào file binary (thông qua account gốc ) và quá trình Caddy cũng có thể đọc và ghi vào nó (vì nó sẽ chạy dưới dạng www-data ), nhưng những user khác sẽ không có quyền truy cập vào nó. Khi được sử dụng với chown , cờ -R thay đổi quyền sở hữu của tất cả các folder con và file trong folder /etc/caddy , thay vì chỉ bản thân folder :

  • sudo chown -R root:www-data /etc/caddy

Trong bước sau, hướng dẫn này sẽ trình bày cách bật TLS tự động với Let's Encrypt. Để chuẩn bị cho điều đó, hãy tạo một folder để lưu trữ bất kỳ certificate TLS nào mà Caddy sẽ có được và cung cấp cho nó các luật sở hữu giống như folder /etc/caddy :

  • sudo mkdir /etc/ssl/caddy
  • sudo chown -R root:www-data /etc/ssl/caddy

Caddy phải có khả năng ghi các certificate vào folder này và đọc từ nó để mã hóa các yêu cầu. Vì lý do này, hãy sửa đổi các quyền cho folder /etc/ssl/caddy để nó chỉ có thể truy cập được bằng rootwww-data :

  • sudo chmod 0770 /etc/ssl/caddy

Tiếp theo, tạo một folder để lưu trữ các file mà Caddy sẽ lưu trữ. /var/www/ là vị trí chuẩn trên thực tế để lưu trữ các file được phân phát qua HTTP:

  • sudo mkdir /var/www

Sau đó, đặt chủ sở hữu và group của folder thành www-data , user mặc định cho các hoạt động web server trên Ubuntu:

  • sudo chown www-data:www-data /var/www

Caddy được cấu hình thông qua một file có tên là Caddyfile ; có thể hữu ích khi nghĩ điều này tương tự như httpd.conf trong Apache hoặc folder cấu hình sites-available Nginx. Dịch vụ systemd cho Caddy sẽ mong đợi file này được lưu trữ trong /etc/caddy , vì vậy hãy tạo Caddyfile ở đó bằng cách touch :

  • sudo touch /etc/caddy/Caddyfile

Để cài đặt dịch vụ Caddy, hãy sao chép file đơn vị systemd từ mã nguồn Caddy sang /etc/systemd/system , vị trí cho các dịch vụ systemd. Làm như vậy sẽ cung cấp cho systemd khả năng khám phá và kiểm soát dịch vụ Caddy:

  • sudo cp $GOPATH/src/github.com/mholt/caddy/dist/init/linux-systemd/caddy.service /etc/systemd/system/

Sửa đổi các quyền của file dịch vụ để chỉ có chủ sở hữu của nó, root :

  • sudo chmod 644 /etc/systemd/system/caddy.service

Tiếp theo, sử dụng công cụ dòng lệnh systemctl để reload systemd. Điều này sẽ khiến systemd phát hiện dịch vụ Caddy, mặc dù ta sẽ chưa chạy nó:

  • sudo systemctl daemon-reload

Kiểm tra xem systemd đã phát hiện ra dịch vụ Caddy bằng cách chạy systemctl status :

  • sudo systemctl status caddy
Output
● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: https://caddyserver.com/docs

Nếu bạn thấy cùng một kết quả này, thì Caddy đã được phát hiện chính xác bởi systemd.

Bước cuối cùng trong quá trình cài đặt này, trước khi bạn viết cấu hình cho Caddy, là điều chỉnh firewall của bạn. Bạn phải chạy firewall bằng UFW, như được chỉ định trong hướng dẫn cài đặt server ban đầu. Tường lửa là một công cụ quan trọng để bảo vệ tính bảo mật cho server của bạn, vì nó cho phép bạn cấu hình những cổng nào có sẵn công khai cho bất kỳ bên ngoài nào kết nối và những cổng được bảo vệ khỏi quyền truy cập. Nếu có các quy trình khác làm lộ một cổng trên server của bạn, thì firewall sẽ ngăn không cho chúng được truy cập, giảm cơ hội cho kẻ tấn công xâm phạm phần mềm dễ bị tấn công.

Sử dụng công cụ dòng lệnh ufw để tắt firewall cho các cổng :80:443 , điều này sẽ cho phép Caddy giao tiếp qua HTTP và HTTPS, tương ứng:

  • sudo ufw allow 80
  • sudo ufw allow 443

Sử dụng ufw status để kiểm tra xem các thay đổi có hoạt động hay không:

  • sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80 ALLOW Anywhere 443 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80 (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6)

Quá trình cài đặt Caddy của bạn đã hoàn tất, nhưng tại thời điểm này, nó vẫn chưa được cài đặt để làm bất cứ điều gì. Tiếp theo, ta sẽ xem xét cách cài đặt Caddy bay sạch này và cấu hình nó để phục vụ một trang web.

Bước 3 - Cấu hình Caddy

Để cài đặt Caddy của bạn được sử dụng như một web server chức năng, có một số cài đặt cần được thay đổi. Khi ta thực hiện những thay đổi này, ta sẽ xem xét cú pháp của cấu hình Caddyfile , khám phá một số trường hợp cấu hình và cung cấp trang giữ chỗ qua HTTP.

Để bắt đầu cấu hình Caddy, hãy tạo một file HTML cơ bản để nó phân phát. HTML là ngôn ngữ mô tả nội dung của các trang web và file này sẽ hoạt động như một trình giữ chỗ để chứng minh việc lưu trữ một trang web với Caddy. Nếu bạn quyết định sử dụng Caddy để lưu trữ trang web của riêng mình, bạn sẽ thay thế file này bằng bất kỳ nội dung nào bạn muốn lưu trữ. Đặt file này vào folder /var/www/ mà bạn đã cài đặt trước đó. Tên index.html rất quan trọng, vì tên này đề cập đến trang "mặc định" cho hầu hết các web server và user chuyển đến domain của bạn sẽ được cung cấp file này trước tiên:

  • sudo touch /var/www/index.html

Mở file mới bằng editor bạn muốn :

  • sudo nano /var/www/index.html

Thêm nội dung sau vào file :

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

Thao tác này sẽ hiển thị một tiêu đề với nội dung “ Trang này đang được phục vụ qua Caddy ”.

Lưu file , sau đó mở file cấu hình Caddyfile bạn đã tạo trước đó:

  • sudo nano /etc/caddy/Caddyfile

Chỉnh sửa file để bao gồm nội dung sau:

/ etc / caddy / Caddyfile
:80 {     root /var/www } 

Trên dòng đầu tiên :80 đặt tên server của server - trong Caddy, điều này được gọi là nhãn . Tên server là domain mà Caddy sẽ phản hồi các yêu cầu. Trong trường hợp này, hãy đặt nó thành :80 , nghĩa là cổng :80 của server . Điều này ngăn server chạy qua HTTPS ngay bây giờ, vì Caddy sẽ cố gắng bật tính năng này tự động, nhưng ta muốn thực hiện việc này thông qua một plugin.

Theo mặc định, Caddy cố gắng tìm nạp certificate SSL từ Let's Encrypt bằng cách cung cấp tài nguyên qua HTTP, chẳng hạn như lưu trữ file . Tuy nhiên, nếu bạn muốn chạy một dịch vụ nội bộ bằng Caddy, bạn có thể không muốn để server tiếp xúc với internet công cộng. Sử dụng plugin cho phép bạn sử dụng thử thách Let's Encrypt DNS. Điều này liên quan đến việc Caddy tạo bản ghi DNS “TXT” để chứng minh quyền kiểm soát server và cho phép bạn tìm nạp certificate mà không nhất thiết phải chấp nhận các yêu cầu HTTP bên ngoài. Điều này giúp bạn có nhiều lựa chọn hơn về cách chạy Caddie trong tương lai.

After :80 là một đoạn cấu hình , nằm trong dấu ngoặc nhọn, trong đó các cấu hình cho trang web sẽ đi. Trên dòng tiếp theo, ta thấy chỉ thị root . Directives là các tùy chọn cấu hình thực tế cho Caddy và việc thêm chúng sẽ thay đổi hành vi của Caddy khi phục vụ trang web. Các chỉ thị có thể có các đối số , là các tùy chọn về cách chỉ thị sẽ có hiệu lực. Trong trường hợp này, chỉ thị root có một đối số: /var/www . Chỉ thị này đặt folder chứa các file Caddy sẽ phân phát. Tuy nhiên, các lệnh không bắt buộc phải có đối số. Ví dụ: bạn có thể thêm lệnh gzip mà không có bất kỳ đối số nào để nén các trang web trước khi chúng được gửi đến client , giúp chúng tải nhanh hơn.

/ etc / caddy / Caddyfile
:80 {     root /var/www     gzip } 

Các chỉ thị có thể được cấu hình với các chỉ thị phụ cung cấp chức năng bổ sung. Chúng được đặt trong các đoạn cấu hình của riêng chúng, sử dụng dấu ngoặc nhọn. Ví dụ, mặc dù gzip chỉ hoạt động trên riêng của bạn , ta có thể sử dụng ext subdirective với các loại file nhất định chỉ nén, hoặc level subdirective để kiểm soát mức độ nén sẽ xảy ra (1 là thấp nhất và 9 là cao nhất).

/ etc / caddy / Caddyfile
:80 {     root /var/www     gzip {         ext .html .htm .php         level 6     } } 

Caddy có một số lượng lớn các chỉ thị khác nhau cho nhiều trường hợp sử dụng. Ví dụ: lệnh fastcgi có thể hữu ích để kích hoạt PHP. Chỉ thị markdown được dùng để tự động chuyển đổi các file Markdown sang HTML trước khi phân phát chúng, điều này có thể hữu ích cho việc tạo một blog đơn giản.

Lưu và đóng Caddyfile , đồng thời kiểm tra xem mọi thứ có hoạt động bình thường không. Sử dụng systemctl để bắt đầu dịch vụ Caddy:

  • sudo systemctl start caddy

Tiếp theo, chạy systemctl status để tìm thông tin về trạng thái của dịch vụ Caddy:

  • sudo systemctl status caddy

Bạn sẽ thấy như sau:

Output
● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: active (running) since Sat 2018-01-27 11:37:06 UTC; 7min ago Docs: https://caddyserver.com/docs Main PID: 2973 (caddy) Tasks: 6 Memory: 3.2M CPU: 24ms CGroup: /system.slice/caddy.service └─2973 /usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp Jan 27 11:37:06 caddy-tutorial-testing-0 systemd[1]: Started Caddy HTTP/2 web server. Jan 27 11:37:06 caddy-tutorial-testing-0 caddy[2973]: Activating privacy features... done. Jan 27 11:37:06 caddy-tutorial-testing-0 caddy[2973]: http:// Jan 27 11:37:06 caddy-tutorial-testing-0 caddy[2973]: 2018/01/27 11:37:06 http://

Nếu bạn duyệt đến domain của bạn , bây giờ bạn sẽ thấy Caddy đang chạy và trang web mẫu của bạn sẽ hiển thị. Sau khi xác nhận điều này, hãy sử dụng systemctl để dừng dịch vụ Caddie, vì vẫn còn một số thay đổi cần thực hiện:

  • sudo systemctl stop caddy

Mặc dù Caddy bao gồm rất nhiều chỉ thị theo mặc định, nó không thể đáp ứng cho mọi trường hợp sử dụng có thể và bạn có thể cần thêm nhiều chức năng hơn vào server . Bây giờ ta biết Caddy đang cung cấp nội dung như mong đợi, ta sẽ xem xét cách mở rộng chức năng của Caddy thông qua việc sử dụng các plugin.

Bước 4 - Sử dụng Plugin

Các plugin là một cách thay đổi hành vi của Caddy. Chúng thường là những đoạn mã nhỏ mà ta có thể chèn vào Caddy để thêm nhiều chỉ thị hơn cho các trường hợp sử dụng cụ thể. Cách dễ nhất để hiểu về plugin là nhảy thẳng vào và thử một plugin, vì vậy ta sẽ cài đặt plugin minify . Plugin này loại bỏ khoảng trắng thừa và mã thừa khỏi một số file , giảm kích thước của từng file và , giúp tăng tốc thời gian tải.

Bắt đầu bằng cách quay lại nơi Go đã lưu mã nguồn của Caddy, vì bạn cần sửa đổi điều này để cài đặt plugin:

  • cd $GOPATH/src/github.com/mholt/caddy

Mở lại file run.go của Caddy. Như ta đã nói trước đó, đây là một trong những phần đầu tiên của Caddy bay và đó là vị trí cài đặt các plugin.

  • nano caddy/caddymain/run.go

Trong file này, bạn sẽ thấy một khai báo import giống như sau:

$ GOPATH / src / github.com / mholt / caddy / caddy / caddymain / run.go
. . . import (     "errors"     "flag"     "fmt"     "io/ioutil"     "log"     "os"     "runtime"     "strconv"     "strings"      "gopkg.in/natefinch/lumberjack.v2"      "github.com/xenolf/lego/acmev2"      "github.com/mholt/caddy"     // plug in the HTTP server type     _ "github.com/mholt/caddy/caddyhttp"      "github.com/mholt/caddy/caddytls"     // This is where other plugins get plugged in (imported) ) . . . 

Để cài đặt một plugin, hãy thêm _ "github.com/path/to/plugin" vào chỉ thị import này. Một số plugin có thể yêu cầu một số chỉnh sửa cấu hình nhỏ, vì vậy hãy nhớ đọc tài liệu về bất kỳ plugin nào bạn cài đặt. Bạn có thể tìm thấy danh sách các plugin phổ biến trong ngăn bên trái của tài liệu Caddy , bên dưới Plugins .

Kho lưu trữ GitHub của plugin minifyhacdias / caddy-minify , vì vậy hãy thêm thông tin sau vào cuối khai báo nhập:

$ GOPATH / github.com / mholt / caddy / caddy / caddymain / run.go
. . . import (     . . .     "github.com/mholt/caddy/caddytls"     // This is where other plugins get plugged in (imported)      _ "github.com/hacdias/caddy-minify" ) 

Bạn cần phải commit mã của bạn khi thực hiện thay đổi để khi bạn hợp nhất trong bất kỳ bản cập nhật mới nào, những thay đổi đó sẽ không bị mất. Nếu bạn chưa commit mã trên server này trước đây, bạn cần đặt tên và email để Git có thể nhận dạng bạn trong log . Lệnh git config cho phép bạn đặt các tùy chọn này và cờ --global áp dụng chúng cho bất kỳ repository nào mà bạn có thể làm việc trong tương lai. Trừ khi bạn đẩy mã lên một repository công khai như GitHub, các chi tiết này sẽ không được công khai.

  • git config --global user.email "sammy@example.com"
  • git config --global user.name "Sammy"

Đến đây bạn đã đặt tên user và email của bạn , hãy thêm các file nào bạn đã thay đổi vào giai đoạn của Git ( cache ẩn được sử dụng để lưu trữ trạng thái của mã trước khi bạn commit ) bằng cách chạy như sau:

  • git add -A .

Bây giờ chạy git commit để lưu các thay đổi vào nhánh hiện tại. Tùy chọn -m cho phép bạn đặt thông báo commit để bạn có thể ghi chú những gì bạn đã thay đổi. Bạn có thể tìm thấy thông báo này bằng cách xem qua log của Git:

  • git commit -m "Added minify plugin"

Đến đây bạn có đường dẫn đến plugin trong mã của bạn , nhưng bạn vẫn cần download local plugin để Go có thể truy cập vào nó. Lệnh này sẽ tự động tìm nạp tất cả các phụ thuộc của Caddy khi chạy từ folder $GOPATH/src/github.com/mholt/caddy :

  • go get ./...

Khi nào bạn thêm một plugin mới, bạn phải xây dựng lại Caddy. Điều này là do Go là một ngôn ngữ lập trình biên dịch, nghĩa là mã nguồn được chuyển thành mã máy trước khi thực thi. Thay đổi đối với khai báo nhập đã thay đổi mã nguồn, nhưng sẽ không ảnh hưởng đến file binary cho đến khi nó được biên dịch.

Sử dụng lệnh go install để biên dịch Caddy:

  • go install github.com/mholt/caddy/caddy

Nếu Caddy được tạo thành công, lệnh này sẽ thoát ra mà không có kết quả . Sao chép file binary đã tạo vào /usr/local/bin và cài đặt quyền cho file binary như bạn đã làm trước đây - bạn phải thực hiện các bước này mỗi khi xây dựng lại Caddy đảm bảo chức năng và bảo mật của nó.

  • sudo cp $GOPATH/bin/caddy /usr/local/bin/
  • sudo chown root:root /usr/local/bin/caddy
  • sudo chmod 755 /usr/local/bin/caddy
  • sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

Để chứng minh rằng plugin đã được cài đặt thành công, hãy mở Caddyfile của bạn.

  • sudo nano /etc/caddy/Caddyfile

Bật plugin bằng cách thêm dòng sau vào đoạn cấu hình :

/ etc / caddy / Caddyfile
:80 {     root /var/www     gzip     minify } 

Bây giờ khởi động server của bạn bằng systemctl :

  • sudo systemctl start caddy

Caddy hiện đang chạy và sẽ thu nhỏ các file nào mà nó phục vụ, bao gồm index.html bạn đã tạo trước đó. Bạn có thể quan sát quá trình 'thu nhỏ' tại nơi làm việc bằng cách sử dụng cURL, một công cụ dòng lệnh để thực hiện các yêu cầu web. Chạy curl không có tùy chọn hoặc cờ sẽ lấy nội dung của một trang web và hiển thị nó trong terminal . Chạy lệnh sau để yêu cầu index.html từ Caddy, thay thế example.com bằng domain của bạn.

  • curl http://example.com

Bạn sẽ thấy kết quả sau. Lưu ý tất cả không gian không cần thiết đã được loại bỏ, cho thấy rằng plugin minify đã hoạt động.

Output
<!doctype html><title>Hello from Caddy!</title><h1 style=font-family:sans-serif>This page is being served via Caddy</h1>

Phương pháp cài đặt tương tự này sẽ hoạt động đối với các plugin Caddy khác. Bạn sẽ có thêm một số thực hành với việc thêm plugin bằng cách cài đặt plugin tls.dns.digitalocean để tự động kích hoạt truy cập HTTP S được bảo mật.

Bước 5 - Bật TLS tự động với Let's Encrypt

Caddy bật HTTPS theo mặc định bằng Let's Encrypt, điều này rất hữu ích vì rất dễ lấy sai chi tiết của HTTPS. Phương pháp tiếp cận HTTPS của Caddy là an toàn và không buộc bạn phải nghiên cứu sâu về cấu hình để mã hóa lưu lượng truy cập của bạn . Tuy nhiên, Caddy mặc định sử dụng phương thức HTTP-01 để xác minh với Let's Encrypt rằng bạn thực sự sở hữu domain của bạn . Phương pháp này liên quan đến việc đăng một file đặc biệt (chứa phản hồi cho một thử thách do Let's Encrypt gửi) đến một vị trí cụ thể trên trang web. Mặc dù phương pháp này hoạt động nhưng nó yêu cầu trang web phải được truy cập . Đây có thể là vấn đề với một số cấu hình firewall nhất định hoặc nếu bạn đang chạy Caddy như một dịch vụ nội bộ cho doanh nghiệp của bạn .

Thay vào đó, bạn có thể cài đặt plugin tls.dns.digitalocean Caddy, sẽ sử dụng phương pháp xác minh DNS-01 để thay thế. Plugin này xác thực với Let's Encrypt bằng cách thêm bản ghi DNS “TXT” mới cho domain của bạn, điều này sẽ không ảnh hưởng đến cách trang web hoạt động. Nó sử dụng API của DigitalOcean để kiểm soát DNS, cho phép bạn linh hoạt tìm nạp certificate ngay cả khi server của bạn không thể truy cập . Để biết thêm thông tin về các loại bản ghi DNS khác nhau, hãy đọc Giới thiệu về DNS DigitalOcean của ta .

Phương pháp cài đặt plugin tls.dns.digitalocean Caddy gần như giống với cách bạn cài đặt plugin minify . Để bắt đầu, hãy mở $GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go :

  • nano $GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go

Thêm vị trí của plugin:

$ GOPATH / github.com / mholt / caddy / caddy / caddymain / run.go
. . . import (     . . .     "github.com/mholt/caddy/caddytls"     // This is where other plugins get plugged in (imported)      _ "github.com/hacdias/caddy-minify"     _ "github.com/caddyserver/dnsproviders/digitalocean" ) 

Để cập nhật Caddy, hãy chuyển vào repository nguồn của Caddy và áp dụng các thay đổi đối với Git:

  • cd $GOPATH/src/github.com/mholt/caddy
  • git add -A .
  • git commit -m "Add DigitalOcean DNS provider"

Tiếp theo, cài đặt tất cả các phụ thuộc và xây dựng Caddy, như bạn đã làm trước đây:

  • go get ./...
  • go install github.com/mholt/caddy/caddy

Đảm bảo Caddy được dừng thông qua systemctl , sau đó hoàn tất cài đặt plugin bằng cách sao chép file binary Caddy mới được tạo và cài đặt quyền sở hữu và quyền của nó:

  • sudo systemctl stop caddy
  • sudo cp $GOPATH/bin/caddy /usr/local/bin/
  • sudo chown root:root /usr/local/bin/caddy
  • sudo chmod 755 /usr/local/bin/caddy
  • sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

Tiếp theo, cấu hình Caddy hoạt động với API của DigitalOcean để cài đặt bản ghi DNS. Điều hướng đến tab API trong account DigitalOcean của bạn và chọn Tạo mã thông báo mới :

Trang API & Ứng dụng DigitalOcean

Đặt tên mô tả cho mã thông báo của bạn (ví dụ: caddy-dns ) và đảm bảo Viết (tùy chọn) được chọn. Sau đó, nhấn Generate Token :

Tạo mã thông báo truy cập cá nhân

Nhấp vào mã thông báo đã tạo để sao chép nó và ghi lại ở đâu đó mà bạn sẽ không bị mất. Caddy cần truy cập mã thông báo này như một biến môi trường để cấu hình DNS của DigitalOcean. các file dịch vụ của systemd cho phép bạn xác định các biến môi trường được đưa vào môi trường của quy trình. Chỉnh sửa file dịch vụ Caddy trong folder /etc/systemd/system/ chứ không phải version trong repository lưu trữ Caddy Git. Thêm khóa API của bạn vào version của file bên ngoài repository Git để tránh vô tình chuyển mã thông báo riêng tư vào repository Caddy công khai:

  • sudo nano /etc/systemd/system/caddy.service

Tìm dòng bắt đầu bằng Environment= trong phần [Service] . Dòng này xác định các biến môi trường sẽ được chuyển cho quy trình Caddy. Thêm khoảng DO_AUTH_TOKEN ở cuối dòng này, sau đó thêm biến DO_AUTH_TOKEN , theo sau là mã thông báo bạn vừa tạo:

/etc/systemd/system/caddy.service
[Service] Restart=on-abnormal  ; User and group the process will run as. User=www-data Group=www-data  ; Letsencrypt-issued certificates will be written to this directory. Environment=CADDYPATH=/etc/ssl/caddy DO_AUTH_TOKEN=your_token_here 

Lưu file này, sau đó reload daemon systemd như bạn đã làm trước đó đảm bảo cấu hình được cập nhật:

  • sudo systemctl daemon-reload

Chạy systemctl status để kiểm tra xem các thay đổi cấu hình của bạn có ổn không:

  • sudo systemctl status caddy

Điều này sẽ tạo ra một kết quả tương tự như sau. Hãy chú ý đến dòng bắt đầu Loaded: Trạng thái loaded cho biết rằng các thay đổi đối với cấu hình dịch vụ đã thành công. Nếu lỗi xảy ra khi cấu hình dịch vụ systemd, dòng này thay vào đó sẽ hiển thị trạng thái error cùng với giải thích tại sao systemd không thể diễn giải file dịch vụ. Dòng tiếp theo, bắt đầu Active: cho biết dịch vụ có đang chạy hay không. Vì bạn đã dừng Caddy trước đó trong bước này, điều này hiển thị inactive . Khi Caddy được chạy, điều này sẽ hiển thị enabled hoặc running .

Output
● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: https://caddyserver.com/docs

Bạn cần thực hiện một số thay đổi nhỏ đối với Caddyfile của bạn , vì vậy hãy mở nó để chỉnh sửa:

  • sudo nano /etc/caddy/Caddyfile

Thêm các dòng được đánh dấu vào Caddyfile , đảm bảo thay thế example.com bằng domain của bạn. Việc sử dụng một domain thay vì chỉ một cổng cho tên server sẽ khiến Caddy phân phát các truy cập qua HTTPS. Lệnh tls cấu hình hành vi của Caddy khi sử dụng TLS và chỉ thị con dns chỉ định rằng Caddy nên sử dụng hệ thống DNS-01 , thay vì HTTP-01 :

/ etc / caddy / Caddyfile
example.com {     root /var/www     gzip     minify     tls {         dns digitalocean     } } 

Trang web đã sẵn sàng để được triển khai. Đầu tiên, khởi động server với systemctl và sau đó enable nó. Điều này sẽ cấu hình Caddy để bắt đầu khi server khởi động :

  • sudo systemctl start caddy
  • sudo systemctl enable caddy

Nếu bạn duyệt đến domain của bạn , bạn sẽ được tự động chuyển hướng đến HTTPS.

Việc cài đặt Caddy của bạn đã hoàn tất và an toàn. Tiếp theo, ta sẽ xem xét cách cập nhật Caddy khi version mới được phát hành. Khi bạn cài đặt phần mềm bằng trình quản lý gói, việc cập nhật phần mềm này thường đơn giản như chạy một lệnh duy nhất và đôi khi hệ điều hành có thể tự động cài đặt các bản cập nhật bảo mật. Tuy nhiên, vì bạn đã xây dựng Caddy từ nguồn, nên quá trình này có liên quan nhiều hơn một chút; bạn cần xây dựng lại Caddy từ version cập nhật của mã nguồn, sau đó cài đặt lại.

Bước 6 - Cập nhật cài đặt Caddy của bạn

Luôn cập nhật phần mềm là một phương pháp bảo mật quan trọng, vì phần mềm lỗi thời thường có lỗ hổng. Chạy version Caddy mới nhất sẽ bảo vệ bạn khỏi bị xâm phạm tính bảo mật của server do bất kỳ lỗ hổng nào có thể tồn tại trong version cũ hơn. Trong bước này, ta sẽ xem xét cách cập nhật cài đặt Caddy của bạn khi có version mới. Chỉ nên làm theo bước này nếu bản phát hành Caddy mới được đẩy vào repository Caddy GitHub.

Ta sẽ sử dụng Git để cập nhật trạng thái mã nguồn của ta . Đầu tiên, thay đổi folder nguồn caddy :

  • cd $GOPATH/src/github.com/mholt/caddy

Đảm bảo rằng bạn đang ở trên nhánh mà bạn đã tạo ở Bước 1 bằng cách sử dụng git checkout :

  • git checkout adding_plugins

Tiếp theo, sử dụng git fetch để kéo các thay đổi từ repository từ xa. Khi Git sao chép repository Caddy, nó sẽ duy trì một liên kết đến kho lưu trữ ngược dòng - vị trí trung tâm nơi bắt nguồn các thay đổi. Git đề cập đến repository ngược dòng theo tên origin , vì vậy bạn cần tìm nạp từ origin:

  • git fetch origin

Các thay đổi đối với repository hiện có trên hệ thống của bạn, được lưu trữ dưới một nhánh khác. Sử dụng git tag để xem bản phát hành mới nhất , vì bạn vẫn nên sử dụng các version Caddy đã phát hành, thay vì mã giữa các bản phát hành:

  • git tag

Như trước đây, hãy duyệt qua danh sách cho đến khi bạn tìm thấy version mới nhất. Git bao gồm một công cụ để hợp nhất hai nhánh mã khác nhau - git merge . Nhập thông tin sau để hợp nhất các thay đổi từ version mới nhất vào nhánh làm việc của bạn. Đảm bảo thay thế adding_plugins bằng tên chi nhánh và số version của bạn bằng tên mới nhất mà bạn vừa xác định:

  • git merge adding_plugins v0.10.13

Một editor sẽ xuất hiện mà bạn có thể lưu và đóng để hoàn tất việc hợp nhất. Tuy nhiên, có khả năng xảy ra xung đột hợp nhất trong đó Git không thể tìm ra cách hai version mã khác nhau nên trùng với nhau. Git sẽ thông báo cho bạn nếu điều này xảy ra và bạn cần phải chỉnh sửa thủ công các file xung đột sau đó commit giải quyết xung đột.

Giả sử không có xung đột hợp nhất, hãy cài đặt lại Caddy theo cùng một quy trình mà bạn đã làm trong suốt hướng dẫn này. Đầu tiên, sử dụng go install để xây dựng lại hệ binary :

  • go install github.com/mholt/caddy/caddy

Tiếp theo, dừng dịch vụ Caddy và sao chép file binary mới:

  • sudo systemctl stop caddy
  • sudo cp $GOPATH/bin/caddy /usr/local/bin/

Đặt quyền của binary :

  • sudo chown root:root /usr/local/bin/caddy
  • sudo chmod 755 /usr/local/bin/caddy
  • sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

Cuối cùng, sử dụng systemctl để khởi động lại dịch vụ Caddy:

  • sudo systemctl start caddy

Caddy sẽ tiếp tục khởi động khi server khởi động trong tương lai, vì nó chưa bị vô hiệu hóa. Cùng với đó, Caddy đã được cập nhật thành công lên version mới nhất và sẽ tiếp tục hoạt động mà không bị gián đoạn, ít nhất là cho đến bản phát hành tiếp theo.

Kết luận

Theo hướng dẫn này, bạn đã triển khai thành công một trang web bằng Caddy. Một bước tốt tiếp theo là tìm cách được thông báo khi có version Caddy bay mới. Ví dụ: bạn có thể sử dụng nguồn cấp dữ liệu Atom cho các bản phát hành Caddy hoặc một dịch vụ chuyên dụng như Sibbell . Tạo một tập lệnh để tự động hóa quá trình cập nhật server cũng sẽ là một ý tưởng hay - bạn thậm chí có thể kết hợp cả hai và tạo một công cụ xây dựng tự động xây dựng lại Caddy khi có bản phát hành mới. Nếu không, bạn có thể khám phá tài liệu của Caddy và khám phá cách tốt nhất để tùy chỉnh nó cho phù hợp với nhu cầu của bạn.


Tags:

Các tin liên quan

Cách thiết lập khóa SSH trên Ubuntu 16.04
2018-04-12
Cách đồng bộ hóa dữ liệu đã chuyển đổi từ MongoDB sang Elasticsearch với Transporter trên Ubuntu 16.04
2018-04-05
Cách triển khai trang web Jekyll bằng Git Hooks trên Ubuntu 16.04
2018-03-29
Cách chặn nỗ lực đăng nhập SSH không mong muốn với PyFilter trên Ubuntu 16.04
2018-03-27
Cách tự động triển khai ứng dụng Laravel với Trình triển khai trên Ubuntu 16.04
2018-03-23
Cách thiết lập trang web phát triển Jekyll trên Ubuntu 16.04
2018-03-20
Cách cài đặt Ruby on Rails với rbenv trên Ubuntu 16.04
2018-03-15
Cách cài đặt Node.js trên Ubuntu 16.04
2018-03-07
Cách cài đặt và bảo mật Memcached trên Ubuntu 16.04
2018-03-06
Cách cài đặt Buildbot trên Ubuntu 16.04
2018-03-06