Bir web sitesinin performansı, kısmen de olsa tarayıcının indirmesi gereken dosyaların boyutuna bağlıdır. İletilen dosyaların boyutunu azaltmak web sitenizi daha hızlı hale getirebilir. Nginx’i gzip kullanacak şekilde yapılandırmak çok kolaydır. Gzip en basit haliyle dosyaları sıkıştırır ve bu dosyalar, destekleyen tarayıcılar tarafından geri çağırıldığında herhangi bir kayıp olmaksızın ve sunucu ile tarayıcı arasında aktarılacak daha az miktarda verinin avantajıyla açılır. Gzip tüm modern tarayıcılar tarafından desteklenmektedir.

Sıkıştırmanın genel mantığı ve gzip’in çalışma yöntemi nedeniyle, bazı dosyalar diğerlerinden daha iyi sıkıştırılır. Örneğin, metin dosyaları iyi sıkıştırılır ve iki kat daha küçük olur. Öte yandan, JPEG veya PNG dosyaları gibi görüntüler doğaları gereği zaten sıkıştırılmıştır ve gzip kullanarak ikinci kez sıkıştırmak çok az olumlu sonuç verir veya hiç vermez. Dosyaları sıkıştırmak sunucu kaynaklarını kullanacağı için, yalnızca boyut küçültmeden yararlanacak dosya türleri ile çalışmak en iyisidir.

Bu kılavuzda, Nginx’i gzip sıkıştırmasını kullanacak şekilde yapılandıracağız. Bu, web sitenizin ziyaretçilere gönderdiği içeriğin boyutunu küçültecek ve performansı artıracaktır.

Bu kılavuzda yazılanları uygulamak için ihtiyacınız olacaklar:

  • Nginx kurulu Ubuntu 20.04 sunucu ve sudo yetkileri tanımlanmış normal bir kullanıcı
  • Sunucu IP adresine yönlendirilmiş example.com alan adı

Test Dosyaları Oluşturma

Şimdi web kök dizininde birkaç test dosyası açıp nginx’in gzip varsayılan davranışını kontrol edelim ve yapılandırma değişikliklerinin istenen etkiye sahip olup olmadığını görelim.

Nginx işleyeceği dosyalara, içeriğine göre değil uzantısına göre davrandığı için açacağımız test dosyalarının içeriğinin önemi olmayacak.

truncate komutuyla bir test.html dosyası oluşturun. Benzer biçimde bir adet jpg resim dosyası, bir css stil dosyası ve birjs javaScript dosyası daha açın:

sudo truncate -s 1k /var/www/html/test.html
sudo truncate -s 1k /var/www/html/test.jpg
sudo truncate -s 1k /var/www/html/test.css
sudo truncate -s 1k /var/www/html/test.js

Varsayılan Nginx Davranışı

Oluşturduğumuz test.html dosyasını Accept-Encoding: gzip html header kullanarak test edeceğiz.

curl -H "Accept-Encoding: gzip" -I http://example.com/test.html

Aşağıdaki gibi bir çok http header içeren cevap alacağız:

HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:04:25 GMT
Content-Type: text/html
Last-Modified: Tue, 09 Feb 2021 19:03:41 GMT
Connection: keep-alive
ETag: W/"6022dc8d-400"
Content-Encoding: gzip

Son satırdaki Content-Encoding: gzip bilgisine dikkat edin. Bu header bize dosya için sıkıştırmanın kullanıldığını belirtiyor. Bu header’ı gördük çünkü nginx, html dosyalarında varsayılan olarak gzip sıkıştırması kullanıyor.

Şimdi de test.jpg dosyasını aynı yolla test edelim:

curl -H "Accept-Encoding: gzip" -I http://example.com/test.jpg
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:05:49 GMT
Content-Type: image/jpeg
Content-Length: 1024
Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
Connection: keep-alive
ETag: "6022dc91-400"
Accept-Ranges: bytes

Göreceğiniz üzere Content-Encoding: gzip header bilgisi çıktıda görünmedi. Bu da dosyanın sıkıştırılmadan işlendiği anlamına geliyor.

CSS stil dosyasına baktığımızda yine sıkıştırmanın yapılmadığını görüyoruz.

curl -H "Accept-Encoding: gzip" -I http://example.com/test.css
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:06:04 GMT
Content-Type: text/css
Content-Length: 1024
Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
Connection: keep-alive
ETag: "6022dc91-400"
Accept-Ranges: bytes

Nginx Gzip Ayarları

Nginx’in ana konfigürasyon dosyasını açın ve gzip bölümünü bulun. Nano editöründe Ctrl+X ile aratabilirsiniz.

sudo nano /etc/nginx/nginx.conf
. . .
##
# `gzip` Settings
#
#
gzip on;
gzip_disable "msie6";

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
. . .

Gzip sıkıştırması gzip on direktifi ile gerçekten aktif durumdaymış ancak ek özellikler pasif durumda. Satır başlarındaki # işaretini kaldırıp aktif hale getirelim. Ekstra olarak gzip_min_length 256; direktifi ile nginx’e 256 byte’dan daha küçük dosyaları sıkıştırmamasını isteyeceğiz zira bir anlamı olmayacaktır.

Web fontları, ikonlar, xml beslemeleri, json verileri ve svg resimleri gibi türleri işlemek içinse gzip_types direktifini kullanıyoruz.

Değişikliklerden sonra /etc/nginx/nginx.confdosyasının gzipbölümü şu şekilde görülecektir.

. . .
##
# `gzip` Settings
#
#
gzip on;
gzip_disable "msie6";

gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types
  application/atom+xml
  application/geo+json
  application/javascript
  application/x-javascript
  application/json
  application/ld+json
  application/manifest+json
  application/rdf+xml
  application/rss+xml
  application/xhtml+xml
  application/xml
  font/eot
  font/otf
  font/ttf
  image/svg+xml
  text/css
  text/javascript
  text/plain
  text/xml;
. . .

Yaptığımız güncellemenin aktif olması için nginx yeniden başlatılmalıdır:

sudo systemctl restart nginx

Yeni Konfigürasyonu Doğrulama

Daha önce kullandığımız metot ile yeniden dosyaları kontrol edin. Eğer çıktılarda Content-Encoding: gzip header bilgisi görüyorsanız işlemlerimiz sorunsuz tamamlanmış demektir.

curl -H "Accept-Encoding: gzip" -I http://example.com/test.html
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:04:25 GMT
Content-Type: text/html
Last-Modified: Tue, 09 Feb 2021 19:03:41 GMT
Connection: keep-alive
ETag: W/"6022dc8d-400"
Content-Encoding: gzip

html dosyası zaten sıkıştırma işleminden geçiyordu.

curl -H "Accept-Encoding: gzip" -I http://example.com/test.css

gzip css dosyalarını işlemeye başladı:

HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:21:54 GMT
Content-Type: text/css
Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: W/"6022dc91-400"
Content-Encoding: gzip

Uzantısını eklemediğimiz test.jpg dosyası sıkıştırılmadan işlem görmeye devam ediyor:

curl -H "Accept-Encoding: gzip" -I http://example.com/test.jpg
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:25:40 GMT
Content-Type: image/jpeg
Content-Length: 1024
Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
Connection: keep-alive
ETag: "6022dc91-400"
Accept-Ranges: bytes

Sonuç

Web sitenizi ziyaret edeceklerin memnuniyeti bir yana, artık arama motorları ve SEO için web sitelerinin hızı büyük bir kriter haline geldi. Bu yüzden kılavuzda anlatılanları eksiksiz uygulamanızı önemle tavsiye ediyorum.