Làm cách nào để Flask chạy trên cổng 80?


212

Tôi có một máy chủ Flask chạy qua cổng 5000, và nó ổn. Tôi có thể truy cập nó tại http://example.com giáp000

Nhưng có thể chỉ cần truy cập nó tại http://example.com ? Tôi cho rằng điều đó có nghĩa là tôi phải thay đổi cổng từ 5000 thành 80. Nhưng khi tôi thử điều đó trên Flask, tôi nhận được thông báo lỗi này khi tôi chạy nó.

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

Chạy lsof -i :80trở lại

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)

Tôi có cần phải giết các quá trình này trước không? Điều đó có an toàn không? Hoặc có một cách khác để giữ Flask chạy trên cổng 5000 nhưng bằng cách nào đó chuyển hướng tên miền trang web chính?


bạn có thể sử dụng nó với apache .
Syed Habib M

3
tiêu đề của câu hỏi không phù hợp với câu hỏi. có lẽ nên đọc 'làm thế nào để không có những thứ khác chạy trên cổng 80'. Tôi tò mò làm thế nào để thay đổi bình cổng đang chạy, đó là những gì câu hỏi này yêu cầu, nhưng không bao giờ được đề cập đến làm thế nào ở đây
Elliot Woods

Câu trả lời:


76

Vì vậy, nó đưa ra thông báo lỗi đó vì bạn đã apache2chạy trên cổng 80.

Nếu điều này là để phát triển, tôi sẽ chỉ để nó như trên cổng 5000.

Nếu đó là để sản xuất:

Không được khuyến khích

  • Dừng lại apache2trước;

Không được đề xuất vì nó nêu trong tài liệu:

Bạn có thể sử dụng máy chủ dựng sẵn trong quá trình phát triển, nhưng bạn nên sử dụng tùy chọn triển khai đầy đủ cho các ứng dụng sản xuất. (Không sử dụng máy chủ phát triển dựng sẵn trong sản xuất.)

Đề xuất

  • HTTPLưu lượng proxy qua apache2Flask.

Bằng cách này, apache2có thể xử lý tất cả các tệp tĩnh của bạn (rất tốt - tốt hơn nhiều so với máy chủ gỡ lỗi được tích hợp trong Flask) và hoạt động như một proxy ngược cho nội dung động của bạn, chuyển các yêu cầu đó đến Flask.

Đây là một liên kết đến tài liệu chính thức về việc thiết lập Flask với Apache + mod_wsgi.

Chỉnh sửa 1 - Làm rõ cho @Djack

Lưu lượng HTTP proxy đến Flask thông qua apache2

Khi một yêu cầu đến máy chủ trên cổng 80 ( HTTP) hoặc cổng 443 ( HTTPS), một máy chủ web như Apache hoặc Nginx sẽ xử lý kết nối của yêu cầu và tìm ra cách làm với nó. Trong trường hợp của chúng tôi, một yêu cầu nhận được phải được cấu hình để được chuyển qua Flask trên giao thức WSGI và được xử lý bởi mã Python. Đây là phần "năng động".

proxy ngược cho nội dung động

Có một vài lợi thế để cấu hình máy chủ web của bạn như trên;

  • Chấm dứt SSL - Máy chủ web sẽ được tối ưu hóa để xử lý các yêu cầu HTTPS chỉ với một chút cấu hình. Đừng "tự lăn" trong Python mà có lẽ rất không an toàn khi so sánh.
  • Bảo mật - Mở một cổng vào internet đòi hỏi phải xem xét cẩn thận về bảo mật. Máy chủ phát triển của Flask không được thiết kế cho việc này và có thể có các lỗi mở hoặc sự cố bảo mật so với máy chủ web được thiết kế cho mục đích này. Lưu ý rằng một máy chủ web được cấu hình xấu cũng có thể không an toàn!
  • Xử lý tệp tĩnh - Máy chủ web Flask tích hợp có thể xử lý các tệp tĩnh tuy nhiên điều này không được khuyến nghị; Nginx / Apache hiệu quả hơn nhiều trong việc xử lý các tệp tĩnh như hình ảnh, CSS, tệp Javascript và sẽ chỉ chuyển các yêu cầu "động" (những nội dung thường được đọc từ cơ sở dữ liệu hoặc thay đổi nội dung) được xử lý bởi mã Python.
  • + nhiều hơn. Điều này giáp với phạm vi cho câu hỏi này. Nếu bạn muốn biết thêm thông tin, hãy làm một số nghiên cứu về lĩnh vực này.

Đó thực sự là một câu trả lời tuyệt vời! Bạn có thể làm sáng tỏ bằng tiếng Anh đơn giản các thuật ngữ kỹ thuật cao mà bạn đã sử dụng " Proxy HTTP traffic to Flask through apache2" và " reverse proxy for dynamic content"?
John Strood

2
@Djack - câu trả lời được cập nhật tuy nhiên nó nằm trong phạm vi cho câu hỏi, vì vậy hãy tìm kiếm trực tuyến để biết thêm thông tin.
Ewan

1
Cảm ơn bạn đã cung cấp các từ khóa. Tôi chắc chắn sẽ thực hiện một tìm kiếm trực tuyến.
John Strood

419

1- Dừng các ứng dụng khác đang sử dụng cổng 80. 2- chạy ứng dụng với cổng 80:

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

1
hoạt động tốt, chỉ trong môi trường windows., khi apache vắng mặt .. :)
jOSe

1
nó không làm việc cho tôi nó phải là: bình chạy --host = 0.0.0.0
Harun-Ur-Rashid

1
@jOSe Tôi đã thử sử dụng PyCharm trên Ubuntu, hoạt động rất tốt.
Lỗi Buggy

@jOSe Apache không cần thiết cho linux để chạy, bạn có thể gỡ cài đặt hoặc thay đổi cổng.
Nurettin

145

Đối với máy chủ hiển thị bên ngoài, nơi bạn không sử dụng apache hoặc máy chủ web khác mà bạn chỉ cần nhập

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

Lệnh này có thể được chạy bằng cách sử dụng các env vars không? Tôi tiếp tục thử CMD flask run --host=0.0.0.0 --port=$PORTtrong Dockerfile của mình (vì lý do heroku) và tôi liên tục gặp lỗi về việc cần một số nguyên cho cổng của mình
Smokin Joe

Điều này hoạt động tốt trên máy cục bộ (máy tính xách tay) của tôi nhưng khi tôi sử dụng nó trên ví dụ AWS EC2 của mình, nó có thông báo "Quyền bị từ chối". Nếu tôi thêm "sudo" vào đầu, lệnh "
jar

1
@ user3768495 Có thể bình không được cài đặt trong người dùng root (sudo)
Harun-Ur-Rashid

2
Xin chào @ Harun-Ur-Rashid, đó có lẽ là trường hợp - Tôi đã cài đặt nó trong một môi trường ảo. Tôi sẽ kiểm tra cách khắc phục nó. Cảm ơn vì đã trả lời.
dùng3768495

22

Nếu bạn sử dụng cách sau để thay đổi cổng hoặc máy chủ:

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

sử dụng mã sau đây để khởi động máy chủ (lối vào chính của tôi cho bình là app.py):

python app.py

thay vì sử dụng:

flask run

10

Nếu bạn muốn ứng dụng của mình trên cùng một cổng tức là port = 5000 thì chỉ trong thiết bị đầu cuối của bạn chạy lệnh này:

fuser -k 5000/tcp

và sau đó chạy:

python app.py

Nếu bạn muốn chạy trên một cổng được chỉ định, ví dụ: nếu bạn muốn chạy trên port = 80, trong tệp chính của bạn chỉ cần đề cập đến điều này:

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

8

Một cách thuận tiện là sử dụng gói python-dotenv: Nó đọc ra một .flaskenvtệp nơi bạn có thể lưu trữ các biến môi trường cho bình.

  • pip install python-dotenv
  • tạo một tập tin .flaskenvtrong thư mục gốc của ứng dụng của bạn

Trong tập tin bạn chỉ định:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

Sau đó, bạn chỉ cần chạy ứng dụng của mình flask runvà có thể truy cập ứng dụng của mình tại cổng đó.

Xin lưu ý rằng FLASK_RUN_HOSTmặc định 127.0.0.1FLASK_RUN_PORTmặc định là 5000.


8

Đây là giải pháp duy nhất phù hợp với tôi trên Ubuntu-18.

Trong tập tin app.py, sử dụng:

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

Đoạn mã trên sẽ đưa ra lỗi cấp phép tương tự trừ khi sudođược sử dụng để chạy nó:

sudo python3 app.py

6

Vấn đề của bạn là, bạn có một máy chủ web apache đang chạy đang sử dụng cổng 80. Vì vậy, bạn có thể:

  1. Giết apache: Có lẽ bạn nên làm điều này thông qua /etc/init.d/apache2 stop, thay vì chỉ đơn giản là giết chúng.

  2. Triển khai ứng dụng bình của bạn trong quá trình apache của bạn, như bình trong apache mô tả.


5

Tôi đã phải đặt FLASK_RUN_PORTtrong môi trường của mình thành số cổng được chỉ định. Lần tới khi bạn khởi động ứng dụng, Flask sẽ tải biến môi trường đó với số cổng bạn đã chọn.


3

Bạn không cần thay đổi số cổng cho ứng dụng của mình, chỉ cần định cấu hình máy chủ www (nginx hoặc apache) của bạn thành truy vấn proxy sang cổng bình. Trả tiền trên uWSGI.



2

Giải pháp dễ nhất và tốt nhất

Lưu tệp .py của bạn trong một thư mục. Trường hợp này tên thư mục của tôi là thử nghiệm. Trong dấu nhắc lệnh chạy như sau

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

----------------- Sau đây sẽ được trả lại ----------------

 * 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 -

Bây giờ trên loại trình duyệt của bạn: http://127.0.0.1:8000 . Cảm ơn


Anh ta cần chạy nó trên 80, một cổng đặc biệt. Anh ta cần phải dừng những thứ khác trước.
Ahmedn1

1

Theo kịch bản của tôi, các bước sau đây hoạt động như một cơ duyên:

  • Cài đặt gói:

    pip install --upgrade pip
    pip install python-dotenv
  • Tạo một tập tin ẩn trong thư mục ứng dụng của tôi "jarr / .flaskenv"

  • Thêm nội dung sau:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • Cuối cùng, chạy lệnh bình thêm một lần nữa:

    flask run
  • Phiên bản mà tôi đang làm việc là:

    pip freeze |grep -i flask
    Flask==1.1.1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.