วิธีทำให้โปรแกรมที่เขียนด้วย ภาษา python รันบน port 80 หรือ port ที่ตำกว่า 1024 ได้

แชร์ความรู้ภาษา Python ไพทอน การเขียนโปรแกรมภาษาไพทอน

Moderator: mindphp, ผู้ดูแลกระดาน

ภาพประจำตัวสมาชิก
mindphp
ผู้ดูแลระบบ MindPHP
ผู้ดูแลระบบ MindPHP
โพสต์: 48003
ลงทะเบียนเมื่อ: 22/09/2008 6:18 pm
ติดต่อ:

วิธีทำให้โปรแกรมที่เขียนด้วย ภาษา python รันบน port 80 หรือ port ที่ตำกว่า 1024 ได้

โพสต์ที่ยังไม่ได้อ่าน โดย mindphp »

วิธีทำให้โปรแกรมที่เขียนด้วยภาษา Python รันบน port 80 หรือ port ที่ต่ำกว่า 1024 ได้ (โดยไม่ใช้ nginx)

บนระบบปฏิบัติการ Linux โดยทั่วไป หากโปรแกรมใด ๆ ต้องการ bind กับพอร์ตต่ำกว่า 1024 (เช่น พอร์ต 80 หรือ 443) จะต้องรันด้วยสิทธิ์ root
แต่การรัน Python script ด้วย root โดยตรงนั้นมีความเสี่ยง และไม่เหมาะสมกับการใช้งานในระดับ production

บทความนี้แนะนำวิธีที่ปลอดภัยกว่า โดยให้ Python ได้สิทธิ์ bind พอร์ต 80 โดยไม่ต้องรันด้วย root ตลอดเวลา และ
**ไม่ต้องติดตั้งโปรแกรมอื่น เช่น หรือ authbind**

วิธีที่ปลอดภัย: ใช้ setcap ให้ Python bind พอร์ต 80 ได้โดยไม่ต้องเป็น root

ขั้นตอน:

1. ตรวจสอบ path ของ Python ที่ใช้อยู่

โค้ด: เลือกทั้งหมด

which python3
เช่นได้ผลลัพธ์: `/usr/bin/python3`

2. ให้สิทธิ์ Python bind พอร์ตต่ำกว่า 1024 ได้ ด้วย setcap

โค้ด: เลือกทั้งหมด

sudo setcap 'cap_net_bind_service=+ep' /usr/bin/python3
3. เขียนโค้ด Python เพื่อทดสอบ

โค้ด: เลือกทั้งหมด

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()
4. รันสคริปต์ Python ด้วย user ปกติได้ทันที

โค้ด: เลือกทั้งหมด

python3 myserver.py
5. ทดสอบเข้าใช้งานผ่าน browser:

โค้ด: เลือกทั้งหมด

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
- อย่าลืมเปิด firewall หรือ iptables ให้รับพอร์ต 80 หากจำเป็น


หวังว่าบทความนี้จะเป็นประโยชน์กับผู้ที่ต้องการรันแอป Python ด้วยพอร์ต 80 โดยไม่ต้องใช้ Web Server ภายนอกครับ
หากมีคำถามเพิ่มเติม ยินดีแนะนำเพิ่มเติมได้เลย 😊
ติดตาม VDO: http://www.youtube.com/c/MindphpVideoman
ติดตาม FB: https://www.facebook.com/pages/MindphpC ... 9517401606
หมวดแชร์ความรู้: https://www.mindphp.com/forums/viewforum.php?f=29
รับอบรม และพัฒนาระบบ: https://www.mindphp.com/forums/viewtopic.php?f=6&t=2042
  • Similar Topics
    ตอบกลับ
    แสดง
    โพสต์ล่าสุด

ผู้ใช้งานขณะนี้

สมาชิกกำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และบุคลทั่วไป 2