포트 80에서 Flask를 실행하려면 어떻게해야합니까?


212

포트 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에서 계속 실행하는 다른 방법이 있습니까?하지만 기본 웹 사이트 도메인이 어떻게 든 리디렉션됩니까?


당신은 그것을 아파치와 플라스크를 사용할 수 있습니다 .
— Syed Habib M

3
질문의 제목이 질문에 맞지 않습니다. 아마도 '포트 80에서 다른 것을 실행하지 않는 방법'을 읽어야합니다. 포트 플라스크가 작동하는 방법이 궁금합니다.이 질문은 다음과 같습니다
— Elliot Woods

답변:


76

따라서 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 코드에서 처리 할 "동적"요청 (데이터베이스에서 내용을 읽거나 내용이 변경되는 경우) 만 전달합니다.
  • + 더 이것은이 질문의 범위에 접해 있습니다. 더 많은 정보를 원하면이 영역에 대해 조사하십시오.

정말 좋은 답변입니다! " Proxy HTTP traffic to Flask through apache2"와 " reverse proxy for dynamic content" 를 사용한 고도로 전문적인 전문 용어를 일반 영어로 이해할 수 있습니까 ?
— John Strood

2
@Djack-답변이 업데이트되었지만 질문의 범위가 경계에 있으므로 자세한 내용을 보려면 온라인으로 검색하십시오.
— Ewan

1
키워드를 제공해 주셔서 감사합니다. 반드시 온라인 검색을하겠습니다.
— John Strood

419

1- 포트 80을 사용하는 다른 응용 프로그램을 중지하십시오. 2- 포트 80으로 응용 프로그램을 실행하십시오.

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

1
아파치가 없을 때 Windows 환경에서만 잘 작동합니다. : :)
— jOSe

1
그것은 나를 위해 작동하지 않습니다. 그것은해야한다 : 플라스크 실행 --host = 0.0.0.0
— 하룬 - 우르 - 라시드

1
@ jOSe 우분투에서 PyCharm을 사용해 보았습니다. 잘 작동합니다.
— 버그 버기

@jOSe Apache는 Linux를 실행하는 데 필요하지 않습니다. Linux를 제거하거나 포트를 변경할 수 있습니다.
— nurettin

145

아파치 나 다른 웹 서버를 사용하지 않는 외부에서 보이는 서버의 경우

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

env vars를 사용하여이 명령을 실행할 수 있습니까? CMD flask run --host=0.0.0.0 --port=$PORTDockerfile 내에서 계속 시도하고 있는데 (헤 로쿠 이유로) 포트에 정수가 필요하다는 오류가 계속 발생합니다.
— Smokin Joe

로컬 (노트북)에서 제대로 작동했지만 AWS EC2 인스턴스에서 사용하면 "Permission Denied"가 표시됩니다. 처음에 "sudo"를 추가하면 "flask"명령이 인식되지 않는다고합니다.
— user3768495

1
@ user3768495 어쩌면 플라스크가 루트 (스도) 사용자에게 설치되지 않았을 수도 있습니다
— Harun-Ur-Rashid

2
안녕하세요 @ Harun-Ur-Rashid, 아마도 그럴 것입니다. 가상 환경에 설치했습니다. 문제를 해결하는 방법을 확인하겠습니다. 답장을 보내 주셔서 감사합니다.
— user3768495

22

다음을 사용하여 포트 또는 호스트를 변경하는 경우 :

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

다음 코드를 사용하여 서버를 시작하십시오 (플라스크의 주요 입구는 app.py입니다).

python app.py

사용하는 대신:

flask run

10

동일한 포트, 즉 port = 5000에 응용 프로그램을 설치하려면 터미널에서 다음 명령을 실행하십시오.

fuser -k 5000/tcp

그런 다음 다음을 실행하십시오.

python app.py

지정된 포트에서 실행하려면 (예 : port = 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.


8

이것은 Ubuntu-18에서 나를 위해 일한 유일한 솔루션입니다.

파일 내부에서 다음을 app.py사용하십시오.

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

위의 코드 sudo는 실행에 사용 되지 않는 한 동일한 권한 오류를 발생시킵니다 .

sudo python3 app.py

6

문제는 이미 포트 80을 사용하는 아파치 웹 서버가 실행 중이라는 것입니다. 따라서 다음 중 하나를 수행 할 수 있습니다.

  1. 아파치 죽이기 : /etc/init.d/apache2 stop단순히 죽이는 것이 아니라을 통해해야 한다.

  2. 아파치의 플라스크가 설명하는 것처럼 아파치 프로세스에 플라스크 앱을 배포하십시오 .


5

FLASK_RUN_PORT내 환경에서 지정된 포트 번호 로 설정해야했습니다 . 다음에 앱을 시작할 때 Flask는 선택한 포트 번호로 해당 환경 변수를로드합니다.


3

응용 프로그램의 포트 번호를 변경할 필요가 없으며 www 서버 (nginx 또는 apache)를 구성하여 쿼리를 플라스크 포트로 프록시 처리하십시오. 에 attantion을 지불하십시오 uWSGI.


3

와 포트 세트 app.run(port=80,debug=True) 때 디바이스에 true로 디버그를 설정해야합니다


2

가장 쉽고 최상의 솔루션

.py 파일을 폴더에 저장하십시오. 이 경우 내 폴더 이름은 테스트입니다. 명령 프롬프트에서 다음을 실행하십시오.

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에서 실행해야합니다. 그는 먼저 다른 것들을 멈춰야합니다.
— Ahmedn1

1

내 시나리오에서 다음 단계는 매력처럼 작동했습니다.

  • 패키지 설치

    pip install --upgrade pip
    pip install python-dotenv
  • 내 앱 디렉토리 "flaskr / .flaskenv"에 숨겨진 파일 만들기

  • 다음 내용 추가하기 :

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • 마지막으로 플라스크 명령을 한 번 더 실행하십시오.

    flask run
  • 내가 작업중 인 버전은 다음과 같습니다.

    pip freeze |grep -i flask
    Flask==1.1.1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.