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.conf
dosyasının gzip
bö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.