이번에 Django 기반으로 서비스하는 시스템을 1.3.1 에서 1.4 로 마이그레이션하였다. settings.py 에서 다음 2가지를 변경해주니, 잘 동작되는 것 같다. 사실, 이 외에도 몇가지 있으나, Django 가 불평은 하지 않았다. 그래도 미래를 위해서 미리 바꾸어주는 것이 좋을 것이다. https://docs.djangoproject.com/en/dev/releases/1.4/를 참고해서 시도해보자.
DATABASE
# 변경전
DATABASE_ENGINE = 'postgresql_psycopg2'
DATABASE_NAME = '디비이름'
DATABASE_USER = '사용자'
DATABASE_PASSWORD = '비밀번호'
DATABASE_HOST = '호스트'
DATABASE_PORT = '포트'

# 변경후
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '디비이름',
        'USER': '사용자',
        'PASSWORD': '비밀번호',
        'HOST': '호스트',
        'PORT': '포트',
    }
}
TEMPLATE_LOADERS
# 변경전
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
#     'django.template.loaders.eggs.load_template_source',
)

# 변경후
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)



Django를 Deploy하기 위한 여러가지 방법들을 소개했었는데, 이번 방법이 내가 가장 선호하는 방식이다. Instance 별로 정상동작 유무를 확인하기가 쉽고, NginX 에서는 로드밸런싱을 하고, 하나의 Instance 에 문제가 발생하면 자동으로 제외되어 무장애/무중단 서비스를 제공할 수 있다.

여기에서 더 나아가 memcached 등을 이용하여 캐싱까지 처리하면 성능에서도 상당히 만족스러운 결과를 볼 수 있을 것이다. 또한, trunserver 조작에 대해서 개선할 부분이 많이 있다. 이런 부분들은 다음에 생각해보고, NginX와 trunserver 를 이용한 방법을 살펴보자.

  1. Install Python
    $ apt-get install zlibc zlib1g-dev libxml2 libxml2-dev libbz2-dev curl build-essential python
    $ curl -kL http://github.com/utahta/pythonbrew/raw/master/pythonbrew-install | bash
    $ echo 'source ~/.pythonbrew/etc/bashrc' >> ~/.bashrc
    $ source ~/.bashrc
    $ pythonbrew install --force --no-test 2.7.2
    $ pythonbrew switch 2.7.2
    
  2. Install Django, trunserver
    $ pip install django psycopg2 trunserver
    
  3. Create Project
    $ mkdir -p /opt/project
    $ cd /opt/project
    $ django-admin.py startproject sample_project
    $ cd sample_project
    $ mkdir media
    
  4. /opt/project/sample_project 에 start.sh를 만든다.
    nohup python manage.py trunserver --verbosity=0 --noreload 0.0.0.0:9000 > /dev/null 2>&1 &
    nohup python manage.py trunserver --verbosity=0 --noreload 0.0.0.0:9001 > /dev/null 2>&1 &
    
    $ chmod 755 start.sh
    
  5. trunuwsgi 실행
    $ ./start.sh
    
  6. Install NginX
    $ aptitude install nginx
    
  7. Configure NginX
    $ cd /etc/nginx/sites-available
    $ vi django 
    upstream sample_project {
        ip_hash;
        server 127.0.0.1:9000;
        server 127.0.0.1:9001;
    }
    
    server {
        listen 80;
        server_name mydomain.com;
        
        location /site_media  {
            root /opt/project/sample_project/media/;
        }
    
        location / {
            proxy_pass sample_project;
            proxy_set_header XRealIP $remote_addr;
        }
    }
    
    $ cd /etc/nginx/sites-enabled
    $ ln -s /etc/nginx/sites-available/django django
    
  8. Run NginX
    $ /etc/init.d/nginx restart
    
  1. Install Python
    $ apt-get install zlibc zlib1g-dev libxml2 libxml2-dev libbz2-dev curl build-essential python
    $ curl -kL http://github.com/utahta/pythonbrew/raw/master/pythonbrew-install | bash
    $ echo 'source ~/.pythonbrew/etc/bashrc' >> ~/.bashrc
    $ pythonbrew install --force --no-test 2.7.2
    $ pythonbrew switch 2.7.2
    
  2. Install Django, uWSGI
    $ pip install django psycopg2 uwsgi
    
  3. Create Project
    $ mkdir -p /opt/project
    $ cd /opt/project
    $ django-admin.py startproject sample_project
    $ cd sample_project
    $ mkdir media
    
  4. /opt/project/sample_project 에 django0.ini를 만든다.
    [uwsgi]
    socket = 127.0.0.1:8000
    chdir = /opt/project/sample_project
    pythonpath = /opt/project
    env = DJANGO_SETTINGS_MODULE=sample_project.settings
    module = django.core.handlers.wsgi:WSGIHandler()
    master = true
    processes = 4
    daemonize = /opt/project/sample_project/uwsgi0.log
    pidfile = /opt/project/sample_project/uwsgi0.pid
    
  5. /opt/project/sample_project 에 django1.ini를 만든다.
    [uwsgi]
    socket = 127.0.0.1:8001
    chdir = /opt/project/sample_project
    pythonpath = /opt/project
    env = DJANGO_SETTINGS_MODULE=sample_project.settings
    module = django.core.handlers.wsgi:WSGIHandler()
    master = true
    processes = 4
    daemonize = /opt/project/sample_project/uwsgi1.log
    pidfile = /opt/project/sample_project/uwsgi1.pid
    
  6. uwsgi 실행
    $ uwsgi django0.ini
    $ uwsgi django1.ini
    
  7. Install NginX
    $ aptitude install nginx
    
  8. Configure NginX
    $ cd /etc/nginx/sites-available
    $ vi django
    
    upstream sample_project {
        ip_hash;
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
    }
    
    server {
        listen 80;
        server_name mydomain.com;
        
        location /site_media  {
            root /opt/project/sample_project/media/;
        }
    
        location / {
            include uwsgi_params;
            uwsgi_pass sample_project;
        }
    }
    
    $ cd /etc/nginx/sites-enabled
    $ ln -s /etc/nginx/sites-available/django django
    
  9. Run NginX
    $ /etc/init.d/nginx restart
    

이번에는 Ubuntu 10.04 (LTS) 에서 NginX + Django 1.3 (FastCGI) + Python 2.7.2 를 구성해보았다. Python 을 설치하기 전에 zlibc 를 먼저 설치해주어야 distribute 가 제대로 설치되는 삽질이 있었긴 했지만, CentOS에서 설치했던 것처럼 대체적으로 무난하게 설정이 되었다.

  1. Install Python
    # aptitude install zlibc zlib1g-dev
    # echo 'export PYTHONBREW_ROOT=/opt/pythonbrew' >> /etc/profile; source /etc/profile
    # curl -kLO http://xrl.us/pythonbrewinstall; chmod +x pythonbrewinstall; ./pythonbrewinstall
    # echo 'source /opt/pythonbrew/etc/bashrc' >> /etc/profile; source /etc/profile
    # pythonbrew install --force --no-test 2.7.2
    # pythonbrew switch 2.7.2
    
  2. Install Django
    # pip install django flup
    
  3. Create Project
    # mkdir -p /opt/project
    # cd /opt/project
    # django-admin.py startproject sample_project
    # cd sample_project
    # mkdir media
    
  4. Run Project
    # cd /opt/project/sample_project
    # python manage.py runfcgi method=threaded pidfile=/tmp/django_sample.pid host=127.0.0.1 port=8000
    
  5. Install NginX
    # aptitude install nginx
    
  6. Configure NginX
    # cd /etc/nginx/sites-available
    # vi django 
    
    server {
        listen 80;
        server_name 도메인주소;
        location /site_media  {
            root /opt/project/sample_project/media/;
        }
        location / {
            # host and port to fastcgi server
            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;
        }
    }
    
    # cd /etc/nginx/sites-enabled
    # ln -s /etc/nginx/sites-available/django django
    
  7. Run NginX
    # /etc/init.d/nginx restart
    

+ Recent posts