Chuẩn bị môi trường và quản lý phụ thuộc
Việc cấu hình đúng runtime, chỉ định nguồn tải gói và vận hành module là bước nền tảng cho mọi dự án Go. Dưới đây là quy trình chuẩn hóa các thao tác thường dùng.
Thiết lập biến môi trường
Xác minh phiên bản trình biên dịch và hiển thị trạng thái cấu hình hiện tại:
go version
go env
Bật chế độ module mặc định và chỉ định đường dẫn proxy thay thế để tối ưu hóa tốc độ giải quyết phụ thuộc:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
Khai báo miền nội bộ được miễn trừ kiểm tra sum database (tách biệt bằng dấu phẩy nếu có nhiều miền):
go env -w GOPRIVATE=*.internal.corp,*.gitlab.enterprise.com
Vận hành Go Modules
Khởi tạo file mô tả dự án với tên định danh tùy chỉnh:
go mod init <ten_du_an>
Phân tích và duyệt hệ thống thư viện:
# Liệt kê các phiên bản khả dụng của một package
go list -m -versions -json github.com/gin-gonic/gin
# Giải thích lý do một gói được kéo vào dependency tree
go mod why github.com/pkg/errors
# In sơ đồ quan hệ giữa các module đang sử dụng
go mod graph
# Ghi đè phiên bản Go runtime được yêu cầu trong file mô tả
go mod edit -go=1.21
Quản lý vòng đời cài đặt và dọn dẹp:
# Kéo gói mới hoặc nâng cấp lên bản mới nhất
go get -u github.com/sirupsen/logrus
# Gắn cứng phiên bản cụ thể
go get github.com/go-playground/validator@v10.15.0
# Loại bỏ gói không còn tham chiếu và đồng bộ go.sum
go mod tidy
# Xóa toàn bộ thư viện đã tải về trong bộ đệm cục bộ
go clean --modcache
# Liệt kê toàn bộ module đang được khai báo
go list -m all
Cấu hình Nginx phục vụ ứng dụng Go
Nginx đóng vai trò máy chủ biên nhận yêu cầu, phân phối tài nguyên tĩnh và chuyển tiếp logic động đến backend. Hai phương án cấu hình tối ưu được trình bày bên dưới.
Phương án A: Phân phối file tĩnh theo phần mở rộng
Phù hợp khi tài nguyên được phân tán đa dạng trong cấu trúc thư mục.
server {
listen 80;
server_name app.example.com;
access_log /var/log/nginx/app_access.log combined;
error_log /var/log/nginx/app_error.log warn;
# Áp dụng cache cho các định dạng tài nguyên phổ biến
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2|ttf)$ {
access_log off;
expires 7d;
root /opt/application/public;
try_files $uri @upstream_handler;
}
# Định tuyến yêu cầu gốc
location / {
try_files $uri @upstream_handler;
}
# Proxy ngược đến runtime Go
location @upstream_handler {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Phương án B: Phân phối file tĩnh theo thư mục cố định
Tách biệt rõ ràng giữa tài nguyên frontend và API backend, giúp tối ưu hóa bảo mật và quản lý cache.
server {
listen 80;
server_name api.company.net;
access_log /var/log/nginx/api_access.log combined;
error_log /var/log/nginx/api_error.log warn;
# Định tuyến trực tiếp đến thư mục assets chuyên dụng
location ^~ /static/ {
access_log off;
expires 30d;
add_header Cache-Control "public, immutable";
root /opt/application;
try_files $uri @upstream_handler;
}
# Giao diện gốc và endpoint động
location / {
try_files $uri @upstream_handler;
}
# Proxy ngược đến runtime Go
location @upstream_handler {
proxy_pass http://localhost:9090;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}