Bạn đang tìm kiếm một hướng dẫn thực tế về cách cài đặt MinIO trên Ubuntu 24.04 và cấu hình Nginx làm frontend proxy? Trong bài viết này, chúng ta sẽ cùng thiết lập máy chủ lưu trữ đối tượng (object storage server) MinIO trên máy Linux Ubuntu, chạy phía sau Nginx.
MinIO là một giải pháp lưu trữ cung cấp API tương thích hoàn toàn với Amazon S3 và hỗ trợ tất cả các tính năng cốt lõi của S3. Phần mềm này có thể được cài đặt trên private cloud (đám mây riêng), public cloud (đám mây công cộng) và thậm chí là trong các thiết lập cơ sở hạ tầng biên (edge infrastructure). Sản phẩm được phát hành dưới dạng giấy phép kép: GNU 3.0 và Giấy phép Thương mại MinIO.
Mặc dù chúng ta sẽ thực hiện cài đặt MinIO trên máy chủ Linux Ubuntu, quy trình tương tự cũng có thể áp dụng cho bất kỳ biến thể Linux dựa trên Debian nào khác vì gói minio được phân phối dưới dạng một tệp thực thi (binary).
Trong hướng dẫn này, địa chỉ IP của máy chủ MinIO là 103.110.85.111 và tên miền được sử dụng là minio.phongdinh.info.vn.
1. Tải xuống tệp thực thi (binary) MinIO
Các bước dưới đây áp dụng cho cả hệ thống sử dụng chip Intel và ARM. Hãy tải xuống bản phát hành binary mới nhất:
- Dành cho bộ xử lý Intel / AMD 64-bit:
wget https://dl.min.io/server/minio/release/linux-amd64/minio
- Dành cho bộ xử lý ARM 64-bit:
wget https://dl.min.io/server/minio/release/linux-arm64/minioSau khi tải xuống, hãy cấp quyền thực thi cho tệp bằng lệnh chmod:
chmod +x minio
Tiếp theo, hãy di chuyển tệp vào thư mục nằm trong biến môi trường PATH của bạn để có thể gọi lệnh từ bất cứ đâu:
sudo mv minio /usr/local/bin/
Kiểm tra xem phần mềm đã hoạt động chưa bằng cách xem phiên bản:
root@phongdh:~# minio --version
minio version RELEASE.2025-09-07T16-13-09Z (commit-id=07c3a429bfed433e49018cb0f78a52145d4bedeb)
Runtime: go1.24.6 linux/amd64
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Copyright: 2015-2025 MinIO, Inc.
2. Cấu hình Máy chủ MinIO (Mô hình Single Node)
Đây là thiết lập cấu hình máy chủ lưu trữ MinIO trên một node duy nhất (single node). Sau khi tải xuống tệp thực thi, hãy tạo các thư mục để MinIO lưu trữ dữ liệu. Thông thường, đây nên là một ổ đĩa cứng chuyên dụng (ví dụ: thiết bị RAID) có khả năng tồn tại và an toàn dữ liệu ngay cả khi hệ điều hành gặp sự cố.
Trong ví dụ này, chúng tôi sử dụng thư mục /data/minio cho dữ liệu và /etc/minio cho các tệp cấu hình.
sudo mkdir -p /data/minio /etc/minio
Tạo một tài khoản người dùng hệ thống (system user) để cấp quyền sở hữu các thư mục này và dùng để chạy dịch vụ systemd. Đặt thư mục gốc (home directory) cho người dùng này trỏ về thư mục vừa tạo.
sudo useradd --system --shell /sbin/nologin --home-dir /data/minio minio
Thiết lập quyền sở hữu cho người dùng minio:
sudo chown -R minio:minio /data/minio /etc/minio
Tạo tệp systemd service (unit file) cho dịch vụ MinIO:
sudo vi /etc/systemd/system/minio.serviceThêm đoạn cấu hình sau vào tệp:
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
AssertFileNotEmpty=/etc/default/minio
[Service]
Type=notify
WorkingDirectory=/usr/local/
User=minio
Group=minio
ProtectProc=invisible
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# Để systemd luôn tự động khởi động lại dịch vụ này
Restart=always
# Chỉ định số lượng bộ mô tả tệp (file descriptor) tối đa có thể được mở bởi tiến trình này
LimitNOFILE=1048576
# Chỉ định số lượng luồng (threads) tối đa mà tiến trình này có thể tạo
TasksMax=infinity
# Vô hiệu hóa logic hết giờ (timeout) và đợi cho đến khi tiến trình dừng hoàn toàn
TimeoutSec=infinity
# Ngăn chặn kernel OOM killer tiêu diệt MinIO khi đầy RAM
OOMScoreAdjust=-1000
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
Chúng ta cũng cần tạo một tệp cấu hình môi trường /etc/default/minio chứa tên người dùng và mật khẩu:
sudo vi /etc/default/minioThiết lập tên người dùng (admin), mật khẩu, và đường dẫn thư mục dữ liệu:
# MINIO_ROOT_USER và MINIO_ROOT_PASSWORD thiết lập tài khoản gốc (root/admin) cho máy chủ MinIO.
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=Str0ngAdmP@ssw0rD
# MINIO_VOLUMES chỉ định volume lưu trữ hoặc đường dẫn thư mục cho MinIO.
MINIO_VOLUMES="/data/minio"
# Địa chỉ Listen của máy chủ - Dành cho API và Console
MINIO_OPTS="-C /etc/minio --address :9000 --console-address :9001"
MINIO_SERVER_URL="https://minio.phongdinh.info.vn"
MINIO_BROWSER_REDIRECT_URL="https://minio.phongdinh.info.vn/minio/ui"
Lưu ý: Port :9000 và :9001 sẽ mở các dịch vụ ra IP công cộng. Đối với việc truy cập cục bộ (local access) trong cùng một máy chủ, đặc biệt nếu bạn dùng Nginx ở phía trước, hãy đặt địa chỉ API và console lần lượt thành 127.0.0.1:9000 và 127.0.0.1:9001 để bảo mật tốt hơn. Đừng quên thay thế /data/minio bằng thư mục dữ liệu thực tế của bạn nếu cần.
Tải lại cấu hình systemd và khởi chạy dịch vụ MinIO. Kiểm tra trạng thái để đảm bảo dịch vụ đang chạy:
sudo systemctl daemon-reload
sudo systemctl enable --now minio
sudo systemctl status minio
Thiết lập này sẽ khởi chạy MinIO như một dịch vụ nền (background service) trên cổng 9000 (cho API) và cổng 9001 (cho Web Console).
3. Truy cập Bảng điều khiển Web MinIO (Web Console)
Mở trình duyệt web của bạn và truy cập địa chỉ URL http://<IP_May_Chu>:9000, hệ thống sẽ tự động chuyển hướng bạn đến trang đăng nhập.
Sử dụng thông tin đăng nhập mà bạn vừa khai báo trong tệp /etc/default/minio (ví dụ: user: admin / pass: Str0ngAdmP@ssw0rD) để truy cập.

Sau khi đăng nhập thành công, bạn sẽ thấy giao diện Bảng điều khiển MinIO. Tại đây, bạn có thể thực hiện hầu hết các tác vụ quản trị, tạo bucket, cấp quyền,… đối với máy chủ MinIO.

4. Cấu hình Nginx Proxy cho MinIO (Tùy chọn)
Nếu bạn muốn cấu hình Nginx đứng trước MinIO để ẩn port cũng như hỗ trợ SSL, hãy cài đặt Nginx nếu máy chủ chưa có:
sudo apt install nginx
Tiếp theo, tạo tệp cấu hình Virtual Host Nginx cho MinIO:
sudo vi /etc/nginx/sites-available/minio.confThêm và điều chỉnh nội dung bên dưới (thay đổi IP và Domain tương ứng):
Hãy nhớ thay thế DOMAIN-CUA-BAN bằng tên miền (domain/sub-domain) thực tế của bạn, và IP_SERVER bằng địa chỉ IP máy chủ của bạn.
upstream minio_s3 {
least_conn;
server IP_SERVER:9000;
}
upstream minio_console {
least_conn;
server IP_SERVER:9001;
}
server {
listen 80;
server_name DOMAIN-CUA-BAN;
# Cho phép các ký tự đặc biệt trong headers
ignore_invalid_headers off;
# Cho phép tải lên các tệp có kích thước bất kỳ.
# Thay giá trị 0 thành ví dụ 1000m; nếu muốn giới hạn ở mức 1000 MB.
client_max_body_size 0;
# Tắt buffering proxy
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
# Mặc định là HTTP/1, tuy nhiên keepalive chỉ được bật trong HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://minio_s3; # Load balance thông qua upstream
}
location /minio/ui/ {
rewrite ^/minio/ui/(.*) /$1 break;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
# Rất cần thiết để pass đúng IP tĩnh khi hash
real_ip_header X-Real-IP;
proxy_connect_timeout 300;
# Để hỗ trợ websocket cho các phiên bản MinIO sau tháng 1/2023
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Một số môi trường có thể bị lỗi CORS (VD: Kubernetes + Nginx Ingress)
# Hãy bỏ chú thích dòng dưới để set header Origin thành chuỗi rỗng:
# proxy_set_header Origin '';
chunked_transfer_encoding off;
proxy_pass http://minio_console; # Load balance thông qua upstream
}
}

Kích hoạt trang web MinIO trên Nginx:
sudo ln -s /etc/nginx/sites-available/minio.conf /etc/nginx/sites-enabled/
Kiểm tra cú pháp cấu hình Nginx có hợp lệ không:
root@phongdh:~# sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Khởi động lại dịch vụ Nginx để áp dụng thay đổi. Kiểm tra trạng thái Nginx:
sudo systemctl restart nginx
sudo systemctl status nginx
Truy cập Web Console thông qua Nginx
Tên miền bạn đã dùng để cấu hình trong Nginx (ví dụ minio.phongdinh.info.vn) cần phải được trỏ bản ghi A (A Record) từ máy chủ DNS về đúng IP máy chủ MinIO. Với môi trường thử nghiệm ở local (máy tính cá nhân), bạn chỉ cần mở tệp /etc/hosts và thêm dòng ánh xạ IP với tên miền ảo của bạn như sau:
192.168.20.11 minio.example.comBây giờ bạn đã có thể truy cập thẳng bảng điều khiển web thông qua HTTP bằng tên miền trên trình duyệt http://<ten_mien_cua_ban>.

Cài đặt SSL cho hostname truy cập Minio
Bước 1: Cài đặt Certbot và Nginx plugin
Đầu tiên, bạn cần cập nhật danh sách gói phần mềm và cài đặt công cụ Certbot cùng với plugin dành riêng cho Nginx.
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
Bước 2: Cho phép HTTPS qua tường lửa (Nếu có dùng UFW)
Nếu máy chủ của bạn đang bật tường lửa UFW, bạn cần đảm bảo đã mở cổng cho HTTPS.
sudo ufw allow 'Nginx Full'
(Lệnh này sẽ mở cả port 80 (HTTP) và 443 (HTTPS) cho Nginx).
Bước 3: Kích hoạt SSL bằng Certbot
Bây giờ, bạn chạy lệnh sau để Certbot tự động xin cấp phát chứng chỉ và cấu hình thẳng vào file Nginx của bạn.
Lưu ý: Hãy thay minio.phongdinh.info.vn bằng tên miền thực tế của bạn (tên miền mà bạn đã trỏ về IP và đã cấu hình trong mục server_name ở file /etc/nginx/sites-available/minio.conf).
sudo certbot --nginx -d minio.phongdinh.info.vnTrong quá trình chạy, hệ thống sẽ hỏi bạn một số thông tin:
- Enter email address: Nhập địa chỉ email của bạn để nhận thông báo khi SSL sắp hết hạn.
- Terms of Service: Nhấn
YvàEnterđể đồng ý với điều khoản dịch vụ. - Share email: Nhấn
YhoặcNtùy ý (chia sẻ email với tổ chức EFF). - Redirect: Nếu Certbot hỏi bạn có muốn tự động chuyển hướng (Redirect) tất cả traffic từ HTTP sang HTTPS hay không, hãy chọn tùy chọn 2 (Redirect). Việc này đảm bảo mọi truy cập đều an toàn.

Bước 4: Kiểm tra lại cấu hình và khởi động lại Nginx
Certbot thường sẽ tự động tải lại Nginx, nhưng để chắc chắn mọi thứ hoạt động trơn tru, bạn nên kiểm tra lại cú pháp cấu hình:
sudo nginx -t
Nếu kết quả báo syntax is ok và test is successful, hãy khởi động lại Nginx:
sudo systemctl restart nginx
sudo systemctl status nginx
Bước 5: Kiểm tra gia hạn tự động (Auto-renewal)
Chứng chỉ Let’s Encrypt có thời hạn 90 ngày, nhưng Certbot đã tự động tạo một lịch trình (cron job/systemd timer) để tự động gia hạn trước khi hết hạn. Bạn có thể kiểm tra xem tính năng gia hạn tự động có hoạt động đúng không bằng lệnh giả lập:
sudo certbot renew --dry-runNếu lệnh chạy mà không báo lỗi gì, bạn hoàn toàn có thể yên tâm sử dụng mà không cần lo việc cấp lại SSL thủ công sau này.

Kiểm tra thành quả:
Bây giờ, hãy mở trình duyệt và truy cập vào tên miền của bạn: https://minio.tenmien.com. Bạn sẽ thấy biểu tượng ổ khóa an toàn hiển thị cạnh thanh địa chỉ, và kết nối tới bảng điều khiển của MinIO giờ đây đã được mã hóa hoàn toàn!

