Host ASP.NET Core Web API On Linux Azure VM

We will create a Virtual Machine in Azure using the Ubuntu Operating System.
 
Let's see the step by step implementation,
 

Steps

  1. Create ASP.NET Core Web API Application
  2. Publish Web API Application
  3. Create Virtual Machine in Azure
  4. Install .NET Core and Apache in Virtual Machine
  5. Host Web API Application in Virtual Machine

Create ASP.NET Web API Application

 
Create new project, select API as template and click on create button, which will create web API application with WeatherForcast Controller having get method.
 
Host ASP.NET Core Web API On Linux Azure VM 
 
Configure Swagger in AspnetCoreWebApi, so that we can see exposed method in UI.
 
In order to enable swagger, add the below nuget packages
  • AspNetCore
  • AspNetCore.Swagger
Add the below code in startup.cs under ConfigureServices method
  1. services.AddSwaggerGen(c =>  
  2.             {  
  3.                 c.SwaggerDoc("v1"new Microsoft.OpenApi.Models.OpenApiInfo { Title = "Aspnet Core Web Api", Version = "v1" });  
  4.                 var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";  
  5.                 var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);  
  6.                 c.IncludeXmlComments(xmlPath);  
  7.             });  
Add the below code in startup.cs under Configure method
  1. app.UseSwagger();  
  2.            app.UseSwaggerUI(c =>  
  3.            {  
  4.                c.SwaggerEndpoint("/swagger/v1/swagger.json""Aspnet Core Web Api");  
  5.                c.InjectJavascript("/swagger/custom.js");  
  6.   
  7.            });  
Create AspnetCoreWebApi.xml file with the below content:
  1. <?xml version="1.0"?>  
  2. <doc>  
  3. </doc>  
Copy AspnetCoreWebApi.xml to D:\AspnetCoreWebApi\AspnetCoreWebApi\bin\Debug\netcoreapp3.0
 
Now run the application and see the result in UI.
 
Host ASP.NET Core Web API On Linux Azure VM
 
Our application is running under localhost in our system.
 

Publish Web API Application

 
Right click on project and click on Publish
 
Click on Folder from left panel and select the path where you would like to save publish copy
 
Host ASP.NET Core Web API On Linux Azure VM 
 
Click on Advanced link, which will open below window
 
Select Release as Configuration, netcoreapp3.0 as Target Framework and Framework-Dependent as Deployment Mode
 
Select linux-x64 as Target Runtime, as we want to host our application in Linux environment
 
Click on Save button
 
Host ASP.NET Core Web API On Linux Azure VM 
 
Click on CreateProfile which will create a profile for us and will be useful for further releases
 
Click on Publish button which will publish our application and save in predefined path
 
Host ASP.NET Core Web API On Linux Azure VM 
 
Explore our selected path i.e. D:\AspnetCoreWebApi\AspnetCoreWebApi\bin\Release\netcoreapp3.0\publish and we can see the published data
 
Host ASP.NET Core Web API On Linux Azure VM 
 

Create Virtual Machine in Azure

 
Log into portal.azure.com and click on "Virtual machines".
 
Click on 'Add', which will open the "Create a virtual machine" wizard. 
 
Host ASP.NET Core Web API On Linux Azure VM 
  1. Select your Azure subscription. Duly note that all resources in an Azure subscription are billed together.
  2. Select existing or create a new resource group. It is a collection of resources that share the same lifecycle, permissions, and policies.
  3. Provide your virtual machine a name. For demo purpose, I have given it a name like 'AspNetCoreLinuxVM'.
  4. Select the region that is right for you and your customers. Not all VM sizes are available in all regions.
  5. Azure offers a range of options for managing the availability and resiliency of your application. We can select 'Availability Set' also but as of now, select 'No infrastructure redundancy required'.
  6. Choose the base operating system or application for your VM.
  7. Change the size as per your requirement and the price will be calculated accordingly.
  8. Provide Username and Password which will be used later on to connect your VM.
  9. Select SSH and HTTP as inbound ports
Host ASP.NET Core Web API On Linux Azure VM

Select your disk option.
  1. Premium SSD
    Offers high-performance, low-latency disk support for I/O-intensive applications and production workloads. 

  2. Standard SSD
    Cost effective storage option optimized for workloads that needs consistent performance at lower IOPS (Input/Output Operations Per Second) levels.

  3. Standard HDD
    For dev/test scenarios and less critical workloads at the lowest cost.
For best performance, reliability, scalability, and access control, it is recommended to select Managed Disk for most of the virtual machine configuration. Use unmanaged disks if you need to support certain classic scenarios or want to manage Disk VHDs in your own storage account.
 
Host ASP.NET Core Web API On Linux Azure VM 
 
Keep the networking option as it is and move to Management.
 
Host ASP.NET Core Web API On Linux Azure VM 
 
Boot the diagnostics capture serial console output and screenshots of the virtual machine running on a host to help diagnose startup issues.
 
OS guest diagnostics gets metrics every minute for our virtual machine. We can use them to create alerts and stay informed on our applications.
 
Metrics are written on a storage account.
 
If Identity is enabled, all necessary permissions can be granted via Azure Role-based access control.
 
Enable auto-shutdown configures our virtual machine to automatically shut down daily.
 
Provide the time when we want to shutdown VM
 
Provide the time zone in which shutdown time is given
 
Subscribe for notification before the VM is shutdown
 
To guard our VM against accidental deletion and corruption, enable backup.
 
Host ASP.NET Core Web API On Linux Azure VM 
 
Keep Advanced option as it is and move to the Tags
 
Host ASP.NET Core Web API On Linux Azure VM 
 
A tag is not required as of now. Skip this stage and move to Review + Create.
 
Host ASP.NET Core Web API On Linux Azure VM 
 
It will validate all the inputs and show the status message.
 
Click on the 'Create' button.
 
Host ASP.NET Core Web API On Linux Azure VM 
 
Once the VM is created, you will be able to see the deployment details as below.
 
Host ASP.NET Core Web API On Linux Azure VM 
 
Now, in the next step, let's try to connect our recently created VM. For this, we need a public IP Address and port.
 
Host ASP.NET Core Web API On Linux Azure VM 
 

Install .NET Core and Apache in Virtual Machine

 
Open command prompt to connect virtual machine
 
Execute below command with username and IpAddress
 
>ssh akshayblevel@13.82.17.110
 
It will ask for the password
 
>akshayblevel@13.82.17.110's password:************
 
Once it is connected, execute below command to point to the root
 
>akshayblevel@AspNetCoreLinuxVM:~$ sudo -i
root@AspNetCoreLinuxVM:~#
 
Execute below commands to register microsoftkey, product repository and required dependencies. Need to execute once per machine.
 
>wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
>sudo dpkg -i packages-microsoft-prod.deb
 
Execute below commands in sequence in order to install .Net Core SDK,
  • >sudo add-apt-repository universe
  • >sudo apt-get update
  • >sudo apt-get install apt-transport-https
  • >sudo apt-get update
  • >sudo apt-get install dotnet-sdk-3.1
Install Asp.Net Core runtime
 
>sudo apt-get install aspnetcore-runtime-3.1
 
Install .Net Core runtime
 
>sudo apt-get install dotnet-runtime-3.1
 
In order to expose our application to the internet, we need IIS, Nginx or Apache as reverse proxy server that will accept HTTP request and forwards to Kestrel.
 
Execute below command to install Apache
 
>sudo apt-get install apache2
 
Copy public ip and run in the browser, if apache is installed correctly then you can see the apache default page
 
Host ASP.NET Core Web API On Linux Azure VM 
 
Enable modproxy modules in Apache server to make it work as a reverse proxy.
 
First we need to restart apache
 
>systemctl restart apache2
 
Enable modproxy module
 
>a2enmod proxy proxy_http proxy_html
 

Host Web API Application in Virtual Machine

 
All the configuration files in Apache are stored at /etc/apache2/conf-enabled directory. We need to create .conf file for our application.
 
Execute below command to create conf file
 
>vi /etc/apache2/conf-enabled/aspnetcorewebapi.conf
 
Insert below text to add in the aspnetcorewebapi.conf
  1. <VirtualHost *:80>  
  2.    ProxyPreserveHost On  
  3.    ProxyPass / http://127.0.0.1:5000/  
  4.    ProxyPassReverse / http://127.0.0.1:5000/  
  5.    ErrorLog /var/log/apache2/aspnetcorewebapi-error.log  
  6.    CustomLog /var/log/apache2/aspnetcodewebapi-access.log common  
  7. </VirtualHost>  
Execute below command to save the file and return back to root
 
>:x
 
Let's verify whether file is saved correctly or not by executing below command
 
>cat /etc/apache2/conf-enabled/aspnetcorewebapi.conf
 
Restart apache
 
>systemctl restart apache2
 
Create directory where we can transfer our published files.
 
Go to var directory
 
cd /var/
 
Create WebApi directory
 
mkdir WebApi
 
Go inside WebApi directory
 
cd WebApi
 
Now we need to transfer our published files to WebApi directory on server, for that we can use filezilla or winscp software.
 
Install winscp from below link
 
https://winscp.net/eng/download.php
 
Connect to server using publicip, username and password. Once it is connected we can see the folder with name as username.
 
Drag and drop Publish folder from left panel to right panel i.e. on server
 
Host ASP.NET Core Web API On Linux Azure VM 
 
Explore publish folder from the right side and verify all the files are uploaded correctly.
 
Upload Transfer files including .xml into the same folder in order to support swagger.
 
Host ASP.NET Core Web API On Linux Azure VM 
 
Now all the files are uploaded on server, in the next step we need to move files from akshayblevel directory to WebApi Directory.
 
Go to the akshayblevel directory
 
>cd /home/akshayblevel
 
Verify if publish folder is there or not.
 
>Ls
 
Go inside publish folder.
 
>cd publish
 
Verify if all the files are there or not.
 
>Ls
 
Copy all the files from publish folder to WebApi folder.
 
>cp -R * /var/WebApi/
 
Go to WebApi folder.
 
>cd /var/WebApi
 
Verify if all the files are there or not.
 
>Ls
 
Restart apache service and server.
 
systemctl restart apache2 
sudo service apache2 restart
 
Create service file to start and monitor web app.
 
>vi /etc/systemd/system/kestrel-aspnetcorewebapi.service
 
Add the below content to the above service file, we need to provide working directory and which file should be executed.
  1. [Unit]  
  2. Description=Aspnet Core Web Api running on Ubuntu 18.04  
  3. [Service]  
  4. WorkingDirectory=/var/WebApi  
  5. ExecStart=/usr/bin/dotnet /var/WebApi/aspnetcorewebapi.dll  
  6. Restart=always  
  7. RestartSec=10  
  8. SyslogIdentifier=dotnet-demo  
  9. User=www-data  
  10. Environment=ASPNETCORE_ENVIRONMENT=Production  
  11. [Install]  
  12. WantedBy=multi-user.target  
Execute the below command to save the file and return back to root.
 
>:x
 
Enable and start recently created service.
  1. sudo systemctl enable kestrel-aspnetcorewebapi.service  
  2. sudo systemctl start kestrel-aspnetcorewebapi.service  
Now hosting is done, let's verify in the browser using public ip and we can see that our Asp.Net Core Web Application is successfully running in Linux environment.
 
Host ASP.NET Core Web API On Linux Azure VM