리눅스 (Linux) 환경에서 Python 웹 서버 환경을 배포해보는 과정을 다루고, 간단하게 실습을 해 보겠습니다. 해당 글에서는 Gunicorn을 WSGI 서버로 사용하고, Nginx를 프록시 서버로 설정하는 과정을 하나하나 따라할 수 있도록 구성을 하려 합니다. 잘 모르는 초보자도 바로 실습 가능하도록 명령어 및 설정 파일을 함께 제공하여 보겠습니다.
1. Python 웹 서버란?
우선 시작하기 전에, Python 웹 서버에 대해 알아가 보겠습니다. Python 웹 서버는 사용자의 요청을 처리하고 응답을 반환하는 애플리케이션을 말합니다. 일반적으로 Flask, Django 같은 프레임워크를 통해 웹 서버 애플리케이션을 작성하고, Gunicorn과 같은 WSGI 서버를 통해 실제 운영 환경에 배포하게 됩니다. 그리고 Flask 앱을 실행할 때 flask run
명령어로 로컬 서버를 띄울 수 있지만, 운영 환경에서는 성능과 안정성을 고려해 별도의 서버(Gunicorn)를 사용하는 것이 일반적입니다. 이때, 정적 파일 처리와 HTTPS 같은 기능은 Nginx와 같은 프록시 서버가 맡게 됩니다. 즉, Gunicorn은 Python 코드 실행 담당, Nginx는 요청 전달과 보안 처리를 맡는 구조입니다. 웹서버를 구축할 때 이 두 가지를 함께 사용하는 이유가 여기에 있습니다. Gunicorn은 비동기 처리가 가능하고 성능이 우수하며, Python 앱을 운영 환경에 안정적으로 배포하는 데 최적화되어 있습니다.
2. Gunicorn 설치 및 실행
두번째로는 이제 Flask 예제 애플리케이션을 Gunicorn으로 실행해 보겠습니다. 먼저 Flask를 설치한 가상환경에서 아래와 같이 Gunicorn을 설치해 보겠습니다. 아래의 명령어로 필요한 패키지를 설치할 수 있겠습니다.
pip install gunicorn
그 후 app.py
라는 파일에 Flask 코드를 작성해 둡니다. (리눅스에서 생성 시, vi 또는 vim 에디터를 사용할 수 있습니다.)
# app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello from Gunicorn!"
Gunicorn으로 이 앱을 실행하는 방법은 다음과 같습니다.
gunicorn -w 4 -b 0.0.0.0:8000 app:app
위 명령어는 4개의 워커(worker)를 사용해 app.py
안의 app
객체를 바인딩하여 0.0.0.0:8000
에서 실행하는 방식입니다. 여기서 -w
는 워커 수, -b
는 바인딩할 주소와 포트를 각각 의미하고 있습니다. 그리고 Gunicorn은 단독으로도 외부에서 접속 가능하지만, Nginx와 함께 구성하면 보안과 성능이 더 향상되어 이것을 권장합니다. 이제 Gunicorn 서버가 동작하는 상태이니, 다음 단계에서는 이를 Nginx와 연동해 봅니다.
3. Nginx로 배포 환경 구성
이제 리눅스 서버에 Nginx를 설치하고 Gunicorn과 연동해보겠습니다. 먼저 Ubuntu 기준으로 Nginx를 설치합니다.
sudo apt update
sudo apt install nginx
설치 후 /etc/nginx/sites-available
에 새 설정 파일을 만들어 줍니다.
sudo nano /etc/nginx/sites-available/myapp
아래와 같이, 설정을 입력합니다:
server {
listen 80;
server_name your_server_ip;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
그 후 심볼릭 링크를 걸어 설정을 적용할 수 있겠습니다.
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled
sudo nginx -t # 설정 테스트
sudo systemctl restart nginx
이제 사용자가 웹 브라우저에서 서버 IP에 접속하면 Nginx가 요청을 받아 Gunicorn으로 전달하고, 응답을 다시 사용자에게 전달하게 됩니다. 배포 환경에서는 HTTPS 설정, 방화벽 설정 등도 추가로 고려해야 하지만, 위 구성만으로도 기본적인 웹서비스는 무리 없이 운영할 수 있습니다. 도메인을 사용하고 싶다면 Cloudflare 또는 Route53 같은 DNS 설정도 병행하면 됩니다.
여태까지 리눅스 환경에서 Python 웹 애플리케이션을 Gunicorn과 Nginx를 이용해 실제로 배포하는 전체 과정을 설명하여 보았습니다. 로컬 개발에서 벗어나 운영 환경에 앱을 올리는 첫걸음을 성공적으로 마칠 수 있도록, 실습 중심으로 구성을 해 보았습니다.이제 여러분도 자신만의 프로젝트를 서버에 올려볼 준비가 되셨습니다. 다음 단계에서는 HTTPS 인증서 적용, Docker를 이용한 배포 자동화도 추후에 배우고, 실습하여 보면 좋을 것이라고 생각합니다.