Simple Web App Needs Hosting? Create App Service

Published on:

CloudTrips needs to publish a simple web application without creating or maintaining a VM. Azure App Service manages the operating system, web server, runtime, patching, and application endpoint while you deploy the code.

An App Service plan supplies the compute resources and pricing tier. A web app contains the application settings, deployments, and hostname. Multiple compatible web apps can share one plan and its resources.

Create the Web App

Search for App Services, select Create > Web App, and enter:

Subscription: CloudTrips TEST
Resource group: rg-cloudtrips-appservice-test-weu
Name: app-cloudtrips-web-dmytro-test-weu
Publish: Code
Runtime stack: Node 24 LTS
Operating System: Linux
Region: West Europe
Linux Plan: Create new
Plan name: asp-cloudtrips-web-test-weu
Pricing plan: Free F1
Zone redundancy: Disabled

The app name must be globally unique because it becomes part of the public hostname. If the proposed name is unavailable, append a short unique suffix and use that same name in every later command.

Select Review + create > Create, then open the resource.

Create Web App Basics tab showing the Node 24 LTS Linux app and Free F1 App Service plan

Understand the Default Page

On Overview, select Default domain. The initial App Service page proves that the platform and public HTTPS endpoint work, but your application code has not been deployed yet.

The Free F1 tier is suitable for this lab, not production: it uses shared compute, has quotas, cannot scale out, and does not provide an availability SLA.

App Service overview showing the running web app and its default azurewebsites.net domain

Create and Deploy a Small Node.js App

On your Mac, create a local application folder:

mkdir -p cloudtrips-appservice
cd cloudtrips-appservice

Create package.json:

{
  "name": "cloudtrips-appservice",
  "version": "1.0.0",
  "scripts": {
    "start": "node server.js"
  }
}

Create server.js:

const http = require('http');

const port = process.env.PORT || 8080;

http.createServer((request, response) => {
  response.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
  response.end(`
    <h1>CloudTrips App Service</h1>
    <p>Hosted without managing a virtual machine.</p>
  `);
}).listen(port);

App Service supplies the PORT environment variable. The application must listen on that port so the platform can route incoming requests to it.

Package the files at the root of the ZIP archive and deploy them:

zip cloudtrips-web.zip package.json server.js

az webapp deploy \
  --resource-group rg-cloudtrips-appservice-test-weu \
  --name app-cloudtrips-web-dmytro-test-weu \
  --src-path cloudtrips-web.zip \
  --type zip

ZIP deployment extracts the files into the app’s content directory and restarts the app. App Service then runs the npm start script.

Verify the App

Retrieve the hostname and test it:

APP_HOST=$(az webapp show \
  --resource-group rg-cloudtrips-appservice-test-weu \
  --name app-cloudtrips-web-dmytro-test-weu \
  --query defaultHostName \
  --output tsv)

curl --fail "https://${APP_HOST}"

Expected content includes:

CloudTrips App Service
Hosted without managing a virtual machine.

Refresh the Default domain in a browser to see the same page.

Browser showing the deployed CloudTrips App Service page on the public default domain

Continue to Scaling

Keep rg-cloudtrips-appservice-test-weu. The next trip uses the same web app and App Service plan to demonstrate scale up and scale out, then removes all resources.