คำตอบสั้น ๆ: ตั้ง NFS Server และเมานต์จากเครื่องอื่น พร้อมตัวเลือกที่มีผลต่อความเร็วและความปลอดภัย และวิธีเมานต์ถาวรที่ไม่ทำให้เครื่องบูตค้าง
คู่มือนี้อธิบาย NFS ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
เมื่อมีเว็บเซิร์ฟเวอร์หลายเครื่องให้บริการเว็บเดียวกัน ไฟล์ที่ผู้ใช้อัปโหลดต้องอยู่ที่เดียวและทุกเครื่องเห็นเหมือนกัน ไม่เช่นนั้นผู้ใช้จะเห็นรูปบ้างไม่เห็นบ้างขึ้นอยู่กับว่าถูกส่งไปเครื่องไหน NFS คือวิธีมาตรฐานของ Linux สำหรับงานนี้
คู่มือนี้ตั้ง NFS Server หนึ่งเครื่องและเมานต์จากเครื่องอื่น พร้อมอธิบายตัวเลือกที่มีผลจริงต่อความเร็วและความปลอดภัย และวิธีเมานต์ที่ไม่ทำให้เครื่องบูตค้างเมื่อ NFS Server ไม่อยู่
สิ่งที่ต้องเตรียม
- เซิร์ฟเวอร์สองเครื่องขึ้นไปที่อยู่ในเครือข่ายภายในเดียวกัน
- สิทธิ์
sudoทั้งสองฝั่ง
ข้อควรรู้ก่อนเริ่ม NFS ไม่มีการเข้ารหัสและยืนยันตัวตนด้วย IP เป็นหลัก จึงต้องใช้เฉพาะในเครือข่ายภายในที่ควบคุมได้เท่านั้น อย่าเปิดสู่อินเทอร์เน็ตเด็ดขาด
ขั้นตอนที่ 1: ติดตั้งฝั่ง Server
# Ubuntu / Debian
sudo apt install -y nfs-kernel-server
# AlmaLinux / Rocky Linux
sudo dnf install -y nfs-utils
sudo systemctl enable --now nfs-server
สร้างโฟลเดอร์ที่จะแชร์
sudo mkdir -p /srv/shared/uploads
sudo chown www-data:www-data /srv/shared/uploads
sudo chmod 2775 /srv/shared/uploads
บิต 2 ข้างหน้าคือ setgid ทำให้ไฟล์ที่สร้างใหม่ในโฟลเดอร์นี้สืบทอดกลุ่มเดียวกัน ซึ่งช่วยลดปัญหาสิทธิ์เมื่อมีหลายเครื่องเขียนพร้อมกัน
ขั้นตอนที่ 2: ประกาศว่าจะแชร์ให้ใคร
sudo nano /etc/exports
/srv/shared/uploads 10.0.0.11(rw,sync,no_subtree_check)
/srv/shared/uploads 10.0.0.12(rw,sync,no_subtree_check)
# หรือทั้งวง
# /srv/shared/uploads 10.0.0.0/24(rw,sync,no_subtree_check)
ความหมายของตัวเลือกที่สำคัญ
- rw ให้เขียนได้ ใช้
roหากต้องการให้อ่านอย่างเดียว - sync ยืนยันการเขียนลงดิสก์จริงก่อนตอบกลับ ช้ากว่า
asyncแต่ปลอดภัยกว่ามากเมื่อไฟดับ อย่าใช้asyncกับข้อมูลสำคัญ - no_subtree_check ลดปัญหาความน่าเชื่อถือเมื่อไฟล์ถูกเปลี่ยนชื่อ และเป็นค่าที่แนะนำในปัจจุบัน
- root_squash เป็นค่าเริ่มต้นที่ไม่ต้องใส่ มันแปลง root ของเครื่องลูกให้กลายเป็นผู้ใช้ไร้สิทธิ์ ป้องกันไม่ให้ root จากเครื่องอื่นมีอำนาจเต็มบนไฟล์ที่แชร์ อย่าปิดด้วย
no_root_squashเว้นแต่จำเป็นจริง ๆ
sudo exportfs -ra
sudo exportfs -v
ขั้นตอนที่ 3: เปิด Firewall เฉพาะวงภายใน
# Ubuntu
sudo ufw allow from 10.0.0.0/24 to any port nfs
# AlmaLinux / Rocky
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --reload
ขั้นตอนที่ 4: เมานต์จากเครื่องลูก
# Ubuntu / Debian
sudo apt install -y nfs-common
# AlmaLinux / Rocky Linux
sudo dnf install -y nfs-utils
ดูว่าเซิร์ฟเวอร์แชร์อะไรไว้บ้าง
showmount -e 10.0.0.9
ทดลองเมานต์
sudo mkdir -p /mnt/uploads
sudo mount -t nfs 10.0.0.9:/srv/shared/uploads /mnt/uploads
df -hT | grep nfs
touch /mnt/uploads/test.txt && ls -l /mnt/uploads/