Ubuntu 18.04 Postgres, Nginx ve Gunicorn ile Django Nasıl Kurulur

Giriş

Django, Python uygulamanızı veya web sitenizi yerden almanıza yardımcı olabilecek güçlü bir web çerçevesidir. Django, kodunuzu yerel olarak test etmek için basitleştirilmiş bir geliştirme sunucusu içerir, ancak biraz üretim ile ilgili herhangi bir şey için daha güvenli ve güçlü bir web sunucusu gerekir.

Bu kılavuzda, Ubuntu 18.04'te Django uygulamalarını desteklemek ve sunmak için bazı bileşenleri nasıl yükleyeceğimizi ve yapılandıracağımızı göstereceğiz. Varsayılan SQLite veritabanını kullanmak yerine bir PostgreSQL veritabanı kuracağız. Gunicorn uygulama sunucusunu uygulamalarımızla arayüz oluşturacak şekilde yapılandıracağız. Daha sonra, uygulamalarımıza hizmet vermek için güvenlik ve performans özelliklerine erişim sağlayarak, Gunicorn proxy'yi tersine çevirmek için Nginx'i kuracağız.

Önkoşullar ve Hedefler

Bu kılavuzu tamamlamak için, temel bir güvenlik duvarı ve yapılandırılmamış sudo ayrıcalıklarına sahip kök olmayan bir kullanıcı ile yeni bir Ubuntu 18.04 sunucu örneği olmalıdır. İlk sunucu kurulum kılavuzumuzu kullanarak bunu nasıl ayarlayacağınızı öğrenebilirsiniz.

Django'yu sanal bir ortamda kuruyor olacağız. Django'yu projenize özgü bir ortama kurmanız, projelerinizin ve gereksinimlerinin ayrı ayrı ele alınmasına olanak tanır.

Veritabanımız ve uygulamamız bir kez hazırlandıktan sonra, Gunicorn uygulama sunucusunu kuracağız ve yapılandıracağız. Bu, başvurumuzun işleyebildiği, HTTP'den Python çağrılarına müşteri taleplerini çeviren bir arayüz olarak hizmet edecektir. Daha sonra yüksek performanslı bağlantı taşıma mekanizmalarından ve uygulanması kolay güvenlik özelliklerinden yararlanmak için Nginx'i Gunicorn'un önüne kuracağız.

Başlayalım.

Ubuntu Repositories'ten Paketleri Yükleme

İşlemi başlatmak için Ubuntu depolarından ihtiyaç duyduğumuz tüm öğeleri indirip yükleyeceğiz. Python paket yöneticisi pip daha sonra ek bileşenler yüklemek için kullanacağız.

Yerel apt paket dizinini güncellememiz ve daha sonra paketleri indirip yüklememiz gerekiyor. Kurduğumuz paketler, projenizin hangi Python sürümünü kullanacağına bağlıdır.

Python 3 ile Django kullanıyorsanız, şunu yazın:

  • sudo apt güncellemesi
  • sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-katkıda bulunan nginx kıvırmak

Django 1.11, Python 2'yi destekleyecek olan Django'nun son sürümüdür. Yeni projelere başlıyorsanız, Python 3'ü seçmeniz kesinlikle önerilir. Eğer hala Python 2'yi kullanmanız gerekiyorsa, şunu yazın:

  • sudo apt güncellemesi
  • sudo apt yüklemek python-pip python-dev libpq-dev postgresql postgresql-katkıda nginx kıvırmak

Bu pip , daha sonra Gunicorn inşa etmek için gerekli Python geliştirme dosyaları, Postgres veritabanı sistemi ve onunla etkileşim için gerekli olan kütüphaneler ve Nginx web sunucusu kuracaktır.

PostgreSQL Veritabanı ve Kullanıcı Oluşturma

Django uygulamamız için doğrudan doğruya atlayacağız ve bir veritabanı ve veritabanı kullanıcısı oluşturacağız.

Varsayılan olarak, Postgres yerel bağlantılar için "eş kimlik doğrulaması" adı verilen bir kimlik doğrulama şeması kullanır. Temel olarak, kullanıcının işletim sistemi kullanıcı adı geçerli bir Postgres kullanıcı adıyla eşleşirse, bu kullanıcının başka bir kimlik doğrulama olmadan oturum açabileceği anlamına gelir.

Postgres Yükleme sırasında, bir işletim sistemi kullanıcı adında postgres karşılık gelecek şekilde oluşturulmuş postgres PostgreSQL yönetici kullanıcı. Yönetim görevlerini gerçekleştirmek için bu kullanıcıyı kullanmamız gerekiyor. Sudo kullanabilir ve -u seçeneğiyle kullanıcı adından geçebiliriz.

Yazarak etkileşimli bir Postgres oturumuna giriş yapın:

  • sudo -u postgres psql

İhtiyaçlarımızı belirleyebileceğimiz bir PostgreSQL emri verilecektir.

Öncelikle, projeniz için bir veritabanı oluşturun:

  • VERİTABANI CREATE çalışmamı;

Not: Her Postgres ifadesi bir noktalı virgülle bitmelidir, bu nedenle sorun yaşıyorsanız komutunuzun biriyle bittiğinden emin olun.

Ardından, projemiz için bir veritabanı kullanıcısı oluşturun. Güvenli bir şifre seçtiğinizden emin olun:

  • KULLANICI myprojectuser'YI ŞİFRE 'şifresiyle CREATE;

Daha sonra, yeni oluşturduğumuz kullanıcı için birkaç bağlantı parametresini değiştireceğiz. Bu, veritabanı işlemlerini hızlandıracak, böylece doğru değerlerin sorgulanması ve her bağlantı kurulduğunda ayarlanması gerekmeyecektir.

Varsayılan kodlamayı Django'nun beklediği UTF-8 olarak ayarlıyoruz. Ayrıca, varsayılan işlem yalıtım şemasını, taahhüt edilmeyen işlemlerden gelen okumaları engelleyen "okuyan" olarak ayarlıyoruz. Son olarak, saat dilimini ayarlıyoruz. Varsayılan olarak, bizim Django projeleri kullanmak üzere ayarlanmış olacak UTC . Bunların hepsi Django projesinin kendisinin tavsiyeleridir:

  • ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
  • ALTER ROLE myprojectuser SET default_transaction_isolation TO 'okumaya kararlı';
  • ALTER ROLE myprojectuser SET zaman dilimi TO 'UTC';

Şimdi, yeni kullanıcı veritabanımızı yeni veritabanımızı yönetmeye verebiliriz:

  • VERİTABANI ÜZERİNE TÜM PRIVILEGELER myproject TO myprojectuser;

İşiniz bittiğinde, yazarak PostgreSQL komut isteminden çıkın:

  • q

Postgres, Django'nun veritabanı bilgilerine bağlanabilmesini ve yönetebilmesini sağlayacak şekilde ayarlanmıştır.

Projeniz için bir Python Sanal Ortamı Oluşturma

Veritabanımıza sahip olduğumuza göre, proje ihtiyaçlarımızın geri kalanını hazırlamaya başlayabiliriz. Python gereksinimlerimizi daha kolay yönetim için sanal bir ortamda kuracağız.

Bunu yapmak için öncelikle virtualenv komutuna virtualenv gerekiyor. Bunu pip ile kurabiliriz.

Python 3 kullanıyorsanız, pip yükseltin ve paketi yazarak yükleyin:

  • sudo -H pip3 install --upgrade pip
  • sudo -H pip3 install virtualenv

Python 2 kullanıyorsanız, pip ve paketi yazarak yükleyin:

  • sudo -H pip install --upgrade pip
  • sudo -H pip sanalenv kurulumu

virtualenv kurulu virtualenv , projemizi oluşturmaya başlayabiliriz. Proje dosyalarımızı saklayabileceğimiz bir dizin oluşturup buraya taşıyın:

  • mkdir ~ / myprojectdir
  • cd ~ / myprojectdir

Proje dizini içinde, yazarak bir Python sanal ortamı oluşturun:

  • virtualenv myprojectenv

Bu adında bir dizin oluşturacaktır myprojectenv senin içinde myprojectdir dizininde. İçeride, Python'un yerel bir sürümünü ve yerel bir pip sürümünü kuracak. Projemiz için izole Python ortamını kurmak ve yapılandırmak için bunu kullanabiliriz.

Projemizin Python gereksinimlerini yüklemeden önce sanal ortamı etkinleştirmemiz gerekiyor. Yazarak bunu yapabilirsiniz:

  • kaynak myprojectenv / bin / etkin

Sorunuz, şimdi bir Python sanal ortamında çalıştığınızı belirtmek için değişmelidir. Şöyle bir şeye benzeyecektir: (myprojectenv)user@host:~/myprojectdir$ .

Sanal ortamınız aktifken, Django, Gunicorn ve psycopg2 PostgreSQL adaptörünü yerel pip örneğiyle kurun:

Not: Sanal ortam etkinleştirildiğinde ( (myprojectenv) olduğunda), Python 3 kullanıyor olsanız bile pip3 yerine pip kullanın. pip3 sanal ortamının kopyası Python'dan bağımsız olarak her zaman pip adlandırılır. sürümü.

  • pip django gunicorn psycopg2-ikili yüklemek

Artık bir Django projesi başlatmak için gereken tüm yazılımlara sahip olmalısınız.

Yeni Django Projesi Oluşturma ve Yapılandırma

Python bileşenlerinin kurulu olmasıyla, gerçek Django proje dosyalarını oluşturabiliriz.

Django Projesinin Oluşturulması

Zaten bir proje dizinimiz olduğundan, Django'ya dosyaları buraya yüklemesini söyleyeceğiz. Bu, normal olan gerçek kod ile ikinci bir dizin oluşturacak ve bu dizine bir yönetim betiği yerleştirecektir. Bunun anahtarı, Django’nun mevcut dizimize göre karar vermesine izin vermek yerine dizini açıkça tanımladığımızdır:

  • django-admin.py startproject myproject ~ / adresim

Bu noktada, proje dizininiz ( ~/myprojectdir ) aşağıdaki içeriğe sahip olmalıdır:

  • ~/myprojectdir/manage.py : Bir Django proje yönetim betiği.
  • ~/myprojectdir/myproject/ : Django proje paketi. Bu __init__.py , settings.py , urls.py ve wsgi.py dosyalarını wsgi.py .
  • ~/myprojectdir/myprojectenv/ : Daha önce oluşturduğumuz sanal ortam dizini.

Proje Ayarlarını Ayarlama

Yeni oluşturulan proje dosyalarımızla yapmamız gereken ilk şey, ayarları değiştirmektir. Metin editörünüzdeki ayarlar dosyasını açın:

  • nano ~ / myprojectdir / myproject / settings.py

ALLOWED_HOSTS yönergesini bularak başlayın. Bu, sunucu adreslerinin bir listesini tanımlar veya Django örneğine bağlanmak için alan adları kullanılabilir. Bu listede olmayan bir Ana makine üstbilgisi ile gelen istekleri bir istisna oluşturacaktır. Django, bunu belirli bir güvenlik açığı sınıfını önlemek için ayarlamanızı gerektirir.

Köşeli parantez içinde, Django sunucunuzla ilişkilendirilmiş IP adreslerini veya alan adlarını listeleyin. Her öğe, virgülle ayrılmış girişlerle alıntılarda listelenmelidir. Tüm alan adı ve alt alan adları için istekte bulunmak isterseniz, girişin başına bir süre ekleyin. Aşağıdaki kod parçasında, göstermek için kullanılan birkaç yorumlanmış örnek var:

Not: Yerel bir Nginx örneğiyle bağlantıları proxy olarak alacağımızdan, localhost seçeneklerden biri olarak localhost emin olun.

~/myprojectdir/myproject/settings.py. . .
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . ., 'localhost']

Ardından, veritabanı erişimini yapılandıran bölümü bulun. DATABASES ile başlayacak. Dosyadaki yapılandırma bir SQLite veritabanı içindir. Projemiz için zaten bir PostgreSQL veritabanı oluşturduk, bu yüzden ayarları değiştirmemiz gerekiyor.

PostgreSQL veritabanı bilgilerinizle ayarları değiştirin. Django'ya pip ile psycopg2 adaptörünü kullanmasını psycopg2 . Veritabanı adı, veritabanı kullanıcı adı, veritabanı kullanıcısı şifresi vermeli ve ardından veritabanının yerel bilgisayarda bulunduğunu belirtmeliyiz. PORT ayarını boş bir dize olarak bırakabilirsiniz:

~/myprojectdir/myproject/settings.py. . .

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}

. . .

Ardından, dosyanın altına inin ve statik dosyaların nereye yerleştirileceğini belirten bir ayar ekleyin. Bu, Nginx'in bu öğeler için istekleri yerine getirebilmesi için gereklidir. Aşağıdaki satır Django'ya bunları temel proje dizininde static olarak adlandırılan bir dizine yerleştirmesini söyler:

~/myprojectdir/myproject/settings.py. . .

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

İşiniz bittiğinde dosyayı kaydedin ve kapatın.

İlk Proje Kurulumu Tamamlanıyor

Şimdi, yönetim veritabanını kullanarak ilk veritabanı şemasını PostgreSQL veritabanımıza taşıyabiliriz:

  • ~ / myprojectdir / manage.py makemigrations
  • ~ / myprojectdir / manage.py geçişi

Proje yazarak yönetici bir kullanıcı oluşturun:

  • ~ / myprojectdir / manage.py Instagram Hesabındaki Resim ve Videoları createuperuser

Bir kullanıcı adı seçmeli, bir e-posta adresi girmeli ve bir şifre seçip onaylamalısın.

Tüm statik içeriği, yazarak yapılandırdığımız dizin konumuna toplayabiliriz:

  • ~ / myprojectdir / manage.py Instagram Hesabındaki Resim ve Videoları collectstatic

İşlemi onaylamanız gerekecek. Statik dosyalar daha sonra proje dizininizde static adlandırılan bir dizine yerleştirilecektir.

İlk sunucu kurulum kılavuzunu takip ettiyseniz, sunucunuzu koruyan bir UFW güvenlik duvarı olmalıdır. Geliştirme sunucusunu test etmek için, kullanacağımız bağlantı noktasına erişime izin vermeliyiz.

Yazarak port 8000 için bir istisna oluşturun:

  • sudo ufw 8000'e izin veriyor

Son olarak, projenizi Django geliştirme sunucusunu bu komutla başlatarak test edebilirsiniz:

  • ~ / myprojectdir / manage.py çalışma sunucusu 0.0.0.0:8000

Web tarayıcınızda, sunucunuzun alan adını veya IP adresini ziyaret edin ve ardından :8000 :

http://server_domain_or_IP:8000

Varsayılan Django dizin sayfasını görmelisiniz:

Adres çubuğunda URL'nin sonuna /admin createsuperuser , createsuperuser komutuyla oluşturduğunuz yönetici kullanıcı adı ve parolası istenir:

Kimlik doğrulamasından sonra, varsayılan Django yönetici arayüzüne erişebilirsiniz:

Keşfetmeyi bitirdiğinizde, geliştirme sunucusunu kapatmak için terminal penceresinde CTRL-C'ye basın.

Gunate'nin Projeyi Sunma Yeteneğini Test Etme

Sanal ortamımızı terk etmeden önce yapmak istediğimiz en son şey, uygulamaya hizmet edebileceğinden emin olmak için Gunicorn test etmektir. Proje dizinimize girerek ve projenin WSGI modülünü yüklemek için gunicorn kullanarak gunicorn :

  • cd ~ / myprojectdir
  • gunicorn --bind 0.0.0.0:8000 Instagram Hesabındaki Resim ve Videoları myproject.wsgi

Bu, Guncorn'i Django geliştirme sunucusunun üzerinde çalıştığı aynı arabirimde başlatacaktır. Geri dönüp uygulamayı tekrar test edebilirsiniz.

Not: Gunicorn, bundan sorumlu olan statik CSS içeriğinin nasıl bulunacağını bilmediğinden, yönetici arayüzünün stil uygulanmış herhangi bir stili olmayacaktır.

Python'un modül sözdizimini kullanarak, Django'nun wsgi.py dosyasına, wsgi.py giriş noktası olan göreceli dizin yolunu belirterek Gunicorn modülünü geçtik. Bu dosyanın içinde, application ile iletişim kurmak için kullanılan application adı verilen bir işlev tanımlanmıştır. WSGI belirtimi hakkında daha fazla bilgi için, buraya tıklayın.

Testi bitirdiğinizde, Guncorn'i durdurmak için terminal penceresinde CTRL-C'ye basın.

Şimdi Django uygulamamızı yapılandırmayı bitirdik. Sanal ortamımızın dışına çıkarak yazabiliriz:

  • devre dışı bırakmak

İletinizdeki sanal ortam göstergesi kaldırılacak.

Gunicorn için systemd Soket ve Servis Dosyaları Oluşturma

Gunicorn'un Django uygulamamızla etkileşimde bulunabileceğini test ettik, ancak uygulama sunucusunu başlatma ve durdurmanın daha sağlam bir yolunu uygulamalıyız. Bunu başarmak için, sistem servisi ve soket dosyaları yapacağız.

Gunicorn soketi önyüklemede oluşturulacak ve bağlantıları dinleyecektir. Bir bağlantı meydana geldiğinde, sistemd bağlantıyı işlemek için Gunicorn işlemini otomatik olarak başlatır.

Oluşturma ve birlikte Gunicorn için systemd soket dosyasını açarak başlayın sudo ayrıcalıkları:

  • sudo nano /etc/systemd/system/gunicorn.socket

İçinde soketi tanımlamak için bir [Unit] bölümü, soket konumunu tanımlamak için bir [Socket] bölümü ve soketin doğru zamanda oluşturulduğundan emin olmak için bir [Install] bölümü oluşturacağız:

/etc/systemd/system/gunicorn.socket[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

İşiniz bittiğinde dosyayı kaydedin ve kapatın.

Ardından, metin düzenleyicinizde sudo ayrıcalıklarına sahip Gunicorn için bir sistemd servisi dosyası oluşturun ve açın. Hizmet dosya adı, uzantı haricinde soket dosya adıyla eşleşmelidir:

  • sudo nano /etc/systemd/system/gunicorn.service

Meta veri ve bağımlılıkları belirtmek için kullanılan [Unit] bölümü ile başlayın. Burada hizmetimizin bir açıklamasını koyacağız ve init sistemine sadece ağ hedefine ulaşıldıktan sonra başlayacağını söyleyeceğiz. Servisimiz soket yuvasından yuvaya bağlı olduğundan, bu ilişkiyi belirtmek için bir Requires yönergesi Requires gerekir:

/etc/systemd/system/gunicorn.service[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

Ardından, [Service] bölümünü açacağız. Altında çalışmak için işlemek istediğimiz kullanıcı ve grubu belirleyeceğiz. İlgili tüm dosyalara sahip olduğundan, düzenli kullanıcı hesabı sürecini biz vereceğiz. Nginx'in Gunicorn ile kolayca iletişim kurabilmesi için www-data grubuna grup sahipliği vereceğiz.

Ardından çalışma dizinini haritalandıracağız ve hizmeti başlatmak için kullanılacak komutu belirleyeceğiz. Bu durumda, sanal ortamımıza yüklenen Gunicorn yürütülebilir dosyasının tam yolunu belirtmeliyiz. Süreci, işlemin Nginx ile iletişim kurabilmesi için /run dizininde oluşturduğumuz Unix soketine bağlarız. Tüm verileri standart çıktıya journald , böylece journald süreci Gunicorn kayıtlarını toplayabilir. Ayrıca isteğe bağlı herhangi bir Gunicorn tweaks belirtebiliriz. Örneğin, bu durumda 3 işçi işlemini belirledik:

/etc/systemd/system/gunicorn.service[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myprojectdir
ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn
--access-logfile -
--workers 3
--bind unix:/run/gunicorn.sock
myproject.wsgi:application

Son olarak, bir [Install] bölümü ekleyeceğiz. Bu, sistem hizmetini, önyüklemede başlamasını sağlamak için bu hizmete ne bağlanacağını söyleyecektir. Düzenli çoklu kullanıcı sistemi çalışır durumda olduğunda bu hizmetin başlamasını istiyoruz:

/etc/systemd/system/gunicorn.service[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myprojectdir
ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn
--access-logfile -
--workers 3
--bind unix:/run/gunicorn.sock
myproject.wsgi:application

[Install]
WantedBy=multi-user.target

Bununla, sistemd servisimiz tamamlandı. Şimdi kaydet ve kapat.

Şimdi Gunicorn soketini başlatabilir ve etkinleştirebiliriz. Bu /run/gunicorn.sock adresindeki soket dosyasını şimdi ve önyüklemede oluşturacaktır. Bu sokete bir bağlantı yapıldığında, systemd otomatik olarak ele almak için gunicorn.service :

  • sudo systemctl start gunicorn.socket
  • sudo systemctl etkinleştirmek gunicorn.socket

Soket dosyasını kontrol ederek işlemin başarılı olduğunu teyit edebiliriz.

Gunicorn Soket Dosyasını Kontrol Etmek

Başlayabildiğini öğrenmek için işlemin durumunu kontrol edin:

  • sudo systemctl status gunicorn.socket

Ardından, /run dizinindeki gunicorn.sock dosyasının varlığını kontrol edin:

  • dosya /run/gunicorn.sock

Output/run/gunicorn.sock: socket

systemctl status komutu bir hata oluştuğunu veya gunicorn.sock dosyasını dizinde bulamazsanız, Gunicorn soketinin doğru şekilde oluşturulamadığının bir göstergesidir. Gunicorn soketinin günlüklerini yazarak kontrol edin:

  • sudo journalctl -u gunicorn.socket

Devam etmeden önce herhangi bir sorunu çözmek için /etc/systemd/system/gunicorn.socket dosyanıza bir göz atın.

Soket Aktivasyonunu Test Etme

Şu anda, eğer sadece gunicorn.socket ünitesini çalıştırdıysanız, soket henüz herhangi bir bağlantı gunicorn.service henüz aktif olmayacaktır. Bunu yazarak kontrol edebilirsiniz:

  • sudo systemctl status gunicorn

Output● gunicorn.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
Active: inactive (dead)

Soket aktivasyon mekanizmasını test etmek için, yazarak curl sokete bir bağlantı gönderebiliriz:

  • curl --unix-socket /run/gunicorn.sock localhost

Uygulamanızdaki HTML çıktısını terminalde görmelisiniz. Bu, Gunicorn'un başlatıldığını ve Django uygulamanıza hizmet verebileceğini gösterir. Gunicorn hizmetinin yazarak çalıştığını doğrulayabilirsiniz:

  • sudo systemctl status gunicorn

Output● gunicorn.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2018-07-09 20:00:40 UTC; 4s ago
Main PID: 1157 (gunicorn)
Tasks: 4 (limit: 1153)
CGroup: /system.slice/gunicorn.service
├─1157 /home/sammy/myprojectdir/myprojectenv/bin/python3 /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application
├─1178 /home/sammy/myprojectdir/myprojectenv/bin/python3 /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application
├─1180 /home/sammy/myprojectdir/myprojectenv/bin/python3 /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application
└─1181 /home/sammy/myprojectdir/myprojectenv/bin/python3 /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application

Jul 09 20:00:40 django1 systemd[1]: Started gunicorn daemon.
Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1157] [INFO] Starting gunicorn 19.9.0
Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1157] [INFO] Listening at: unix:/run/gunicorn.sock (1157)
Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1157] [INFO] Using worker: sync
Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1178] [INFO] Booting worker with pid: 1178
Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1180] [INFO] Booting worker with pid: 1180
Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1181] [INFO] Booting worker with pid: 1181
Jul 09 20:00:41 django1 gunicorn[1157]: - - [09/Jul/2018:20:00:41 +0000] "GET / HTTP/1.1" 200 16348 "-" "curl/7.58.0"

curl çıkışı veya systemctl status çıktısı bir sorun olduğunu gösterirse, ek ayrıntılar için günlükleri kontrol edin:

  • sudo journalctl -u gunicorn

Sorunlarınız için /etc/systemd/system/gunicorn.service dosyanızı kontrol edin. /etc/systemd/system/gunicorn.service dosyasında değişiklik yaparsanız, hizmet tanımını yeniden okumak ve Gunicorn işlemini yeniden yazarak yeniden başlatmak için arka planı yeniden yükleyin:

  • sudo systemctl daemon-reload
  • sudo systemctl restart gunicorn

Devam etmeden önce yukarıdaki sorunları giderdiğinizden emin olun.

Nginx'i Proxy Pass'a Gunicorn'a Yapılandırma

Gunicorn'un kurulduğuna göre, Nginx'i sürece trafiği geçirmek için yapılandırmalıyız.

Nginx'in sites-available dizininde yeni bir sunucu bloğu oluşturarak ve açarak başlayın:

  • sudo nano / etc / nginx / siteler kullanılabilir / myproject

İçeride yeni bir sunucu bloğu açın. Bu bloğun normal bağlantı noktası 80 üzerinde dinlenmesi ve sunucumuzun etki alanı adına veya IP adresine yanıt vermesi gerektiğini belirterek başlayacağız:

/etc/nginx/sites-available/myprojectserver {
listen 80;
server_name server_domain_or_IP;
}

Sonra, Nginx'e favicon bulmakta herhangi bir problemi görmezden geleceğini söyleyeceğiz. Ayrıca, ~/myprojectdir/static topladığımız statik varlıkları nerede bulacağımızı da söyleyeceğiz. Tüm bu dosyaların standart bir URI "/ static" öneki vardır, bu nedenle bu istekleri eşleştirmek için bir konum bloğu oluşturabiliriz:

/etc/nginx/sites-available/myprojectserver {
listen 80;
server_name server_domain_or_IP;

location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/sammy/myprojectdir;
}
}

Son olarak, diğer tüm istekleri karşılayacak bir location / {} bloğu oluşturacağız. Bu lokasyonun içinde, Nginx kurulumuna dahil olan standart proxy_params dosyasını proxy_params ve ardından trafiği doğrudan Gunicorn soketine geçireceğiz:

/etc/nginx/sites-available/myprojectserver {
listen 80;
server_name server_domain_or_IP;

location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/sammy/myprojectdir;
}

location / {
include proxy_params;
proxy_pass http://unix:/gunicorn.sock;
}
}

İşiniz bittiğinde dosyayı kaydedin ve kapatın. Şimdi, dosyayı sites-enabled dizinine bağlayarak sites-enabled :

  • sudo ln -s / etc / nginx / site-kullanılabilir / myproject / etc / nginx / siteler-etkin

Yazarak sözdizimi hataları için Nginx yapılandırmanızı test edin:

  • sudo nginx -t

Hata bildirilmezse, devam ederek Nginx'i yeniden başlatın:

  • sudo systemctl restart nginx

Son olarak, güvenlik duvarımızı 80 numaralı bağlantı noktasında normal trafiğe açmamız gerekiyor. Artık geliştirme sunucusuna erişmemiz gerektiğinden, kuralı 8000 numaralı bağlantı noktasını da açabiliriz:

  • sudo ufw delete 8000 izin ver
  • sudo ufw 'Nginx Full'e izin ver

Artık uygulamanızı görüntülemek için sunucunuzun etki alanına veya IP adresine gitmelisiniz.

Not: Nginx'i yapılandırdıktan sonra, bir sonraki adım SSL / TLS kullanarak sunucuya trafik sağlamalıdır. Bu önemlidir, çünkü o olmadan şifreler dahil tüm bilgiler ağ üzerinden düz metin olarak gönderilir.

Bir alan adınız varsa, trafiğinizi güvenli hale getirmek için bir SSL sertifikası almanın en kolay yolu Let's Encrypt kullanıyor. Ubuntu 18.04 üzerinde Nginx ile Let's Encrypt kurmak için bu kılavuzu izleyin. Bu kılavuzda oluşturduğumuz Nginx sunucu bloğunu kullanarak prosedürü izleyin.

Bir alan adınız yoksa, sitenizi test etmek ve kendinden imzalı bir SSL sertifikasıyla öğrenmek için hala güvenceye alabilirsiniz. Yine, bu öğreticide oluşturduğumuz Nginx sunucu bloğunu kullanarak süreci takip edin.

Nginx ve Gunicorn Sorunlarını Giderme

Bu son adım başvurunuzu göstermezse, yüklemenizde sorun gidermeniz gerekir.

Nginx, Django Uygulaması Yerine Varsayılan Sayfa Gösteriyor

Nginx uygulamanıza proxy'leme yerine varsayılan sayfayı görüntülerse, genellikle sunucunuzun IP adresini veya etki alanı adını göstermek için /etc/nginx/sites-available/myproject dosyasındaki server_name değerini ayarlamanız gerektiği anlamına gelir.

Nginx, isteklere yanıt vermek için hangi sunucu bloğunu kullanacağını belirlemek üzere server_name kullanır. Varsayılan Nginx sayfasını görüyorsanız, Nginx'in isteği açıkça bir önem bloğiyle eşleştiremediğinin bir işaretidir. Bu nedenle, /etc/nginx/sites-available/default tanımlı varsayılan bloğa geri dönülür.

Projenizin sunucu bloğundaki server_name , seçilecek varsayılan sunucu bloğundan daha spesifik olmalıdır.

Nginx, Django Uygulaması Yerine 502 Hatalı Bir Ağ Geçidi Hatası gösteriyor

Bir 502 hatası, Nginx'in isteği başarıyla proxy edemediğini gösterir. Çok çeşitli yapılandırma sorunları kendilerini 502 hatasıyla ifade eder, bu yüzden doğru bir şekilde sorun gidermek için daha fazla bilgi gerekir.

Daha fazla bilgi için ana yer Nginx'in hata kayıtlarında yer alıyor. Genel olarak, bu, proxy olayları sırasında hangi koşulların sorunlara neden olduğunu size söyleyecektir. Yazarak Nginx hata günlüklerini takip edin:

  • sudo tail -F /var/log/nginx/error.log

Şimdi tarayıcınızda yeni bir hata oluşturmak için başka bir istekte bulunun (sayfayı yenilemeyi deneyin). Günlüğe yazılan yeni bir hata mesajı görmelisiniz. Mesaja bakarsanız, sorunu daraltmanıza yardımcı olur.

Aşağıdaki mesajlardan bazılarını görebilirsiniz:

connect () unix'e: /run/gunicorn.sock başarısız oldu (2: Böyle bir dosya veya dizin yok)

Bu, gunicorn.sock belirtilen konumda gunicorn.sock dosyasını bulamadığını gösterir. /etc/nginx/sites-available/myproject dosyasında tanımlanan proxy_pass konumunu, gunicorn.socket systemd birimi tarafından oluşturulan gunicorn.sock dosyasının gerçek konumuna karşılaştırmalısınız.

/run dizini içinde bir gunicorn.sock dosyası bulamazsanız, genellikle systemd soket dosyasının onu oluşturamadığı anlamına gelir. Gunicorn soket dosyasını kontrol etmek için Gunicorn'un sorun giderme adımlarını atlatmak için bölüme geri dönün.

connect () unix'e: /run/gunicorn.sock başarısız oldu (13: İzin reddedildi)

Bu, Nginx'in izin sorunları nedeniyle Gunicorn yuvasına bağlanamadığını gösterir. Bu prosedür, bir sudo kullanıcısı yerine kök kullanıcı kullanılarak takip edildiğinde gerçekleşebilir. Systemd, Gunicorn soket dosyasını oluşturabilirken, Nginx buna erişemiyor.

Bu, kök dizini ( / ) gunicorn.sock dosyası arasında herhangi bir noktada sınırlı izin varsa oluşabilir. Soket dosyasının mutlak yolunu namei komutuna ileterek, soket dosyasının ve ana dizinlerinin her birinin izinlerini ve sahiplik değerlerini görebiliriz:

  • namei -l /run/gunicorn.sock

Outputf: /run/gunicorn.sock
drwxr-xr-x root root /
drwxr-xr-x root root run
srw-rw-rw- root root gunicorn.sock

Çıkış, dizin bileşenlerinin her birinin izinlerini görüntüler. İzinlere (ilk sütun), sahip (ikinci sütun) ve grup sahibine (üçüncü sütun) bakarak, soket dosyasına hangi tür erişimin izin verildiğini anlayabiliriz.

Yukarıdaki örnekte, soket dosyasına ve soket dosyasına giden dizinlerin herbiri dünya okuma ve yürütme izinlerine sahiptir (dizinler için izinler sütunu rx yerine --- ). Nginx işlemi sokete başarılı bir şekilde erişebilmelidir.

Sokete giden dizinlerden herhangi birinin dünyayı okuma ve yürütme izni yoksa, Nginx, dünya okuma ve yürütme izinlerine izin vermeden veya Nginx'in bir gruba verildiğinden emin olmak için yuvaya erişemeyecektir. arasında.

Django Görüntüleniyor: "sunucuya bağlanılamadı: Bağlantı reddedildi"

Web tarayıcısında uygulamanın bölümlerine erişmeye çalışırken Django'dan görebileceğiniz bir mesaj:

OperationalError at /admin/login/
could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?

Bu, Django'nun Postgres veritabanına bağlanamadığını gösterir. Postgres örneğinin yazarak çalıştığından emin olun:

  • sudo systemctl status postgresql

Değilse, başlatabilir ve önyükleme sırasında otomatik olarak başlatmayı etkinleştirebilirsiniz (önceden yapılandırılmamışsa):

  • sudo systemctl start postgresql
  • sudo systemctl postgresql'i etkinleştir

Hala sorun yaşıyorsanız, ~/myprojectdir/myproject/settings.py dosyasında tanımlanan veritabanı ayarlarının doğru olduğundan emin olun.

Daha fazla sorun giderme

Ek sorun giderme için, günlükler kök nedenlerini daraltmaya yardımcı olabilir. Her birini sırayla kontrol edin ve sorunlu alanları belirten mesajları arayın.

Aşağıdaki günlükler yardımcı olabilir:

  • Nginx işlem günlüklerini yazarak sudo journalctl -u nginx
  • Nginx erişim günlüklerini aşağıdakileri yazarak kontrol edin: sudo less /var/log/nginx/access.log
  • Yazarak Nginx hata günlüklerini kontrol edin: sudo less /var/log/nginx/error.log
  • Gunicorn uygulama günlüklerini yazarak kontrol edin: sudo journalctl -u gunicorn
  • Gunicorn soket günlüklerini yazarak sudo journalctl -u gunicorn.socket

Yapılandırmanızı veya uygulamanızı güncellediğinizde, değişikliklerinizi düzeltmek için işlemleri yeniden başlatmanız gerekecektir.

Django uygulamanızı güncellerseniz, değişiklik yaparak değişiklik yapmak için Gunicorn işlemini yeniden başlatabilirsiniz:

  • sudo systemctl restart gunicorn

Gunicorn soketini veya servis dosyalarını değiştirirseniz, arka planı yeniden yükleyin ve aşağıdakileri yaparak işlemi yeniden başlatın:

  • sudo systemctl daemon-reload
  • sudo systemctl restart gunicorn.socket gunicorn.service

Nginx sunucu bloğu yapılandırmasını değiştirirseniz, yapılandırmayı ve ardından Nginx'i yazarak sınayın:

  • sudo nginx -t && sudo systemctl yeniden başlat nginx

Bu komutlar, yapılandırmanızı ayarladığınız sırada değişikliklerin toplanması için yardımcı olur.

Sonuç

Bu kılavuzda, kendi sanal ortamında bir Django projesi oluşturduk. Guneycorn'u, Django'nun bunlarla başa çıkabilmesi için müşteri isteklerini çevirecek şekilde yapılandırdık. Daha sonra, istemci bağlantılarını ele almak ve müşteri isteğine bağlı olarak doğru projeyi sunmak için ters proxy olarak hareket etmek üzere Nginx'i kurduk.

Django, benzersiz parçalara odaklanmanızı sağlayarak ortak parçaların çoğunu sağlayarak projeler ve uygulamalar yaratmayı kolaylaştırır. Bu makalede açıklanan genel araç zincirini kullanarak, oluşturduğunuz uygulamaları tek bir sunucudan kolayca sunabilirsiniz.

Bir önceki yazımız olan Ubuntu'da VNC Nasıl Kurulur ve Yapılandırılır 18.04 başlıklı makalemizi de okumanızı öneririz.

About This Author

Comments are closed

%d blogcu bunu beğendi: