Bu makale Nginx'i öğrenmem için bazı notlar, ana içerik Nginx'i anlamak için gereken bazı temel kavramları anlatıyor.
Ardından, Nginx'in modüler organizasyon yapısının yanı sıra her modül tarafından sağlanan sınıflandırmayı, çalışma yöntemlerini, sorumlulukları ve ilgili talimatları tartışın.
Esas olarak aşağıdaki amaçlara ulaşın:
Nginx, proxy HTTP, HTTPS ve postayla ilişkili (SMTP, POP3, IMAP) protokol bağlantılarını tersine çevirebilen performans odaklı bir HTTP sunucusudur. Ve yük dengeleme ve HTTP önbelleğe alma sağlar.
Tasarımı, eşzamansız olay modelini tam olarak kullanır, bağlam planlamasının ek yükünü azaltır ve sunucunun eşzamanlılığını iyileştirir.
Modüler tasarım benimsenmiştir ve bol miktarda modül içeren üçüncü taraf modülleri sağlanmaktadır.
Dolayısıyla Nginx hakkında şu etiketler vardır: "eşzamansız" "olay" "modülerlik" "yüksek performans" "yüksek eşzamanlılık" "ters proxy" "yük dengeleme"
İşlem modeli
Nginx süreci klasik "Master-Worker" modelini kullanır.
Nginx başlatıldıktan sonra, bir ana süreç ve birden çok çalışan süreç olacaktır.
Ana süreç esas olarak çalışan sürecini yönetmek için kullanılır: dış dünyadan sinyal alma, her çalışan işleme sinyal gönderme, çalışan işlemin çalışma durumunu izleme ve çalışan işlem çıktığı zaman (anormal koşullar altında) yeni çalışan süreci otomatik olarak yeniden başlatma .
Çalışan süreci esas olarak temel ağ olaylarıyla ilgilenir. Birden çok çalışan süreci eşler arasıdır. İstemcilerden gelen talepler için eşit olarak rekabet ederler ve her süreç birbirinden bağımsızdır. Her İşçinin yalnızca "tek iş parçacığı" olarak adlandırılan ana iş parçacığına sahip olduğuna dikkat edilmelidir.
Bir istek yalnızca bir çalışan işlemde işlenebilir ve bir çalışan işlem diğer işlemlerden gelen istekleri işleyemez.
Çalışan işlemlerin sayısı ayarlanabilir ve genellikle makine CPU çekirdeklerinin sayısıyla tutarlı olacak şekilde ayarlanır.Bunun nedeni nginx işlem modeli ve olay işleme modelinden ayrılamaz. Çok çekirdekli özelliklerin daha iyi kullanılması için nginx, cpu affinitesi için bir bağlama seçeneği sunar.Belirli bir işlemi belirli bir çekirdeğe bağlayabiliriz, böylece işlem değiştirme nedeniyle önbellek geçersiz hale gelmez. Daha fazla işçi yalnızca işlemlerin cpu kaynakları için rekabet etmesine neden olacaktır.
Nginx süreç model.png
Olay modeli
Nginx, olayları "eşzamansız, engellemesiz" bir şekilde uygular.
Eşzamansız ve eşzamansız, engelleyen ve engellemeyen iki farklı kavramdır. Birincisi uygulamalar için daha çok, ikincisi daha çok CPU'lar içindir:
Nginx'in "asenkron engellemesiz" yöntemi, sistem çağrıları söz konusu olduğunda, select / poll / epoll / kqueue gibi bir sistem çağrısıdır. Aynı anda birden fazla olayı izlemenizi sağlayan bir mekanizma sağlarlar.Onları çağırmak engellemektir, ancak bir zaman aşımı belirleyebilirsiniz.Zaman aşımı süresi içinde, bir olay hazırsa geri dönün.
Epoll, Linux'ta olayların uygulanmasıdır ve kqueue, OpenBSD veya FreeBSD işletim sistemlerindeki epoll'e benzer bir olay modelidir.
Bu yüzden epoll modelini açıklamaya odaklanın:
epoll event model.png
Bu çözüm, Linux altındaki en verimli I / O olay bildirim mekanizmasıdır. Sorguya girerken I / O olayı kontrol edilmezse, olay onu uyandırana kadar uyku moduna geçecektir. Aslında, sorguları çapraz çevirmek yerine olay bildirimi ve geri aramaların yürütülmesi yöntemini kullanır, bu nedenle CPU'yu boşa harcamaz ve daha yüksek yürütme verimliliğine sahiptir.
Ters vekil
"Ters proxy" yi anlamak için önce "proxy sunucusu" ve "ileri proxy" nin ne olduğunu bilmeniz gerekir.
Proxy sunucu
Ağda, istemci sunucudan kaynakları almak için bir istek başlatır. Aralarında doğrudan bir kanal kurulmaz, ancak proxy sunucusu tarafından iletilir.
Proxy sunucusu, İnternet üzerinden elde edilen kaynakları ilgili istemcilere döndürmek için ağda bir ortam görevi görür.
Genellikle bahsettiğimiz proxy, genellikle istemciye göre olan "ileri proxy" yi ifade eder.
Örneğin, bir VPN'e bağlandım. Google'ı ziyaret ettiğimde, istemci isteği VPN'e başlattı. VPN, isteğin Google'ın sunucusuna iletilmesine yardımcı oldu ve ardından Google yanıtını istemciye geri verdi. Bu süreçte VPN, "ileri proxy sunucusu" olarak hareket eder.
Proxy server.png
Ters vekil
"İleri proxy" nin aksine, "ters proxy" terimi sunucu tarafına yöneliktir. Proxy sunucusuna bir istemci talebi gelir ve proxy sunucusu, istemcinin isteğine göre isteği farklı sunuculara iletir. Bu süreçte "yük dengeleme" de iki özdeş istek de gerçekleşecek ve bunlar tamamen farklı Sunucudaki durum.
"Ters proxy", "yük dengeleme" nin gerçekleştirilmesi için ön koşuldur. Bunun nedeni, proxy sunucunun istekleri çözme ve istekleri dağıtma yeteneğine sahip olmasıdır, yük dengeleme sağlanabilir ve her sunucu üzerindeki yük azaltılabilir.
Yük dengelemeye ek olarak "ters proxy" kullanarak, SSL şifreleme, statik içerik önbelleğe alma, gzip sıkıştırma, yavaş yükleme, güvenlik vb. Gibi işlevleri de gerçekleştirebilirsiniz.
Ters proxy.png
Yük dengeleme
Yük dengeleme, kaynak kullanımını optimize etmek, verimi en üst düzeye çıkarmak, yanıt süresini en aza indirmek ve aynı zamanda aşırı yüklenmeyi önlemek için yükü birden çok sunucu arasında dağıtmak için kullanılan bir bilgisayar ağı teknolojisidir.
Tek bir bileşen yerine yük dengelemeli birden çok sunucu bileşeni kullanmak, artıklık yoluyla güvenilirliği artırabilir. Yük dengeleme hizmetinin gerçekleştirilmesi yazılım ve donanım aracılığıyla gerçekleştirilebilir.
Yük dengeleme dağıtımında, dağıtım sorununu çözmek için genellikle birden fazla algoritma seti vardır.
Bağ
Nginx'te bağlantı, bağlı soketi, okuma olayını ve yazma olayını içeren bir tcp bağlantısının kapsüllenmesidir. Nginx tarafından kapsüllenen bağlantı ile, bağlantı kurmak, veri göndermek ve almak gibi bağlantı ile ilgili şeyleri idare etmek için nginx'i kolayca kullanabiliriz.
Http isteklerinin nginx'te işlenmesi bağlantıya dayalıdır, bu nedenle nginx sadece bir web sunucusu olarak değil, aynı zamanda bir posta sunucusu olarak da kullanılabilir.
Elbette, nginx tarafından sağlanan bağlantıyı kullanarak, herhangi bir arka uç hizmetiyle başa çıkabiliriz.
Maksimum bağlantı sayısı
Nginx'te, her işlem, sistemin fd üzerindeki sınırından farklı bir maksimum bağlantı sayısı üst sınırına sahiptir.
İşletim sisteminde ulimit -n aracılığıyla, bir işlemin açabileceği maksimum fd sayısını, yani nofile'ı elde edebiliriz, çünkü her soket bağlantısı bir fd kaplayacaktır, bu da işlemimizin maksimum bağlantı sayısını sınırlayacaktır. Elbette, programımızın destekleyebileceği maksimum eşzamanlılık sayısını da doğrudan etkileyecektir. Fd kullanıldığında, soket yeniden oluşturulduğunda başarısız olacaktır.
Nginx, worker_connectons ayarlayarak her işlem tarafından desteklenen maksimum bağlantı sayısını belirler. Değer nofile'dan büyükse, gerçek maksimum bağlantı sayısı sıfırdır ve nginx sizi uyaracaktır.
Nginx uygulandığında, bir bağlantı havuzu aracılığıyla yönetilir.Her çalışan işlemin bağımsız bir bağlantı havuzu vardır.Bağlantı havuzunun boyutu işçi_ağlantılarıdır. Buradaki bağlantı havuzu aslında gerçek bir bağlantı değildir, sadece worker_connections boyutuna sahip bir ngx_connection_t yapısı dizisidir. Buna ek olarak, nginx tüm ücretsiz ngx_connection_t'yi bağlı bir free_connections listesi aracılığıyla kaydeder.Bir bağlantı her elde edildiğinde, ücretsiz bağlantı listesinden bir tane alır ve kullanıldıktan sonra serbest bağlantı listesine geri koyar.
Bu nedenle, nginx'in kurabileceği maksimum bağlantı sayısı: worker_connections * worker_processes,
Eğer nginx bir ters proxy olarak kullanılıyorsa, nginx'in bir istemci ve sunucu isteği oluşturması gerektiğinden, maksimum bağlantı sayısı şudur: worker_connections * worker_processes / 2
Talep İste
Nginx'te http talebine atıfta bulunuruz ve nginx'teki veri yapısı ngx_http_request_t'dir.
Bir http talebinin kapsüllenmesidir, nginx, ngx_http_request_t aracılığıyla analiz isteği ve çıktı yanıtı ile ilgili verileri kaydeder.
Bir http isteği, istek satırı, istek başlığı, istek gövdesi, yanıt satırı, yanıt başlığı ve yanıt gövdesini içerir.
Genel ağ talebi işleme süreci şu şekildedir:
Nginx'in isteği işlerken bazı küçük farklılıkları vardır.Örneğin, istek başlığı okunduğunda, isteği işlemeye başlar.
Nginx işleme istek süreci
Nginx'in bir isteği işlemesinin soyut kavramsal süreci:
Ekstrem verimlilik arayışında, nginx'in yazarı birçok farklı nginx tarzı veri yapısı ve genel işlev gerçekleştirdi. Örneğin nginx, uzunluklu dizge, derleyici seçeneklerine vb. Göre optimize edilmiş dize kopyalama işlevi ngx_copy sağlar.
ps: Altı çizili bölme, C dilinin değişken adı stilidir
Nginx'in konfigürasyon sistemi, bir ana konfigürasyon dosyası ve diğer bazı yardımcı konfigürasyon dosyalarından oluşur. Bu yapılandırma dosyalarının tümü, tümü nginx kurulum dizininin altındaki conf dizininde bulunan düz metin dosyalarıdır.
Talimatlar, nginx'in çeşitli modülleri tarafından sağlanır ve farklı modüller, yapılandırmayı uygulamak için farklı talimatlar sağlar.
Anahtar-Değer komutlarının biçimine ek olarak, kapsam komutları da vardır.
Nginx.conf dosyasındaki yapılandırma bilgileri, birden çok kapsama bölünmüş veya yapılandırma talimatı bağlamı olarak adlandırılan mantıksal anlamına göre sınıflandırılır. Farklı kapsamlar, bir veya daha fazla yapılandırma öğesi içerir.
Aşağıdaki bağlam talimatları daha çok kullanılır:
Nginx, çeşitli fonksiyonel modülleri bir zincir halinde organize eder.Bir talep geldiğinde, istek, işlenmek üzere bu zincirdeki modüllerin bir kısmı veya tamamı üzerinden geçer. Her modül belirli bir işlevi yerine getirir. Örneğin, isteklerin sıkıştırmasının açılmasını uygulayan bir modül, SSI uygulayan bir modül, yukarı akış sunucusu ile iletişimi uygulayan bir modül ve FastCGI hizmetleriyle iletişimi uygulayan bir modül.
Üç tür modül vardır:
Resmi belge düzenine göre, yardımcı modüller de aşağıdaki kategorilere ayrılmıştır:
İşlevlerine göre şu kategorilere ayrılabilir:
Bu makale, Nginx'in bazı temel kavramlarını açıklamaktadır.
Nginx'in iş parçacığı modeli Master-Worker modelidir.Her işçi tek iş parçacıklıdır, yani istekleri işleme tek iş parçacıklıdır. Tek iş parçacıklı eşzamanlılık olay modeli, "eşzamansız, engellemesiz G / Ç" modelidir.
Ayrıca, nginx'in yüksek performansla yüksek eşzamanlılık ile başa çıkabilmesinin nedenlerinden biri olan "ters proxy" ve "yük dengeleme" kavramlarını da açıklar.
Nginx, ağ istekleri için Bağlantı ve Talep kavramlarına ve kapsüllemesine sahiptir.
Nginx'in kaynak kodu organizasyon yapısı modülerdir.Farklı modüller farklı sorumluluklar uygular ve daha sonra büyük bir şey yapmak için birbirlerine bağlanırlar.Modül kategorilerini bilmek, resmi belgeleri nasıl bulacağımızı bize bildirebilir.
Hangi komutların ve hangi komutların hangi işlevlere sahip olduğunu görmeden önce, nginx'in hangi işlevleri sağladığını tam olarak bilemiyorum. Sonra durun, sonra "herkes bunu düşünebilir ve gerçekleştirebilir" fikrine tutun. Nginx kullanın. Bir proxy hizmeti olarak Nginx, ortada ne istersen yapabilir.
Eser sahibi: JC_Huang
Bağlantı: https://www.jianshu.com/p/1648d4e936f2