#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 отсутствуют эти строки конфигурации