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/debugyü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:

Screenshot that shows your site/wwwroot directory and command prompt.

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.

Screenshot that shows the profile.cpuprofile file.

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.

Screenshot that shows the profile.cpuprofile file that you loaded.

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:

  1. 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.
  2. 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:

  1. Node.exe doğru konumda yok. nodeProcessCommandLine ayarını denetleyin.
  2. 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.
  3. Web.config yapılandırması doğru değil– ayarların adlarını/değerlerini denetleyin.
  4. 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:

  1. 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.
  2. 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, cnodeconstantsiisnode'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_INSTANCESsahiptir. 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.