Cách triển khai ứng dụng web Go bằng Nginx trên Ubuntu 18.04
Go là một ngôn ngữ lập trình đa dụng đang dần trở thành một trong những ngôn ngữ lập trình web back-end phổ biến nhất. Bằng cách tập trung vào sự đơn giản, các nhà thiết kế của Go đã tạo ra một ngôn ngữ vừa dễ học vừa nhanh hơn nhiều ngôn ngữ khác cho các ứng dụng web, tận dụng các tính năng hiệu quả như khả năng xử lý nhiều yêu cầu cùng một lúc do tính đồng thời của nó. Do đó, việc triển khai ứng dụng web trong Go sẽ hữu ích cho nhiều nhà phát triển back-end.Nginx là một trong những web server phổ biến nhất trên thế giới do sử dụng tài nguyên nhẹ và độ tin cậy khi tải. Nhiều trang web lớn nhất và được buôn bán cao nhất trên internet phụ thuộc vào Nginx để phân phát nội dung của họ. Trong triển khai, Nginx thường được sử dụng như một bộ cân bằng tải hoặc một Reverse Proxy để tăng tính bảo mật và làm cho ứng dụng mạnh mẽ hơn. Cùng với phần mềm hỗ trợ của Go web, Nginx có thể cung cấp một ứng dụng web mạnh mẽ và nhanh chóng.
Trong hướng dẫn này, bạn sẽ xây dựng ứng dụng web Hello World
trong Go và triển khai nó trên server Ubuntu 18.04 sử dụng Nginx làm Reverse Proxy .
Yêu cầu
Để làm theo hướng dẫn này, bạn cần những thứ sau:
- Một server Ubuntu 18.04 được cài đặt theo cài đặt server ban đầu này cho hướng dẫn Ubuntu 18.04 , bao gồm user không phải root có quyền sudo và firewall .
- Đã cài đặt ngôn ngữ lập trình Go theo Cách cài đặt Go và cài đặt môi trường lập trình local trên Ubuntu 18.04 .
- Đã cài đặt Nginx theo Cách cài đặt Nginx trên Ubuntu 18.04 . Không làm theo Bước 5 - Cài đặt khối server ; bạn sẽ tạo khối server Nginx sau này trong hướng dẫn này.
- Tên domain đã trỏ đến server của bạn, như được mô tả trong Cách cài đặt tên server với DigitalOcean . Hướng dẫn này sẽ sử dụng
your_domain
xuyên suốt. Điều này là cần thiết để có được certificate SSL cho trang web , vì vậy bạn có thể cung cấp ứng dụng của bạn một cách an toàn với mã hóa TLS.
Ngoài ra, để đạt được việc triển khai cấp production ứng dụng web Go của bạn, điều quan trọng là bạn phải giữ an toàn cho server của bạn bằng cách cài đặt certificate TLS / SSL. Bước này được khuyến khích mạnh mẽ . Để bảo mật ứng dụng web Go của bạn, hãy làm theo Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 18.04 sau Bước 3 của hướng dẫn này để nhận certificate TLS / SSL miễn phí.
Bước 1 - Xây dựng ứng dụng web Go
Trong bước này, bạn sẽ xây dựng một ứng dụng web Go mẫu hiển thị Hello World
tại your_domain
và chào user tại your_domain /greet/
. Nếu bạn muốn tìm hiểu thêm về những kiến thức cơ bản của lập trình trong Go, hãy xem bài viết Cách viết chương trình đầu tiên của bạn trong Go .
Đầu tiên, hãy tạo một folder mới trong folder GOPATH
của bạn để chứa file nguồn. Bạn có thể đặt tên folder theo ý muốn, nhưng hướng dẫn này sẽ sử dụng go-web
:
- mkdir $GOPATH/go-web
Làm theo cấu trúc file được đề xuất trong hướng dẫn tiên quyết Cách cài đặt Go và Cài đặt Môi trường Lập trình Cục bộ trên Ubuntu 18.04 , điều này sẽ cung cấp cho folder của bạn đường dẫn là ~/go/go-web
.
Tiếp theo, chạy phần sau để thay đổi folder thành folder mới được tạo của bạn trong GOPATH
:
- cd $GOPATH/go-web
Sử dụng nano
hoặc editor bạn muốn để tạo file có tên main.go
, file này sẽ chứa mã nguồn cho ứng dụng web của bạn:
- nano main.go
Để tạo chức năng của ứng dụng Hello World
, hãy thêm mã Go sau vào file main.go
mới tạo:
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World") }) http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) { name := r.URL.Path[len("/greet/"):] fmt.Fprintf(w, "Hello %s\n", name) }) http.ListenAndServe(":9990", nil) }
Bây giờ ta hãy xem đoạn mã trước đó sẽ làm gì, bắt đầu từ dòng đầu tiên.
Đầu tiên, bạn đã viết điểm vào đơn đăng ký của bạn :
package main ...
package main
yêu cầu trình biên dịch Go biên dịch file này dưới dạng chương trình thực thi thay vì dưới dạng thư viện được chia sẻ.
Tiếp theo, bạn có các câu lệnh import
:
... import ( "fmt" "net/http" ) ...
Đoạn mã này nhập các module cần thiết cần thiết để mã này hoạt động, bao gồm gói fmt
tiêu chuẩn và gói net/http
cho web server của bạn.
Đoạn mã tiếp theo tạo tuyến đường đầu tiên của bạn trong hàm main
, là điểm vào của bất kỳ ứng dụng Go nào:
... func main () { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World") }) ... } ...
Một tuyến cha /
được tạo trong func main
, sẽ trả về văn bản Hello World
khi được yêu cầu.
Tuyến thứ hai như trong đoạn mã sau chấp nhận một tham số URL, trong trường hợp này là tên, để hiển thị kèm theo lời chào.
... func main () { ... http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) { name := r.URL.Path[len("/greet/"):] fmt.Fprintf(w, "Hello %s\n", name) }) ... } ...
Điều này sử dụng URL.Path
của Go để lưu trữ giá trị ngay sau /greet/
URL.Path
/greet/
và chuyển nó dưới dạng tên từ tham số URL.
Cuối cùng, bạn khởi tạo server của bạn :
... func main () { ... http.ListenAndServe(":9990", nil) }
Đoạn mã trước khởi động server và hiển thị ứng dụng của bạn qua cổng 9990
bằng server http
có sẵn của Go.
Sau khi bạn kiểm tra xong mã trong main.go
, hãy lưu file và thoát khỏi editor của bạn.
Tiếp theo, xây dựng file thực thi binary của ứng dụng của bạn bằng lệnh:
- go build main.go
Lệnh trước đó sẽ biên dịch main.go
để tạo ra một file thực thi có tên main
.
Bạn đã tạo ứng dụng web Go mẫu của bạn . Tiếp theo, bạn sẽ tạo một file đơn vị systemd để giữ cho ứng dụng của bạn chạy trong nền ngay cả khi bạn không truy cập vào server của bạn .
Bước 2 - Tạo file đơn vị hệ thống
Trong bước này, bạn sẽ tạo một file đơn vị systemd để giữ cho ứng dụng của bạn chạy trong nền ngay cả khi user đăng xuất khỏi server . Điều này sẽ làm cho ứng dụng của bạn bền bỉ, đưa bạn đến gần hơn một bước với việc triển khai ở cấp độ production .
Đầu tiên, tạo một file mới trong folder /lib/systemd/system
có tên goweb.service
bằng nano
hoặc editor mà bạn ưa thích:
- sudo nano /lib/systemd/system/goweb.service
Để đặt các thông số của dịch vụ, hãy thêm đoạn mã sau vào file .
[Unit] Description=goweb [Service] Type=simple Restart=always RestartSec=5s ExecStart=/home/user/go/go-web/main [Install] WantedBy=multi-user.target
Biến ExecStart=/home/ user /go/go-web/main
chỉ định rằng điểm vào cho dịch vụ này là thông qua file thực thi main
nằm trong folder /home/ user /go/go-web
, nơi user
là server tên user account sudo không phải root. Restart=always
đảm bảo systemd sẽ luôn cố gắng khởi động lại chương trình nếu nó dừng. Trên dòng tiếp theo, RestartSec=5s
đặt thời gian chờ năm giây giữa các lần khởi động lại. WantedBy=multi-user.target
chỉ định server của bạn sẽ kích hoạt dịch vụ ở trạng thái nào.
Lưu và thoát khỏi file .
Đến đây bạn đã viết file đơn vị dịch vụ, hãy khởi động dịch vụ web Go của bạn bằng lệnh:
- sudo service goweb start
Để xác nhận xem dịch vụ có đang chạy hay không, hãy sử dụng lệnh sau:
- sudo service goweb status
Bạn sẽ nhận được kết quả sau:
Output● goweb.service - goweb Loaded: loaded (/lib/systemd/system/goweb.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2019-07-17 23:28:57 UTC; 6s ago Main PID: 1891 (main) Tasks: 4 (limit: 1152) CGroup: /system.slice/goweb.service └─1891 /home/user/go/go-web/main
Để tìm hiểu thêm về cách làm việc với file đơn vị systemd, hãy xem phần Hiểu đơn vị Systemd và file đơn vị .
Đến đây bạn đã cài đặt và chạy ứng dụng của bạn , bạn có thể cài đặt Reverse Proxy Nginx.
Bước 3 - Cài đặt Reverse Proxy với Nginx
Trong bước này, bạn sẽ tạo một khối server Nginx và cài đặt Reverse Proxy Nginx để hiển thị ứng dụng của bạn với internet.
Đầu tiên, hãy thay đổi folder làm việc của bạn thành folder sites-available
Nginx:
- cd /etc/nginx/sites-available
Tạo một file mới với domain mà bạn muốn hiển thị ứng dụng của bạn . Hướng dẫn này sẽ sử dụng your_domain
:
- sudo nano your_domain
Thêm các dòng sau vào file để cài đặt cài đặt cho your_domain
:
server { server_name your_domain www.your_domain; location / { proxy_pass http://localhost:9990; } }
Khối server Nginx này sử dụng proxy_pass
để phân phát ứng dụng web Go trên địa chỉ IP server của bạn được chỉ định là localhost
để làm cho nó chạy trên cổng 9990
. server_name
cho biết domain được ánh xạ tới địa chỉ IP của bạn, trong trường hợp này là your_domain
và www.your_domain
.
Tiếp theo, tạo một softlink của cấu hình Nginx này trong folder sites-enabled
bằng cách chạy lệnh sau:
- sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/your_domain
Softlink là một lối tắt của một file ở vị trí khác. Lối tắt mới được tạo sẽ luôn tham chiếu đến file root để điều chỉnh cập nhật khi thực hiện chỉnh sửa đối với file đó. Nginx yêu cầu một bản sao của cấu hình trong cả hai folder .
Tiếp theo, reload cấu hình Nginx của bạn bằng cách chạy lệnh reload :
- sudo nginx -s reload
Để đảm bảo việc triển khai của bạn đang hoạt động, hãy truy cập http:// your_domain
trong trình duyệt của bạn. Bạn sẽ được chào đón bằng một chuỗi văn bản Hello World .
Lưu ý: Như đã đề cập trong phần Yêu cầu , tại thời điểm này, bạn nên bật SSL / TLS trên server của bạn . Điều này sẽ đảm bảo tất cả thông tin liên lạc giữa ứng dụng và khách truy cập sẽ được mã hóa, điều này đặc biệt quan trọng nếu ứng dụng yêu cầu thông tin nhạy cảm như đăng nhập hoặc password . Thực hiện theo Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 18.04 ngay bây giờ để nhận certificate SSL miễn phí cho Nginx trên Ubuntu 18.04. Sau khi có certificate SSL / TLS, hãy quay lại và hoàn thành hướng dẫn này.
Đến đây bạn đã cài đặt Reverse Proxy Nginx để hiển thị ứng dụng của bạn tại domain của bạn và bảo mật ứng dụng web Go của bạn bằng SSL / TLS. Trong bước tiếp theo, bạn sẽ kiểm tra ứng dụng của bạn qua kết nối an toàn.
Bước 4 - Kiểm tra ứng dụng
Trong bước này, bạn sẽ kiểm tra ứng dụng của bạn qua kết nối an toàn đảm bảo mọi thứ đang hoạt động.
Mở trình duyệt web bạn muốn , truy cập https:// your_domain
:
Bạn sẽ nhận được một tin nhắn Hello World
đơn giản. Nhận được thông báo này khi sử dụng https://
trong URL cho biết rằng ứng dụng của bạn đang được cung cấp qua kết nối an toàn.
Tiếp theo, hãy thử truy cập tuyến thứ hai https:// your_domain /greet/ your-name
, thay thế your-name
bằng bất kỳ tên nào bạn muốn ứng dụng của bạn chào:
Ứng dụng sẽ trả về một lời chào đơn giản cùng với your-name
, dựa trên tham số được truyền đến URL.
Khi bạn nhận được những kết quả này, bạn đã triển khai thành công ứng dụng web Go của bạn .
Kết luận
Trong hướng dẫn này, bạn đã tạo một ứng dụng web đơn giản với Go bằng cách sử dụng các thư viện tiêu chuẩn của nó, cài đặt Reverse Proxy bằng Nginx và sử dụng certificate SSL trên domain của bạn để bảo mật ứng dụng của bạn. Để tìm hiểu thêm về cờ vây, hãy xem tài liệu chính thức của họ. Ngoài ra, bạn có thể xem loạt bài Cách viết mã trong Go để tìm hiểu thêm về lập trình bằng ngôn ngữ hiệu quả này.
Các tin liên quan
Biến Gatsby thành PWA: Service Worker và Web App Manifest2019-07-18
Giới thiệu về Kiểm tra trực quan cho Ứng dụng Web
2019-06-11
Cách cài đặt ứng dụng web bằng Cloudron trên Ubuntu 18.04
2019-05-29
Cách triển khai ứng dụng web Go với Docker và Nginx trên Ubuntu 18.04
2019-04-23
Cách cạo các trang web và đăng nội dung lên Twitter bằng Python 3
2019-04-22
module Web tích hợp: Cách sử dụng KV Storage
2019-03-22
Cách thu thập thông tin một trang web với Scrapy và Python 3
2019-03-20
Cách cạo các trang web với Beautiful Soup và Python 3
2019-03-20
Cách sử dụng API Web trong Python 3
2019-03-20
Tạo ứng dụng web tiến bộ (PWA) với React
2019-03-02