การตั้งค่าเริ่มต้นเซิร์ฟเวอร์ Ubuntu: 9 ขั้นตอนเริ่มต้นบนเซิร์ฟเวอร์ Ubuntu ที่เพิ่งติดตั้ง
เมื่อได้เซิร์ฟเวอร์ใหม่ คุณจะทำการตั้งค่าเริ่มต้นเซิร์ฟเวอร์ Ubuntu หนึ่งครั้งก่อนนำบริการใดๆ ขึ้นไป บนเซิร์ฟเวอร์ Ubuntu 24.04 ที่สร้างใน DigitalOcean เราเชื่อมต่อด้วย root แล้วตั้งค่าตามลำดับตั้งแต่อัปเดตแพ็กเกจ ผู้ใช้ sudo การล็อกอินด้วยคีย์ ไฟร์วอลล์ เขตเวลา การอัปเดตความปลอดภัยอัตโนมัติ ไปจนถึง swap และตรวจสอบว่าการตั้งค่ายังคงอยู่หลังรีบูต
กล่องผลลัพธ์ด้านล่างคือเอาต์พุตจากการรันคำสั่งตามลำดับนี้ IP ของเซิร์ฟเวอร์ 203.0.113.10 เป็นค่าตัวอย่าง และผู้ใช้ทั่วไปที่สร้างใหม่ตั้งชื่อว่า deploy
1️⃣ อัปเดตแพ็กเกจ Ubuntu
แม้แต่เซิร์ฟเวอร์ที่เพิ่งสร้างก็มีอัปเดตรอติดตั้งอยู่ หลังจากดาวน์โหลดรายการแพ็กเกจใหม่แล้ว ให้ตรวจดูก่อนว่าอะไรจะเปลี่ยนก่อนติดตั้งจริง
🔲 apt-get update
export DEBIAN_FRONTEND=noninteractiveคำสั่ง apt-get ด้านล่างรันหลังจากตั้งค่านี้ไว้ก่อน เมื่อตั้งค่านี้ไว้ ระหว่างติดตั้งแพ็กเกจจะไม่มีหน้าต่างถามการตั้งค่าขึ้นมา และจะใช้คำตอบเริ่มต้น
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.ตัวเลือก -s คือการจำลองที่คำนวณเฉพาะผลลัพธ์โดยไม่ติดตั้งอะไร บนเซิร์ฟเวอร์นี้มีแพ็กเกจที่จะอัปเกรด 26 รายการ และ libsqlite3-0 หนึ่งรายการถูกข้ามในการอัปเกรดครั้งนี้ด้วย [deferred due to phasing] จำนวนแพ็กเกจจะต่างกันในแต่ละเซิร์ฟเวอร์ตามช่วงเวลาที่สร้างเซิร์ฟเวอร์และอิมเมจที่ใช้
🔲 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.เมื่อติดตั้งเสร็จ จะมีรายการบริการที่รีสตาร์ตตามมา
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.serviceเมื่อมีการติดตั้งอัปเดตที่ต้องรีบูต จะมีไฟล์ /var/run/reboot-required เกิดขึ้น ครั้งนี้ขึ้น [Running kernel seems to be up-to-date.] และไม่มีไฟล์นั้นเกิดขึ้น จึงไปขั้นตอนถัดไปโดยไม่ต้องรีบูต
2️⃣ เพิ่มผู้ใช้ Ubuntu และสิทธิ์ sudo
งานประจำวันทำด้วยผู้ใช้ทั่วไป และรันเฉพาะคำสั่งดูแลระบบด้วย sudo เนื่องจาก sudo ยกระดับสิทธิ์ด้วยรหัสผ่านของคุณเองแทนรหัสผ่าน root จึงมีบันทึกว่าใครรันคำสั่งใด
🔲 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 เป็นเครื่องมือที่ครอบ useraddไว้ โดยจะสร้างโฟลเดอร์โฮมและกลุ่ม แล้วถามรหัสผ่านและข้อมูลผู้ใช้ตามลำดับ รหัสผ่านจะไม่แสดงบนหน้าจอขณะพิมพ์ และข้อมูลอย่างชื่อหรือหมายเลขโทรศัพท์สามารถเว้นว่างได้ด้วย Enter
🔲 usermod -aG sudo deploy
usermod -aG sudo deploygroups deploydeploy : deploy sudo users🔲 su
ผู้ใช้ในกลุ่ม sudo สามารถรันคำสั่งดูแลระบบด้วย sudo ได้ สลับไปที่บัญชี deploy ด้วย su แล้วตรวจสอบสิทธิ์
su - deployTo run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.whoamideploysudo whoami[sudo] password for deploy:
rootexitเมื่อใส่ sudo จะมีการถามรหัสผ่านของ deploy และถ้าถูกต้อง คำสั่งจะรันด้วยสิทธิ์ root
3️⃣ ลงทะเบียนคีย์ SSH ของผู้ใช้ใหม่
ตอนแรกมีคีย์ SSH ลงทะเบียนไว้เฉพาะ root จึงล็อกอินด้วยคีย์ในชื่อ deploy ไม่ได้ ให้คัดลอก authorized_keys ของ root ไปยังโฟลเดอร์โฮมของ 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 จัดการทั้งการสร้างโฟลเดอร์ การคัดลอก และการกำหนดเจ้าของกับสิทธิ์ในครั้งเดียว sshd จะตรวจสิทธิ์และเจ้าของไฟล์ของผู้ใช้ก่อนรับการล็อกอิน (StrictModes) จึงตั้งโฟลเดอร์ .ssh เป็น 700 และ authorized_keys เป็น 600
🔲 ssh deploy@203.0.113.10
อย่าปิดหน้าต่าง root ที่เปิดอยู่ ให้ตรวจในหน้าต่างเทอร์มินัลใหม่ก่อนว่าเชื่อมต่อในชื่อ deploy ได้หรือไม่
ssh deploy@203.0.113.10whoamideploy4️⃣ ปิดกั้นการล็อกอิน root ทาง SSH
ใน Ubuntu 24.04 บรรทัด Include ด้านบนสุดของ sshd_config จะโหลดไฟล์ในโฟลเดอร์ /etc/ssh/sshd_config.d/ ก่อน และสำหรับรายการเดียวกันจะใช้ค่าที่อ่านก่อน ดังนั้นก่อนเปลี่ยนการตั้งค่า ให้ตรวจค่าที่ใช้อยู่ตอนนี้และไฟล์ที่มีค่านั้นก่อน
/etc/ssh└─ sshd_config ด้านบนสุด: 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 บรรทัด 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การล็อกอินด้วยรหัสผ่านถูกปิดไว้แล้วในสองไฟล์ภายใน sshd_config.d สิ่งที่ต้องเปลี่ยนมีเพียงบรรทัดล็อกอิน root หนึ่งบรรทัดในไฟล์หลัก
🔲 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 ตรวจไวยากรณ์ของการตั้งค่า และถ้าไม่มีอะไรแสดงออกมาแสดงว่าไม่มีข้อผิดพลาด หลังจากโหลดใหม่ ให้ยืนยันในหน้าต่างใหม่ว่าการเชื่อมต่อ deploy ยังใช้ได้ แล้วลองเชื่อมต่อด้วย root เพื่อดูว่าถูกปฏิเสธ
ssh root@203.0.113.10root@203.0.113.10: Permission denied (publickey).แม้คีย์จะถูกต้องก็เข้าด้วย root ไม่ได้ งานดูแลระบบทำโดยเชื่อมต่อในชื่อ deploy แล้วใช้ sudo
5️⃣ ไฟร์วอลล์ Ubuntu ufw
ufw เป็นเครื่องมือไฟร์วอลล์พื้นฐานของ Ubuntu แต่ตอนแรกจะปิดอยู่ ทันทีที่เปิด การเชื่อมต่อที่ไม่ได้รับอนุญาตจะถูกปิดกั้น จึงเพิ่มกฎอนุญาต SSH ก่อนแล้วเปิดเป็นขั้นสุดท้าย
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 เป็นโปรไฟล์ที่เปิดพอร์ต 22 ส่วน 80 และ 443 เป็นพอร์ตที่เว็บเซิร์ฟเวอร์ใช้ กฎจะถูกเพิ่มทั้งใน IPv4 และ 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) การเชื่อมต่อขาเข้าจะถูกปิดกั้นโดยค่าเริ่มต้น เปิดเฉพาะสามพอร์ตที่อนุญาต และไฟร์วอลล์จะเปิดเองตอนบูตด้วย หลังจากเปิดแล้ว ให้เชื่อมต่อในชื่อ deploy อีกครั้งในหน้าต่างใหม่และตรวจหมายเลขกฎ
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️⃣ ตั้งค่าเขตเวลา Ubuntu
เขตเวลาเริ่มต้นคือ Etc/UTC เพื่อให้เวลาในล็อกและงานที่ตั้งเวลาไว้ตรงกับภูมิภาคของเซิร์ฟเวอร์ เซิร์ฟเวอร์นี้ซึ่งสร้างในภูมิภาคสิงคโปร์จึงตั้งเป็น 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: noสิ่งที่เปลี่ยนมีเพียงสองบรรทัด Local time และ Time zone ส่วนการซิงก์นาฬิกา (NTP) และเวลา UTC ยังคงเดิม
7️⃣ unattended upgrades อัปเดตความปลอดภัยอัตโนมัติ
Ubuntu ติดตั้งอัปเดตความปลอดภัยโดยอัตโนมัติด้วยแพ็กเกจ unattended-upgrades และแพ็กเกจนี้ติดตั้งและเปิดใช้งานไว้ตั้งแต่แรก ในขั้นตอนนี้จึงตรวจว่าเปิดใช้งานอยู่หรือไม่ และติดตั้งอะไรโดยอัตโนมัติ
🔲 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";เลข 1 ในทั้งสองค่าหมายถึงวันละครั้ง และถ้าเปลี่ยนเป็น 0 การอัปเดตอัตโนมัติจะปิด สิ่งที่จะติดตั้งกำหนดโดยไฟล์ 50unattended-upgrades
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";ในแหล่งที่อนุญาตมี -security แต่ไม่มี -updates อัปเดตทั่วไปจึงไม่ถูกติดตั้งอัตโนมัติ และติดตั้งเฉพาะอัปเดตความปลอดภัย หากต้องการรับอัปเดตทั่วไปอัตโนมัติด้วย ให้เอาเครื่องหมายคอมเมนต์ของบรรทัด -updates ในไฟล์นี้ออก
🔲 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นี่คือสองบรรทัดสุดท้ายของการรันครั้งเดียวกัน
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 คำนวณเฉพาะสิ่งที่การอัปเดตอัตโนมัติจะทำโดยไม่ติดตั้งอะไร เนื่องจากอัปเดตแพ็กเกจเสร็จแล้ว จึงแสดงว่าไม่มีแพ็กเกจที่ต้องติดตั้งอัตโนมัติ บันทึกการรันจริงจะเก็บไว้ในโฟลเดอร์ /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️⃣ ตั้งค่าหน่วยความจำ swap ของ Ubuntu
เซิร์ฟเวอร์นี้มีหน่วยความจำ 1GB และตอนแรกไม่มี swap ก่อนนำแอปขึ้น ให้สร้างไฟล์ swap 2GB และลงทะเบียนใน /etc/fstab เพื่อให้เปิดใช้งานหลังรีบูตด้วย
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 เปิดใช้งานได้เฉพาะตอนนี้ หากต้องการให้เปิดหลังรีบูตด้วย ให้เพิ่มหนึ่งบรรทัดใน fstab
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab/swapfile none swap sw 0 09️⃣ ตรวจสอบการตั้งค่าเริ่มต้นเซิร์ฟเวอร์ Ubuntu
เมื่อตรวจแล้วว่าการตั้งค่ายังอยู่หลังรีบูต การตั้งค่าเริ่มต้น Ubuntu ก็เสร็จสมบูรณ์
🔲 systemctl reboot
sudo systemctl reboot🔲 uptime -p
หลังรีบูต ให้เชื่อมต่อในชื่อ 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 การตั้งค่า SSH ไฟร์วอลล์ เขตเวลา และการอัปเดตอัตโนมัติทั้งหมดเหมือนก่อนรีบูต ต่อไปจะนำแอป Node.js ขึ้นเซิร์ฟเวอร์นี้ด้วย PM2 และ Nginx
🔢 FAQ & เนื้อหาแนะนำ
การตั้งค่า SSH
การตั้งค่า SSH - ฟังก์ชันและการตั้งค่าไฟล์ /etc/ssh/sshd_config
บทความที่อธิบายรายการใน sshd_config ที่มักเปลี่ยนนอกจาก PermitRootLogin และความหมายของแต่ละรายการ
Swap
การตั้งค่าหน่วยความจำ swap (Swap Memory): 2 วิธี พาร์ทิชัน & ไฟล์
บทความที่อธิบายวิธีสร้าง swap บนพาร์ทิชันแทนไฟล์ swap และคำสั่ง swapon, mkswap
แพ็กเกจ
[Ubuntu] คำสั่ง apt | วิธีใช้และความต่างของคำสั่ง apt-get
บทความที่อธิบายความต่างของ apt กับ apt-get และคำสั่งติดตั้ง ลบแพ็กเกจ
ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน