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

У меня есть сервер 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, но как-то перенаправить основной домен сайта?

Ответ 1

Таким образом, это вызывает это сообщение об ошибке, поскольку на порту 80 выполняется apache2.

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

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

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

  • Сначала остановите apache2;

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

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

Рекомендуется

  • Прокси HTTP трафик через apache2 на флажок.

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

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

Изменить 1 - Уточнение для @Djack

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

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

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

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

  • Прекращение SSL. Веб-сервер будет оптимизирован для обработки запросов HTTPS только с небольшой конфигурацией. Не "сворачивайте свой собственный" в Python, который, вероятно, очень небезопасен в сравнении.
  • Безопасность. Открытие порта в Интернете требует тщательного рассмотрения безопасности. Сервер разработки флэшей не предназначен для этого и может иметь открытые ошибки или проблемы безопасности по сравнению с веб-сервером, предназначенным для этой цели. Обратите внимание, что плохо настроенный веб-сервер также может быть небезопасным!
  • Обработка статических файлов. Встроенный веб-сервер Flask может обрабатывать статические файлы, однако это не рекомендуется; Nginx/Apache гораздо эффективнее обрабатывают статические файлы, такие как изображения, CSS, файлы Javascript и передают только "динамические" запросы (те, где контент часто считывается из базы данных или изменения содержимого), обрабатываемый кодом Python.
  • + больше. Это граничит с вопросом для этого вопроса. Если вы хотите получить дополнительную информацию, сделайте некоторые исследования в этой области.

Ответ 2

1- Остановить другие приложения, использующие порт 80. 2- запустить приложение с портом 80:

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

Ответ 3

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

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

Ответ 4

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

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

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

python app.py

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

flask run

Ответ 5

Если вы хотите, чтобы ваше приложение было на том же порту, то есть port = 5000, то просто в своем терминале выполните эту команду:

fuser -k 5000/tcp

и затем запустите:

python app.py

Если вы хотите работать с указанным портом, например, если вы хотите работать с портом = 80, в основном файле просто укажите это:

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

Ответ 6

Ваша проблема в том, что у вас уже запущен веб-сервер apache, который уже использует порт 80. Таким образом, вы можете:

  • Убить apache: вы должны, вероятно, сделать это через /etc/init.d/apache2 stop, а не просто убивать их.

  • Разверните флеш-приложение в процессе apache, как описано фляжка в apache.

Ответ 7

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

Ответ 8

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

Ответ 9

установите порт с помощью app.run(port=80,debug=True) для debug необходимо установить значение true, если он включен

Ответ 10

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

Сохраните ваш .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. Спасибо

Ответ 11

Я не могу запустить свое приложение на 80, оно запускается на 5000 просто отлично. Я не вижу, как работает Apache? что еще я могу проверить? Мы хотим работать на 80, поэтому мы можем использовать URL без указания порта.

>     server.run(debug=False, host=args.host, port=args.port)   File "/home/ryanicky/.local/lib/python3.6/site-packages/flask/app.py", line
> 944, in run
>     run_simple(host, port, self, **options)   File "/home/ryanicky/.local/lib/python3.6/site-packages/werkzeug/serving.py",
> line 1009, in run_simple
>     inner()   File "/home/ryanicky/.local/lib/python3.6/site-packages/werkzeug/serving.py",
> line 962, in inner
>     fd=fd,   File "/home/ryanicky/.local/lib/python3.6/site-packages/werkzeug/serving.py",
> line 805, in make_server
>     host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd   File
> "/home/ryanicky/.local/lib/python3.6/site-packages/werkzeug/serving.py",
> line 698, in __init__
>     HTTPServer.__init__(self, server_address, handler)   File "/usr/lib64/python3.6/socketserver.py", line 456, in __init__
>     self.server_bind()   File "/usr/lib64/python3.6/http/server.py", line 136, in server_bind
>     socketserver.TCPServer.server_bind(self)   File "/usr/lib64/python3.6/socketserver.py", line 470, in server_bind
>     self.socket.bind(self.server_address) OSError: [Errno 98] Address already in use [[email protected] WebSTR]$ systemctl status httpd Unit
> httpd.service could not be found.