ฉันจะให้ Flask ทำงานบนพอร์ต 80 ได้อย่างไร


212

ฉันมีเซิร์ฟเวอร์ Flask ที่ทำงานผ่านพอร์ต 5000 และใช้ได้ ฉันสามารถเข้าถึงได้ที่http://example.com,5000

แต่มันก็เป็นไปได้ที่จะเข้าถึงได้เพียงแค่ที่http://example.com ? ฉันสมมติว่านั่นหมายความว่าฉันต้องเปลี่ยนพอร์ตจาก 5,000 เป็น 80 แต่เมื่อฉันลองบน Flask ฉันจะได้รับข้อความแสดงข้อผิดพลาดนี้เมื่อฉันเรียกใช้

Traceback (most recent call last):
  File "xxxxxx.py", line 31, in <module>
app.run(host="0.0.0.0", port=int("80"), debug=True)
   File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 772, in run
run_simple(host, port, self, **options)
  File "/usr/local/lib/python2.6/dist-packages/werkzeug/serving.py", line 706, in run_simple
    test_socket.bind((hostname, port))
  File "<string>", line 1, in bind
socket.error: [Errno 98] Address already in use

วิ่งlsof -i :80กลับมา

COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
apache2   467     root    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2  4413 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14346 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14570 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14571 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14573 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)

ฉันต้องฆ่ากระบวนการเหล่านี้ก่อนหรือไม่ ปลอดภัยไหม หรือมีวิธีอื่นในการทำให้ Flask ทำงานบนพอร์ต 5000 แต่มีการเปลี่ยนเส้นทางโดเมนเว็บไซต์หลักอย่างใด


คุณสามารถใช้ขวดกับ Apache
Syed Habib M

3
ชื่อของคำถามไม่ตรงกับคำถาม บางทีมันควรอ่าน 'วิธีไม่ให้สิ่งอื่น ๆ ทำงานบนพอร์ต 80' ฉันอยากรู้อยากเห็นวิธีการเปลี่ยนพอร์ตขวดกำลังทำงานซึ่งเป็นสิ่งที่คำถามนี้ถาม แต่ไม่เคยพูดถึงวิธีการที่นี่
Elliot Woods

คำตอบ:


76

ดังนั้นจึงเกิดข้อผิดพลาดขึ้นเพราะคุณapache2ทำงานบนพอร์ต 80

หากนี่คือเพื่อการพัฒนาฉันจะทิ้งมันไว้บนพอร์ต 5000

หากเป็นการผลิต:

ไม่แนะนำ

  • หยุดapache2ก่อน

ไม่แนะนำเนื่องจากระบุไว้ในเอกสารประกอบ:

คุณสามารถใช้เซิร์ฟเวอร์ builtin ในระหว่างการพัฒนา แต่คุณควรใช้ตัวเลือกการปรับใช้แบบเต็มสำหรับแอปพลิเคชันที่ใช้งานจริง (อย่าใช้เซิร์ฟเวอร์การพัฒนาในตัวในการผลิต)

แนะนำ

  • HTTPการรับส่งข้อมูลพร็อกซีผ่านapache2ไปยัง Flask

ด้วยวิธีนี้apache2สามารถจัดการไฟล์สแตติกทั้งหมดของคุณ (ซึ่งดีมาก - ดีกว่าเซิร์ฟเวอร์ดีบักที่สร้างใน Flask) และทำหน้าที่เป็นพร็อกซีย้อนกลับสำหรับเนื้อหาแบบไดนามิกของคุณส่งผ่านคำขอเหล่านั้นไปยัง Flask

นี่คือลิงค์ไปยังเอกสารอย่างเป็นทางการเกี่ยวกับการตั้งค่า Flask ด้วย Apache + mod_wsgi

แก้ไข 1 - ชี้แจงสำหรับ @Djack

การรับส่งข้อมูล HTTP พร็อกซีไปยัง Flask ผ่าน apache2

เมื่อคำขอมาถึงเซิร์ฟเวอร์ที่พอร์ต 80 ( HTTP) หรือพอร์ต 443 ( HTTPS) เว็บเซิร์ฟเวอร์เช่น Apache หรือ Nginx จัดการการเชื่อมต่อของคำขอและทำงานเกี่ยวกับเรื่องนี้ ในกรณีของเราคำขอที่ได้รับควรได้รับการกำหนดค่าให้ส่งผ่านไปยัง Flask ในโปรโตคอล WSGI และจัดการโดยรหัส Python นี่คือส่วน "ไดนามิก"

reverse proxy สำหรับเนื้อหาแบบไดนามิก

มีข้อดีเล็กน้อยในการกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณดังกล่าวข้างต้น

  • การสิ้นสุด SSL - เว็บเซิร์ฟเวอร์จะได้รับการปรับแต่งเพื่อจัดการคำขอ HTTPS ด้วยการกำหนดค่าเพียงเล็กน้อย อย่า "ม้วนตัวคุณเอง" ใน Python ซึ่งอาจไม่ปลอดภัยเมื่อเปรียบเทียบ
  • ความปลอดภัย - การเปิดพอร์ตเข้าสู่อินเทอร์เน็ตจำเป็นต้องพิจารณาเรื่องความปลอดภัยอย่างรอบคอบ เซิร์ฟเวอร์การพัฒนาของ Flask ไม่ได้ถูกออกแบบมาเพื่อการนี้และอาจมีข้อบกพร่องแบบเปิดหรือปัญหาด้านความปลอดภัยเมื่อเปรียบเทียบกับเว็บเซิร์ฟเวอร์ที่ออกแบบมาเพื่อการนี้โดยเฉพาะ โปรดทราบว่าเว็บเซิร์ฟเวอร์ที่มีการกำหนดค่าไม่ดีอาจไม่ปลอดภัยเช่นกัน!
  • การจัดการไฟล์คงที่ - เป็นไปได้สำหรับเว็บเซิร์ฟเวอร์ Flask ในตัวเพื่อจัดการไฟล์คงที่ แต่ไม่แนะนำให้ทำเช่นนี้ Nginx / Apache มีประสิทธิภาพมากขึ้นในการจัดการไฟล์สแตติกเช่นรูปภาพ, CSS, ไฟล์ Javascript และจะผ่านการร้องขอ "ไดนามิก" เท่านั้น (ผู้ที่เนื้อหามักจะอ่านจากฐานข้อมูลหรือการเปลี่ยนแปลงเนื้อหา) เพื่อจัดการกับรหัส Python
  • + เพิ่มเติม นี่คือขอบเขตของคำถามนี้ ถ้าคุณต้องการข้อมูลเพิ่มเติมทำการวิจัยในพื้นที่นี้

นั่นเป็นคำตอบที่ยอดเยี่ยมแน่นอน! คุณสามารถอธิบายให้เข้าใจชัดเจนถึงศัพท์แสงภาษาอังกฤษธรรมดา ๆ ที่คุณใช้ " Proxy HTTP traffic to Flask through apache2" และ " reverse proxy for dynamic content"
John Strood

2
@Djack - คำตอบที่ได้รับการปรับปรุง แต่มันอยู่ติดกับขอบเขตของคำถามดังนั้นโปรดค้นหาออนไลน์เพื่อรับข้อมูลเพิ่มเติม
Ewan

1
ขอบคุณที่ให้คำหลัก ฉันจะทำการค้นหาออนไลน์อย่างแน่นอน
John Strood

419

1- หยุดแอปพลิเคชั่นอื่น ๆ ที่ใช้พอร์ต 80 2- รันแอปพลิเคชันด้วยพอร์ต 80:

if __name__ == '__main__':
      app.run(host='0.0.0.0', port=80)

1
ทำงานได้ดีเฉพาะในสภาพแวดล้อม Windows เมื่อ Apache จะขาด .. :).
Jose

1
มันไม่ทำงานสำหรับฉัน ควรเป็น: flask run --host = 0.0.0.0
Harun-Ur-Rashid

1
@jOSe ฉันพยายามใช้ PyCharm บน Ubuntu ทำงานได้ดี
บัก Buggy

@jOSe Apache ไม่ต้องการให้ linux รันคุณสามารถถอนการติดตั้งหรือเปลี่ยนพอร์ตได้
nurettin

145

สำหรับเซิร์ฟเวอร์ที่มองเห็นจากภายนอกซึ่งคุณไม่ได้ใช้ apache หรือเว็บเซิร์ฟเวอร์อื่นที่คุณเพิ่งพิมพ์

flask run --host=0.0.0.0 --port=80

คำสั่งนี้สามารถรันโดยใช้ env vars ได้หรือไม่? ฉันพยายามCMD flask run --host=0.0.0.0 --port=$PORTภายใน Dockerfile ของฉัน (สำหรับเหตุผล heroku) และฉันได้รับข้อผิดพลาดเกี่ยวกับการต้องเป็นจำนวนเต็มสำหรับพอร์ตของฉัน
Smokin Joe

สิ่งนี้ใช้ได้ดีในเครื่องแล็ปท็อปของฉัน แต่เมื่อฉันใช้กับอินสแตนซ์ AWS EC2 ของฉันจะมีข้อความระบุว่า "Permission Denied" หากฉันเพิ่ม "sudo" ที่จุดเริ่มต้นคำสั่ง "flask" จะไม่รู้จัก ...
user3768495

1
@ user3768495 อาจไม่ได้ติดตั้งขวดในผู้ใช้รูท (sudo)
Harun-Ur-Rashid

2
สวัสดี @ Harun-Ur-Rashid นั่นอาจเป็นกรณีนี้ - ฉันติดตั้งในสภาพแวดล้อมเสมือนจริง ฉันจะตรวจสอบวิธีการแก้ไข ขอบคุณสำหรับการตอบกลับของคุณ.
3768495

22

หากคุณใช้สิ่งต่อไปนี้เพื่อเปลี่ยนพอร์ตหรือโฮสต์:

if __name__ == '__main__':
  app.run(host='0.0.0.0', port=80)

ใช้รหัสต่อไปนี้เพื่อเริ่มต้นเซิร์ฟเวอร์ (ทางเข้าหลักของฉันสำหรับขวดคือ app.py):

python app.py

แทนที่จะใช้:

flask run

10

หากคุณต้องการให้แอปพลิเคชันของคุณอยู่ในพอร์ตเดียวกันนั่นคือพอร์ต = 5000 เพียงแค่ในเทอร์มินัลของคุณให้เรียกใช้คำสั่งนี้:

fuser -k 5000/tcp

จากนั้นเรียกใช้:

python app.py

หากคุณต้องการรันบนพอร์ตที่ระบุเช่นหากคุณต้องการรันบนพอร์ต = 80 ในไฟล์หลักของคุณเพียงแค่พูดถึงสิ่งนี้:

if __name__ == '__main__':  
    app.run(host='0.0.0.0', port=80)

8

วิธีการที่สะดวกในการใช้แพคเกจpython-dotenv: มันอ่าน.flaskenvไฟล์ที่คุณสามารถเก็บตัวแปรสภาพแวดล้อมสำหรับขวด

  • pip install python-dotenv
  • สร้างไฟล์.flaskenvในไดเรกทอรีรากของแอปของคุณ

ภายในไฟล์ที่คุณระบุ:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

หลังจากนั้นคุณเพียงแค่เปิดแอพด้วย flask runและสามารถเข้าถึงแอพของคุณที่พอร์ตนั้น

โปรดทราบว่าFLASK_RUN_HOSTค่าเริ่มต้น127.0.0.1และค่าเริ่มต้นFLASK_RUN_PORT5000


8

นี่เป็นทางออกเดียวที่ใช้ได้กับฉันบน Ubuntu-18

ภายในไฟล์app.pyให้ใช้:

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

รหัสด้านบนจะให้ข้อผิดพลาดในการอนุญาตเดียวกันเว้นแต่sudoจะใช้เพื่อเรียกใช้:

sudo python3 app.py

6

ปัญหาของคุณคือคุณมีเว็บเซิร์ฟเวอร์ apache แล้วทำงานที่ใช้พอร์ต 80 อยู่แล้วดังนั้นคุณสามารถ:

  1. Kill apache: คุณน่าจะทำแบบนี้ได้/etc/init.d/apache2 stopมากกว่าแค่ฆ่าพวกมัน

  2. การปรับใช้แอพพลิเคขวดของคุณในกระบวนการ Apache ของคุณเป็นขวดใน Apacheอธิบาย


5

ฉันต้องตั้งค่าFLASK_RUN_PORTในสภาพแวดล้อมของฉันเป็นหมายเลขพอร์ตที่ระบุ ครั้งต่อไปที่คุณเริ่มแอพของคุณ Flask จะโหลดตัวแปรสภาพแวดล้อมนั้นด้วยหมายเลขพอร์ตที่คุณเลือก


3

คุณไม่จำเป็นต้องเปลี่ยนหมายเลขพอร์ตสำหรับแอปพลิเคชันของคุณเพียงกำหนดค่าเซิร์ฟเวอร์ www ของคุณ (nginx หรือ apache) เป็นเคียวรีพร็อกซีเป็นพอร์ตขวด attantion uWSGIจ่ายใน



2

ทางออกที่ง่ายที่สุดและดีที่สุด

บันทึกไฟล์. py ของคุณในโฟลเดอร์ กรณีนี้ชื่อโฟลเดอร์ของฉันคือการทดสอบ ในพรอมต์คำสั่งเรียกใช้ต่อไปนี้

c:\test> set FLASK_APP=application.py
c:\test> set FLASK_RUN_PORT=8000
c:\test> flask run

----------------- การติดตามจะถูกส่งคืน ----------------

 * Serving Flask app "application.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
127.0.0.1 - - [23/Aug/2019 09:40:04] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [23/Aug/2019 09:40:04] "[33mGET /favicon.ico HTTP/1.1[0m" 404 -

ตอนนี้อยู่กับชนิดของเบราว์เซอร์ของคุณ: http://127.0.0.1:8000 ขอบคุณ


เขาต้องการเรียกใช้บน 80 ซึ่งเป็นพอร์ตพิเศษ เขาต้องการหยุดสิ่งอื่นก่อน
Ahmedn1

1

ในสถานการณ์ของฉันขั้นตอนต่อไปนี้ทำงานเหมือนมีเสน่ห์:

  • การติดตั้งแพ็คเกจ:

    pip install --upgrade pip
    pip install python-dotenv
  • การสร้างไฟล์ที่ซ่อนอยู่ในไดเรกทอรีแอพของฉัน "flaskr / .flaskenv"

  • การเพิ่มเนื้อหาต่อไปนี้:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • สุดท้ายให้รันคำสั่ง flask อีกครั้ง:

    flask run
  • รุ่นที่ฉันกำลังทำงานคือ:

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