from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "hello"
@app.route('/1')
def test1page():
return "1page ok"
@app.route('/2')
def test2page():
return "2page ok"
def main():
app.run(debug=True, port=80) #책은 포트번호 80으로 나오는데 그러면 permission denied 오류.
if __name__ == '__main__':
main()
파이썬과 40개의 작품들 이라는 책을 따라하다가 'Permission denied 오류가 발생했다.
오류의 원인은 포트 번호였다. 포트 번호가 책에선 80으로 나왔으나 이를 8000으로 수정하니 정상적으로 작동한다.
오류의 원인은 알았지만 왜 일어나는지는 알지 못해서 챗gpt한테 물어봤다.
아래는 챗gpt의 답변이다.
***
이 코드에서 포트 번호는 Flask 웹 애플리케이션이 들어오는 요청을 수신하는 네트워크 포트를 나타냅니다. 클라이언트가 웹 서버에 요청을 보낼 때 서버에서 통신하려는 특정 서비스를 나타내기 위해 IP 주소와 함께 포트 번호를 지정합니다. 포트 번호는 동일한 서버에서 실행되는 서로 다른 서비스에 대한 고유 식별자 역할을 합니다.
제공된 코드에서 라인은 app.run(debug=True, port=80)Flask 애플리케이션이 포트 80에서 실행되도록 설정합니다. 포트 80은 웹 페이지를 제공하는 데 일반적으로 사용되는 HTTP 트래픽의 기본 포트입니다. 그러나 포트 80에 바인딩하려면 권한이 부여된 포트이기 때문에 일반적으로 관리 권한이 필요합니다(1024 미만의 포트는 권한이 있는 것으로 간주됨). 대부분의 경우 일반 사용자는 보안상의 이유로 이러한 포트에 바인딩할 수 없습니다.
관리자 권한 없이 Flask 애플리케이션을 실행하려고 하면 port=80오류가 발생합니다. 이 오류는 일반적으로 "권한 거부됨" 또는 이와 유사한 내용으로 표시되며 프로그램에 포트 80에 바인딩할 충분한 권한이 없음을 나타냅니다.
이 문제를 해결하려면 관리 권한(예: Unix 기반 시스템에서 사용)으로 Flask 응용 프로그램을 실행하거나 sudo특별한 권한이 필요하지 않은 8000과 같은 권한이 없는 포트 번호를 선택할 수 있습니다.
포트를 8000( app.run(debug=True, port=8000))으로 설정하면 일반적으로 일반 사용자가 1024 이상의 포트를 사용할 수 있으므로 권한 문제를 피할 수 있습니다. http://localhost:8000/따라서 Flask 애플리케이션은 포트 8000에서 정상적으로 실행되며 웹 브라우저에서 방문하여 액세스할 수 있습니다 .
프로덕션 환경에서는 리버스 프록시(예: Nginx)를 사용하여 포트 80에서 들어오는 트래픽을 처리하고 다른 포트(예: 8000)에서 실행 중인 Flask 애플리케이션으로 전달하는 것이 일반적이라는 점에 주목할 가치가 있습니다. 이렇게 하면 기본 HTTP 포트에서 계속 요청을 처리하면서 Flask 애플리케이션이 권한이 없는 사용자로 실행될 수 있습니다.
***
요약하자면 포트 번호 중 1024 이하의 포트는 특수한 관리 권한을 부여해야 실행할 수 있는 포트라서 80번 포트로 실행시키는 코드가 에러가 발생한 것이었다.