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.
İ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"
az group create ile bir Azure kaynak grubu oluşturun. adını
rg-demo-vm-eastus
kullanın:az group create \ --location eastus \ --name rg-demo-vm-eastus
Azure CLI ile Azure İzleyici kaynağı oluşturma
Application Insights uzantısını Azure CLI'ya yükleyin.
az extension add -n application-insights
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
Çıktıdaki Sonucu kopyalayın; bu değere
instrumentationKey
daha sonra ihtiyacınız olacaktır.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.
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
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
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
İşlem birkaç dakika sürebilirken bekleyin.
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.
İşlem, SSH anahtarlarını ve yanıtta belirtilen bir konumda oluşturdu.
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
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
publicIpAddress
kullanacak şekilde değiştirin.http://YOUR-VM-PUBLIC-IP-ADDRESS
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.
Sanal makinenin web uygulaması aşağıdaki bilgileri döndürür:
- VM adı
- İstemci IP'niz
- Geçerli Tarih/Saat
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
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.
Bağlanmak istediğinizden emin olup olmadığınız sorulursa, yanıtlayın
y
veyayes
devam edin.Sanal makinede nerede olduğunuzu anlamak için aşağıdaki komutu kullanın. Azureuser kökünde olmanız gerekir:
/home/azureuser
.pwd
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:
Web uygulamanız alt dizinindedir
myapp
. Dizininemyapp
geçin ve içeriği listeleyin:cd myapp && ls -l
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
Sanal makinenize bağlı olan SSH terminalinde Application Insights için Azure SDK istemci kitaplığını yükleyin.
sudo npm install --save applicationinsights
Devam etmeden önce komut tamamlanana kadar bekleyin.
İzleme izleme anahtarı ekleme
Sanal makinenize bağlı olan SSH terminalinde Nano düzenleyicisini kullanarak dosyayı açın
package.json
.sudo nano package.json
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ştirinREPLACE-WITH-YOUR-KEY
."start": "APPINSIGHTS_INSTRUMENTATIONKEY=REPLACE-WITH-YOUR-KEY pm2 start index.js --watch --log /var/log/pm2.log"
SSH terminalinde, dosyayı X denetimiyle + Nano düzenleyicisine kaydedin.
Nano düzenleyicide istenirse, kaydetmek için Y girin.
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.
Node.js uygulamaları için üretim süreci yöneticisi olan PM2'yi aşağıdaki komutlarla durdurun:
sudo npm run-script stop
Application Insights kullanarak özgün
index.js
öğesini dosyayla değiştirin.sudo npm run-script appinsights
İ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()}`) })
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
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 |
- 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
- 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 |
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
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
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.json durdurun ve başlatın. |