Cài đặt ban đầu máy chủ Ubuntu: 9 bước bắt đầu trên máy chủ Ubuntu mới cài đặt
Khi nhận một máy chủ mới, bạn thực hiện cài đặt ban đầu máy chủ Ubuntu một lần trước khi đưa bất kỳ dịch vụ nào lên. Trên máy chủ Ubuntu 24.04 tạo tại DigitalOcean, chúng tôi kết nối bằng root rồi lần lượt thiết lập từ cập nhật gói, người dùng sudo, đăng nhập bằng khóa, tường lửa, múi giờ, cập nhật bảo mật tự động cho đến swap, và xác nhận các thiết lập vẫn còn nguyên sau khi khởi động lại.
Các ô kết quả bên dưới là đầu ra khi chạy các lệnh theo thứ tự này. IP máy chủ 203.0.113.10 là giá trị ví dụ, và người dùng thường mới tạo được đặt tên là deploy.
1️⃣ Cập nhật gói Ubuntu
Ngay cả máy chủ vừa tạo cũng có sẵn các bản cập nhật chờ cài. Sau khi tải danh sách gói mới, hãy kiểm tra những gì sẽ thay đổi trước khi thực sự cài đặt.
🔲 apt-get update
export DEBIAN_FRONTEND=noninteractiveCác lệnh apt-get bên dưới được chạy sau khi đặt giá trị này trước. Khi có giá trị này, trong lúc cài gói sẽ không hiện cửa sổ hỏi thiết lập và câu trả lời mặc định được áp dụng.
apt-get updateHit:1 http://mirrors.digitalocean.com/ubuntu noble InRelease
Hit:2 http://mirrors.digitalocean.com/ubuntu noble-updates InRelease
Hit:3 http://mirrors.digitalocean.com/ubuntu noble-backports InRelease
Hit:4 https://repos-droplet.digitalocean.com/apt/droplet-agent main InRelease
Hit:5 http://security.ubuntu.com/ubuntu noble-security InRelease
Reading package lists...🔲 apt-get -s upgrade
apt-get -s upgradeCalculating upgrade...
The following upgrades have been deferred due to phasing:
libsqlite3-0
The following packages will be upgraded:
apt apt-transport-https apt-utils bind9-dnsutils bind9-host bind9-libs
cloud-init distro-info-data gir1.2-glib-2.0 git git-man libapt-pkg6.0t64
libbrotli1 libglib2.0-0t64 libglib2.0-bin libglib2.0-data liblzma5
libmspack0t64 libpcre2-8-0 python3-jwt python3-twisted tmux
ubuntu-pro-client ubuntu-pro-client-l10n xz-utils zlib1g
26 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.Tùy chọn -s là chạy thử, chỉ tính kết quả mà không cài gì. Trên máy chủ này có 26 gói cần nâng cấp, và libsqlite3-0 bị bỏ ra khỏi lần nâng cấp này với [deferred due to phasing]. Số gói khác nhau giữa các máy chủ tùy thời điểm tạo máy chủ và image được dùng.
🔲 apt-get -y upgrade
apt-get -y upgrade26 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Need to get 15.4 MB of archives.
After this operation, 398 kB of additional disk space will be used.Khi cài đặt xong, danh sách các dịch vụ được khởi động lại sẽ hiện tiếp theo.
Running kernel seems to be up-to-date.
Restarting services...
/etc/needrestart/restart.d/systemd-manager
systemctl restart cron.service fwupd.service multipathd.service packagekit.service polkit.service ssh.service systemd-journald.service systemd-networkd.service systemd-resolved.service systemd-timesyncd.service systemd-udevd.service udisks2.service
Service restarts being deferred:
systemctl restart ModemManager.service
/etc/needrestart/restart.d/dbus.service
systemctl restart systemd-logind.service
systemctl restart unattended-upgrades.serviceKhi một bản cập nhật cần khởi động lại được cài, tệp /var/run/reboot-required sẽ được tạo. Lần này hiện [Running kernel seems to be up-to-date.] và tệp đó cũng không được tạo, nên chúng tôi chuyển sang bước tiếp theo mà không khởi động lại.
2️⃣ Thêm người dùng Ubuntu và quyền sudo
Công việc hằng ngày làm bằng người dùng thường, và chỉ chạy lệnh quản trị bằng sudo. sudo nâng quyền bằng mật khẩu của chính bạn thay vì mật khẩu root, nên lưu lại được ai đã chạy lệnh nào.
🔲 adduser deploy
adduser deployinfo: Adding user `deploy' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `deploy' (1000) ...
info: Adding new user `deploy' (1000) with group `deploy (1000)' ...
info: Creating home directory `/home/deploy' ...
info: Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for deploy
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
info: Adding new user `deploy' to supplemental / extra groups `users' ...
info: Adding user `deploy' to group `users' ...adduser là công cụ bao quanh useradd; công cụ này tạo thư mục home và nhóm, sau đó lần lượt hỏi mật khẩu và thông tin người dùng. Mật khẩu không hiện trên màn hình khi gõ, còn các thông tin như tên và số điện thoại có thể để trống bằng Enter.
🔲 usermod -aG sudo deploy
usermod -aG sudo deploygroups deploydeploy : deploy sudo users🔲 su
Người dùng trong nhóm sudo có thể chạy lệnh quản trị bằng sudo. Chuyển sang tài khoản deploy bằng su và kiểm tra quyền.
su - deployTo run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.whoamideploysudo whoami[sudo] password for deploy:
rootexitKhi thêm sudo, hệ thống hỏi mật khẩu của deploy, và nếu đúng thì lệnh chạy với quyền root.
3️⃣ Đăng ký khóa SSH cho người dùng mới
Ban đầu chỉ root có khóa SSH được đăng ký, nên deploy chưa đăng nhập bằng khóa được. Hãy sao chép authorized_keys của root vào thư mục home của deploy.
🔲 install -o deploy -g deploy
install -d -m 700 -o deploy -g deploy /home/deploy/.sshinstall -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keysls -la /home/deploy/.sshtotal 12
drwx------ 2 deploy deploy 4096 Nov 5 11:48 .
drwxr-x--- 3 deploy deploy 4096 Nov 5 11:48 ..
-rw------- 1 deploy deploy 100 Nov 5 11:48 authorized_keysinstall tạo thư mục, sao chép tệp và đặt chủ sở hữu cùng quyền trong một lần. sshd kiểm tra quyền và chủ sở hữu của các tệp người dùng trước khi chấp nhận đăng nhập (StrictModes), nên đặt thư mục .ssh là 700 và authorized_keys là 600.
🔲 ssh deploy@203.0.113.10
Đừng đóng cửa sổ root đang mở; trước hết hãy kiểm tra trong cửa sổ terminal mới xem có kết nối được bằng deploy không.
ssh deploy@203.0.113.10whoamideploy4️⃣ Chặn đăng nhập root qua SSH
Trên Ubuntu 24.04, dòng Include ở đầu sshd_config tải trước các tệp trong thư mục /etc/ssh/sshd_config.d/, và với cùng một mục thì giá trị được đọc trước sẽ được áp dụng. Vì vậy, trước khi đổi thiết lập, hãy kiểm tra giá trị đang áp dụng và tệp chứa giá trị đó.
/etc/ssh└─ sshd_config trên cùng: Include /etc/ssh/sshd_config.d/*.conf ├─ ① sshd_config.d/50-cloud-init.conf PasswordAuthentication no ├─ ② sshd_config.d/60-cloudimg-settings.conf PasswordAuthentication no └─ ③ sshd_config dòng 42 PermitRootLogin yes → no
🔲 sshd -T
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) 'permitrootlogin yes
passwordauthentication nosudo grep -rn 'PasswordAuthentication' /etc/ssh/sshd_config.d//etc/ssh/sshd_config.d/60-cloudimg-settings.conf:1:PasswordAuthentication no
/etc/ssh/sshd_config.d/50-cloud-init.conf:1:PasswordAuthentication noĐăng nhập bằng mật khẩu đã bị tắt sẵn ở hai tệp trong sshd_config.d, nên thứ cần đổi chỉ là một dòng đăng nhập root trong tệp chính.
🔲 sed -i PermitRootLogin
sudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config42:PermitRootLogin yessudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_configsudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config42:PermitRootLogin no🔲 systemctl reload ssh
sudo sshd -tsudo systemctl reload sshsudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) 'permitrootlogin no
passwordauthentication nosshd -t kiểm tra cú pháp thiết lập, và nếu không có gì hiện ra thì không có lỗi. Sau khi tải lại, hãy xác nhận trong cửa sổ mới rằng kết nối deploy vẫn hoạt động, rồi thử kết nối bằng root để thấy bị từ chối.
ssh root@203.0.113.10root@203.0.113.10: Permission denied (publickey).Dù khóa đúng cũng không vào được bằng root; việc quản trị được làm bằng cách kết nối với deploy và dùng sudo.
5️⃣ Tường lửa Ubuntu ufw
ufw là công cụ tường lửa mặc định của Ubuntu nhưng ban đầu ở trạng thái tắt. Ngay khi bật, mọi kết nối không được phép sẽ bị chặn, nên hãy thêm quy tắc cho phép SSH trước và bật sau cùng.
sudo ufw status verboseStatus: inactive🔲 ufw allow OpenSSH
sudo ufw app listAvailable applications:
OpenSSHsudo ufw allow OpenSSHRules updated
Rules updated (v6)sudo ufw allow 80/tcpRules updated
Rules updated (v6)sudo ufw allow 443/tcpRules updated
Rules updated (v6)sudo ufw show addedAdded user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcpOpenSSH là profile mở cổng 22, còn 80 và 443 là các cổng dùng cho máy chủ web. Quy tắc được thêm cho cả IPv4 và IPv6.
🔲 ufw enable
sudo ufw enableCommand may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupsudo ufw status verboseStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6) Kết nối đến bị chặn theo mặc định, chỉ ba cổng được phép là mở, và tường lửa cũng bật khi khởi động. Sau khi bật, hãy kết nối lại bằng deploy trong cửa sổ mới và kiểm tra số thứ tự quy tắc.
sudo ufw status numberedStatus: active
To Action From
-- ------ ----
[ 1] OpenSSH ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] OpenSSH (v6) ALLOW IN Anywhere (v6)
[ 5] 80/tcp (v6) ALLOW IN Anywhere (v6)
[ 6] 443/tcp (v6) ALLOW IN Anywhere (v6) 6️⃣ Cài đặt múi giờ Ubuntu
Múi giờ ban đầu là Etc/UTC. Để thời gian trong log và các tác vụ đặt lịch khớp với khu vực của máy chủ, máy chủ này tạo ở khu vực Singapore nên được đặt thành Asia/Singapore.
timedatectl Local time: Thu 2026-11-05 12:00:31 UTC
Universal time: Thu 2026-11-05 12:00:31 UTC
RTC time: Thu 2026-11-05 12:00:31
Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no🔲 timedatectl list-timezones
timedatectl list-timezones | grep SingaporeAsia/Singapore🔲 timedatectl set-timezone
sudo timedatectl set-timezone Asia/Singaporetimedatectl Local time: Thu 2026-11-05 20:00:32 +08
Universal time: Thu 2026-11-05 12:00:32 UTC
RTC time: Thu 2026-11-05 12:00:32
Time zone: Asia/Singapore (+08, +0800)
System clock synchronized: yes
NTP service: active
RTC in local TZ: noChỉ hai dòng Local time và Time zone thay đổi; đồng bộ đồng hồ (NTP) và giờ UTC vẫn giữ nguyên.
7️⃣ unattended upgrades: cập nhật bảo mật tự động
Ubuntu tự động cài cập nhật bảo mật bằng gói unattended-upgrades, và gói này đã được cài và bật sẵn từ đầu. Vì vậy ở bước này, bạn kiểm tra xem nó có đang bật không và nó tự động cài những gì.
🔲 dpkg-query -W
dpkg-query -W unattended-upgradesunattended-upgrades 2.9.1+nmu4ubuntu1systemctl is-enabled unattended-upgrades apt-daily.timer apt-daily-upgrade.timerenabled
enabled
enabled🔲 cat 20auto-upgrades
cat /etc/apt/apt.conf.d/20auto-upgradesAPT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";Số 1 trong hai giá trị nghĩa là mỗi ngày một lần, và đổi thành 0 thì cập nhật tự động sẽ tắt. Những gì được cài do tệp 50unattended-upgrades quyết định.
grep -vE '^[[:space:]]*(//|$)' /etc/apt/apt.conf.d/50unattended-upgradesUnattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESM:${distro_codename}-infra-security";
};
Unattended-Upgrade::Package-Blacklist {
};
Unattended-Upgrade::DevRelease "auto";Trong các nguồn được phép có -security nhưng không có -updates, nên cập nhật thường không được cài tự động mà chỉ cập nhật bảo mật được cài. Để nhận cả cập nhật thường một cách tự động, hãy bỏ chú thích dòng -updates trong tệp này.
🔲 unattended-upgrade
sudo unattended-upgrade --dry-run --debugStarting unattended upgrades script
Allowed origins are: o=Ubuntu,a=noble, o=Ubuntu,a=noble-security, o=UbuntuESMApps,a=noble-apps-security, o=UbuntuESM,a=noble-infra-securityĐây là hai dòng cuối của cùng một lần chạy.
No packages found that can be upgraded unattended and no pending auto-removals
The list of kept packages can't be calculated in dry-run mode.--dry-run chỉ tính những gì cập nhật tự động sẽ làm mà không cài gì. Vì đã cập nhật gói xong, kết quả cho thấy không có gói nào cần cài tự động. Nhật ký các lần chạy thật được lưu trong thư mục /var/log/unattended-upgrades/.
sudo ls -l /var/log/unattended-upgrades/total 32
-rw-r--r-- 1 root root 0 Nov 5 20:00 unattended-upgrades-dpkg.log
-rw-r--r-- 1 root root 0 Nov 5 17:34 unattended-upgrades-shutdown.log
-rw-r--r-- 1 root root 29093 Nov 5 20:04 unattended-upgrades.log8️⃣ Cài đặt bộ nhớ swap Ubuntu
Máy chủ này có bộ nhớ 1GB và ban đầu swap là 0. Trước khi đưa ứng dụng lên, hãy tạo tệp swap 2GB và đăng ký vào /etc/fstab để nó vẫn bật sau khi khởi động lại.
free -h total used free shared buff/cache available
Mem: 961Mi 328Mi 161Mi 4.0Mi 631Mi 633Mi
Swap: 0B 0B 0Bdf -h /Filesystem Size Used Avail Use% Mounted on
/dev/vda1 24G 2.0G 22G 9% /🔲 fallocate -l 2G /swapfile
sudo fallocate -l 2G /swapfilesudo chmod 600 /swapfilels -lh /swapfile-rw------- 1 root root 2.0G Nov 5 20:04 /swapfile🔲 mkswap /swapfile
sudo mkswap /swapfileSetting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=0b43ccd8-5b4a-4048-9b84-eee12667b387🔲 swapon /swapfile
sudo swapon /swapfileswapon --showNAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2free -h total used free shared buff/cache available
Mem: 961Mi 328Mi 160Mi 4.0Mi 632Mi 632Mi
Swap: 2.0Gi 0B 2.0Gi🔲 tee -a /etc/fstab
swapon chỉ bật ngay lúc này; để nó vẫn bật sau khi khởi động lại, hãy thêm một dòng vào fstab.
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab/swapfile none swap sw 0 09️⃣ Kiểm tra cài đặt ban đầu máy chủ Ubuntu
Khi đã xác nhận các thiết lập vẫn còn sau khi khởi động lại, việc cài đặt ban đầu Ubuntu hoàn tất.
🔲 systemctl reboot
sudo systemctl reboot🔲 uptime -p
Sau khi khởi động lại, hãy kết nối lại bằng deploy.
uptime -pup 2 minutesswapon --showNAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) 'permitrootlogin no
passwordauthentication nosudo ufw status verboseStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6) timedatectl | head -n 4 Local time: Thu 2026-11-05 20:06:35 +08
Universal time: Thu 2026-11-05 12:06:35 UTC
RTC time: Thu 2026-11-05 12:06:35
Time zone: Asia/Singapore (+08, +0800)systemctl is-active unattended-upgrades ssh.socketactive
activeSwap, thiết lập SSH, tường lửa, múi giờ và cập nhật tự động đều giống như trước khi khởi động lại. Tiếp theo, máy chủ này sẽ chạy một ứng dụng Node.js với PM2 và Nginx.
🔢 FAQ & nội dung đề xuất
Thiết lập SSH
Thiết lập SSH - chức năng và thiết lập của tệp /etc/ssh/sshd_config
Bài viết về các mục trong sshd_config thường được thay đổi ngoài PermitRootLogin và ý nghĩa của chúng.
Swap
Cài đặt bộ nhớ swap (Swap Memory): 2 cách, phân vùng & tệp
Bài viết về cách tạo swap trên phân vùng thay vì tệp swap, cùng các lệnh swapon và mkswap.
Gói
[Ubuntu] Lệnh apt | Cách dùng và khác biệt với lệnh apt-get
Bài viết về khác biệt giữa apt và apt-get, cùng các lệnh cài đặt và gỡ gói.
ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.