Nginx и Certbot не будут перенаправлять на 443, только порт 5001 в aspnet core и kestrel

#nginx #asp.net-core #certbot

#nginx #asp.net-core #certbot

Вопрос:

Я пытаюсь развернуть сайт aspnet core 2.2 со следующей настройкой, но при вводе URL somesite.co.uk он перенаправляет на порт 5001, а не на 443. Кто-нибудь может определить, что я делаю неправильно?

При вводе somesite.co.uk в браузере он перенаправляет на https://somesite.co.uk:5001

C #-Program

 public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();
}
  

C # — appsettings.json

 {
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://0.0.0.0:5000"
      },
      "Https": {
        "Url": "https://0.0.0.0:5001"
      }
    }
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}
  

Linux — /etc/systemd/system/kestrel-somesite.service

 [Service]
WorkingDirectory=/usr/share/nginx/html
ExecStart=/usr/bin/dotnet /usr/share/nginx/html/somesite.dll
Restart=always
RestartSec=10
SyslogIdentifier=dotnet-coretest
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
Environment=ASPNETCORE_HTTPS_PORT=5001
Environment=ASPNETCORE_URLS=http://*:5000;https://*:5001

[Install]
WantedBy=multi-user.target
  

Linux — /etc/nginx/sites-доступен/first.conf

 server {

    server_name somesite.co.uk;
    root /usr/share/nginx/html;

        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;
        }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/somesite.co.uk/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/somesite.co.uk/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}server {
    if ($host = somesite.co.uk) {
        return 301 https://$server_name$request_uri;
    } # managed by Certbot


    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    server_name somesite.co.uk;
    return 404; # managed by Certbot

}
  

Комментарии:

1. я не думаю, что вам нужно указывать настройки kestrel в appsettings.json и последние две строки среды в файле service. попробуйте сначала удалить их, перезагрузите nginx и перезапустите службу. Также, если вы используете certbot и nginx, как вы это делаете, вы можете удалить вызов app.UseHttpRedirection() в startup.cs, поскольку он не нужен, если вы этого еще не сделали (некоторые люди специально также перенаправляют на порт для https при запуске, так что это также не требуется). Но вы не забыли использовать app.UseForwaredHeaders при запуске?

2. @JohanHerstad Спасибо. App.UseForwaredHeaders исправил это. Я использовал app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto} ); . Если вы добавите это в качестве ответа, я приму.

Ответ №1:

Но вы не забыли использовать app.UseForwaredHeaders при запуске?

 app.UseForwardedHeaders(new ForwardedHeadersOptions
{
   ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
  

Обычно вам не нужно указывать порты в файле службы (последние две строки среды).
Я рекомендую также ознакомиться с документами в linode для nginx, они полезны в дополнение к официальным документам на сайте Microsoft.

Комментарии:

1. Спасибо. Я пытался развернуть новый шаблон mvc dotnet в digitalocean через nginx, и это было то, чего мне не хватало. В шаблоне mvc отсутствуют эти строки конфигурации