Nginx ve uWSGI Nedir?
Nginx, yüksek verimli bir web sunucusu ve ters proxy sunucusudur. Genellikle statik dosyaları sunmak, SSL sonlandırması yapmak ve dinamik içerikleri yönlendirmek için kullanılır. Python tabanlı web uygulamaları için genellikle WSGI (Web Server Gateway Interface) kullanılır. uWSGI, WSGI standartlarını destekleyen bir uygulama sunucusudur ve Python uygulamalarını çalıştırmak için popüler bir tercihtir.
Nginx ve uWSGI’nin Entegrasyonu
Nginx ve uWSGI’nin entegrasyonu, Python WSGI uygulamalarının verimli bir şekilde sunulmasını sağlar. Bu entegrasyonun temel bileşenlerinden biri `uwsgi_pass` direktifidir. Bu direktif, Nginx yapılandırmasında hangi uWSGI sunucusuna isteklerin yönlendirileceğini belirtir.
uWSGI Sunucusunun Kurulumu
Öncelikle, uWSGI sunucusunun kurulumunun gerçekleştirilmesi gerekmektedir. Bu, pip aracılığıyla yapılabilir. Aşağıdaki komut, uWSGI’yi kurmak için kullanılabilir:
“`
pip install uwsgi
“`
Kurulum tamamlandıktan sonra, uygun bir uWSGI dosyası oluşturarak uygulamanın başlatılması sağlanır. Örnek bir `app.py` dosyası aşağıda verilmiştir:
“`python
def application(environ, start_response):
status = ‘200 OK’
headers = [(‘Content-Type’, ‘text/plain’)]
start_response(status, headers)
return [b”Hello World”]
“`
uWSGI uygulaması için bir konfigürasyon dosyası (`app.ini`) oluşturulabilir:
“`
[uwsgi]
module = app
callable = application
socket = /tmp/uwsgi.sock
chmod-socket = 660
vacuum = true
die-on-term = true
“`
Nginx Yapılandırması
Nginx’in uWSGI ile çalışabilmesi için uygun yapılandırmanın yapılması gereklidir. Aşağıda, örnek bir Nginx yapılandırma dosyası verilmiştir:
“`nginx
server {
listen 80;
server_name example.com;
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/uwsgi.sock;
}
}
“`
Bu yapılandırmada, `server_name` direktifi, isteklerin yönlendirileceği sunucunun adını belirtir. `location /` bloğu, ana URL’ye gelen istekleri işler. `include uwsgi_params;` satırı, uWSGI’ye gereken parametreleri dahil eder. `uwsgi_pass unix:/tmp/uwsgi.sock;` direktifi ise, Nginx’in uWSGI ile etkileşimde bulunmak için kullanacağı socket dosyasını belirtir.
uwsgi_param Direkifleri
`uwsgi_param`, Nginx’in uWSGI’ye ileteceği parametreleri tanımlamak için kullanılır. Bu parametreler, WSGI uygulamasının işlem yapabilmesi için gereklidir. Aşağıda bazı yaygın `uwsgi_param` direktifleri ve açıklamaları verilmiştir:
– SCRIPT_NAME: Uygulamanın URL’deki kök yolunu belirtir. WSGI uygulaması bu değeri kullanarak istekleri yönetir.
– REQUEST_METHOD: HTTP isteğinin yöntemini belirtir (GET, POST vb.).
– CONTENT_TYPE: İstek gövdesinin içeriğinin türünü belirtir.
– CONTENT_LENGTH: İstek gövdesinin uzunluğunu belirtir.
– QUERY_STRING: İstek URL’inin sorgu kısmını belirtir.
Örnek bir `uwsgi_params` dosyası aşağıdaki gibidir:
“`
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param SCRIPT_NAME $script_name;
uwsgi_param PATH_INFO $uri;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_NAME $server_name;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_PROTOCOL $server_protocol;
“`
Uygulamanın Çalıştırılması
Nginx ve uWSGI yapılandırmaları tamamlandıktan sonra, uWSGI sunucusunu başlatmak için aşağıdaki komut kullanılabilir:
“`
uwsgi –ini app.ini
“`
Ardından, Nginx sunucusunu başlatmak için aşağıdaki komut kullanılabilir:
“`
sudo systemctl start nginx
“`
Her iki sunucu da çalıştığında, uygulama üzerinde yapılan istekler Nginx üzerinden uWSGI’ye yönlendirilir.
Hata Ayıklama
Uygulamanın çalışmaması durumunda, her iki sunucunun log dosyaları kontrol edilmelidir. Nginx hata günlüğü genellikle `/var/log/nginx/error.log` altında bulunur. uWSGI için log ayarları konfigürasyon dosyasında belirtilebilir:
“`
logto = /path/to/uwsgi.log
“`
Bu şekilde, uWSGI hata günlüğü belirtilen dosyaya yazılır ve hata ayıklama süreçleri daha etkili hale gelir.
Güvenlik İpuçları
Web uygulaması sunarken, güvenlik önemleri dikkate alınmalıdır. Nginx üzerinde SSL/TLS yapılandırması yapmak, yalnızca yerel socket dosyasına erişimi sınırlamak ve gerekli CORS politikalarını uygulamak, temel güvenlik uygulamalarındandır.
Nginx ve uWSGI entegrasyonu, Python tabanlı web uygulamalarının sunulması için etkili bir yöntemdir. Yapılandırma dosyalarının dikkatli bir şekilde hazırlanması, uygulamanın performansı ve güvenliği açısından önemlidir.