Как мне запустить 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.