У меня есть сервер 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. 2 - запустить приложение с портом 80 :
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
На внешний сервер, где вы не'т использовать Apache или другими веб-сервера вы просто тип
flask run --host=0.0.0.0 --port=80
Значит, он выдает это сообщение об ошибке, потому что у вас apache2
работает на порту 80.
Если это для разработки, я бы просто оставил все как есть на порту 5000.
Если это для производства, то тоже:
Не рекомендуется.
apache2
;Не рекомендуется, как сказано в документации:
Вы можете использовать встроенный сервер во время разработки, но для производственных приложений вы должны использовать вариант полного развертывания. (Не используйте встроенный сервер разработки в производстве).
Рекомендуется.
HTTP
трафик через apache2
на Flask.Таким образом, apache2
может обрабатывать все ваши статические файлы (что он делает очень хорошо - намного лучше, чем встроенный во Flask сервер отладки) и действовать как обратный прокси для вашего динамического контента, передавая эти запросы во Flask.
Вот ссылка на официальную документацию по настройке Flask с Apache + mod_wsgi.
Правка 1 - Уточнение для @Djack.
Проксировать HTTP трафик на Flask через apache2
Когда запрос приходит на сервер по порту 80 (HTTP
) или 443 (HTTPS
), веб-сервер, такой как Apache или Nginx, обрабатывает соединение запроса и решает, что с ним делать. В нашем случае полученный запрос должен быть настроен на передачу во Flask по протоколу WSGI и обработан кодом Python. Это и есть "динамическая" часть.
обратный прокси для динамического контента
Есть несколько преимуществ настройки вашего веб-сервера, как описано выше;
Если вы выполните следующие действия, чтобы изменить порт или хост:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
используйте следующий код для запуска сервера (моя главная вход для колбы app.py):
python app.py
вместо использования:
flask run
Если вы хотите, чтобы ваше приложение на одном порту.e порт=5000 потом просто в терминале выполните следующую команду:
fuser -k 5000/tcp
а затем выполните:
python app.py
Если вы хотите работать на указанном порту, например, если вы хотите использовать порт=80, в основной файл просто упоминаю об этом:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
Ваша проблема в том, что у вас уже запущен веб-сервер apache, который уже использует порт 80. Поэтому вы можете либо:
Убить apache: Вы, вероятно, должны сделать это через /etc/init.d/apache2 stop
, а не просто убить его.
Разверните ваше приложение flask в процессе apache, как описано в flask in apache.
Мне пришлось установить FLASK_RUN_PORT
в моем окружении с указанным номером порта. В следующий раз вы запустите приложение, фляга будет загружать эту переменную окружения с номером порта, который вы выбрали.
Простой и лучшее решение
Сохранить .пы файл в папке. В этом случае мое имя папки тест. В командной строке выполните следующую
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. Спасибо