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

NGINX | proxy_pass ile Reverse Proxy

Last updated on 10 Eylül 2020

NGINX’i örnek Node.js uygulamamız için bir reverse proxy olarak ayarlayalım.

Pictures.example.com Sunucusunu oluşturma

Artık photos.example.com hostunu 80 portunu dinleyecek şekilde ayarlamaya hazırız, 3000 numaralı portu local olarak çalışan uygulamaya proxy yapmak için. /Etc/nginx/conf.d içinde yeni bir yapılandırma dosyası oluşturalım:

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

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

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

}

NGINX yapılandırmamızı yeniden başlatır ve curl kullanarak bağlanmaya çalışırsak maalesef bir hata görürüz:

[root] $ systemctl reload nginx
[root] $ curl --header "Host: photos.example.com" local

NGINX hata loglarına bir göz attığımızda, bunun SELinux olduğunu düşünmemize neden olan başka bir “İzin Reddedildi” durumu olduğunu göreceğiz. SELinux’ta httpd hizmeti (NGINX’in parçası olarak kabul eder) ile ilgili olarak ayarlanabilecek epeyce boolean değer vardır. Bunları getsebool -a kullanarak listelersek | grep httpd httpd_can_network_connect adında kapalı olarak ayarlanmış bir tane olduğunu göreceğiz. Sunucumuzun ağ isteklerinde bulunabilmesi için bu özelliği etkinleştirmemiz gerekiyor.

[root] $ setsebool -P httpd_can_network_connect 1
[root] $ curl --header "Host: photos.example.com" localhost

Bunu tarayıcıda görmek için, istemcimiz üzerinden (tarayıcısı olan) /etc/hosts dosyasını değiştirmemiz gerekecektir. /Etc/hosts dosyasındaki örnek bir satır şöyle görünecektir:

172.22.22.22  photos.example.com

Not: 172.22.22.22 yerine sunucunuzun genel IP adresini yazmanız gerekir.

Ağ denetçisinde, statik içeriği başarılı bir şekilde sunduğumuzu görebiliriz, ancak bunu Node.js uygulaması aracılığıyla yapıyoruz. NGINX, bu tür içeriği sunmada gerçekten çok iyi, bu nedenle, bu yükü uygulama sunucusundan çıkarmak için yapılandırmamıza aşağıdaki konum bloğunu ekleyelim.

/etc/nginx/conf.d/photos.example.com.conf (partial)

    location ~* \.(js|css|png|jpe?g|gif) {
        root /var/www/photos.example.com;
    }

NGINX’i servisiniyeniden başlatıp, sayfayı yenileyelim. Ağ denetçisine bakarsak, sunmaya çalıştığımız javascript dosyalarından 403 hatası aldığımızı göreceğiz. SELinux ile bir kez daha sorunlarla karşılaşıyoruz. Bu sefer, sembolik olarak /var/www ile bağlantılı olan bir dizinden içerik sunmaya çalıştığımız için. Potansiyel uygulamalarımızdaki herkese açık dizinler için bunun üstesinden gelmek için başka bir kural eklememiz gerekecek:

[root] $ ln -s /srv/www/s3photoapp/apps/web-client/public /var/www/photos.example.com
[root] $ semanage fcontext -a -t httpd_sys_content_t '/srv/www/.*/public(/.*)?'
[root] $ restorecon -R /srv/www

Ekranı yeniden yüklediğimizde, statik varlıklarımızın düzgün bir şekilde sunulduğunu görüyoruz.

Resim Yüklemeyi Yönetme

Varsayılan olarak, client_max_body_size 1MB’dir ve bu, birisinin yüklemek isteyebileceği birçok görüntüden daha küçüktür. Fotoğraf uygulamamızın gerçekten yararlı olabilmesi için, bu değeri NGINX yapılandırmamızda özelleştirmemiz gerekecek:

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

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

client_max_body_size 5m;

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

location ~* \.(js|css|png|jpe?g|gif) {
    root /var/www/photos.example.com;
}

}

Şimdi, sunucuyu yeniden yükleyebilir ve bir görüntü yüklemeyi test edebiliriz.

[root] $ systemctl reload nginx
Bir cevap yazın

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