Hosting multiple ASP NET Core sites on unbuntu and nginx as reverse proxy Hosting multiple ASP NET Core sites on unbuntu and nginx as reverse proxy nginx nginx

Hosting multiple ASP NET Core sites on unbuntu and nginx as reverse proxy


I had a similar issue.

Each of your applications nginx config files should point to the correct port number that the .Net Core application is set to run on.

This is determined in each of your .Net Core applications program.cs in the .UseUrls() extension, e.g.

public static IWebHost CreateWebHostBuilder(string[] args) =>            WebHost.CreateDefaultBuilder(args)                .UseContentRoot(Directory.GetCurrentDirectory())                .UseUrls("http://0.0.0.0:2001")                .UseStartup<Startup>()                .Build();

Each application will need to have a different port number and have this reflected in its nginx config files, like so:

server {    listen        80;    server_name   domain;    location / {        proxy_pass         http://localhost:2001;        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;    }}

Hope this helps.


Individual ports on the server is the way to go, in ASP.NET Core 3.0 my program.cs looks like this:

public static IHostBuilder CreateHostBuilder(string[] args) =>        Host.CreateDefaultBuilder(args)            .ConfigureWebHostDefaults(webBuilder =>            {                webBuilder.ConfigureKestrel(serverOptions =>                {                    serverOptions.Listen(IPAddress.Loopback, 5100);                })                .UseStartup<Startup>();            });}


If you want to host two or more applications on one server
you need to configure nginx something like this:

cat /etc/nginx/conf.d/domain.conf

server {    listen        80;    server_name   domain;    location /prod {        rewrite            /prod(.*) $1 break;        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;    }    location /dev {        rewrite            /dev(.*) $1 break;        proxy_pass         http://localhost:5001;        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;    }}

The configuration of two .Net Core applications will look like:

cat /etc/systemd/system/example_prod.service

[Unit]Description=Example production on .Net Core[Service]WorkingDirectory=/var/www/exampleExecStart=/usr/bin/dotnet /var/www/example/example.dllRestart=always# Restart service after 10 seconds if the dotnet service crashes:RestartSec=10KillSignal=SIGINTSyslogIdentifier=example-productionEnvironment=ASPNETCORE_ENVIRONMENT=ProductionEnvironment=DOTNET_PRINT_TELEMETRY_MESSAGE=falseEnvironment=ASPNETCORE_URLS=http://localhost:5000[Install]WantedBy=multi-user.target

cat /etc/systemd/system/example_dev.service

[Unit]Description=Example development on .Net Core[Service]WorkingDirectory=/var/www/exampleExecStart=/usr/bin/dotnet /var/www/example/example.dllRestart=always# Restart service after 10 seconds if the dotnet service crashes:RestartSec=10KillSignal=SIGINTSyslogIdentifier=example-developmentEnvironment=ASPNETCORE_ENVIRONMENT=DevelopmentEnvironment=DOTNET_PRINT_TELEMETRY_MESSAGE=falseEnvironment=ASPNETCORE_URLS=http://localhost:5001[Install]WantedBy=multi-user.target

At the conclusion:
I launched two applications from one path: /var/www/example/example.dll
with different environments: Production and Development
on different ports: localhost:5000 and localhost:5001

And I confugured nginx to reverse proxy:

http://localhost:5000 => http://domain/prod/http://localhost:5001 => http://domain/dev/