Як змусити Flask працювати на порт 80?


212

У мене Flask-сервер працює через порт 5000, і це добре. Я можу отримати доступ до нього за адресою http://example.comwhat000

Але чи можна просто отримати доступ до нього на веб-сайті http://example.com ? Я припускаю, що це означає, що я повинен змінити порт з 5000 на 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, але основний домен веб-сайту якось переспрямувати?


Ви можете використовувати цю колбу з апашем .
Syed Habib M

3
назва питання не відповідає питанню. можливо, він повинен читати "як не змусити інші речі працювати на порт 80". Мені цікаво, як змінити флеш-порт, на якому задається це питання, але ніколи не згадується, як тут
Елліот Вудс

Відповіді:


76

Тож це повідомлення про помилку передається через те, що у вас apache2працює порт 80.

Якщо це для розвитку, я б просто залишив його таким, який є на порту 5000.

Якщо це для виробництва:

Не рекомендовано

  • Зупиніться apache2спочатку;

Не рекомендується, як зазначено в документації:

Ви можете використовувати вбудований сервер під час розробки, але слід використовувати повний варіант розгортання для виробничих додатків. (Не використовуйте вбудований сервер розробки у виробництві.)

Рекомендовано

  • Проксі- HTTPтрафік через apache2Flask.

Таким чином, ви apache2можете обробляти всі ваші статичні файли (що дуже добре - набагато краще, ніж сервер налагодження, вбудований у Flask) та діяти як зворотний проксі для вашого динамічного вмісту, передаючи ці запити у Flask.

Ось посилання на офіційну документацію щодо налаштування Flask за допомогою Apache + mod_wsgi.

Редагувати 1 - Роз'яснення для @Djack

Проксі HTTP-трафік до колби через apache2

Коли запит надходить на сервер на порт 80 ( HTTP) або порт 443 ( HTTPS), веб-сервер, як Apache або Nginx, обробляє з'єднання запиту і визначає, що з ним робити. У нашому випадку отриманий запит повинен бути налаштований для передачі до Flask за протоколом WSGI та обробляється кодом Python. Це "динамічна" частина.

зворотний проксі для динамічного вмісту

Є декілька переваг налаштування вашого веб-сервера, як описано вище;

  • Припинення SSL - Веб-сервер буде оптимізований для обробки запитів HTTPS лише з невеликою конфігурацією. Не «котуйте своїх» у Python, що, мабуть, дуже небезпечно порівняно.
  • Безпека - Відкриття порту в Інтернеті вимагає ретельного розгляду безпеки. Сервер розробки Flask не призначений для цього і може мати відкриті помилки або проблеми безпеки порівняно з веб-сервером, призначеним для цієї мети. Зауважте, що погано налаштований веб-сервер також може бути небезпечним!
  • Статична обробка файлів - вбудований веб-сервер Flask може обробляти статичні файли, однак це не рекомендується; Nginx / Apache набагато ефективніше обробляти статичні файли, такі як зображення, CSS, файли Javascript і передаватимуть лише "динамічні" запити (ті, де вміст часто читається з бази даних або зміна вмісту), який обробляється кодом Python.
  • + більше. Це межує з обсягами цього питання. Якщо ви хочете отримати більше інформації, зробіть кілька досліджень у цій галузі.

Це справді чудова відповідь! Чи можете ви демістифікувати простою англійською мовою високо технічний жаргон, який ви використовували " Proxy HTTP traffic to Flask through apache2" і " reverse proxy for dynamic content"?
Джон Строд

2
@Djack - оновлена ​​відповідь, проте межує з обсягами питання, тому, будь ласка, знайдіть в Інтернеті додаткову інформацію.
Еван

1
Дякуємо за надання ключових слів. Я обов’язково проведу онлайн-пошук.
Джон Стройд

419

1- Зупиніть інші програми, які використовують порт 80. 2- запустіть програму з портом 80:

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

1
працює чудово, лише в середовищі Windows., коли
апач

1
це не працює для мене. це має бути: колба запустити --host = 0.0.0.0
Харун-Ур-Рашид

1
@jOSe Я спробував використовувати PyCharm в Ubuntu, працює чудово.
Bugs Buggy

@jOSe Apache не потрібен для запуску Linux, ви можете його видалити або змінити його порт.
Нуреттін

145

Для зовнішнього сервера, на якому ви не використовуєте апаш або інший веб-сервер, який ви просто вводите

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, він говорить "Відмовлено у дозволі". Якщо я на початку додаю "sudo", команда "flask" не розпізнається ...
user3768495

1
@ user3768495 Можливо, колба не встановлена ​​у root (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

Якщо ви хочете, щоб ваша програма знаходилася на одному порту, тобто port = 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файл, де можна зберігати змінні середовища для flask.

  • 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_PORTза замовчуванням для 5000.


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. Вбити апаш: Мабуть, ви повинні це зробити через /etc/init.d/apache2 stop, а не просто вбивати їх.

  2. Розгортайте додаток для колби в процесі apache, як описано в колбі в апачі .


5

Мені довелося встановити FLASK_RUN_PORTв моєму середовищі вказаний номер порту. Наступного разу, коли ви запустите додаток, Flask завантажить цю змінну середовища із номером порту, який ви вибрали.


3

Вам не потрібно змінювати номер порту для вашої програми, просто налаштуйте свій www-сервер (nginx або apache) на проксі-запити для flask-порту. Зверніть увагу на uWSGI.


3

встановіть порт з app.run(port=80,debug=True) вами, слід встановити налагодження на true, коли він перебуває у програмі dev


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, який є спеціальним портом. Йому потрібно спочатку зупинити інші речі.
Ахмедн1

1

У моєму сценарії такі кроки спрацювали як шарм:

  • Встановлення пакета:

    pip install --upgrade pip
    pip install python-dotenv
  • Створення прихованого файлу в моєму каталозі додатків "flaskr / .flaskenv"

  • Додавання наступного вмісту:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • Нарешті, запустіть команду колбу ще раз:

    flask run
  • Я працюю над версією:

    pip freeze |grep -i flask
    Flask==1.1.1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.