Как заставить Flask работать на 80-м порту?

212

У меня есть сервер Flask, работающий через порт 5000, и это нормально. Я могу получить к нему доступ на http://example.com:5000

Но возможно ли просто получить к нему доступ по адресу 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, но как-то перенаправить основной домен сайта?

quantumtremor
источник
Вы можете использовать его колбу с Apache .
Сайед Хабиб М
3
название вопроса не соответствует вопросу. возможно, следует прочитать «как не заставить другие вещи работать на порте 80». мне любопытно, как изменить работу колбы порта, о которой спрашивает этот вопрос, но никогда не упоминается, как это сделать
Эллиот Вудс,

Ответы:

76

Так что выдает это сообщение об ошибке, потому что вы apache2работаете на порту 80.

Если бы это было для развития, я бы просто оставил его как есть на порту 5000.

Если это для производства либо:

Не рекомендуется

  • Остановись apache2первым;

Не рекомендуется, как указано в документации:

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

рекомендуемые

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

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

Вот ссылка на официальную документацию по настройке Flask с Apache + mod_wsgi.

Редактировать 1 - Разъяснение для @Djack

Прокси HTTP-трафик на Flask через apache2

Когда запрос поступает на сервер через порт 80 ( HTTP) или порт 443 ( HTTPS), веб-сервер, такой как Apache или Nginx, обрабатывает соединение запроса и определяет, что с ним делать. В нашем случае полученный запрос должен быть настроен на передачу во Flask по протоколу WSGI и обработан кодом Python. Это «динамическая» часть.

обратный прокси для динамического контента

Есть несколько преимуществ для настройки вашего веб-сервера, как указано выше;

  • Завершение SSL - веб-сервер будет оптимизирован для обработки запросов HTTPS с небольшой настройкой. Не «бросайте свои» в Python, который, вероятно, очень небезопасен по сравнению.
  • Безопасность. Открытие порта в Интернете требует тщательного рассмотрения вопросов безопасности. Сервер разработки Flask не предназначен для этого и может иметь открытые ошибки или проблемы с безопасностью по сравнению с веб-сервером, предназначенным для этой цели. Обратите внимание, что плохо настроенный веб-сервер также может быть небезопасным!
  • Обработка статических файлов - встроенный веб-сервер Flask может обрабатывать статические файлы, однако это не рекомендуется; Nginx / Apache намного более эффективны в обработке статических файлов, таких как изображения, CSS, файлы Javascript, и будут передавать только «динамические» запросы (те, где содержимое часто читается из базы данных или изменения содержимого), которые будут обрабатываться кодом Python.
  • + Больше. Это граничит с областью для этого вопроса. Если вы хотите больше информации, сделайте некоторые исследования в этой области.
Ewan
источник
Это действительно отличный ответ! Можете ли вы представить на простом английском языке высокотехнологичный жаргон, который вы использовали " 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., когда Apache отсутствует .. :)
JOSE
1
это не работает для меня. это должно быть: фляжка --host = 0.0.0.0
Харун-Ур-Рашид
1
@jOSe Я пытался использовать PyCharm на Ubuntu, работает просто отлично.
Ошибки Багги
@jOSe Apache не нужен для запуска linux, вы можете удалить его или изменить его порт.
Нуреттин
145

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

flask run --host=0.0.0.0 --port=80
Харун-Ur-Rashid
источник
Может ли эта команда быть запущена с использованием 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
Привет @ Харун-Ур-Рашид, это, вероятно, так - я установил его в виртуальной среде. Я проверю, как это исправить. Спасибо за ваш ответ.
user3768495
22

Если вы используете следующее для изменения порта или хоста:

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

используйте следующий код для запуска сервера (мой главный вход для flask - app.py):

python app.py

Вместо того, чтобы использовать:

flask run
Muca
источник
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файл, в котором вы можете хранить переменные среды для фляги.

  • 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.

jorop
источник
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. Убить Apache: Вы, вероятно, должны сделать это через /etc/init.d/apache2 stop, а не просто убить их.

  2. Разверните ваше приложение фляги в вашем процессе Apache, как описывает фляга в Apache .

Себастьян
источник
5

Я должен был установить FLASK_RUN_PORTв моей среде указанный номер порта. В следующий раз, когда вы запустите ваше приложение, Flask загрузит эту переменную среды с выбранным вами номером порта.

Каталон кронин
источник
3

Вам не нужно менять номер порта для вашего приложения, просто настройте свой сервер www (nginx или apache) для запросов прокси к порту фляги. Обратите внимание на uWSGI.

Greg
источник
3

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

Валентин
источник
2

Самое простое и лучшее решение

Сохраните ваш .py файл в папке. В этом случае моя папка называется test. В командной строке запустите следующее

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 еще раз:

    flask run
  • Версия, над которой я работаю:

    pip freeze |grep -i flask
    Flask==1.1.1
Мануэль Лазо
источник