포트 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.1FLASK_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.