"Enter"a basıp içeriğe geçin

NGINX | uwsgi_pass ile uWSGI Python Web Uygulamasına proxy oluşturma

Last updated on 10 Eylül 2020

UWSGI (Django 2.0) uygulamamız çalışırken, NGINX’i ona giden trafiği proxy olarak ayarlamaya hazırız.

Kaynaklar

Uwsgi_pass kullanma

Uwsgi’nin “WSGI” kısmı, “Web Server Gateway Interface – Web Sunucusu Ağ Geçidi Arayüzü” anlamına gelir ve başlangıçta Python’a özgü bir protokoldür. Uwsgi’deki “u”, “Universal” anlamına gelir. FastCGI gibi, uWSGI bir programdan diğerine bilgi aktarmanın başka bir yoludur. Ayrıca FastCGI gibi, NGINX de trafiği doğrudan http_uwsgi_module kullanarak çalışan bir uWSGI uygulamasına proxy yapmak için bir modül sağlar. Şimdi bu modülü kullanarak basit bir yapılandırma oluşturalım:

/etc/nginx/conf.d/notes.example.com.conf

server {
    listen 80;
    server_name notes.example.com;

location /static {
   root /var/www/notes.example.com;
}

location / {
    include uwsgi_params;
    uwsgi_pass unix:/var/run/uwsgi/notes.sock;
}

}

Bu noktalar tanıdık gelmelidir. NGINX’in yaratıcıları, NGINX tarafından sağlanan proxy yöntemlerinin hepsinin çok benzer şekillerde çalışmasını sağlamak için harika bir iş çıkardıkları gözüküyor. Statik değerler /var/www içindeki bir dizinden sunuyoruz, böylece Python işleminin bunlar için endişelenmesine gerek kalmaz. Statik bir varlık için olmayan tüm trafik, uwsgi_pass kullanılarak uygulamamıza proxy olarak bağlanıyor

FastCGI’de fastcgi_params dosyası ve uWSGI’da uwsgi_params dosyası bulunur (her ikisi de varsayılan olarak NGINX tarafından sağlanır). Uwsgi_params dosyası şunları içerir:

/etc/nginx/uwsgi_params

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  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;


uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

Bu dosya NGINX değişkenlerini uWSGI’nin beklediği dizge gösterimiyle eşleştirir.

Bu yapılandırma çalışmadan önce SELinux’a NGINX’in soket ile iletişim kurmasına izin vermesini söylememiz gerekecek. Şimdi, SELinux’u izin verici olarak ayarlayarak, bir talepte bulunarak ve ardından denetim günlüğünden bir politika dosyası oluşturarak gördüğümüz sorunlara dayalı bir politika dosyası oluşturacağımız noktaya geldik.

[root] $ cd /etc/nginx
[root] $ semanage permissive -a httpd_t
[root] $ systemctl reload nginx
[root] $ curl --header "Host: notes.example.com" localhost
...
[root] $ grep nginx /var/log/audit/audit.log | audit2allow -m nginx

module nginx 1.0;


require {
        type httpd_t;
        type initrc_t;
        class unix_stream_socket connectto;
}


#============= httpd_t ==============


#!!!! The file '/run/uwsgi/notes.sock' is mislabeled on your system.
#!!!! Fix with $ restorecon -R -v /run/uwsgi/notes.sock
allow httpd_t initrc_t:unix_stream_socket connectto;
[root] $ grep nginx /var/log/audit/audit.log | audit2allow -M nginx
**** IMPORTANT ***
To make this policy package active, execute:


semodule -i nginx.pp

Bu modül, nginx için kurallara bağlı kalacaktır ve gerekirse bu konuda daha sonra değişiklikler yapabiliriz. NGINX’teki izin verilebilirliği kaldırma, modülü yükleme ve etkinleştirme sürecini bitirelim.

[root] $ semanage permissive -d httpd_t
[root] $ semodule -i nginx.pp
libsemanage.semanage_direct_install_info: nginx module will be disabled after install due to default enabled status.
[root] $ semodule -e nginx
[root] $ restorecon -Rv /var/run/uwsgi/
restorecon reset /run/uwsgi/notes.sock context system_u:object_r:var_run_t:s0->system_u:object_r:httpd_var_run_t:s0

Şimdi, web tarayıcınızdan notes.example.com adresini ziyaret ettiğimizde (/etc/hosts dosyamızda gerekli tanımlamayı yaptıgımızı düşünerek), Markdown not alma uygulamamız için bir giriş sayfası göreceğiz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.