목차
준비
설치
Step One: 패키지 업데이트(Update Packages)
Step Two: 가상 환경세팅(Install and Create Virtualenv)
Step Three: 장고 설치(Install Django)
Step Four: PostgreSQL 설치(Install PostgreSQL)
Step Five: NGINX 설치(Install NGINX)
Step Six: Gunicorn 설치(Install Gunicorn)
설정
Step Seven: PostgreSQL 설정(Configure PostgreSQL)
Step Eight: 장고 프로젝트 생성(Create a Django Project)
Step Nine: Gunicorn 설정(Configure Gunicorn)
Step Ten: NGINX 설정(Configure NGINX)
※ Digitalocean의 How To Install and Configure Django with Postgres, Nginx, and Gunicorn 의 글을 제가 이해한 대로 번역하였습니다. 틀린 부분이 있을지도 모르니 원문도 꼭 읽어주세요.
준비
이 튜토리얼은 리눅스(ex: Ubuntu) 환경에서 진행됩니다. 원본 글에는 두 단계(1 설치 2 활용)로
나누어 포스팅 하였지만 이 문서에는 세팅 부분만 번역하였습니다.
설치
[ Step One: 패키지 업데이트(Update Packages)
만약의 상황을 대비하여 패키지들을 최신 상태로 업데이트합니다.
sudo apt-get update sudo apt-get upgrade |
[ Step Two: 가상 환경세팅(Install and Create Virtualenv)
이 글에서는 기존 리눅스에 세팅된 파이썬을 최대한 건드리지 않고 진행하기 위하여
가상 환경을 세팅하고 일련의 과정을 그 환경에서 진행합니다.
sudo apt-get install python-virtualenv sudo virtualenv /opt/myenv |
/opt 밑의 /myenv 폴더(/opt/myenv) 에 가상 환경이 세팅 되었습니다.
[ Step Three: 장고 설치(Install Django)
장고를 설치하기 전에 일단 virtualenv 를 활성화 시킵니다.
source /opt/myenv/bin/activate |
프롬프트 입력줄에 “myenv” 가 표시되었다면 virtualenv 가 정상적으로 활성화 된 것입니다.
다음으로 가상 환경에 장고(Django)를 설치해줍니다.
V | pip install django |
[ Step Four: PostgreSQL 설치(Install PostgreSQL)
대부분의 Django 개발자들은 PostgreSQL 을 개발 DB로 잡는 것을 선호한다고 합니다(우리나라는 잘 안보이네요..)
또한 장고 ORM 은 MySQL 등 타 DB 서버보다 PostgreSQL 에서 훨씬 더 잘 작동한다고 합니다.
PostgreSQL 설치 시에는 virtualenv를 사용하지 않기 때문에 가상 환경을 비활성화 후 PostgreSQL을 설치해줍니다.
V | deactivate |
sudo apt-get install postgresql postgresql-contrib |
[ Step Five: NGINX 설치(Install NGINX)
NGINX 는 가볍고 빠른 웹 서버입니다. 이곳에서는 장고 어플리케이션에 정적 파일을 전달하려 사용합니다.
프롬프트에서 NGINX를 설치합니다.
sudo apt-get install nginx |
NGNIX 를 시작해야 하지만 VPS 설정이 완료된 후 설정 및 작동 시키겠습니다.
[ Step Six: Gunicorn 설치(Install Gunicorn)
Gunicorn 은 Python WSGI 의 HTTP 서버 입니다. ( 참고 )
Gunicorn 은 파이썬 패키지이기 때문에 먼저 가상 환경을 활성화 시켜줍니다.
source /opt/myenv/bin/activate |
활성화가 완료 되었다면 Gunicorn 을 설치합니다.
V | pip install gunicorn |
여기까지 설치 작업은 모두 완료 되었습니다. 실제 사용을 위해서는 Django 와 PostgreSQL, NGINX 에서의 여러 설정이 필요합니다.
설정
[ Step Seven: PostgreSQL 설정(Configure PostgreSQL)
PostgreSQL를 사용하기 위해서는 사용할 유저를 만들고 권한을 부여해 주어야 합니다.
먼저 프롬프트에서 PostgreSQL 를 실행해 줍니다.
sudo su - postgres |
PostgreSQL 이 성공적으로 실행 되었다면 사용할 DB를 만들어 줍니다.
DB | createdb mydb |
다음은 이 DB를 사용할 유저를 만들어 줍니다.
DB | createuser -P |
이 명령어 후 유저 생성을 위한 질문에 대한 입력을 합니다.
첫 번째는 새로운 유저의 이름(name)을,
두 번째는 새로운 유저의 비밀번호(password)를.
나머지는 유저의 용도에 따라 설정해줍니다.
DB | Shall the new role be a superuser? (y/n) n Shall the new role be allowed to create databases? (y/n) n Shall the new role be allowed to create more new roles? (y/n) n |
CREATE USER 명령에 대한 자세한 설명 ( 참고 )
유저 생성이 완료되었다면 PostgreSQL 을 실행시켜 준 후 생성한 유저에 권한을 부여해줍니다.
psql | |
DB | GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser; |
[ Step Eight: 장고 프로젝트 생성(Create a Django Project)
Django 의 설정을 위해 일단 Django 프로젝트를 만들어 줍니다.
먼저, 미리 만들어 놓은 가상 환경 디렉토리에 들어갑니다.
cd /opt/myenv |
만약 virtualenv 가 실행 되고 있지 않다면 실행해줍니다.
source /opt/myenv/bin/activate |
virtualenv 가 실행 중이라면 새로운 Django 프로젝트를 만들어 줍니다.
V | django-admin.py startproject myproject |
다음으로는 PostgreSQL 과 Django 의 연동을 위하여 psycopg2 패키지를 설치해줍니다.
V | pip install psycopg2 |
설치가 완료되었다면 setting.py 를 열어 DB 설정을 해줍니다.
DB | DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'mydb', # Or path to database file if using sqlite3. # The following settings are not used with sqlite3: 'USER': 'myuser', 'PASSWORD': 'password', 'HOST': 'localhost', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP. 'PORT': '', # Set to empty string for default. } } |
세팅을 저장한 후 DB 설정을 반영합니다.
V | python manage.py syncdb |
위의 과정은 이 글에 특화되어있으며 다른 방식을 사용하여도 괜찮습니다.
[ Step Nine: Configure Gunicorn
Gunicorn을 설정하기 전에 먼저 기본 설정으로 구동해봅니다.
gunicorn_django --bind mydomain.com:8001 |
mydomain.com 은 자신이 구성한 도메인 혹은 IP 주소로 넣어줍니다.
구동 후 mydomain.com:8001 에 접속하면 장고 시작 화면을 볼 수 있을 것입니다.
기본 설정의 경우 Gunicorn 자원을 한 개만 사용합니다. 만약 당신이 대형 VPN을 구동한다면 설정을 조정해야 할 필요가 있습니다.
gunicorn_django --workers=3 --bind yourdomainorip.com:8001 |
Gunicorn은 유저에 대한 언급이 없다면 기본적으로 user를 root로 잡고 구동 됩니다.
모든 유저를 대상으로 구동 시키려면 아래와 같이 명령합니다.
gunicorn_django --workers=3 --user=nobody --bind yourdomainorip.com:8001 |
더 많은 설정을 위해서는 Gunicorn 의 설정 파일을 수정합니다.
Gunicorn 설정 파일은 어디든 배치 할 수 있습니다. 예시에서는 virtualenv 폴더 안에 배치하겠습니다.
cd /opt/myenv sudo nano gunicorn_config.py |
구동 시 사용 할 수 있는 구성을 파일에 미리 지정해 줄 수 있습니다.
command = '/opt/myenv/bin/gunicorn' pythonpath = '/opt/myenv/myproject' bind = '127.0.0.1:8001' workers = 3 user = nobody |
정상 구동을 위해 추가적으로 명령을 해줍니다.
/opt/myenv/bin/gunicorn -c /opt/myenv/gunicorn_config.py myproject.wsgi |
위 명령에서는 “-c” 플래그를 통해 myproject의 wsgi 파일이 어디 있는지 알 수 있게 해주는 설정 파일을 적용해줍니다.
세션이 종료되도 계속 Gunicron을 실행시키기 위해서는 Gunicorn 실행 후 Ctrl + z 를 누르고 “bg” 를 타이핑 해줍니다(Manage Unix Background Jobs)
[CTRL-Z] [2]+ Stopped bg |
[ Step Ten: NGINX 설정(Configure NGINX)
먼저, NGNIX를 실행 해 줍니다.
sudo service nginx start |
우리는 정적 파일을 처리할 NGINX 를 설정하려 하기 때문에 정적 파일이 저장 될 위치를 먼저 결정해야 합니다.
Django의 setting.py 파일을 열어 정적 경로를 원하는 곳에 설정해 줍니다.
STATIC_ROOT = "/opt/myenv/static/" |
파일 위치를 설정해 주었으니 그 파일을 처리할 NGINX 를 설정해줍니다.
다음 경로에 원하는 이름으로(ex: myproject) 새로운 NGINX 설정 파일을 만듭니다.
sudo nano /etc/nginx/sites-available/myproject |
파일 명을 어떻게 넣는지는 상관 없지만 보통 자신의 프로젝트와 동일한 파일 명을 써줍니다.
server { server_name yourdomainorip.com; access_log off; location /static/ { alias /opt/myenv/static/; } location / { proxy_pass http://127.0.0.1:8001; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"'; } } |
위의 설정은 자신의 서버(mydomain.com/static)에서 오는 어떤 요청에 대하여 NGINX가 정적 파일을 제공하기 위한 것입니다.
서버(mydomain.com) 에서 localhost의 8001 로 오는 모든 요청은 우리가 실행하도록 설정한 Gunicorn을 통해 프록시 되어 들어올 것입니다.
이외의 다른 포트를 통해 오는 요청은 Gunicorn에 통과될 것입니다.
이 부분이 없다면 모든 요청의 IP주소는 localhost 이고 호스트 이름은 당신의 VPS hostname이 될것입니다.
이제 NGINX가 서버의 상황(enabled or disabled)을 알 수 있도록 이 구성 파일을 가리키는 심볼릭 링크를 설정해야 합니다.
/etc/nginx/sites-enabled 에 들어가서 아래의 명령어를 실행시켜 줍니다.
sudo ln -s ../sites-available/myproject |
이 작업은 NGINX에게 서버(mydomain.com)의 구성파일을 알 수 있도록 해주는 심볼릭 링크를 만들어 줍니다.
또한 기존의 NGINX의 서버 블록을 제거해 줍니다.
sudo rm default |
반영을 위하여 NGINX를 재 실행 해줍니다.
sudo service nginx restart |
이 글 말고도 참고할 글들이 많습니다. 다른 예시들은 원문이지만 일단 링크로 첨부하였습니다.
참고 링크
HOWTO: Redmine + Nginx / Passenger + Postgresql
https://forums.freebsd.org/threads/howto-redmine-nginx-passenger-postgresql.41256/
Setting up a Django Server with PostgreSQL, Nginx, Celery & RabbitMQ
http://dustindavis.me/django-server-postgresql-nginx-celery-rabbitmq/
How To Install and Configure Django with Postgres, Nginx, and Gunicorn (추천)
DJANGO 1.7 + PYTHON 3 + NGINX + POSTGRESQL + GUNICORN
https://linuxluigi.com/2015/01/django-1-7-python-3-nginx-postgresql-gunicorn/
window 용 postgresql
엔진엑스 한국 커뮤니티
nginx + Django 연동
Django와 nginx를 연동하기 위해서 flup 라이브러리를 설치한다.
pip install flup
Django 실행은 다음과 같다.
python manage.py runfcgi method=prefork pidfile=PID_FILE host=127.0.0.1 port=8000
nginx.conf 에 다음과 같이 추가한다.
server {
listen 80
server_name localhost;
location /static/ { #static url
autoindex on;
root /static/; #static 파일들이 저장된 디렉토리
}
location / { #사용할 url
#root /usr/share/nginx/html;
#index index.html index.htm;
fastcgi_pass 127.0.0.1:8000;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;
}
}
static url을 설정할 때 /static/으로 해서 파일을 불러오지 못할 경우 앞이나 뒤의 /를 제거하면 된다.
위와 같이 수정한 설정 파일을 다시 읽는다.
sudo /etc/init.d/nginx reload
HOWTO: Redmine + Nginx / Passenger + Postgresql |
https://forums.freebsd.org/threads/howto-redmine-nginx-passenger-postgresql.41256/ |
Setting up a Django Server with PostgreSQL, Nginx, Celery & RabbitMQ |
http://dustindavis.me/django-server-postgresql-nginx-celery-rabbitmq/ |
How To Install and Configure Django with Postgres, Nginx, and Gunicorn (추천) |
DJANGO 1.7 + PYTHON 3 + NGINX + POSTGRESQL + GUNICORN |
https://linuxluigi.com/2015/01/django-1-7-python-3-nginx-postgresql-gunicorn/ |
window 용 postgresql |
엔진엑스 한국 커뮤니티 |
nginx + Django 연동 |
Django와 nginx를 연동하기 위해서 flup 라이브러리를 설치한다. |
pip install flup |
Django 실행은 다음과 같다. |
python manage.py runfcgi method=prefork pidfile=PID_FILE host=127.0.0.1 port=8000 |
nginx.conf 에 다음과 같이 추가한다. |
server { listen 80 server_name localhost;
location /static/ { #static url autoindex on; root /static/; #static 파일들이 저장된 디렉토리 } location / { #사용할 url #root /usr/share/nginx/html; #index index.html index.htm; fastcgi_pass 127.0.0.1:8000; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param QUERY_STRING $query_string; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_pass_header Authorization; fastcgi_intercept_errors off; } } |
static url을 설정할 때 /static/으로 해서 파일을 불러오지 못할 경우 앞이나 뒤의 /를 제거하면 된다. 위와 같이 수정한 설정 파일을 다시 읽는다. |
sudo /etc/init.d/nginx reload |
'it > programming' 카테고리의 다른 글
장고 테스트(Django PyUnit Test) - django.test (0) | 2015.03.04 |
---|---|
[javascript] 숫자 두자리로 만들기 (0) | 2015.02.17 |
[javascript] 금액에 세자리마다 반점 찍기 (0) | 2015.02.17 |