- Konu sahibi
- #1
İlk olarak Nginx yapılandırmasının
Nginx’in ana yapılandırma dosyası çoğu Linux kurulumunda
Gzip yönergeleri
Aşağıdaki örnek, metin tabanlı yanıtlar için kullanılabilecek temel bir yapılandırmadır. Bu örnekteki değerler varsayılan bir başlangıç ayarıdır; sıkıştırma düzeyini artırmak işlemci kullanımını da artırabileceğinden, sunucunun yüküne göre değiştirilmelidir.
Bu ayarları örneğin
İçeriği yalnızca belirli bir site için sıkıştıracaksanız aynı yönergeleri ilgili
Dosyayı kaydettikten sonra önce sözdizimini test edin:
Başarılı bir sonuç, yapılandırma dosyasının sözdiziminin geçerli olduğunu gösterir. Bu test, gzip’in istemciye gerçekten gönderildiğini kanıtlamaz; yalnızca Nginx’in yapılandırmayı okuyabildiğini doğrular. Hata alırsanız çıktıda belirtilen dosya yolu ve satır numarasını açın. Eksik noktalı virgül, yanlış yerleştirilmiş
Test başarılıysa çalışan Nginx süreçlerine yeni yapılandırmayı yükletin:
Bazı sistemlerde servis adı veya yönetim yöntemi farklı olabilir.
Testi, gzip kabul eden bir istemci başlığı göndererek yapın. Örneğin alan adınızı
Yanıtta aşağıdaki başlıkları görmeniz beklenir:
Sonuçları şu şekilde yorumlayabilirsiniz:
Gzip yalnızca Nginx’in ürettiği veya Nginx üzerinden ilettiği uygun yanıtları sıkıştırır. JPEG, PNG, WebP, MP4, ZIP ve PDF gibi zaten sıkıştırılmış dosyalarda genellikle anlamlı bir kazanç beklenmez. Bu dosya türlerini zorla gzip kapsamına almak CPU tüketimini artırabilir ve dosya boyutunu önemli ölçüde azaltmayabilir.
Uygulamanız yanıtın
Gzip yönergeleri tanınmıyorsa Nginx’in gzip modülü devre dışı bırakılmış veya kurulum sırasında gerekli zlib desteği bulunmuyor olabilir. Nginx’in derleme seçeneklerini görmek için şu komutu çalıştırabilirsiniz:
Çıktıda
Yanıt
HTTPS kullanan ve yanıt içinde kullanıcıya özel gizli bilgileri yansıtan uygulamalarda gzip, BREACH türü saldırı riskleri açısından ayrıca değerlendirilmelidir. Özellikle oturum bilgileriyle birlikte değişken kullanıcı girdisini aynı sıkıştırılmış yanıtta veren uygulamalarda, gzip’i tüm dinamik yanıtlar için koşulsuz açmak yerine güvenlik ekibinizin önerdiği kapsamı uygulayın.
http bölümüne gzip ayarlarını ekleyin, ardından yapılandırmayı nginx -t ile doğrulayıp Nginx’i yeniden yükleyin. Yanıtı gzip destekleyen bir istemciyle test ettiğinizde Content-Encoding: gzip başlığını görüyorsanız sıkıştırma etkinleşmiştir. CSS, JavaScript, JSON ve XML gibi metin tabanlı içerik türlerini ayrıca gzip_types ile belirtmeniz gerekir; HTML, varsayılan olarak zaten gzip kapsamındadır.Yapılandırma dosyasını ve doğru bölümü bulun
Nginx’in ana yapılandırma dosyası çoğu Linux kurulumunda
/etc/nginx/nginx.conf konumundadır. Ancak sanal sunucu ayarları /etc/nginx/conf.d/ veya /etc/nginx/sites-available/ altındaki ayrı dosyalarda tutulabilir. Önce etkin yapılandırmanın hangi dosyalardan oluştuğunu belirleyin; yalnızca bir siteye uygulamak istiyorsanız ayarı ilgili server bloğuna, tüm sitelerde kullanmak istiyorsanız http bloğuna ekleyin.Gzip yönergeleri
http, server veya location bağlamında kullanılabilir. Genel sunucu ayarını http bloğuna eklemek, aynı Nginx örneğindeki tüm sanal sunucular için geçerli olur. Tek bir alan adını etkilemesini istiyorsanız, ilgili server { ... } bloğunun içine yerleştirmek daha sınırlı ve güvenli bir seçimdir.Gzip ayarlarını ekleyin
Aşağıdaki örnek, metin tabanlı yanıtlar için kullanılabilecek temel bir yapılandırmadır. Bu örnekteki değerler varsayılan bir başlangıç ayarıdır; sıkıştırma düzeyini artırmak işlemci kullanımını da artırabileceğinden, sunucunun yüküne göre değiştirilmelidir.
NGINX:
gzip on;
gzip_vary on;
gzip_min_length 1000;
gzip_comp_level 5;
gzip_types
text/plain
text/css
application/javascript
application/json
application/xml
image/svg+xml;
Bu ayarları örneğin
http { ... } bloğunun içine yerleştirebilirsiniz:
NGINX:
http {
gzip on;
gzip_vary on;
gzip_min_length 1000;
gzip_comp_level 5;
gzip_types
text/plain
text/css
application/javascript
application/json
application/xml
image/svg+xml;
include /etc/nginx/conf.d/*.conf;
}
İçeriği yalnızca belirli bir site için sıkıştıracaksanız aynı yönergeleri ilgili
server bloğuna taşıyın. Aynı yönergeleri farklı yerlerde tekrar tekrar tanımlamak yerine, kapsamı baştan belirleyip tek bir etkin yapılandırma dosyasında tutmak hata ayıklamayı kolaylaştırır.Bu yönergeler neyi değiştirir?
gzip on; yanıt sıkıştırmasını açar. gzip_types, HTML dışındaki MIME türlerinin sıkıştırılacağını belirler. Nginx, text/html yanıtlarını ayrıca listelenmese de gzip kapsamına alır.gzip_min_length 1000;, yalnızca yanıtın Content-Length değeri en az 1000 bayt olduğunda sıkıştırma yapılmasını sağlar. Küçük yanıtları sıkıştırmak, aktarımda anlamlı bir kazanç sağlamadan işlemci maliyeti oluşturabilir. Yanıtın boyutu Content-Length başlığıyla belirlenemiyorsa bu yönergenin sonucu beklediğiniz gibi olmayabilir.gzip_comp_level 1 ile 9 arasında değer alır. Düşük değerler daha az işlemci kullanırken daha düşük sıkıştırma sağlayabilir; yüksek değerler dosya boyutunu azaltabilir ancak CPU maliyetini artırır. Bu nedenle doğrudan en yüksek değeri kullanmak yerine, sunucunun işlemci kullanımı ve gerçek yanıt boyutları izlenmelidir.gzip_vary on;, istemcinin kabul ettiği kodlama türünün önbelleklerde dikkate alınabilmesi için Vary: Accept-Encoding yanıt başlığını ekler. Paylaşımlı önbellek, CDN veya ters vekil kullanıyorsanız bu başlık, sıkıştırılmış ve sıkıştırılmamış yanıtların birbirine karıştırılmasını önlemeye yardımcı olur.Yapılandırmayı kaydedip Nginx’i yeniden yükleyin
Dosyayı kaydettikten sonra önce sözdizimini test edin:
Bash:
sudo nginx -t
Başarılı bir sonuç, yapılandırma dosyasının sözdiziminin geçerli olduğunu gösterir. Bu test, gzip’in istemciye gerçekten gönderildiğini kanıtlamaz; yalnızca Nginx’in yapılandırmayı okuyabildiğini doğrular. Hata alırsanız çıktıda belirtilen dosya yolu ve satır numarasını açın. Eksik noktalı virgül, yanlış yerleştirilmiş
gzip_types satırı veya hatalı blok kapanışı en sık karşılaşılan nedenlerdendir.Test başarılıysa çalışan Nginx süreçlerine yeni yapılandırmayı yükletin:
Bash:
sudo systemctl reload nginx
Bazı sistemlerde servis adı veya yönetim yöntemi farklı olabilir.
reload işlemi yeni yapılandırmayı yüklerken mevcut bağlantıları kesmeden çalışmayı amaçlar; yapılandırma geçersizse Nginx’i yeniden yüklememelidir. Bu nedenle nginx -t adımını atlamayın.Sıkıştırmanın gerçekten çalıştığını kontrol edin
Testi, gzip kabul eden bir istemci başlığı göndererek yapın. Örneğin alan adınızı
example.com yerine gerçek alan adınızla değiştirin:
Bash:
curl -I -H 'Accept-Encoding: gzip' https://example.com/app.css
Yanıtta aşağıdaki başlıkları görmeniz beklenir:
HTTP:
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Encoding: gzip, bu istekte yanıt gövdesinin gzip ile sıkıştırıldığını gösterir. Vary: Accept-Encoding ise önbelleklerin istemcinin kodlama desteğini dikkate alması gerektiğini belirtir. Yalnızca Vary başlığını görmek gzip gövdesinin gönderildiğini kanıtlamaz; doğrulama için özellikle Content-Encoding: gzip başlığını arayın.Sonuçları şu şekilde yorumlayabilirsiniz:
| Görülen sonuç | Anlamı | Sonraki işlem |
|---|---|---|
| Content-Encoding: gzip | Bu yanıt sıkıştırılmıştır. | Ayarın ilgili içerik türlerinde çalıştığını kabul edip farklı dosya türlerini ayrıca test edin. |
| Vary: Accept-Encoding var, Content-Encoding yok | Yanıt gzip kapsamına girmemiş, küçük kalmış veya üst katman yanıtı değiştirmiş olabilir. | Content-Type, yanıt boyutu ve ilgili gzip_types eşleşmesini kontrol edin. |
| İki başlık da yok | İstek farklı bir Nginx sunucusuna gidiyor, ayar etkin yapılandırmada değil veya yanıt gzip için uygun değil olabilir. | Etkin yapılandırmayı, alan adının doğru sunucuya yönlendiğini ve reload çıktısını kontrol edin. |
| nginx -t hata veriyor | Nginx yeni yapılandırmayı kabul etmemiştir. | Belirtilen dosya ve satırdaki sözdizimi hatasını düzeltmeden reload yapmayın. |
Uygulamanız yanıtın
Content-Encoding başlığını daha sonra değiştiriyor, CDN kendi sıkıştırmasını uyguluyor veya ters vekil yanıtı önceden sıkıştırılmış olarak gönderiyorsa test sonucu doğrudan Nginx ayarını yansıtmayabilir. Böyle bir durumda testi önce doğrudan Nginx sunucusuna, ardından CDN veya vekil üzerinden yaparak iki yanıtı karşılaştırın.Sık karşılaşılan sorunları ayırın
Gzip yönergeleri tanınmıyorsa Nginx’in gzip modülü devre dışı bırakılmış veya kurulum sırasında gerekli zlib desteği bulunmuyor olabilir. Nginx’in derleme seçeneklerini görmek için şu komutu çalıştırabilirsiniz:
Bash:
nginx -V 2>&1
Çıktıda
--without-http_gzip_module seçeneği bulunuyorsa gzip modülü özellikle kapatılmıştır. Böyle bir durumda yalnızca yapılandırma satırı eklemek yeterli olmaz; dağıtımınızın uygun Nginx paketini kullanmanız veya Nginx’i gzip modülü ve zlib desteğiyle yeniden derlemeniz gerekir.Yanıt
Content-Type: text/plain gibi beklediğiniz bir MIME türüyle gelmiyorsa gzip_types içindeki değer eşleşmez. Bu nedenle yalnızca dosya uzantısına bakmayın; curl -I çıktısındaki gerçek Content-Type başlığını kontrol edin. Gerekirse uygulamanın doğru MIME türünü göndermesini sağlayın veya yalnızca gerçekten sıkıştırılması gereken MIME türünü yapılandırmaya ekleyin.HTTPS kullanan ve yanıt içinde kullanıcıya özel gizli bilgileri yansıtan uygulamalarda gzip, BREACH türü saldırı riskleri açısından ayrıca değerlendirilmelidir. Özellikle oturum bilgileriyle birlikte değişken kullanıcı girdisini aynı sıkıştırılmış yanıtta veren uygulamalarda, gzip’i tüm dinamik yanıtlar için koşulsuz açmak yerine güvenlik ekibinizin önerdiği kapsamı uygulayın.
Sık sorulan sorular
Gzip ayarını Nginx’in hangi dosyasına eklemeliyim?
Tüm siteler için ortak bir ayar istiyorsanız etkin
nginx.conf dosyasındaki http bloğunu, yalnızca tek bir alan adı için istiyorsanız ilgili sanal sunucunun server bloğunu kullanın. Dosyanın gerçekten etkin olduğunu nginx -T çıktısında arama yaparak doğrulayabilirsiniz.gzip_types içine image/svg+xml eklemek gerekir mi?
SVG metin tabanlı bir MIME türü olduğu için sıkıştırılabilir; ancak yalnızca yanıtın gerçek
Content-Type değeri image/svg+xml ise bu satır etkili olur. Aynı dosya uzantısı farklı MIME türüyle gönderiliyorsa önce uygulamanın yanıt başlığını düzeltin.Gzip etkin olduğu hâlde dosya boyutu neden değişmiyor?
Dosya küçük olabilir, MIME türü
gzip_types ile eşleşmiyor olabilir veya içerik JPEG, PNG, ZIP gibi zaten sıkıştırılmış bir formatta olabilir. Yanıt başlıklarını, Content-Length değerini ve istekte gönderilen Accept-Encoding: gzip başlığını birlikte kontrol edin.