Aracılığıyla paylaş


Azure CLI kullanarak Express.js sanal makine oluşturma

Bu öğreticide, bir Express.js uygulaması için bir Linux sanal makinesi (VM) oluşturun. VM bir cloud-init yapılandırma dosyasıyla yapılandırılır ve bir Express.js uygulaması için NGINX ve GitHub deposu içerir. SSH ile VM'ye bağlanın, web uygulamasını izleme günlüğünü içerecek şekilde değiştirin ve genel Express.js sunucu uygulamasını bir web tarayıcısında görüntüleyin.

Bu öğretici aşağıdaki görevleri içerir:

  • Azure CLI ile Azure'da oturum açma
  • Azure CLI ile Azure Linux VM kaynağı oluşturma
    • Ortak bağlantı noktası 80'i açın
    • GitHub deposundan tanıtım Express.js web uygulaması yükleme
    • Web uygulaması bağımlılıklarını yükleme
    • Web uygulamasını başlatma
  • Azure CLI ile Azure İzleme kaynağı oluşturma
    • SSH ile VM'ye bağlanma
    • npm ile Azure SDK istemci kitaplığını yükleme
    • Özel izleme oluşturmak için Application Insights istemci kitaplığı kodu ekleme
  • Web uygulamasını tarayıcıdan görüntüleme
    • /trace Application Insights günlüğünde özel izleme oluşturmak için istek yolu
    • Azure CLI ile günlükte toplanan izlemelerin sayısını görüntüleme
    • Azure portalı ile izlemelerin listesini görüntüleme
  • Azure CLI ile kaynakları kaldırma

Önkoşullar

  • Azure kullanıcı hesabı ve aboneliği: Ücretsiz abonelik oluşturun.
  • VM'ye bağlanmak için SSH: Azure Cloud Shell'i veya SSH içeren bash kabuğu gibi modern bir terminali kullanın.
  • Azure Cloud Shell'de Bash ortamını kullanın. Daha fazla bilgi için bkz . Azure Cloud Shell'de Bash için hızlı başlangıç.

  • CLI başvuru komutlarını yerel olarak çalıştırmayı tercih ediyorsanız Azure CLI'yı yükleyin . Windows veya macOS üzerinde çalışıyorsanız Azure CLI’yi bir Docker kapsayıcısında çalıştırmayı değerlendirin. Daha fazla bilgi için bkz . Docker kapsayıcısında Azure CLI'yi çalıştırma.

    • Yerel yükleme kullanıyorsanız az login komutunu kullanarak Azure CLI ile oturum açın. Kimlik doğrulama işlemini tamamlamak için terminalinizde görüntülenen adımları izleyin. Diğer oturum açma seçenekleri için bkz . Azure CLI ile oturum açma.

    • İstendiğinde, ilk kullanımda Azure CLI uzantısını yükleyin. Uzantılar hakkında daha fazla bilgi için bkz. Azure CLI ile uzantıları kullanma.

    • Yüklü sürümü ve bağımlı kitaplıkları bulmak için az version komutunu çalıştırın. En son sürüme yükseltmek için az upgrade komutunu çalıştırın.

1. Web sayfaları için Application Insights kaynağı oluşturma

Web uygulamanızın günlük dosyalarını Azure buluta toplamak için tüm Azure kaynaklarınız için bir Azure kaynak grubu ve bir İzleyici kaynağı oluşturun. Kaynak grubu oluşturmak, kaynakları kolayca bulmanıza ve işiniz bittiğinde silmenize olanak tanır. Azure İzleyici, Azure hizmetinin adı, Application Insights ise öğreticinin kullandığı istemci kitaplığının adıdır.

  1. İsteğe bağlı olarak, birden fazla aboneliğiniz varsa, kalan komutları tamamlamadan önce varsayılan aboneliği ayarlamak için az account set komutunu kullanın.

    az account set \
        --subscription "ACCOUNT NAME OR ID" 
    
  2. az group create ile bir Azure kaynak grubu oluşturun. adını rg-demo-vm-eastuskullanın:

    az group create \
        --location eastus \
        --name rg-demo-vm-eastus 
    

Azure CLI ile Azure İzleyici kaynağı oluşturma

  1. Application Insights uzantısını Azure CLI'ya yükleyin.

    az extension add -n application-insights
    
  2. az monitor app-insights component create ile bir izleme kaynağı oluşturmak için aşağıdaki komutu kullanın:

    az monitor app-insights component create \
      --app demoWebAppMonitor \
      --location eastus \
      --resource-group rg-demo-vm-eastus \
      --query instrumentationKey --output table
    
  3. Çıktıdaki Sonucu kopyalayın; bu değere instrumentationKey daha sonra ihtiyacınız olacaktır.

  4. Terminali açık bırakın, sonraki adımda kullanacaksınız.

2. Azure CLI kullanarak Linux sanal makinesi oluşturma

Hem NGINX ters proxy sunucusunu hem de Express.js sunucusunu oluşturmak için bir cloud-init yapılandırma dosyası kullanır. NGINX, Express.js bağlantı noktasını (3000) genel bağlantı noktasına (80) iletmek için kullanılır.

  1. adlı cloud-init-github.txt bir yerel dosya oluşturun ve aşağıdaki içeriği dosyaya kaydedin veya deponun dosyasını yerel bilgisayarınıza kaydedebilirsiniz. Cloud-init biçimli dosyanın Azure CLI komutlarınızın terminal yolu ile aynı klasörde bulunması gerekir.

    #cloud-config
    package_upgrade: true
    packages:
      - nginx
    write_files:
      - owner: www-data:www-data
        path: /etc/nginx/sites-available/default
        content: |
          server {
            listen 80 default_server;
            server_name _;
            location / {
              # First, try if the file exists locally, otherwise request it from the app
              try_files $uri @app;
            }
            location @app {
              proxy_pass http://localhost:3000;
              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection 'upgrade';
              proxy_set_header X-Forwarded-For $remote_addr;
              proxy_set_header Host $host;
              proxy_cache_bypass $http_upgrade;
            }
          }
    runcmd:
      # install Node.js
      - 'curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -'
      - 'sudo apt-get install -y nodejs'
      # clone GitHub Repo into myapp directory
      - 'cd /home/azureuser'
      - git clone "https://github.com/Azure-Samples/js-e2e-vm" myapp
      # Start app
      - 'cd myapp && npm install && npm start'
      # restart NGINX
      - systemctl restart nginx
    
  2. runcmd Ne yaptığını anlamak için dosyanın bölümünü gözden geçirin.

    çeşitli runcmd görevlere sahiptir:

    • Node.js indirin ve yükleyin
    • Örnek Express.js deposunu GitHub'dan dizine myapp kopyalama
    • Uygulama bağımlılıklarını yükleme
    • PM2 ile Express.js uygulamasını başlatma

Sanal makine kaynağı oluşturma

  1. Linux sanal makinesinin Azure kaynağını oluşturmak için terminalde az vm create adlı Azure CLI komutunu girin. komutu, cloud-init dosyasından VM'yi oluşturur ve sizin için SSH anahtarlarını oluşturur. Çalışan komut anahtarların depolandığı yeri görüntüler.

    az vm create \
      --resource-group rg-demo-vm-eastus \
      --name demo-vm \
      --location eastus \
      --public-ip-sku Standard \
      --image UbuntuLTS \
      --admin-username azureuser \
      --generate-ssh-keys \
      --custom-data cloud-init-github.txt
    
  2. İşlem birkaç dakika sürebilirken bekleyin.

  3. publicIpAddress değerini yanıttan koruyun; web uygulamasını tarayıcıda görüntülemek ve VM'ye bağlanmak için gereklidir. Bu IP'yi kaybederseniz, yeniden almak için az vm list-ip-addresss azure CLI komutunu kullanın.

  4. İşlem, SSH anahtarlarını ve yanıtta belirtilen bir konumda oluşturdu.

  5. Bu konuma gidin ve dosyayı oluşturun authorized_keys :

    cd <SSH-KEY-LOCATION> && cat id_rsa >> authorized_keys
    

Sanal makine için bağlantı noktasını açma

İlk oluşturulduğunda sanal makinenin açık bağlantı noktası yoktur . Web uygulamasının genel kullanıma sunulması için aşağıdaki Azure CLI komutuyla 80 numaralı bağlantı noktasını açın: az vm open-port :

az vm open-port \
  --port 80 \
  --resource-group rg-demo-vm-eastus \
  --name demo-vm

Web sitesine göz atın

  1. Sanal makinenin kullanılabilir ve çalışır durumda olduğundan emin olmak için web tarayıcısında genel IP adresini kullanın. URL'yi değerini publicIpAddresskullanacak şekilde değiştirin.

    http://YOUR-VM-PUBLIC-IP-ADDRESS
    
  2. Kaynak bir ağ geçidi hatasıyla başarısız olursa, bir dakika içinde yeniden deneyin; web uygulamasının başlatılması bir dakika sürebilir.

  3. Sanal makinenin web uygulaması aşağıdaki bilgileri döndürür:

    • VM adı
    • İstemci IP'niz
    • Geçerli Tarih/Saat

    Azure'da Linus sanal makinesinden sunulan basit uygulamayı gösteren web tarayıcısının ekran görüntüsü.

  4. Web uygulamasının ilk kod dosyasının, NGINX ara sunucusu üzerinden geçen tek bir yolu vardır.

    const os = require('os');
    const express = require('express')
    const app = express()
    
    app.use('/public', express.static('public'))
    app.get('/', function (req, res) {
    
        const clientIP = req.headers['x-forwarded-for'];
        const msg = `HostName: ${os.hostname()}<br>ClientIP: ${clientIP}<br>DateTime: ${new Date()}<br><img width='200' height='200' src='/public/leaves.jpg' alt='flowers'>`
        console.log(msg)
    
        res.send(msg)
    })
    app.listen(3000, function () {
        console.log(`Hello world app listening on port 3000! ${Date.now()}`)
    })
    

3. SSH kullanarak Linux sanal makinesine bağlanma

Öğreticinin bu bölümünde, sanal makinenize bağlanmak için bir terminalde SSH kullanın. SSH , Azure Cloud Shell dahil olmak üzere birçok modern kabukla sağlanan yaygın bir araçtır.

SSH ile bağlanma ve web uygulamasını değiştirme

  1. Aşağıdaki komutla uzak sanal makinenize bağlanın.

    değerini kendi sanal makinenizin genel IP'siyle değiştirin YOUR-VM-PUBLIC-IP .

    ssh azureuser@YOUR-VM-PUBLIC-IP
    

    Bu işlem, SSH istemcinizin VM oluşturma işleminizin bir parçası olarak oluşturulan ve yerel makinenize yerleştirilen SSH anahtarlarınızı bulabileceğini varsayar.

  2. Bağlanmak istediğinizden emin olup olmadığınız sorulursa, yanıtlayın y veya yes devam edin.

  3. Sanal makinede nerede olduğunuzu anlamak için aşağıdaki komutu kullanın. Azureuser kökünde olmanız gerekir: /home/azureuser.

    pwd
    
  4. Bağlantı tamamlandığında, terminal istemi uzak sanal makinenin kullanıcı adını ve kaynak adını gösterecek şekilde değiştirilmelidir.

    azureuser@demo-vm:
    
  5. Web uygulamanız alt dizinindedir myapp. Dizinine myapp geçin ve içeriği listeleyin:

    cd myapp && ls -l
    
  6. GitHub deposunu temsil eden içeriklerin sanal makineye ve npm paket dosyalarına kopyalanmış olduğunu görmeniz gerekir:

    -rw-r--r--   1 root root   891 Nov 11 20:23 cloud-init-github.txt
    -rw-r--r--   1 root root  1347 Nov 11 20:23 index-logging.js
    -rw-r--r--   1 root root   282 Nov 11 20:23 index.js
    drwxr-xr-x 190 root root  4096 Nov 11 20:23 node_modules
    -rw-r--r--   1 root root 84115 Nov 11 20:23 package-lock.json
    -rw-r--r--   1 root root   329 Nov 11 20:23 package.json
    -rw-r--r--   1 root root   697 Nov 11 20:23 readme.md
    

İzleme SDK'sını yükleme

  1. Sanal makinenize bağlı olan SSH terminalinde Application Insights için Azure SDK istemci kitaplığını yükleyin.

    sudo npm install --save applicationinsights
    
  2. Devam etmeden önce komut tamamlanana kadar bekleyin.

İzleme izleme anahtarı ekleme

  1. Sanal makinenize bağlı olan SSH terminalinde Nano düzenleyicisini kullanarak dosyayı açınpackage.json.

    sudo nano package.json
    
  2. Başlangıç betiğinizin başına bir APPINSIGHTS_INSTRUMENTATIONKEY ortam değişkeni ekleyin. Aşağıdaki örnekte değerini izleme anahtarı değerinizle değiştirin REPLACE-WITH-YOUR-KEY .

    "start": "APPINSIGHTS_INSTRUMENTATIONKEY=REPLACE-WITH-YOUR-KEY pm2 start index.js --watch --log /var/log/pm2.log"
    
  3. SSH terminalinde, dosyayı X denetimiyle + Nano düzenleyicisine kaydedin.

  4. Nano düzenleyicide istenirse, kaydetmek için Y girin.

  5. Nano düzenleyicide istenirse, istendiğinde dosya adını kabul edin.

Uygulamayı değiştirmek için VM'yi durdurma

Azure istemci kitaplığı artık node_modules dizininizdedir ve anahtar uygulamaya ortam değişkeni olarak geçirilir. Sonraki adımda program aracılığıyla Application Insights kullanılır.

  1. Node.js uygulamaları için üretim süreci yöneticisi olan PM2'yi aşağıdaki komutlarla durdurun:

    sudo npm run-script stop 
    
  2. Application Insights kullanarak özgün index.js öğesini dosyayla değiştirin.

    sudo npm run-script appinsights
    
  3. İstemci kitaplığı ve günlük kodu sizin için sağlanır.

    const express = require('express')
    const app = express()
    const os = require('os');
    
    console.log(JSON.stringify(process.env));
    
    const AppInsights = require('applicationinsights');
    
    if (process.env.APPINSIGHTS_INSTRUMENTATIONKEY) {
        console.log(`AppInsights configured with key ${process.env.APPINSIGHTS_INSTRUMENTATIONKEY}`);
    } else{
        console.log(`AppInsights not configured`);
    }
    
    AppInsights.setup(process.env.APPINSIGHTS_INSTRUMENTATIONKEY)
        .setAutoDependencyCorrelation(true)
        .setAutoCollectRequests(true)
        .setAutoCollectPerformance(true, true)
        .setAutoCollectExceptions(true)
        .setAutoCollectDependencies(true)
        .setAutoCollectConsole(true)
        .setUseDiskRetryCaching(true)
        .setSendLiveMetrics(false)
        .setDistributedTracingMode(AppInsights.DistributedTracingModes.AI)
        .start();
    
    const AppInsightsClient = AppInsights.defaultClient;
    
    
    app.get('/trace', (req, res) => {
    
        const clientIP = req.headers['x-forwarded-for'];
        const msg = `trace route ${os.hostname()} ${clientIP} ${new Date()}`;
    
        console.log(msg)
    
        if (process.env.APPINSIGHTS_INSTRUMENTATIONKEY) {
            AppInsightsClient.trackPageView();
            AppInsightsClient.trackTrace({ message: msg })
            AppInsightsClient.flush();
        } else {
            msg += ' AppInsights not configured';
        }
    
        res.send(`${msg}`)
    })
    
    app.get('/', function (req, res) {
    
        const clientIP = req.headers['x-forwarded-for'];
        const msg = `root route ${os.hostname()} ${clientIP} ${new Date()}`
    
        console.log(msg)
    
        res.send(msg)
    
    })
    app.listen(3000, function () {
        console.log(`Hello world app listening on port 3000! ${os.hostname()}`)
    })
    
  4. Sonraki ortam değişkenini almak için uygulamayı PM2 ile yeniden başlatın.

    sudo npm start
    

Günlüğe kaydetmeyi doğrulamak için uygulamayı kullanma

  1. Web tarayıcısında uygulamayı yeni trace yol ile test edin:

    http://YOUR-VM-PUBLIC-IP-ADDRESS/trace
    

    Tarayıcı yanıtı trace route demo-vm YOUR-CLIENT-IP VM-DATE-TIME IP adresinizle birlikte görüntüler.

NGINX günlüğünü görüntüleme

Sanal makine (VM), görüntülenebilir NGINX günlüklerini toplar.

Hizmet Günlük konumu
NGINX /var/log/nginx/access.log
  1. Yine SSH terminalinde, günlüğü görüntülemek için aşağıdaki komutla NGINX proxy hizmetinin VM günlüğünü görüntüleyin:
cat /var/log/nginx/access.log
  1. Günlük, yerel bilgisayarınızdan gelen çağrıyı içerir.
"GET /trace HTTP/1.1" 200 10 "-"

PM2 günlüğünü görüntüleme

Sanal makine, görüntülenebilir pm2 için günlükleri toplar.

Hizmet Günlük konumu
PM2 /var/log/pm2.log
  1. Express.js Node web uygulamanız olan PM2 hizmetinin VM günlüğünü görüntüleyin. Aynı bash kabuğunda, günlüğü görüntülemek için aşağıdaki komutu kullanın:

    cat /var/log/pm2.log
    
  2. Günlük, yerel bilgisayarınızdan gelen çağrıyı içerir.

    grep "Hello world app listening on port 3000!" /var/log/pm2.log
    
  3. Günlük, npm başlangıç betiğinde geçirilen ApplicationInsights anahtarınız da dahil olmak üzere ortam değişkenlerinizi de içerir. anahtarınızın ortam değişkenlerinde olduğunu doğrulamak için aşağıdaki grep komutunu kullanın.

    grep APPINSIGHTS_INSTRUMENTATIONKEY /var/log/pm2.log
    

    Bu, PM2 günlüğünüzü APPINSIGHTS_INSTRUMENTATIONKEY farklı bir renkte vurgulanmış olarak görüntüler.

VM günlüğü ve bulut günlüğü

Bu uygulamada, kullanarak console.log iletileri yalnızca VM'de bulunan PM2 günlüklerine yazar. Günlükleri veya VM'yi silerseniz, bu bilgileri kaybedersiniz.

Günlükleri sanal makinenizin kullanım ömrü dışında tutmak istiyorsanız Application Insights'ı kullanın.

5. Kaynakları temizleme

Bu öğreticiyi tamamladıktan sonra, daha fazla kullanım için faturalandırılmadığınızdan emin olmak için tüm kaynaklarını içeren kaynak grubunu kaldırmanız gerekir.

Aynı terminalde az group delete azure CLI komutunu kullanarak kaynak grubunu silin:

az group delete --name rg-demo-vm-eastus -y

Bu komut birkaç dakika sürer.

Sorun giderme

Sorun yaşıyorsanız sorununuzu nasıl çözeceğinizi anlamak için aşağıdaki tabloyu kullanın:

Sorun Çözüm
502 Ağ Geçidi hatası Bu, index.js veya package.js dosyanızda hata olduğunu gösterebilir. Daha fazla bilgi için pm2 günlüklerinizi adresinde /var/log/pm2.log görüntüleyin. En son hata, dosyanın en altındadır. Bu dosyaların doğru olduğundan eminseniz, içindeki npm betiklerini kullanarak PM2'yi package.jsondurdurun ve başlatın.

Örnek kod

Sonraki adımlar