Come già introdotto nell'articolo precedente, ASP.NET Core è un framework di sviluppo multipiattaforma che consente la progettazione di applicazioni Web in modo indipendente dalla piattaforma utilizzata. Garantendo la compatibilità su diversi sistemi operativi come Windows, Mac e Linux.
In questa lezione ci occuperemo di installare e configurare ASP.NET Core su Linux, dato che l'hosting di applicazioni Web su ambienti Linux è diventato sempre più popolare grazie alla sua flessibilità e ai costi ridotti rispetto all'hosting su Windows.
In questa lezione vedremo come predisporre un ambiente Web per ospitare applicazioni ASP.NET Core su Debian con server Nginx. Verrà spiegato come installare Nginx, configurarlo per ospitare le applicazioni ASP.NET Core e verranno forniti tutti i passaggi necessari per la sua configurazione come reverse proxy.
Installazione .NET su Debian
.NET è disponibile nei repository ufficiali dei pacchetti per le varie distribuzioni Linux, come:
Per installare .NET su Debian tramite apt
, è sufficiente eseguire alcuni comandi. Prima di installare .NET, è necessario aggiungere la chiave di firma del pacchetto Microsoft alla lista delle chiavi attendibili e aggiungere il repository del pacchetto. Apriamo un terminale su Debian e scriviamo:
wget https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
A questo punto, quello che dobbiamo fare è installare l'SDK .NET. L'SDK .NET (Software Development Kit) è uno strumento di sviluppo software che consente di creare applicazioni per la piattaforma .NET. Il kit include una serie di strumenti, librerie e framework necessari per sviluppare, compilare e distribuire applicazioni .NET. L'SDK .NET offre una vasta gamma di funzionalità, tra cui la possibilità di creare applicazioni Desktop, Web e mobile. Inoltre, il kit supporta molti linguaggi di programmazione, come C#, F# e Visual Basic. L'SDK .NET è disponibile gratuitamente ed è supportato da Microsoft, il che significa che gli sviluppatori possono contare su un'ampia documentazione, una vasta comunità di sviluppatori e un'assistenza tecnica di altissima qualità. Per installare l'SDK scriviamo nel terminale:
sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-7.0
Installiamo anche il runtime ASP.NET Core, che permette di eseguire le applicazioni create con .NET che non hanno incluso il runtime. Per installare il runtime ASP.NET Core, scriviamo:
sudo apt-get update && \
sudo apt-get install -y aspnetcore-runtime-7.0
Il runtime ASP.NET Core include sia il runtime di .NET che quello di ASP.NET Core. A questo punto, per verificare che tutte le installazioni siano andate a buon fine, possiamo adoperare i seguenti comandi e controllare le versioni di quanto installato:
dotnet --list-sdks
dotnet --list-runtime
Installazione Nginx
Nginx è un server Web open source leggero, ad alte prestazioni e altamente scalabile, utilizzato per gestire il traffico Internet e le richieste HTTP in modo efficiente. Uno dei suoi utilizzi più comuni è come reverse proxy, ovvero come livello intermedio tra un client e un server, in modo da migliorare la disponibilità, la sicurezza e le prestazioni dei siti Web. Un reverse proxy può anche essere utilizzato per nascondere l'infrastruttura su cui si basa un sito Internet, proteggendo i server backend da eventuali attacchi esterni.
Per installare Nginx su Debian ci serviamo del comando apt-get
. L'installazione genera uno script di init di systemd che lancia Nginx come daemon all'avvio del nostro sistema:
sudo -s
nginx=stable
add-apt-repository ppa:nginx/$nginx
apt-get update
apt-get install nginx
Dato che Nginx è stato installato per la prima volta, dobbiamo avviarlo eseguendo il comando:
sudo service nginx start
Per verificare che tutto sia andato per il meglio, possiamo verificare se il browser raggiunge la pagina di default di Nginx. La pagina è raggiungibile all'indirizzo http://<server_IP_address>/index.nginx-debian.html
, dove al posto di <server_IP_address>
dobbiamo inserire l'indirizzo IP del nostro hosting.
Configurazione Nginx come reverse proxy
Il server Web sviluppato da Microsoft e incluso nella piattaforma .NET Core. Chiamato Kestrel è stato progettato per servire applicazioni ASP.NET Core e per supportare la gestione di connessioni HTTP/2 e WebSocket. Kestrel è leggero e veloce, e può essere utilizzato da solo o come parte di una configurazione più complessa che prevede l'uso di un reverse proxy come Nginx o Apache. Kestrel non è progettato per gestire tutte le funzionalità di un server Web completo come Nginx o Apache, che offrono una vasta gamma di funzionalità avanzate come il caching, la compressione delle risorse, la gestione degli accessi, la sicurezza, la gestione del carico, e altro ancora. Un reverse proxy come Nginx o Apache può essere utilizzato, quindi, per offrire queste funzionalità, alleggerendo il lavoro del server Kestrel e può risiedere su una macchina dedicata o essere distribuito insieme a un server HTTP. In questa guida useremo Nginx come reverse proxy, in modo che si occupi di inoltrare le richieste alla nostra App ASP.NET Core.
Per configurare Nginx come reverse proxy è sufficiente modificare il file /etc/nginx/sites-available/default
. Apriamo il file con un editor di testo e sostituiamo il suo contenuto con quanto segue:
server {
listen 80;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Una volta stabilita la configurazione di Nginx, dobbiamo eseguire sudo nginx -t
per verificare la sintassi dei file di configurazione. Se il test del file di configurazione è completato con successo, forzeremo Nginx a prendere le modifiche eseguendo sudo nginx -s reload
.
sudo nginx -t
sudo nginx -s reload
HelloWorld in ASP .NET Core
Per creare un progetto in ASP .NET Core, chiamato MyWebApp
, possiamo utilizzare il comando dotnet publish
. Esso viene adoperato per pubblicare l'applicazione in un formato che può essere distribuito e installato in un ambiente di produzione ed esegue una serie di attività, tra cui la compilazione del codice sorgente, la creazione dei file binari e la pubblicazione di questi file in una directory di output, che specifichiamo con il parametro -o
, seguito dal nome della cartella. Scrivendo:
dotnet publish -o MyWebApp
genereremo la nostra applicazione in una forma pronta per la distribuzione.
Eseguire l'App come service
Dopo avere creato la nostra prima applicazione, per poterla raggiungere tramite Internet bisogna configurarla come servizio Linux. Eseguire un'applicazione come servizio su Linux significa che l'applicazione viene avviata automaticamente durante l'avvio del sistema operativo e viene eseguita come un processo di sistema. Ciò garantisce che l'applicazione rimanga in esecuzione anche se l'utente che ha eseguito l'accesso alla macchina si disconnette o chiude la sessione.
Creando un file di servizio systemd per un'applicazione, si può configurare il sistema operativo in modo da avviare l'applicazione come un servizio e gestire automaticamente il suo avvio e la sua esecuzione come processo di sistema. Ciò semplifica notevolmente la gestione dell'applicazione e garantisce che sia sempre in esecuzione, anche dopo il riavvio del sistema operativo. Per fare ciò, creiamo un file all'interno di /etc/systemd/system/
, chiamato my-web-api.service
.
sudo nano /etc/systemd/system/my-web-api.service
All'interno di my-web-api.service
, scriviamo la seguente configurazione:
[Unit]
Description=My first .NET Core application on Debian
[Service]
WorkingDirectory=/home/debian/Desktop/Vito/MyWebApp/
ExecStart=/usr/bin/dotnet /home/home/debian/Desktop/Vito/MyWebApp/bin/Debug/net7.0/MyWebApp.dll
Restart=always
RestartSec=10 # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=offershare-web-app
Environment=ASPNETCORE_ENVIRONMENT=Development
[Install]
WantedBy=multi-user.target
Come possiamo vedere, il file contiene tre sezioni, "Unit", "Service" e "Install". La sezione "Unit" descrive l'unità del servizio e contiene una descrizione del servizio. La sezione "Service" specifica come il servizio deve essere eseguito. "WorkingDirectory" specifica la directory dove si trova il servizio da avviare e gestire. "ExecStart" specifica il comando per avviare il servizio, in questo caso il comando per eseguire l'applicazione .NET Core è specificata dalla DLL MyWebApp.dll
. "Restart" specifica che il servizio deve essere riavviato in caso di crash e "RestartSec" specifica il tempo di attesa (in secondi) prima di riavviare il servizio. "SyslogIdentifier" specifica l'identificatore del servizio per il registro di sistema e "Environment" le variabili di ambiente per il servizio. Infine, la sezione "Install" specifica quando il servizio deve essere installato. In questo caso, il servizio deve essere installato quando il sistema operativo è in esecuzione in multi-user.target mode
.
Così facendo, insieme alla configurazione del server Nginx come reverse proxy, siamo in grado di poter raggiungere la nostra applicazione tramite l'indirizzo del nostro spazio Web.
Conclusioni
In questa lezione abbiamo installato il framework .NET Core su un sistema Debian e, successivamente, abbiamo installato e configurato il server Web Nginx come reverse proxy. La configurazione di Nginx come reverse proxy è necessaria per indirizzare le richieste dell'utente al server ASP.NET Core in esecuzione. Infine, per testare il funzionamento dell'ambiente di sviluppo abbiamo creato un'applicazione di prova e l'abbiamo registrata come un servizio per garantire che venga eseguita in modo affidabile e continuo.
Questi passaggi rappresentano le fasi necessarie per sviluppare e pubblicare un'applicazione Web in ASP.NET Core su ambiente Linux, e costituiscono una buona base per continuare ad approfondire lo sviluppo di applicazioni più complesse. Nelle prossime lezioni ci addentreremo maggiormente nello studio di ASP.NET Core.