Tutorial passo-passo su come fare hosting di un sito web in ASP.NET su un sistema Linux con Apache.
Prerequisiti
- Il tuo utente ha privilegi sudo
- Hai installato Apache
Installiamo dotnet
Installiamo dotnet seguendo la pagina ufficiale microsoft.
Iniziamo scaricando l’installer per l’ASP.NET Core Runtime.
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
sudo apt-get update
Grazie a questi 4 comandi, possiamo usare apt per installare i pacchetti necessari.
Procediamo ad installare l’SDK e il runtime per .NET 7.0:
sudo apt-get install -y dotnet-sdk-7.0
sudo apt-get install -y aspnetcore-runtime-7.0
Creiamo un nuovo progetto
Creiamo un nuovo progetto dotnet in una cartella dell’utente, ad esempio /home/timothy/myNewApp
cd /home/timothy
mkdir myNewApp
cd myNewApp
All’interno di questa cartella andremo a creare un nuovo progetto asp.net:
dotnet new webapp
Con questo semplice comando abbiamo creato un nuovo sito web in dotnet. Puoi vederne il contenuto usando il comando dir.

Adesso puoi già attivare il tuo sito con il comando dotnet run. Puoi anche specificare un url da cui accedere al tuo sito se non vuoi localhost. Per questo tutorial sto usando una macchina virtuale, quindi userò il parametro url come ip della macchina:
dotnet run --urls=http://192.168.1.68:5000/
Apri un browser e visita l’indirizzo 192.168.1.68:5000 e vedrai il nostro nuovo sito web:

Pubblichiamo il sito
Adesso siamo pronti per creare i file di pubblicazione del nostro sito. Si tratta di un semplice comando:
dotnet publish --configuration Release
Adesso troviamo i nostri file in /home/timothy/myNewApp/bin/Release/net7.0/publish.
Configuriamo Apache
Adesso andiamo a modificare le impostazioni del vhost principale di Apache. Andremo a configurare un proxy che “gira” le richieste della porta 80 di Apache alla porta 5000 di dotnet. Iniziamo abilitando i moduli necessari:
sudo a2enmod headers
sudo a2enmod proxy
sudo a2enmod proxy_http
Modifichiamo quindi il file /etc/apache2/sites-available/000-default.conf e impostiamo il contenuto:
<VirtualHost *:*>
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
ServerName 192.168.1.68
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
Crea le cartelle per ospitare il progetto /var/www/myNewApp/public_html e riavvia apache:
sudo systemctl restart apache2
Connettendoti al web server dal browser dovresti adesso ricevere un errore 503 di Service Unavailable. Questo è perché apache sta tentando di comunicare con il servizio dotnet sulla porta 5000 che ancora non abbiamo attivato.
Copiamo il contenuto di /home/timothy/myNewApp/bin/Release/net7.0/publish in /var/www/myNewApp/public_html
sudo rsync -r /home/timothy/myNewApp/bin/Release/net7.0/publish/* /var/www/myNewApp/public_html
Configuriamo il servizio dotnet
Per creare il nuovo servizio, creiamo un nuovo file in /etc/systemd/system contenente i comandi del servizio, ed eseguiamolo.
cd /etc/systemd/system
sudo nano kestrel-myNewApp.service
E in questo nuovo file inseriamo queste istruzioni (in grassetto ciò che devi modificare):
[Unit]
Description=.NET Core App running on ${distribution}
[Service]
WorkingDirectory=/var/www/myNewApp/public_html
ExecStart=/usr/bin/dotnet /var/www/myNewApp/public_html/myNewApp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-myNewApp-app
User=timothy
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
E verifichiamo l’esito con il comando sudo systemctl status kestrel-myNewApp che dovrebbe essere Loaded e Inactive. Procediamo quindi ad abilitare il servizio:
sudo systemctl enable kestrel-myNewApp
sudo systemctl restart kestrel-myNewApp
E verifica lo stato con il comando sudo systemctl status kestrel-myNewApp. Potrebbe volerci circa un minuto prima che il servizio si sia effettivamente attivato.
Completato
Adesso il tuo server apache su debian 11 sta ospitando un sito web asp.net
Consiglio questa ottima guida su Youtube: https://youtu.be/mBhT_MRwGYE. Si tratta di un video vecchio, del 2019, alcune cose sono cambiate e per questo le ho corrette in questo tutorial aggiornato al 2023. Ma la base rimane valida.