9 Mart 2015 Pazartesi

Django Virtualenv, Gunicorn, Nginx ve Supervisor

Merhabalar bu yazıda bir Virtualenv oluşturmayı, ardından oluşturduğumuz Virtualenv içerisinde bir django projesi oluşturmayı, oluşturmuş olduğumuz bu projemizi nasıl Gunicorn üzerinde koşturacağımızı. Koşturduğumuz bu projemizi Nginx ile nasıl konuşturacağımızı ve en son olarak Gunicorn'u yönetim işlemini nasıl Supervisor'a devredeceğimizden bahsedeceğiz.
Yazımıza geçmeden önce şu komutları sırası ile çalıştırarak sistemimiz güncelleyelim.
sudo apt-get update
sudo apt-get upgrade
Python Virtualenv
Pyton Virtualenv bize özel bir python çalışma alanı yaratır. Ve yüklediğimiz kütüphaneler sadece bu alana yüklenerek sistemin genelini etkilemez. Yaptığımız kurulumların sadece burada geçerli olmasını sağlıyoruz. Bunun ne gibi avantajları var derseniz. En basitinden tek bir sistem altında farklı Django sürümleri ile 1.6 ve 1.7 gibi geliştirilmiş projeleri rahat bir şekilde yayınlayabilirsiniz. İlk önce şu komutu vererek Virtualenv'yi sistemimize kuruyoruz.
sudo apt-get install python-virtualenv
Kurulum ardından kendimize özel bir Virtualenv oluşturalım.
virtualenv django-virt
Oluşturma işleminin ardından dizin içerisini inceleyebilirsiniz. Oluşturduğumuz dizin içerisine girelim ve aktif edelim.
cd django-virt/
source bin/activate
Bu işlemden sonra komut satırının başının değiştiğini göreceksiniz. Artık kuracağımız kütüphaneler bu virtualenv içerisine kurulacaktır.
(django-virt)massumo@ubuntu:~/django/django-virt$
Django Kurulumu
(django-virt)massumo@ubuntu:~/django/django-virt$ pip install django
komutunu çalıştırarak djangoyu oluşturmuş olduğumuz sanal çalışma alanımıza kuruyoruz.
Nginx Kurulumu
Sistemimize Nginx'i kuralım. Bunun için ilk önce aşağıdaki komutu çalıştırarak virtualenv içerisinden çıkalım. Ardından Nginx kurulumu için gerekli olan komutu verelim.
(django-virt)massumo@ubuntu:~/django/django-virt$ deactivate
sudo apt-get install nginx
Gunicorn Kurulumu
Gunicorn çok güçlü bir Python WSGI HTTP Server'dır. Şimdi tekrar virtualenv içerisine girerek Gunicorn'u kuracağız.
$ source bin/activate
(django-virt)massumo@ubuntu:~/django/django-virt$ pip install gunicorn
Django Projesi Oluşturmak
Gunicornu başarılı bir şekilde kurduktan sonra django projesi oluşturabiliriz.
(django-virt)massumo@ubuntu:~/django/django-virt$ django-admin.py startproject django_project
(django-virt)massumo@ubuntu:~/django/django-virt$ cd django_project
(django-virt)massumo@ubuntu:~/django/django-virt/django_project$ python manage.py runserver
Not : Burada komut satırlarının tamamını yazmamın sebebi sizin o an bulunduğumuz dizini ve çalışma alanınızı takip edebilmenizi kolaylaştırmaktır.
Projemiz başarılı bir şekilde ayağa kalktı. Şimdi projeyi Gunicorn ile ayağa kaldıralım.
(django-virt)massumo@ubuntu:~/django/django-virt/django_project$ gunicorn_django --workers=3 --bind localhost:8000
Eğer oluşturduğunuz django projesi 1.7 ve üzeri ise bu komutu çalıştırdığınız da şu şekilde bir hata alacaksınız.
...
    from django.core.management.validation import get_validation_errors
ImportError: No module named validation
Bu hatanın sebebi Django 1.7ile itibaren bazı sınıfların kaldırılması veya yerlerinin değiştirilmesi. Burada da aynı sorun söz konusu. Bu hatanın ortadan kalkması için yapmanız gereken virtualenv içerisine kurmuş olduğumuz gunicorn içerisindeki django_wsgi.py dosyasını düzenlemek. Bu dosyayı şuradan açın
/django-virt/lib/python2.7/site-packages/gunicorn/app/
Bu dizin altındaki django_wsgi.py dosyasını açın ve eski halinden yeni haline getirin.
##Eski hali 
...
##Bu satiri silin
from django.core.management.validation import get_validation_errors
...
def make_wsgi_application():
    # validate models
    s = StringIO()
    if get_validation_errors(s):
        s.seek(0)
        error = s.read()
        msg = "One or more models did not validate:\n%s" % error
        print(msg, file=sys.stderr)
        sys.stderr.flush()
        sys.exit(1)

    translation.activate(settings.LANGUAGE_CODE)
    if django14:
        return get_internal_wsgi_application()
    return WSGIHandler()
...

##Yeni Hali
...
def make_wsgi_application():
    # validate models
    s = StringIO()
    import django
    from django.core.management.base import BaseCommand
    django.setup()
    cmd = BaseCommand()
    import sys
    cmd.stdout, cmd.stderr = sys.stdout, sys.stderr
    cmd.check()
    translation.activate(settings.LANGUAGE_CODE)
    if django14:
        return get_internal_wsgi_application()
    return WSGIHandler()
...
Bu düzeltme işlemini yaptıktan sonra aynı komutu tekrar çalıştırıyoruz.
(django-virt)massumo@ubuntu:~/django/django-virt/django_project$ gunicorn_django --workers=3 --bind localhost:8000
Şimdi hatasız bir şekilde çalıştı. Tarayıcıdan localhost:8000 yazarak çalıştığını görebilirsiniz. Buradaki workers değerini değiştirebilirsiniz. Şimdi gunicorn için bir config dosyası için bir dosya oluşturalım. Ardından ayarlarımızı bu dosya içerisine yazarak bu dosya üzerinden projemizi koşturalım. Virtualenv'nin ana dizinine gunicorn_config.py adında bir dosya oluşturuyoruz ve içerisine şu satırları ekliyoruz.
command = '/home/massumo/django/django-virt/bin/gunicorn'
pythonpath = '/home/massumo/django/django-virt/django_project'
bind = '127.0.0.1:8000'
workers = 3
Bunun ardından bu dosya üzerinden projemizi şu şekilde çalıştırıyoruz.
(django-virt)massumo@ubuntu:~/django/django-virt$ gunicorn -c gunicorn_config.py django_project.wsgi
Projemiz sıkıntısız bir şekilde çalıştı.
Nginx Ayarlamaları
Nginx'i daha önce kurmuştuk. Şimdi ayarlamalarını yaparak projemizi Nginx üzerinde koşturacağız. İlk önce Nginx'i başlatalım.
#service nginx start
Daha sonra /etc/nginx/sites-available dizini içerisine girerek bir conf dosyası oluşturuyoruz.
#####Dosya adı 'myproject'
server {
        server_name localhost;
        access_log off;
 listen 80;
        location /static/ {
                alias /home/massumo/django-virt/django_project/static/;
        }

        location / {
                proxy_pass http://127.0.0.1:8000;
                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"';
        }
}
Burada dikkatinizi çekmiştir. Nginx bizim Gunicorn ile 8000 portta ayağa kaldırdığımız projeyi dinliyor. Eğer siz az önce komut satırından çalıştırdığımız projeyi CTRL+C vb bir işlem kapattıysanız. Nginx aracılığı ile projeyi koşturamazsınız. O yüzden onu kapatmadan başka bir terminal açarak bu işlemleri yapın. Yani burada nginx bir nevi tünelleme görevi görüyor. Bizim Gunicorn ile ayağa kaldırdığımız projeyi dinleyerek kullanıcıya gösteriyor. Şimdi işlemlerimize devam edelim.
Oluşturduğumuz config dosyasını /etc/nginx/sites-available dizini içerisinde oluşturduk. Oysa nginx ana config dosyası içerisinde aktarma işlemi yaparken /etc/nginx/sites-enabled dizini içerisindeki dosyaları aktarır. Bunu /etc/nginx/nginx.conf dosyasını inceleyerek görebilirsiniz. Bizde bundan dolayı oluşturduğumuz dosyayı ../sites-enabled dizini içerisine linkleyeceğiz. Bunun için siz de şu komutu çalıştırın.
massumo@ubuntu:/etc/nginx/sites-available$ sudo ln myproject ../sites-enabled/myproject
$sudo service nginx restart
Tarayıcıdan localhost yazarsanız projenin çalıştığını görebilirsiniz. Eğer bir hata oluşursa işlemlerinizi kontrol edin.
Supervisor Kurulumu ve Ayarlamaları
Buraya kadar projemizi gunicorn aracılığı ile nginx üzerinde koşturduk. Ama sizde fark etmişsinizdir ki burada bir eksik var. Projemizi terminalde gunicorn üzerinden şu komutla çalıştırmamız gerekiyor ki nginx üzerinden erişilebilsin.
/django-virt$ gunicorn -c gunicorn_config.py django_project.wsgi
Yani bizim bunun kontrolünü sürekli takip etmemiz gerekiyor. Eğer bilgisayarı kapatıp açarsak bu işlemi tekrar yapmamız gerekiyor. İşte bu kontrolleri bizim yerimize Supervisor yapacak. İlk önce kuralım. Virtaulenv içerisinden çıktıktan sonra şu komutu çaıştırın.
sudo apt-get install supervisor
Kurulumu yaptıktan sonra /etc/supervisor/conf.d dizinin açıyoruz ve config dosyası oluşturuyoruz.
##dosya adı 'django_project.conf'

[program:project]
command = /home/massumo/django/django-virt/bin/gunicorn -c /home/massumo/django/django-virt/gunicorn_config.py django_project.wsgi
Config dosyasını Supervisor'a göstermek için şu komutları sırası ile çalıştırın.
sudo supervisorctl reread
sudo supervisorctl update
İşlemlerimiz başarılı bir şekilde gerçekleşti. Artık tarayıcıdan gelerek gunicorn komutunu çalıştırmamıza gerek yok. Supervisor bu işlemi bizim için halledecek. Şuan bilgisayarınızı yeniden başlatsanız bile Nginx üzerinde koşan bir uygulama olması gerekmektedir. Tarayıcıdan http://localhost yazarak ulaşabilirsiniz.

3 yorum :

  1. çok başarılı bir anlatım olmuş.

    YanıtlaSil
  2. Çok teşekkür ederim. Böylece sonunda ngix server kurabildim.
    Sadece bir kısımda hata var:
    Supervisor komutlarını yazmadan önce onu başlatmış olmamız gerek. Başlatmak için:
    sudo supervisord -c /etc/supervisor/supervisord.conf
    sudo supervisorctl -c /etc/supervisor/supervisord.conf

    YanıtlaSil