포트 5000을 통해 Flask 서버를 실행 중이며 괜찮습니다. 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에서 계속 실행하는 다른 방법이 있습니까?하지만 기본 웹 사이트 도메인이 어떻게 든 리디렉션됩니까?
답변
따라서 apache2
포트 80에서 실행 했기 때문에 해당 오류 메시지가 발생합니다 .
이것이 개발 용인 경우 포트 5000에 그대로 둡니다.
프로덕션 용인 경우 :
권장하지 않음
apache2
먼저 멈춰라 .
설명서에 명시된대로 권장하지 않습니다.
개발 중에 내장 서버를 사용할 수 있지만 프로덕션 응용 프로그램에는 전체 배포 옵션을 사용해야합니다. 프로덕션 환경에서 내장 개발 서버를 사용하지 마십시오.
추천
- 플라스크를
HTTP
통한 프록시 트래픽apache2
.
이렇게하면 apache2
모든 정적 파일 (Flask에 내장 된 디버그 서버보다 훨씬 우수함)을 처리하고 동적 콘텐츠에 대한 역방향 프록시 역할을하여 해당 요청을 Flask에 전달할 수 있습니다.
다음 은 Apache + mod_wsgi로 Flask를 설정하는 방법에 대한 공식 문서 링크 입니다.
편집 1-@Djack에 대한 설명
Apache2를 통한 Flask 프록시 프록시 트래픽
요청이 포트 80 ( HTTP
) 또는 포트 443 ( HTTPS
) 에서 서버로 오면 Apache 또는 Nginx와 같은 웹 서버가 요청의 연결을 처리하고 요청과 관련된 작업을 수행합니다. 이 경우 수신 된 요청은 WSGI 프로토콜의 Flask로 전달되고 Python 코드에 의해 처리되도록 구성되어야합니다. 이것이 “동적”부분입니다.
동적 컨텐츠를위한 리버스 프록시
위와 같이 웹 서버를 구성하면 몇 가지 장점이 있습니다.
- SSL 종료-웹 서버는 약간의 구성만으로 HTTPS 요청을 처리하도록 최적화됩니다. 파이썬에서는 “자신의 롤”을하지 마십시오. 아마도 비교가 매우 안전하지 않을 것입니다.
- 보안-인터넷 포트를 열려면 보안을 신중하게 고려해야합니다. Flask의 개발 서버는이를 위해 설계되지 않았으며이 목적을 위해 설계된 웹 서버와 비교하여 오픈 버그 또는 보안 문제가있을 수 있습니다. 잘못 구성된 웹 서버도 안전하지 않을 수 있습니다!
- 정적 파일 처리-내장 Flask 웹 서버가 정적 파일을 처리 할 수 있지만 권장하지는 않습니다. Nginx / Apache는 이미지, CSS, Javascript 파일과 같은 정적 파일을 처리하는 데 훨씬 효율적이며 Python 코드에서 처리 할 “동적”요청 (데이터베이스에서 내용을 읽거나 내용이 변경되는 경우) 만 전달합니다.
- + 더 이것은이 질문의 범위에 접해 있습니다. 더 많은 정보를 원하면이 영역에 대해 조사하십시오.
답변
1- 포트 80을 사용하는 다른 응용 프로그램을 중지하십시오. 2- 포트 80으로 응용 프로그램을 실행하십시오.
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
답변
아파치 나 다른 웹 서버를 사용하지 않는 외부에서 보이는 서버의 경우
flask run --host=0.0.0.0 --port=80
답변
다음을 사용하여 포트 또는 호스트를 변경하는 경우 :
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
다음 코드를 사용하여 서버를 시작하십시오 (플라스크의 주요 입구는 app.py입니다).
python app.py
사용하는 대신:
flask run
답변
동일한 포트, 즉 port = 5000에 응용 프로그램을 설치하려면 터미널에서 다음 명령을 실행하십시오.
fuser -k 5000/tcp
그런 다음 다음을 실행하십시오.
python app.py
지정된 포트에서 실행하려면 (예 : port = 80에서 실행하려는 경우) 주 파일에서 다음을 언급하십시오.
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
답변
편리한 방법은 패키지를 사용하는 것입니다 . 플라스크의 환경 변수를 저장할 수 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
.
답변
이것은 Ubuntu-18에서 나를 위해 일한 유일한 솔루션입니다.
파일 내부에서 다음을 app.py
사용하십시오.
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
위의 코드 sudo
는 실행에 사용 되지 않는 한 동일한 권한 오류를 발생시킵니다 .
sudo python3 app.py