En servidores Linux, la arquitectura estándar consiste en ejecutar el servidor interno Kestrel escuchando en http://localhost:5000, administrado por el demonio del sistema systemd, mientras que Nginx actúa como proxy inverso en el puerto 80/443 para manejar el cifrado SSL/TLS, compresión y balanceo de carga.
1. Compilar tu Aplicación .NET en Release
En tu computadora de desarrollo, genera los binarios optimizados para Linux:
dotnet publish -c Release -o ./publish
Esto creará una carpeta ./publish que contiene tu archivo ejecutable MiApp.dll, las vistas Razor precompiladas y los assets estáticos de wwwroot.
2. Instalar ASP.NET Core Runtime en el Servidor VPS
Conéctate a tu servidor Linux (Ubuntu Server) por SSH e instala el paquete del runtime de .NET 8:
# Registrar el repositorio oficial de Microsoft en Ubuntu
sudo apt-get update && sudo apt-get install -y wget
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
# Instalar el runtime de ASP.NET Core
sudo apt-get update
sudo apt-get install -y aspnetcore-runtime-8.0
Verifica la instalación:
dotnet --info
3. Subir tu Aplicación al Directorio /var/www
Crea el directorio destino y copia tus archivos de publish:
sudo mkdir -p /var/www/miapp
# Copia los archivos usando SCP desde tu máquina local:
# scp -r ./publish/* root@TU_IP_PUBLICA:/var/www/miapp/
Otorga la propiedad al usuario web del sistema:
sudo chown -R www-data:www-data /var/www/miapp
sudo chmod -R 755 /var/www/miapp
4. Crear el Servicio systemd para Kestrel
Crea el archivo de servicio para que Linux ejecute tu aplicación de fondo y la reinicie ante cualquier fallo:
sudo nano /etc/systemd/system/kestrel-miapp.service
Pega la siguiente definición (ajusta el nombre del archivo DLL y el puerto si es necesario):
[Unit]
Description=Aplicacion ASP.NET Core en Planeta Nube
After=network.target
[Service]
WorkingDirectory=/var/www/miapp
ExecStart=/usr/bin/dotnet /var/www/miapp/MiApp.dll --urls "http://127.0.0.1:5000"
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-miapp
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE_TO_USER=false
[Install]
WantedBy=multi-user.target
Habilita e inicia el servicio en Linux:
sudo systemctl daemon-reload
sudo systemctl enable kestrel-miapp.service
sudo systemctl start kestrel-miapp.service
sudo systemctl status kestrel-miapp.service
5. Configurar Nginx como Reverse Proxy
Crea la configuración del sitio en Nginx:
sudo nano /etc/nginx/sites-available/miapp.conf
server {
listen 80;
server_name tu-dominio.com www.tu-dominio.com;
location / {
proxy_pass http://127.0.0.1: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;
}
}
Activa el sitio y recarga Nginx:
sudo ln -s /etc/nginx/sites-available/miapp.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
6. Certificado SSL Gratuito Let's Encrypt
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d tu-dominio.com -d www.tu-dominio.com
Errores Típicos en Despliegues de .NET
Para que ASP.NET Core reconozca correctamente las IPs reales de tus visitantes y el protocolo HTTPS cuando está detrás de Nginx, añade app.UseForwardedHeaders(); antes de cualquier otro middleware en tu Program.cs.
Guías Complementarias
- Cómo publicar una página web que tienes en localhost
- Servidores VPS para Desarrolladores en Planeta Nube
¿Buscas un VPS ideal para .NET y C#?
Nuestro plan VPS Plus (4 GB RAM / 2-4 vCPU) es la elección preferida de desarrolladores .NET para correr Kestrel, bases de datos PostgreSQL o SQL Server sin cuellos de botella.