วิธีเข้าถึงเว็บเซิร์ฟเวอร์ Django ในพื้นที่จากโลกภายนอก


176

ผมทำตามคำแนะนำของที่นี่จะเรียกใช้ Django python manage.py runserverใช้ในตัวเว็บเซิร์ฟเวอร์และก็สามารถที่จะประสบความสำเร็จใช้โดยใช้ ถ้าฉันเข้าถึง 127.0.0.1: พอร์ตภายในเครื่องจากเว็บเซิร์ฟเวอร์ฉันจะได้หน้า Django ที่ระบุว่าใช้งานได้

ฉันรู้ว่า Django webserver ไม่ใช่เซิร์ฟเวอร์ที่ใช้งานจริง แต่เป็นสิ่งสำคัญสำหรับฉันในการทดสอบเพื่อให้สามารถเข้าถึงได้จากโลกภายนอก - ไม่ใช่จากเว็บเบราว์เซอร์บนเซิร์ฟเวอร์ แต่มาจากคอมพิวเตอร์เครื่องอื่น

ฉันเหนื่อย:

http://mywebserver:port_django_runs_on

แต่มันไม่ทำงาน ฉันพยายามใช้ IP แทน (อ้างอิงจาก ifconfig) เพื่อเข้าถึง:

http://myipaddress:port_django_runs_on 

ซึ่งไม่ได้ผลเช่นกัน

เว็บเซิร์ฟเวอร์กำลังทำงานอยู่ดังนั้นจึงต้องสามารถเข้าถึงได้จากภายนอกฉันไม่แน่ใจ ฉันใช้ Linux กับ Apache อยู่แล้ว แต่ฉันยังไม่ได้ปรับแต่ง Django ด้วย Apache

ความคิดเห็นใด ๆ เกี่ยวกับวิธีการทำเช่นนี้?


3
ทำไมไม่กำหนดค่า Django ด้วย Apache และ mod_wsgi ทำไมไม่ทำอย่างถูกต้อง
S.Lott

@ S.Lott จะเกิดอะไรขึ้นถ้าคุณมีโครงการต่าง ๆ มากมายบนเซิร์ฟเวอร์ที่คุณต้องการเรียกใช้ในเวลาที่ต่างกันและคุณและคุณไม่ต้องการกำหนดค่า Apache ใหม่ทุกครั้งที่คุณเพิ่มโครงการใหม่
robenkleene

คำตอบ:


303

คุณต้องเรียกใช้เซิร์ฟเวอร์การพัฒนาเพื่อให้ฟังบนอินเทอร์เฟซไปยังเครือข่ายของคุณ

เช่น

python manage.py runserver 0.0.0.0:8000

รับฟังทุกอินเตอร์เฟสที่พอร์ต 8000

ไม่สำคัญว่าคุณจะเข้าถึงเว็บเซิร์ฟเวอร์ด้วย IP หรือชื่อโฮสต์ ฉันเดาว่าคุณยังอยู่ใน LAN ของคุณเอง
หากคุณต้องการเข้าถึงเซิร์ฟเวอร์จากภายนอกคุณต้องกำหนดค่าเราเตอร์ของคุณให้ส่งต่อพอร์ตเช่น8000ไปยังเซิร์ฟเวอร์ของคุณ


ตรวจสอบไฟร์วอลล์ของคุณบนเซิร์ฟเวอร์ของคุณว่าอนุญาตให้มีการเชื่อมต่อขาเข้ากับพอร์ตที่ใช้งานหรือไม่!

สมมติว่าคุณสามารถเข้าถึงเซิร์ฟเวอร์ Apache ของคุณจากภายนอกได้สำเร็จคุณสามารถลองทำสิ่งนี้:

  • หยุดเซิร์ฟเวอร์ Apache เพื่อให้พอร์ต80ว่าง
  • เริ่มต้นเซิร์ฟเวอร์การพัฒนาด้วย sudo python manage.py runserver 0.0.0.0:80

1
การใช้ "python Manage.py runserver 0.0.0.0:8000" ยังคงให้ผลลัพธ์เหมือนเดิม คุณสามารถพูดเพิ่มเติมเกี่ยวกับวิธีที่ฉันสามารถกำหนดค่า Apache ให้จัดการพอร์ตนี้ได้อย่างไร

1
@ user248237: คุณเรียกใช้เซิร์ฟเวอร์เพื่อการพัฒนาซึ่งไม่เกี่ยวข้องกับเว็บเซิร์ฟเวอร์ Apache ทั้งหมด เซิร์ฟเวอร์การพัฒนาเป็นเว็บเซิร์ฟเวอร์แบบสแตนด์อโลน
เฟลิกซ์คลิง

มันต้องมีสิทธิพิเศษที่จะใช้พอร์ต 80 sudo python manage.py runserver 80คุณสามารถลอง
S.Lott

@ S.Lott: โอ้ขอบคุณ ฉันรู้ว่ามันอยู่ในใจของฉันเป็นคนเขียนมัน แต่อย่างใดไม่ได้ทำให้มันไปที่แป้นพิมพ์;)
เฟลิกซ์แพรว

1
การอนุญาตให้ทุกคนALLOWED_HOSTS = ['*']ทำงานให้ฉันเข้าถึงแอป Django บน Mac จากโทรศัพท์ Android ของฉัน
Anupam

28

ฉันต้องเพิ่มบรรทัดนี้ใน settings.py เพื่อให้ทำงานได้ (ไม่เช่นนั้นจะแสดงข้อผิดพลาดเมื่อเข้าถึงจากคอมพิวเตอร์เครื่องอื่น)

ALLOWED_HOSTS = ['*']

จากนั้นรันเซิร์ฟเวอร์ด้วย:

python manage.py runserver 0.0.0.0:9595

ตรวจสอบให้แน่ใจด้วยว่าไฟร์วอลล์อนุญาตการเชื่อมต่อกับพอร์ตนั้น


14

เลือกหนึ่งรายการขึ้นไปจาก:

  • แอปพลิเคชันของคุณไม่สามารถฟัง IP ที่ต้องการ: PORT ได้สำเร็จ
    • เนื่องจากคุณไม่ได้กำหนดค่าสำเร็จ
    • เนื่องจากผู้ใช้ไม่ได้รับอนุญาต
  • แอปพลิเคชันของคุณกำลังรับฟังสำเร็จบน IP ที่ต้องการ: PORT แต่ลูกค้าไม่สามารถเข้าถึงได้เพราะ
    • iptables โลคัลเซิร์ฟเวอร์ป้องกันมัน
    • ไฟร์วอลล์ป้องกันได้

ดังนั้นคุณสามารถตรวจสอบได้ว่าแอปพลิเคชันของคุณกำลังรับฟังอย่างประสบความสำเร็จโดยรันlsof -iเป็นรูทบนเครื่องและค้นหาpythonรายการที่มีพอร์ตที่เกี่ยวข้องที่คุณระบุ

โดยทั่วไปผู้ใช้ที่ไม่ใช่รูทไม่สามารถผูกกับพอร์ต <1024

คุณจะต้องดูiptables -nvLเพื่อดูว่ามีกฎที่จะป้องกันการเข้าถึง ip: พอร์ตที่คุณพยายามผูกแอปพลิเคชันของคุณหรือไม่

หากมีไฟร์วอลล์อัปสตรีมและคุณไม่รู้อะไรมากคุณจะต้องคุยกับผู้ดูแลระบบเครือข่ายของคุณ


คุณอธิบายได้you haven't configured it successfullyไหม
ChillarAnand

@ChillarAnand: เพียงแค่ให้คุณตรวจสอบว่าเป็นจริงการฟังที่คุณตั้งใจให้เป็นเช่นใช้django runserver lsof
MattH

@ChillarAnand ฉันทำตามขั้นตอนที่คุณแนะนำ ใช้lsofฉันเห็นรายการหลามสำหรับพอร์ตของฉัน แต่ลิงก์ของฉันเช่น myip: 8000 ไม่ตอบสนอง ฉันรู้ว่ามันสาย แต่ข้อเสนอแนะใด ๆ จะช่วยได้
WaterRocket8236

8

เพิ่งทำสิ่งนี้:

python manage.py runserver 0:8000

โดยคำสั่งข้างต้นคุณผูกพันจริงกับที่อยู่ IP ภายนอก ดังนั้นเมื่อคุณเข้าถึงที่อยู่ IP ของคุณด้วยหมายเลขพอร์ตคุณจะสามารถเข้าถึงได้ในเบราว์เซอร์โดยไม่มีปัญหาใด ๆ

เพียงพิมพ์ต่อไปนี้ในแถบที่อยู่ของเบราว์เซอร์:

<your ip address>:8000

เช่น:

192.168.1.130:8000

คุณอาจต้องแก้ไข settings.py เพิ่มสิ่งต่อไปนี้ใน settings.py ในบรรทัดสุดท้าย:

ALLOWED_HOSTS = ['*']

หวังว่าสิ่งนี้จะช่วย ...


5

สำหรับผู้ใช้ AWS

ฉันต้องใช้ขั้นตอนต่อไปนี้เพื่อไปที่นั่น

1)ตรวจสอบให้แน่ใจว่ามีการติดตั้ง pip และ django ในระดับ sudo

  • sudo apt-get install python-pip
  • sudo pip ติดตั้ง django

2)ตรวจสอบว่ากฎความปลอดภัยของกลุ่มความปลอดภัยนั้นรวม http บนพอร์ต 80 สำหรับ 0.0.0.0/0

  • กำหนดค่าผ่าน AWS console

3)เพิ่ม Public IP และ DNS ใน ALLOWED_HOSTS

  • ALLOWED_HOSTS เป็นวัตถุรายการที่คุณสามารถหาได้ใน settings.py
  • ALLOWED_HOSTS = ["75.254.65.19", "ec2-54-528-27-21.compute-1.amazonaws.com"]

4)เรียกใช้เซิร์ฟเวอร์การพัฒนาด้วย sudo บนพอร์ต 80

  • sudo python Manage.py Runserver 0:80

ขณะนี้ไซต์มีให้บริการอย่างใดอย่างหนึ่งต่อไปนี้ (ไม่จำเป็นต้องมี: 80 เนื่องจากเป็นค่าเริ่มต้นสำหรับ http):

  • [DNS สาธารณะ] เช่น ec2-54-528-27-21.compute-1.amazonaws.com
  • [Public IP] เช่น 75.254.65.19

2

ฉันจะเพิ่มที่นี่:

  1. sudo python manage.py runserver 80

  2. ไปที่โทรศัพท์หรือคอมพิวเตอร์ของคุณแล้วป้อน IP ภายในคอมพิวเตอร์ (เช่น192.168.0.12) ลงในเบราว์เซอร์

ณ จุดนี้คุณควรเชื่อมต่อกับเซิร์ฟเวอร์ Django

สิ่งนี้ควรทำงานโดยไม่ใช้ sudo:

python manage.py runserver 0.0.0.0:8000


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.