ubuntu – แก้ปัญหา permission ของ symbolic link เพื่อลิงค์ web app ใน apache

กำลังต้องการเซตให้โปรเจคเวปที่อยู่ใน /home หลายๆ อันสามารถรันเป็น web app บน apache โดยไม่ต้องคัดลอกโค้ดใหม่ทั้งหมดไปลงใน /var/www/html ของ apache มันคงวิธีทำหลายวิธีแหละ แต่ว่ารอบนี้จะอาศัยวิธีสร้าง symbolic link เพื่อลิงค์ให้โฟลเดอร์ของโปรเจคเหล่านั้นมา เชื่อมกับ /var/www/html เลย

1. สร้าง symbolic link


เพื่อลิงค์ web app มาที่ /var/www/html รันคำสั่งสร้าง symbolic link

# เข้าไปในโฟลเดอร์ /var/www/html ซึ่งเป็นโฟลเดอร์ default ของเวปใน apache
cd /var/www/html

# รันคำสั่งสร้าง symbolic link
sudo ln -s /path/to/symlink/folder name_of_symbolic_link

2. เซตการตั้งค่า(config ของ apache เพื่ออนุญาติให้เข้าถึงสิ่งต่างๆ ที่ลิงค์จาก symbolic link ได้


ส่วนมากถ้าต้องการให้ user www-data ของ apache สามารถเข้าถึงโฟลเดอร์อื่นๆ ที่อยู่นอกเหนือไปจาก /var/www/html ซึ่งเป็นโฟลเดอร์ default แล้ว มักจะต้องทำการเซตค่านี้เพิ่ม
2.1 แก้ config ของ apache (ถ้าไฟล์ configuration หลักจะอยู่ที่ /etc/apache/apache2.config แต่ถ้า config ย่อยตามแต่จะ site จะอยู่ที่ /etc/apache/site-available/) ในที่นี้เราจะแก้ที่ไฟล์หลักเลย

# ใช้โปรแกรม nano เปิดไฟล์ config (อย่าลืมใช้ sudo เพราะต้องใช้ root permission)
sudo nano /etc/apache2/apache2.conf

2.2 เพิ่ม Options FollowSymLinks
สังเกตุดูใน block <Directory> หรือ <VirtualHost> ว่ามีการตั้งค่า Options ไว้แล้วยัง ถ้ามีอยู่แล้วให้ระบุ FollowSymLinks ต่อท้าย ถ้ายังไม่มีก็ใส่ Options FollowSymLinks เข้าไปใหม่ได้เลย

<!-- ใน tag Directory ให้เพิ่ม Options FollowSymLinks -->
<Directory "/path/to/symlink/folder">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted 
</Directory>

2.3 รีสตาร์ท service apache

sudo systemctl restart apache2

เป็นอันเสร็จสิ้นขั้นตอนของการบอก apache ว่าเราอยากอนุญาติให้ apache เข้าถึงโฟลเดอร์อื่นๆ ที่เชื่อมผ่าน symbolic link ด้วย นอกเหนือจากโฟลเดอร์ default ที่อยู่ใน /var/www/html

3. ทำการตรวจสอบเรื่อง file/folder permission ของโฟลเดอร์ปลายทางที่เชื่อมต่อไป


หลังจากการใช้ symbolic link เชื่อมโฟลเดอร์เสร็จแล้ว เราจำเป็นต้องตรวจสอบ permission ว่าโฟลเดอร์ที่เราเชื่อมต่อไว้นั้น user www-data ของ apache สามารถเข้าถึงได้หรือไม่ โดยในการใช้ symbolic link นั้น user www-data จำเป็นต้องได้รับอนุญาติให้:-

  • user www-data สามารถ execute (x) ในโฟลเดอร์ที่เชื่อมไปได้ ทั้งยังรวมไปถึง parent folder ทั้งหมดของโฟลเดอร์ปลายทางที่ระบุนั้นด้วย ตัวอย่างเช่น ถ้าเราอยากสร้าง symbolic link มาที่ /var/www/html/project1 โดยเชื่อมไปยังปลายทางคือ /home/booboo/project1 เราต้องตรวจสอบ permission ว่า www-data สามารถ execute (x) ในโฟลเดอร์ /home, /home/booboo, home/booboo/project
  • user www-data สามารถ read (r) ในส่วนของโฟลเดอร์ที่เชื่อมไปได้ รวมไปถึง file/directory ทั้งหมดในนั้น ตัวอย่างเช่น ถ้าเราอยากสร้าง symbolic link มาที่ /var/www/html/project1 โดยเชื่อมไปยังปลายทางคือ /home/booboo/project1 เราต้องตรวจสอบ permission ว่า www-data สามารถ read (r) ในโฟลเดอร์ home/booboo/project
  • ทดสอบว่า user www-data สามารถเข้าถึงโฟลเดอร์ที่เชื่อมไว้ได้หรือไม่

    # /path/to/symlink/folder ให้ระบุ folder ที่เราต้องการตรวจสอบว่า user www-data นั้น
    # สามารถเข้าไปทำคำสั่งลิสต์ไฟล์เพื่อดูรายละเอียดในโฟลเดอร์ที่ระบุได้หรือไม่
    sudo -u www-data ls -l /path/to/symlink/folder
    

    ถ้า user www-data สามารถเข้าถึงโฟลเดอร์ดังกล่าวได้ จะสามารถลิสต์ไฟล์ที่อยู่ภายได้ folder นั้นออกมาได้ แต่ถ้าไม่สามารถเข้าถึงได้ จะมีการแสดง error พร้อมรายละเอียดออกมา และต้องไปปรับแก้เรื่อง permission ที่เหมาะสม จะพา user www-data ไปเซต permission สไตล์ไหนก็ตามความถนัดและความเหมาะสมตามการใช้งานเลย (เช่น เซตให้ user www-data เข้าไปอยู่ใน group เดียวกับเจ้าของโฟลเดอร์, สร้าง group ใหม่ที่ เพิ่มเจ้าของโฟลเดอร์และ www-data แล้วก็เปลี่ยน group owner เป็น group ใหม่นี้เพื่อที่จะสามารถเข้าถึงโฟลเดอร์ได้ หรือถ้าเครื่องใช้อยู่คนเดียวจะให้ง่ายๆ เลย ก็ อนุญาติให้ other สามารถexecute (x) ได้หมดเลย แต่อย่าลืมว่าต้องเซตตั้งแต่ parent ลงมาจนถึงโฟลเดอร์ที่อนุญาตินะ ดังนั้นจะเซตแบบไหนก็ต้องวางแผนให้ดีนิดนึง)