Azure Uygulaması Hizmeti Windows'ta düğüm uygulamaları için en iyi yöntemler ve sorun giderme kılavuzu
Bu makalede, Azure Uygulaması Hizmeti'nde (iisnode ile) çalışan Windows Node.js uygulamaları için en iyi yöntemleri ve sorun giderme adımlarını öğreneceksiniz.
Uyarı
Üretim sitenizde sorun giderme adımlarını kullanırken dikkatli olun. Öneri, üretim dışı bir kurulumda uygulamanızın sorunlarını gidermektir, örneğin hazırlama yuvanız ve sorun giderildiğinde hazırlama yuvanızı üretim yuvanızla değiştirin.
IISNODE yapılandırması
Bu şema dosyası iisnode için yapılandırabileceğiniz tüm ayarları gösterir. Uygulamanız için yararlı olan bazı ayarlar:
nodeProcessCountPerApplication
Bu ayar, IIS uygulaması başına başlatılan düğüm işlemlerinin sayısını denetler. Varsayılan değer 1 şeklindedir. Değeri 0 olarak değiştirerek VM vCPU sayınız kadar node.exe başlatabilirsiniz. Çoğu uygulama için önerilen değer 0'dır, bu nedenle makinenizdeki tüm vCPU'ları kullanabilirsiniz. Node.exe tek iş parçacıklı olduğundan bir node.exe en fazla 1 vCPU tüketir. Düğüm uygulamanızdan en yüksek performansı elde etmek için tüm vCPU'ları kullanmak istiyorsunuz.
nodeProcessCommandLine
Bu ayar node.exe dosyasının yolunu denetler. Bu değeri node.exe sürümünüzü işaret etmek için ayarlayabilirsiniz.
maxConcurrentRequestsPerProcess
Bu ayar, iisnode tarafından her node.exe'ye gönderilen en fazla eşzamanlı istek sayısını denetler. Azure Uygulaması Hizmeti'nin varsayılan değeri Sonsuz'dur. Değeri, uygulamanızın kaç istek aldığına ve uygulamanızın her isteği ne kadar hızlı işlediğine bağlı olarak yapılandırabilirsiniz.
maxNamedPipe Bağlan ionRetry
Bu ayar, istekleri node.exe'ye göndermek için adlandırılmış kanalda iisnode yeniden deneme sayısı üst sınırını denetler. Bu ayar namedPipe Bağlan ionRetryDelay ile birlikte iisnode içindeki her isteğin toplam zaman aşımını belirler. Azure Uygulaması Hizmetinde varsayılan değer 200'dür. Saniye cinsinden Toplam Zaman Aşımı = (maxNamedPipe Bağlan ionRetry * namedPipe Bağlan ionRetryDelay) / 1000
namedPipe Bağlan ionRetryDelay
Bu ayar, isteği adlandırılmış kanal üzerinden node.exe'ye göndermek için her yeniden deneme arasındaki iisnode bekleme süresini (ms cinsinden) denetler. Varsayılan değer 250 ms'dir. Saniye cinsinden Toplam Zaman Aşımı = (maxNamedPipe Bağlan ionRetry * namedPipe Bağlan ionRetryDelay) / 1000
Varsayılan olarak, Azure Uygulaması Hizmeti'nde iisnode'da toplam zaman aşımı 200 * 250 ms = 50 saniyedir.
logDirectory
Bu ayar, iisnode'un stdout/stderr'ı günlüğe kaydedeceği dizini denetler. Varsayılan değer, ana betik dizinine (main server.js dosyasının bulunduğu dizin) göre iisnode değeridir
debuggerExtensionDll
Bu ayar, düğüm uygulamanızın hatalarını ayıklarken iisnode düğümünün hangi sürümünü kullandığını denetler. Şu anda iisnode-inspector-0.7.3.dll ve iisnode-inspector.dll bu ayar için yalnızca iki geçerli değerdir. Varsayılan değer iisnode-inspector-0.7.3.dll'dir. iisnode-inspector-0.7.3.dll sürümü node-inspector-0.7.3 kullanır ve web yuvalarını kullanır. Bu sürümü kullanmak için Azure web uygulamanızda web yuvalarını etkinleştirin.
flushResponse
IIS'nin varsayılan davranışı, temizleme işleminden önce veya yanıtın sonuna kadar (hangisi önce gerçekleşirse) 4 MB'a kadar yanıt verilerini arabelleğe alır. iisnode bu davranışı geçersiz kılmak için bir yapılandırma ayarı sunar: iisnode node.exe dosyasından alır almaz yanıt varlık gövdesinin bir parçasını temizlemek için web.config dosyasında iisnode/@flushResponse özniteliğini 'true' olarak ayarlamanız gerekir:
<configuration>
<system.webServer>
<!-- ... -->
<iisnode flushResponse="true" />
</system.webServer>
</configuration>
Yanıt varlığı gövdesinin her parçasının boşaltılabilmesi, sistemin aktarım hızını yaklaşık %5 azaltan (v0.1.13 itibarıyla) performans yükü ekler. Bu ayarın kapsamını yalnızca yanıt akışı gerektiren uç noktalara (örneğin, web.config içindeki öğesini kullanarak <location>
) belirlemek için en iyi seçenektir
Buna ek olarak, akış uygulamaları için iisnode işleyicinizin responseBufferLimit değerini de 0 olarak ayarlamanız gerekir.
<handlers>
<add name="iisnode" path="app.js" verb="\*" modules="iisnode" responseBufferLimit="0"/>
</handlers>
watchedFiles
Değişiklikler için izlenen dosyaların noktalı virgülle ayrılmış listesi. Bir dosyada yapılan herhangi bir değişiklik, uygulamanın geri dönüşümüne neden olur. Her girdi, isteğe bağlı bir dizin adından ve ana uygulama giriş noktasının bulunduğu dizine göre gerekli bir dosya adından oluşur. Joker karakterlere yalnızca dosya adı bölümünde izin verilir. Varsayılan değer: *.js;iisnode.yml
recycleSignalEnabled
Varsayılan değer olarak yanlış kullanılır. Etkinleştirilirse düğüm uygulamanız adlandırılmış bir kanala bağlanabilir (ortam değişkeni IISNODE_CONTROL_PIPE) ve "geri dönüşüm" iletisi gönderebilir. Bu, w3wp'nin düzgün bir şekilde geri dönüşümüne neden olur.
idlePageOutTimePeriod
Varsayılan değer 0'dır ve bu da bu özelliğin devre dışı bırakıldığı anlamına gelir. 0'dan büyük bir değere ayarlandığında iisnode, her 'idlePageOutTimePeriod' alt işlemini milisaniye cinsinden sayfaya çıkarır. Sayfa çıkışının ne anlama geldiğini anlamak için belgelere bakın. Bu ayar, yüksek miktarda bellek tüketen ve RAM'i boşaltmak için zaman zaman belleği diske çıkarmak isteyen uygulamalar için kullanışlıdır.
Uyarı
Üretim uygulamalarında aşağıdaki yapılandırma ayarlarını etkinleştirirken dikkatli olun. Öneri, bunları canlı üretim uygulamalarında etkinleştirmemektir.
debugHeaderEnabled
Varsayılan değer olarak yanlış kullanılır. true olarak ayarlanırsa iisnode, gönderdiği iisnode-debug
her HTTP yanıtına bir HTTP yanıt üst bilgisi iisnode-debug
ekler. Üst bilgi değeri bir URL'dir. Tek tek tanılama bilgileri, URL parçasına bakılarak elde edilebilir, ancak URL'yi tarayıcıda açarak görselleştirme kullanılabilir.
loggingEnabled
Bu ayar, stdout ve stderr'ın iisnode tarafından günlüğe kaydedilmesini denetler. Iisnode, başlattığı düğüm işlemlerinden stdout/stderr yakalar ve 'logDirectory' ayarında belirtilen dizine yazar. Bu etkinleştirildikten sonra, uygulamanız günlükleri dosya sistemine yazar ve uygulama tarafından yapılan günlük miktarına bağlı olarak performans etkileri olabilir.
devErrorsEnabled
Varsayılan değer olarak yanlış kullanılır. true olarak ayarlandığında, iisnode tarayıcınızda HTTP durum kodunu ve Win32 hata kodunu görüntüler. Win32 kodu, belirli sorun türlerinin hata ayıklamasında yararlıdır.
hata ayıklamaEnabled (canlı üretim sitesinde etkinleştirme)
Bu ayar hata ayıklama özelliğini denetler. Iisnode, node-inspector ile tümleşiktir. Bu ayarı etkinleştirerek düğüm uygulamanızın hata ayıklamasını etkinleştirirsiniz. Bu ayarı etkinleştiren iisnode, düğüm uygulamanıza yapılan ilk hata ayıklama isteğinde 'debuggerVirtualDir' dizininde düğüm denetçisi dosyaları oluşturur. öğesine bir istek göndererek düğüm denetçisini http://yoursite/server.js/debug
yükleyebilirsiniz. Hata ayıklama URL'si kesimini 'debuggerPathSegment' ayarıyla denetleyebilirsiniz. Varsayılan olarak debuggerPathSegment='debug'. Örneğin, başkaları tarafından bulunmasının daha zor olması için GUID olarak ayarlayabilirsiniz debuggerPathSegment
.
Hata ayıklama hakkında daha fazla bilgi için Windows'da Node.js uygulamalarında hata ayıklama makalesini okuyun.
Senaryolar ve öneriler/sorun giderme
Düğüm uygulamam aşırı giden çağrılar yapıyor
Birçok uygulama normal çalışmalarının bir parçası olarak giden bağlantılar kurmak isteyebilir. Örneğin bir istek geldiğinde, düğüm uygulamanız başka bir konumdaki REST API’yle iletişim kurmak ve isteği işlemek için bazı bilgiler almak isteyebilir. Http veya https çağrıları yaparken etkin tutma aracısını kullanmak isteyebilirsiniz. Bu giden çağrıları yaparken etkin tutma aracınız olarak agentkeepalive modülünü kullanabilirsiniz.
Agentkeepalive modülü yuvaların Azure webapp VM'nizde yeniden kullanılmasını sağlar. Her giden istekte yeni bir yuva oluşturmak, uygulamanıza ek yük getirir. Uygulamanızın giden istekler için yuvaları yeniden kullanabilmesi, uygulamanızın VM başına ayrılan maxSockets değerini aşmamasını sağlar. Azure Uygulaması Hizmeti'ne yönelik öneri, agentKeepAlive maxSockets değerini vm başına toplam (4 node.exe örneği * 32 maxSockets/instance) 128 yuvaya ayarlamaktır.
Örnek agentKeepALive yapılandırması:
let keepaliveAgent = new Agent({
maxSockets: 32,
maxFreeSockets: 10,
timeout: 60000,
freeSocketTimeout: 300000
});
Önemli
Bu örnekte, VM'nizde çalışan 4 node.exe olduğu varsayılır. VM'de farklı sayıda node.exe çalıştırıyorsanız maxSockets ayarını buna göre değiştirmeniz gerekir.
Düğüm uygulamam çok fazla CPU kullanıyor
Portalınızdaki Azure Uygulaması Hizmetinden yüksek cpu tüketimi hakkında bir öneri alabilirsiniz. Belirli ölçümleri izlemek için izleyiciler de ayarlayabilirsiniz. Azure portalı Panosu'nda CPU kullanımını denetlerken, en yüksek değerleri kaçırmamak için CPU için MAX değerlerini denetleyin. Uygulamanızın çok fazla CPU tüketeceğine inanıyorsanız ve nedenini açıklayamıyorsanız, öğrenmek için düğüm uygulamanızın profilini oluşturabilirsiniz.
V8-Profiler ile Azure Uygulaması Hizmetinde düğüm uygulamanızın profilini oluşturma
Örneğin, profili oluşturmak istediğiniz bir merhaba dünya uygulamanız olduğunu varsayalım:
const http = require('http');
function WriteConsoleLog() {
for(let i=0;i<99999;++i) {
console.log('hello world');
}
}
function HandleRequest() {
WriteConsoleLog();
}
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
HandleRequest();
res.end('Hello world!');
}).listen(process.env.PORT);
Hata Ayıklama Konsolu sitesine gidin https://yoursite.scm.azurewebsites.net/DebugConsole
Sitenize/wwwroot dizininize gidin. Aşağıdaki örnekte gösterildiği gibi bir komut istemi görürsünüz:
npm install v8-profiler
komutunu çalıştırın.
Bu komut v8 profil oluşturucusunu node_modules dizinine ve tüm bağımlılıklarına yükler. Şimdi uygulamanızın profilini görüntülemek için server.js dosyasını düzenleyin.
const http = require('http');
const profiler = require('v8-profiler');
const fs = require('fs');
function WriteConsoleLog() {
for(let i=0;i<99999;++i) {
console.log('hello world');
}
}
function HandleRequest() {
profiler.startProfiling('HandleRequest');
WriteConsoleLog();
fs.writeFileSync('profile.cpuprofile', JSON.stringify(profiler.stopProfiling('HandleRequest')));
}
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
HandleRequest();
res.end('Hello world!');
}).listen(process.env.PORT);
Yukarıdaki kod WriteConsoleLog işlevinin profilini oluşturur ve ardından profil çıkışını sitenizin wwwroot altındaki 'profile.cpuprofile' dosyasına yazar. Uygulamanıza bir istek gönderin. Siteniz wwwroot altında oluşturulmuş bir 'profile.cpuprofile' dosyası görürsünüz.
Bu dosyayı indirin ve Chrome F12 Araçları ile açın. Chrome'da F12 tuşuna basın, ardından Profiller sekmesini seçin. Yükle düğmesini seçin. İndirdiğiniz profile.cpuprofile dosyanızı seçin. Az önce yüklemiş olduğunuz profile tıklayın.
Zamanın %95'inin WriteConsoleLog işlevi tarafından tüketildiğini görebilirsiniz. Çıkışta soruna neden olan tam satır numaraları ve kaynak dosyaları da gösterilir.
Düğüm uygulamam çok fazla bellek tüketiyor
Uygulamanız çok fazla bellek kullanıyorsa portalda Azure Uygulaması Hizmeti'nden yüksek bellek tüketimiyle ilgili bir bildirim görürsünüz. Belirli ölçümleri izlemek için monitörler ayarlayabilirsiniz. Azure portalı Panosu'nda bellek kullanımını denetlerken en yüksek değerleri kaçırmamak için bellek için MAX değerlerini kontrol ettiğinizden emin olun.
Node.js için sızıntı algılama ve Yığın Farkı
Bellek sızıntılarını belirlemenize yardımcı olması için node-memwatch kullanabilirsiniz.
V8 profil oluşturucu gibi yükleyebilir memwatch
ve uygulamanızdaki bellek sızıntılarını belirlemek için yığınları yakalamak ve fark etmek için kodunuzu düzenleyebilirsiniz.
Node.exe'lerim rastgele öldürülüyor
node.exe dosyasının rastgele kapatılmasının birkaç nedeni vardır:
- Uygulamanız yakalanmamış özel durumlar atıyor – Oluşturulan özel durumla ilgili ayrıntılar için d:\home\LogFiles\Application\logging-errors.txt dosyasını denetleyin. Bu dosya, uygulamanızın hatalarını ayıklamaya ve düzeltmeye yardımcı olacak yığın izlemesine sahiptir.
- Uygulamanız çok fazla bellek tüketiyor ve bu da diğer işlemlerin başlatılmasını etkiliyor. Toplam VM belleği %100'e yakınsa node.exe'niz işlem yöneticisi tarafından sonlandırılabilir. İşlem yöneticisi bazı işlemleri sonlandırarak diğer işlemlerin bazı işler yapma şansına sahip olmasını sağlar. Bu sorunu çözmek için uygulamanızın bellek sızıntılarının profilini oluşturun. Uygulamanız için büyük miktarda bellek gerekiyorsa ölçeği daha büyük bir VM'ye yükseltin (bu da VM için kullanılabilir RAM'i artırır).
Düğüm uygulamam başlatılmıyor
Uygulamanız başlatıldığında 500 Hata döndüriyorsa, bunun birkaç nedeni olabilir:
- Node.exe doğru konumda yok. nodeProcessCommandLine ayarını denetleyin.
- Ana betik dosyası doğru konumda yok. web.config dosyasını denetleyin ve işleyiciler bölümündeki ana betik dosyasının adının ana betik dosyasıyla eşleştiğinden emin olun.
- Web.config yapılandırması doğru değil– ayarların adlarını/değerlerini denetleyin.
- Cold Start : Uygulamanızın başlatılması çok uzun sürüyor. Uygulamanız (maxNamedPipe Bağlan ionRetry * adlandırılmışPipe Bağlan ionRetryDelay) / 1000 saniyeden uzun sürüyorsa iisnode 500 hata döndürür. Iisnode'un zaman aşımına uğramasını ve 500 hatasını döndürmesini önlemek için bu ayarların değerlerini uygulamanızın başlangıç zamanıyla eşleşecek şekilde artırın.
Düğüm uygulamam kilitlendi
Uygulamanız yakalanmamış özel durumlar atıyor – Oluşan özel durumla ilgili ayrıntılar için dosyayı denetleyin d:\\home\\LogFiles\\Application\\logging-errors.txt
. Bu dosya, uygulamanızı tanılamaya ve düzeltmeye yardımcı olacak yığın izlemesine sahiptir.
Düğüm uygulamamın başlatılması çok uzun sürüyor (Soğuk Başlangıç)
Uzun uygulama başlangıç sürelerinin yaygın nedeni, node_modules çok sayıda dosyadır. Uygulama başlatılırken bu dosyaların çoğunu yüklemeye çalışır. Varsayılan olarak, dosyalarınız Azure Uygulaması Hizmeti'nin ağ paylaşımında depolandığından, birçok dosya yüklenmesi zaman alabilir. Bu işlemi daha hızlı hale getirmek için bazı çözümler şunlardır:
- node_modules yavaş yüklemeyi deneyin ve uygulama başlangıcında modüllerin tümünü yüklemeyin. Gecikmeli yükleme modülleri için, modül kodunun ilk yürütülmesinden önce işlevin içinde modüle gerçekten ihtiyacınız olduğunda require('module') çağrısı yapılmalıdır.
- Azure Uygulaması Hizmeti yerel önbellek adlı bir özellik sunar. Bu özellik, içeriğinizi ağ paylaşımından VM'nin yerel diskine kopyalar. Dosyalar yerel olduğundan, node_modules yükleme süresi çok daha hızlıdır.
IISNODE http durumu ve alt durumu
Kaynak dosya, cnodeconstants
iisnode'un bir hata nedeniyle döndürebileceği tüm olası durum/alt durum bileşimlerini listeler.
Uygulamanızın win32 hata kodunu görmesi için FREB'yi etkinleştirin (performans nedeniyle FREB'yi yalnızca üretim dışı sitelerde etkinleştirdiğinizden emin olun).
Http Durumu | Http Alt Durumu | Olası Sebep mi? |
---|---|---|
500 | 1000 | İstek IISNODE'a gönderilirken bir sorun oluştu – node.exe dosyasının başlatılıp başlatılmadığını denetleyin. Node.exe başlatılırken kilitlenmiş olabilir. Web.config yapılandırmanızda hatalar olup olmadığını denetleyin. |
500 | 1001 | - Win32Error 0x2 - Uygulama URL'ye yanıt vermiyor. URL yeniden yazma kurallarını denetleyin veya express uygulamanızda doğru yolların tanımlandığını denetleyin. - Win32Error 0x6d – adlandırılmış kanal meşgul – Node.exe, kanal meşgul olduğundan istekleri kabul ediyor. Yüksek cpu kullanımını denetleyin. - Diğer hatalar – node.exe dosyasının kilitlenip kilitlenmediğini denetleyin. |
500 | 1002 | Node.exe kilitlendi – yığın izlemesi için d:\home\LogFiles\logging-errors.txt dosyasını denetleyin. |
500 | 1003 | Kanal yapılandırması Sorunu – Adlandırılmış kanal yapılandırması yanlış. |
500 | 1004-1018 | İstek gönderilirken veya node.exe'ye/node.exe'den yanıt işlenirken bir hata oluştu. node.exe dosyasının kilitlenip kilitlenmediğini denetleyin. yığın izlemesi için d:\home\LogFiles\logging-errors.txt dosyasını denetleyin. |
503 | 1000 | Daha fazla adlandırılmış kanal bağlantısı ayırmak için yeterli bellek yok. Uygulamanızın neden bu kadar fazla bellek tüketiyor olduğunu denetleyin. maxConcurrentRequestsPerProcess ayar değerini denetleyin. Sonsuz değilse ve çok sayıda isteğiniz varsa, bu hatayı önlemek için bu değeri artırın. |
503 | 1001 | Uygulama geri dönüşümde olduğundan istek node.exe'ye gönderilemedi. Uygulama geri dönüştürüldikten sonra istekler normal şekilde sunulmalıdır. |
503 | 1002 | Gerçek nedenden dolayı win32 hata kodunu denetleyin – İstek bir node.exe'ye gönderilemedi. |
503 | 1003 | Adlandırılmış kanal çok Meşgul – node.exe dosyasının aşırı CPU tüketip kullanmadığını doğrulayın |
NODE.exe adlı bir ayara NODE_PENDING_PIPE_INSTANCES
sahiptir. Azure Uygulaması Hizmetinde bu değer 5000 olarak ayarlanır. Node.exe dosyasının adlandırılmış kanalda aynı anda 5000 isteği kabul edebildiği anlamına gelir. Bu değer, Azure Uygulaması Hizmetinde çalışan çoğu düğüm uygulaması için yeterli olmalıdır. Azure Uygulaması Hizmeti'nin yüksek değeri nedeniyle 503.1003'i görmemeniz gerekirNODE_PENDING_PIPE_INSTANCES
Diğer kaynaklar
Azure Uygulaması Service'te Node.js uygulamaları hakkında daha fazla bilgi edinmek için bu bağlantıları izleyin.
- Azure App Service’te Node.js web uygulamalarını kullanmaya başlama
- Azure Uygulama Hizmeti’ndeki bir Node.js web uygulamasına hata ayıklama
- Azure uygulamalarıyla Node.js Modüllerini kullanma
- Azure Uygulama Hizmeti Web Apps: Node.js
- Node.js Geliştirici Merkezi
- Süper Gizli Kudu Hata Ayıklama Konsolunu keşfetme