Django ile bir uygulama yaptınız ve şimdi de bu uygulamayı yayınlamak istiyorsunuz. Elinizde bir sunucu var. Ben bu yazı için Ubuntu Server 22.04 kullanacağım.
Boş bir Ubuntu Server kurulumundan sonra başlıyoruz. Root kullanıcısında değil sudo yetkileri olan normal bir kullanıcıdan yapacağız işlemleri. sudo apt update
ve sudo apt upgrade -y
ile sunucunuzu güncelleyin. Ev dizininize gelin.
Not: Bilmeyenler için bash kullanırken eğer normal bir kullanıcı olarak komut giriyorsanız $
işareti görürsünüz ama eğer root kullanıcısıysanız #
işareti görürsünüz. Promptların başında bu işaretleri koyuyorum ki ne olarak komut girdiğimi anlayın.
Öncelikle bir virtual env e ihtiyaç var. Bunun için:
~$ sudo apt install python3-venv
ile “venv” paketini kurduk. Sonrasında venv oluşturmak için:
~$ python3 -m venv env
diyoruz. “env” adında bir venv oluşturduk. Aktif etmek için:
~$ source env/bin/activate
Daha sonra gerekli paketleri kurun (projenizde kullandığınız paketler, requirements.txt vs). Gunicorn u kurmak için:
(env) ~$ pip install gunicorn
Benim elimde bir uygulama olmadığı için şimdilik boş bir django uygulaması oluşturacağım. Bunun için bir dizin oluşturuyorum, mkdir myproject
, ve bu dizinin içine giriyorum, cd myproject
, ardından projeyi oluşturuyorum, django-admin startproject config .
. Ardından $HOME dizinine geri dönüyorum (not: cd
komutuna parametre vermezseniz sizi $HOME dizinine alacaktır).
Şu anda “env” ve “myproject” adında iki dizin olmalı.
(env) ~$ mkdir logs static
ile logs ve static adında iki dizin daha oluşturuyoruz. Daha sonra cd logs
ile dizinin içine girip mkdir gunicorn nginx
komutu ile iki dizin daha oluşturup ev dizinine dönüyoruz.
Şimdi uygulamamızda bir değişiklik yapmamız lazım. settings.py
ye gelip STATIC_URL="/home/<kullanıcı>/static/"
yapmanız lazım ve ALLOWED_HOSTS
a sunucunun IP adresini (ya da domain) eklemeniz lazım.
myproject/config altında “gunicorn_config.py” adında bir dosya oluşturun. İçeriği şu şekilde olmalı:
command="/home/<kullanıcı>/env/bin/gunicorn"
pythonpath="/home/<kullanıcı>/myproject"
bind="<ip>:8000"
workers=3
accesslog="/home/<kullanıcı>/logs/gunicorn/access.log"
errorlog="/home/<kullanıcı>/logs/gunicorn/error.log"
Satır satır açıklarsak: command
gunicorn un yolu. pythonpath
projenizin yolu. bind
çalışacağı ip:port. workers
kaç worker çalıştıracağınız. accesslog
access loglarının tutulacağı dosyanın yolu ve errorlog
error loglarının tutulacağı dosyanın yolu.
Kaydedip çıkıyoruz.
Artık (env) ~$ gunicorn -c myproject/config/gunicorn_config.py myproject.config.wsgi
ile gunicorn u başlatabilirsiniz ve ip:8000 adresine giderseniz uygulamayı görebilirsiniz. Ama biz her seferinde böyle çalıştırmayacağız. Otomatik çalışması için supervisor
kullanacağım. Supervisor kullanırsak her sunucu başladığında arkaplanda otomatik olarak çalışacak ve hata sonucu kapandığında kendini yeniden başlatacak.
Supervisor kurmak için
$ sudo apt install supervisor -y
Daha sonrasında bir supervisor process i oluşturmalıyız. Supervisor process lerinin hepsi /etc/supervisor/conf.d/
altında tutulur. Bu dizine $ cd /etc/supervisor/conf.d
komutu ile gidiyoruz. Ardından $ sudo touch myproject_gunicorn.conf
komutu ile bir dosya oluşturuyoruz ve düzenliyoruz. Düzenlerken hangi editörü kullanıyorsanız sudo
ile açmayı unutmayın yoksa kaydedemezsiniz (örn:$ sudo vi myproject_gunicorn.conf
). Dosya içeriği şu şekilde olmalı:
[program:myproject_gunicorn]
user=<kullanıcı>
directory=/home/<kullnıcı>/myproject
command=/home/<kullanıcı>/env/bin/gunicorn -c /home/<kullanıcı>/myproject/config/gunicorn_config.py config.wsgi
autostart=true
autorestart=true
Satır satır açarsak: user
komutun çalıştırılacağı kullanıcı. directory
çalışma dizini. command
çalışacak komut. autostart
sunucu açıldığında otomatik başlatma. autorestart
process hata alıp çökerse tekrar başlatma.
Bunu kaydedip çıkıyoruz.
Ardından
$ sudo supervisorctl reread
$ sudo supervisorctl update
komutları ile supervisor un eklediğimiz dosyayı okumasını sağlıyoruz. autostart
dediğimiz için direkt olarak başlatılacaktır. Artık ip:8000 adresinde gunicorn un çalıştığını görebilirsiniz.
$ sudo supervisorctl status myproject_gunicorn
ile process in durumunu kontrol edebilir, start
stop
ve restart
ile başlatıp, durdurup, yeniden başlatabilirsiniz.
Şimdi sıra nginx in ayarlanmasında.
$ cd /etc/nginx/sites-available
ile diznimizi değiştiriyoruz.
$ sudo touch myproject
ile dosya oluşturuyoruz. Dosyanın içeriği şu şekilde olmalı:
server {
listen 80;
server_name <ip veya domain>;
access_log /home/<kullanıcı>/logs/nginx/access.log;
error_log /home/<kullanıcı>/logs/nginx/error.log;
location /static/ {
root /home/<kullanıcı>/static;
}
location / {
proxy_pass http://192.168.124.140:8000;
}
}
Açarsak: listen
port. server_name
ip veya domain. access_log
access loglarının tutulacağı dosyanın yolu. error_log
error loglarının tutulacağı dosyanın yolu. location /static/
de root
bizim static dizinimizin yolu. location /
ve proxy_pass
ile gelen requestleri gunicorn a iletiyoruz.
Kaydedip çıkıyoruz. Ardından aktif olması için önce sites-enabled
a bir link oluşturuyoruz ve nginx i yeniden başlatıyoruz.
$ sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
$ sudo systemctl restart nginx
Artık ip adresinize bir tarayıcıdan girdiğinizde uygulamanızı görebilmeniz lazım.
Bir sıkıntı yaşarsanız bana ulaşabilirsiniz, elimden geldiğince yardımcı olmaya çalışırım.
Kerem Üllenoğlu
kerem.ullen@proton.me