บนระบบปฏิบัติการ Linux โดยทั่วไป หากโปรแกรมใด ๆ ต้องการ bind กับพอร์ตต่ำกว่า 1024 (เช่น พอร์ต 80 หรือ 443) จะต้องรันด้วยสิทธิ์ root
แต่การรัน Python script ด้วย root โดยตรงนั้นมีความเสี่ยง และไม่เหมาะสมกับการใช้งานในระดับ production
บทความนี้แนะนำวิธีที่ปลอดภัยกว่า โดยให้ Python ได้สิทธิ์ bind พอร์ต 80 โดยไม่ต้องรันด้วย root ตลอดเวลา และ
**ไม่ต้องติดตั้งโปรแกรมอื่น เช่น
โค้ด: เลือกทั้งหมด
nginx
วิธีที่ปลอดภัย: ใช้ setcap ให้ Python bind พอร์ต 80 ได้โดยไม่ต้องเป็น root
ขั้นตอน:
1. ตรวจสอบ path ของ Python ที่ใช้อยู่
โค้ด: เลือกทั้งหมด
which python3
2. ให้สิทธิ์ Python bind พอร์ตต่ำกว่า 1024 ได้ ด้วย setcap
โค้ด: เลือกทั้งหมด
sudo setcap 'cap_net_bind_service=+ep' /usr/bin/python3
โค้ด: เลือกทั้งหมด
import http.server
import socketserver
PORT = 80
Handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print(f"Serving at port {PORT}")
httpd.serve_forever()
โค้ด: เลือกทั้งหมด
python3 myserver.py
โค้ด: เลือกทั้งหมด
http://your_server_ip/
ข้อดีของวิธีนี้
- ไม่ต้องรัน Python ด้วย sudo หรือ root
- ไม่ต้องติดตั้ง nginx, authbind หรือโปรแกรมเสริมอื่น
- ได้ความยืดหยุ่นเต็มที่ในการพัฒนาและ deploy
[hr]
หมายเหตุความปลอดภัย
- ตรวจสอบให้แน่ใจว่า Python binary ที่คุณ setcap ไม่สามารถถูกแทนที่หรือ hijack ได้โดยผู้ใช้ทั่วไป
- หากใช้ virtualenv ควร setcap กับ Python ที่อยู่ใน virtualenv โดยตรง เช่น:
โค้ด: เลือกทั้งหมด
sudo setcap 'cap_net_bind_service=+ep' /home/username/venv/bin/python
หวังว่าบทความนี้จะเป็นประโยชน์กับผู้ที่ต้องการรันแอป Python ด้วยพอร์ต 80 โดยไม่ต้องใช้ Web Server ภายนอกครับ
หากมีคำถามเพิ่มเติม ยินดีแนะนำเพิ่มเติมได้เลย