Skip to content

포트 80에서 Streamlit 애플리케이션 실행하기

Updated on

Streamlit은 개발자가 최소한의 어려움으로 상호작용하는 웹 애플리케이션을 만들 수 있게 해주는 강력한 도구입니다. 그러나 설정에 관련된 문제가 있을 수 있습니다. 특히 포트 80에서 실행하는 것은 자주 발생하는 문제 중 하나입니다. 이 포괄적인 가이드에서 우리는 사용자 경험, 전문가의 통찰력, 실제 예시를 통해 이 주제를 깊이 있게 다루어 이 도전을 자신 있게 해결할 수 있도록 도와드립니다.

무료로 Streamlit을 사용하여 데이터 분석 및 데이터 시각화 앱을 만들고 싶으신가요?

PyGWalker (opens in a new tab)는 Python 라이브러리로서, 쉽게 Tableau와 유사한 UI를 자체 Streamlit 앱에 통합할 수 있도록 도와줍니다. Coding is Fun (opens in a new tab)의 Sven이 제작한 이 놀라운 비디오를 확인해보세요. 이 비디오에서는 이 강력한 데이터 시각화 Python 라이브러리를 사용하여 Streamlit 앱을 강화하는 방법에 대한 상세한 단계가 설명됩니다!


PyGWalker 커뮤니티에 기여한 Sven님에게 특별한 감사를 전합니다 (opens in a new tab)!

추가로, PyGWalker GitHub 페이지 (opens in a new tab)에서 PyGWalker 예제를 더 확인할 수도 있습니다.

제 1부: Streamlit의 포트 80에서 실행하는 구성의 어려움

2022년 5월에 Streamlit 커뮤니티의 사용자인 Nom_ji는 포트 80에서 애플리케이션을 실행하려 할 때 문제가 발생했습니다. Nom_ji는 공식 Streamlit 문서에서 설명하는 것처럼 적절한 구성 단계를 따랐음에도 불구하고 애플리케이션을 배포할 때 PermissionError: [Errno 13] 오류가 발생했습니다.

흥미롭게도, 애플리케이션은 8051번 포트와 8080번 포트에서 완벽히 실행되었습니다. 이는 첫 번째 주요한 포인트로 이어집니다:

  • 모든 포트가 동등하게 생성되지 않습니다. 포트 80을 비롯한 1024보다 작은 포트는 Unix 계열 운영체제에서 특권이 있는 포트로 간주되며 일반적으로 슈퍼유저(또는 루트) 액세스가 필요합니다.

Nom_ji의 문제에 대한 대답으로 Streamlit 개발자 커뮤니티의 이전 개발자 관련 책임자인 Randyzwitch는 포트 80이 다른 인스턴스에 의해 사용되고 있는지 확인하는 것을 제안했습니다. 터미널에서 netstat 명령을 사용하여 포트에서 현재 실행 중인 서비스를 확인할 수 있습니다:

sudo netstat -tuln | grep :80

이 명령은 현재 포트 80에서 실행 중인 서비스를 나열합니다. 명령이 출력을 반환하면 포트 80이 이미 사용 중이므로 Streamlit 애플리케이션을 이 포트에서 실행하기 위해 다른 서비스를 중지해야 합니다.

제 2부: Streamlit에서 포트 할당 깊이 알아보기

Streamlit 사용자가 일련의 고유한 포트를 필요로 하는 여러 Streamlit 애플리케이션을 동시에 실행하는 데 문제가 발생할 수 있습니다. Streamlit 커뮤니티 모더레이터인 BeyondMyself는 이를 위한 간단한 해결책을 제공했습니다: 애플리케이션을 시작할 때 --server.port 매개변수를 지정하십시오.

예를 들어, streamlit run myapp.py --server.port 8080 명령은 myapp.py 파일에서 정의된 Streamlit 앱을 8080 포트에서 실행합니다. 8080 대신 사용 가능한 포트 번호를 사용할 수 있습니다. 다른 서비스에서 이미 사용 중이지 않은 한 말이죠.

따라서 여러 Streamlit 앱을 실행하려고 할 때 다음 사항을 확인하십시오:

  • 각 애플리케이션에 고유한 포트 번호를 할당합니다.
  • 선택한 포트가 다른 서비스에서 이미 사용 중이지 않은지 확인합니다.

제 3부: Streamlit 앱이 표준 포트에서 실행되도록 하는 방법

Streamlit 앱을 사용 가능한 모든 포트에서 실행하도록 선택할 수 있지만, 도메인을 통해 앱이 표준 포트(예: 80)에서 실행되는 것처럼 보이길 원하는 경우가 있을 수 있습니다. 이때 리버스 프록시(Reverse proxy) 개념이 사용됩니다.

리버스 프록시는 웹 서버(Apache 또는 Nginx 등)에서 요청을 Streamlit 앱이 실행 중인 포트로 전달할 수 있습니다. 다음과 같은 여러 가지 방법으로 설정할 수 있습니다:

  • 도메인에 대한 모든 요청을 Streamlit 앱으로 전달합니다.
  • 웹 서버를 구성하여 특정 하위 디렉토리의 요청을 다른 Streamlit 앱으로 전달합니다.

예를 들어, 여러 개의 Streamlit 앱을 서로 다른 포트에서 실행하고 있다면,

mydomain.com/app1을 포트 8000에서 실행 중인 Streamlit 앱으로 전달하고 mydomain.com/app2을 포트 8080에서 실행 중인 앱으로 전달할 수 있습니다. 이렇게 설정하면 사용자의 관점에서 앱이 포트 80에서 실행 중인 것처럼 보입니다.

제 4부: Streamlit 애플리케이션을 위한 고정 포트 번호 설정하기

마지막으로, Streamlit 애플리케이션의 포트 번호를 고정시켜서 팀원이나 사용자에게 안정적인 링크를 공유하고 싶을 수 있습니다. 이때 ./streamlit/config.toml 파일이 사용됩니다.

config.toml 파일에서 고정 포트 번호를 지정할 수 있습니다. 예를 들어:

[server]
port = 8501

이 구성은 Streamlit이 앱을 실행할 때 항상 8501 포트를 사용하도록 지정합니다. 이 포트는 다른 서비스에서 사용 중이지 않아야 하며, 그렇지 않으면 앱이 실행되지 않을 것입니다.

요약하면 다음을 확인하십시오:

  • 특권 포트에 대한 슈퍼유저 액세스 권한을 갖고 있는지 확인합니다.
  • netstat을 사용하여 포트에서 실행 중인 기존 인스턴스를 확인합니다.
  • 여러 앱을 실행하기 위해 --server.port 매개변수를 사용합니다.
  • 리버스 프록시를 사용하여 앱이 포트 80에서 실행되는 것처럼 보이도록 설정합니다.
  • config.toml 파일을 사용하여 포트 번호를 고정합니다.

제 5부: 일반적인 오류 해결

앞서 설명한 단계를 따라도 "포트가 예약되었습니다"와 같은 오류가 발생할 수 있습니다. 이 오류는 다른 프로세스가 제대로 종료되지 않았거나 포트를 사용하려는 동안 다른 어떤 프로세스가 실행 중인 경우에 자주 발생합니다.

포트가 사용 중인지 확인하려면 netstat 명령을 사용할 수 있습니다. 다음은 특정 포트(이 경우 포트 80)가 사용 중인지 확인하는 간단한 코드 스니펫입니다:

netstat -tuln | grep :80

출력에서 원하는 포트 번호가 나열되어 있는 경우, 해당 포트가 사용 중이라는 의미입니다. Linux 시스템에서는 lsof 명령을 사용해서 특정 포트를 사용하는 프로세스를 확인할 수도 있습니다:

sudo lsof -i :80

프로세스를 식별한 후에는 kill 명령을 사용하여 해당 프로세스를 종료할 수 있습니다.

kill -9 PID

PID는 이전 명령에서 얻은 프로세스 ID로 대체하세요.

포트를 사용하는 다른 프로세스가 없음을 확신하고도 오류가 발생하는 경우, 운영 체제의 네트워크 설정에 문제가 있을 수 있습니다. 이 경우 IT 전문가나 Streamlit 커뮤니티에 도움을 요청하는 것이 좋습니다.

제 6부: Streamlit 애플리케이션의 최신 상태 유지하기

또 다른 도전 과제는 Streamlit 애플리케이션이 항상 최신 데이터를 표시하도록 하는 것입니다. 특히 앱이 실시간이거나 자주 업데이트되는 데이터를 표시하는 경우에 특히 중요합니다. 이 도전 과제의 해결책은 Streamlit 캐시에 있습니다.

Streamlit의 캐싱 메커니즘을 사용하면 앱이 데이터를 디스크에서 로드하거나 원격 서버에서 가져 오는 대신 데이터를 메모리에 저장할 수 있습니다.

데이터 로딩 함수에서 @st.cache 데코레이터를 사용하여 애플리케이션의 속도와 응답 시간을 크게 향상시킬 수 있습니다. 예를 들어 원격 서버에서 데이터를 가져 오는 함수가 있는 경우 다음과 같이 함수 위에 @st.cache 데코레이터를 추가할 수 있습니다:

@st.cache
def get_data():
    # 원격 서버에서 데이터 가져오기
    return data

이렇게 하면 Streamlit은 반환된 데이터를 캐시에 저장합니다. 함수가 다시 호출 될 때 Streamlit은 먼저 데이터가 캐시에 있는지 확인합니다. 데이터가있는 경우 Streamlit은 함수를 다시 호출하는 대신 캐시 된 데이터를 사용합니다.

또한 Streamlit은 캐시할 데이터의 지속 시간을 지정하는 데 사용할 수있는 ttl 매개 변수를 제공합니다. ttl을 일정한 시간으로 설정하면 Streamlit은 지정된 기간 후에 자동으로 캐시 된 데이터를 새로 고칩니다.

함수에서 ttl 매개 변수를 사용하는 예제를 살펴 보겠습니다:

@st.cache(ttl=60*60*2)
def get_data():
    # 원격 서버에서 데이터 가져오기
    return data

이 예제에서 ttl은 두 시간 (60 초 * 60 분 * 2)로 설정되어 있으며, 이는 Streamlit이 매 두 시간마다 데이터를 자동으로 새로 고칩니다.

결론

포트 80에서 Streamlit 애플리케이션을 실행하는 것은 처음 보는 것만큼 간단하지 않습니다. 이는 포트의 특권성 및 다른 포트 또는 권한과 같은 잠재적 인 문제 때문입니다. 그러나이 가이드에서 논의 한 통찰력을 사용하면 이러한 도전 과제를 잘 해결할 준비가되어 있습니다.

어려움을 겪을 때는 Streamlit 커뮤니티에 문의하는 것을 주저하지 마십시오. 그곳에는 비슷한 문제를 겪은 경험있는 사람들이 가득하며 도움의 손길을 주기를 기꺼이합니다.

자주 묻는 질문

1. 왜 Streamlit 애플리케이션을 포트 80에서 실행할 수 없나요?

포트 80을 포함하여 1024 미만의 포트는 Unix와 비슷한 운영 체제에서 특권으로 간주되며 일반적으로 슈퍼 사용자 (또는 루트) 액세스가 필요합니다. 필요한 권한이 있는지 및 포트가 이미 사용 중인지 확인하십시오.

2. 어떻게 여러 개의 Streamlit 애플리케이션을 동시에 실행할 수 있나요?

애플리케이션을 시작할 때 --server.port 매개 변수를 사용하여 각 애플리케이션에 대해 다른 포트 번호를 지정하여 여러 개의 Streamlit 앱을 실행할 수 있습니다.

3. Streamlit 애플리케이션 데이터를 최신 상태로 유지하는 방법은 무엇인가요?

데이터 로딩 함수에서 @st.cache 데코레이터를 사용하여 데이터를 메모리에 저장하여 애플리케이션의 속도와 응답 시간을 향상시킬 수 있습니다. Streamlit은 또한 데이터가 캐시될 지속 시간을 지정하기 위해 ttl 매개 변수를 제공합니다.