Я запускаю приложение Blazor Server в течение нескольких лет. Это довольно маленький и простой сервис, который я и мои друзья используют. Он имеет обратный прокси-сервер Nginx и использует Certbot для автоматического выдачи и обновления сертификатов Let's Encrypt.
public class NotificationHub : Hub
{
public const string HubUrl = "/notifications";
public const string InviteCreatedMethod = "InviteCreated";
public const string InviteAcceptedMethod = "InviteAccepted";
private static readonly ILogger Log = Serilog.Log.ForContext();
public override Task OnConnectedAsync()
{
Log.Debug("{ConnectionId} connected", Context.ConnectionId);
return base.OnConnectedAsync();
}
public override async Task OnDisconnectedAsync(Exception? e)
{
Log.Debug(e, "{ConnectionId} disconnected", Context.ConnectionId);
await base.OnDisconnectedAsync(e);
}
}
public interface INotificationClient
{
Task InviteCreated(InviteCreatedNotification notification);
Task InviteAccepted(InviteAcceptedNotification notification);
}
< /code>
на странице.@implements IAsyncDisposable
@code {
private HubConnection _hubConnection;
public async ValueTask DisposeAsync()
{
Log.Debug("Page {Page} disposing", nameof(Home));
await _hubConnection.DisposeAsync();
}
protected override async Task OnInitializedAsync()
{
Log.Debug("Page {Page} initialized", nameof(Home));
_hubConnection = new HubConnectionBuilder()
.WithUrl(NavigationManager.ToAbsoluteUri(NotificationHub.HubUrl))
.Build();
_hubConnection.On(NotificationHub.InviteCreatedMethod, HandleInviteCreated);
_hubConnection.On(NotificationHub.InviteAcceptedMethod, HandleInviteAccepted);
await _hubConnection.StartAsync();
}
private void HandleInviteCreated(InviteCreatedNotification notification)
{
Log.Debug("{Notification} received", nameof(InviteCreatedNotification));
}
private void HandleInviteAccepted(InviteAcceptedNotification notification)
{
Log.Debug("{Notification} received", nameof(InviteAcceptedNotification));
}
}
< /code>
То, что происходит при размещении за nginx, так это то, что браузер загрузится в течение длительного времени, пока не будет снят с 504. Журналы для ASP.NET выглядит так же, будто запросы обрабатываются нормально.[14:09:11 INF] Request starting HTTP/2 POST https://localhost:7108/notifications/negotiate?negotiateVersion=1 - null 0
[14:09:11 INF] Executing endpoint '/notifications/negotiate'
< /code>
При запуске в производстве я не вижу никаких журналов, которые содержит /notifications
.
образного /> Когда Nginx Times Out, это то, что регистрируется: < /p>
2024/12/18 15:10:36 [error] 39#39: *1 upstream timed out (110: Operation timed out) while reading response header from upstream, client: [client public IP], server: example.com, request: "GET / HTTP/1.1", upstream: "http://172.19.0.7:5000/", host: "www.example.com"
< /code>
Когда изначально получен запрос, журналы для asp.net содержит следующее: < /p>
[15:09:36 INF] Request starting HTTP/1.1 GET http://www.example.com/ - null null
[15:09:36 INF] Executed DbCommand (2ms) [Parameters=[@__p_0='?' (DbType = Int64)], CommandType='Text', CommandTimeout='30']
SELECT a."Id", a."AccessFailedCount", a."ConcurrencyStamp", a."Email", a."EmailConfirmed", a."LockoutEnabled", a."LockoutEnd", a."NormalizedEmail", a."NormalizedUserName", a."PasswordHash", a."PhoneNumber", a."PhoneNumberConfirmed", a."SecurityStamp", a."TwoFactorEnabled", a."UserName"
FROM "AspNetUsers" AS a
WHERE a."Id" = @__p_0
LIMIT 1
[15:09:36 INF] Executed DbCommand (1ms) [Parameters=[@__user_Id_0='?' (DbType = Int64)], CommandType='Text', CommandTimeout='30']
SELECT a."Id", a."ClaimType", a."ClaimValue", a."UserId"
FROM "AspNetUserClaims" AS a
WHERE a."UserId" = @__user_Id_0
[15:09:36 INF] Executing endpoint '/ (/)'
[15:09:36 DBG] Adding entry for 18b0d7e3-dde7-45b6-875b-efb27271616c/MudBlazor.MudPopoverProvider. 1 total observers after add.
[15:09:36 DBG] Updating entry for 18b0d7e3-dde7-45b6-875b-efb27271616c/MudBlazor.MudPopoverProvider. 1 total observers.
[15:09:36 DBG] Page Home initialized
< /code>
Подключение концентратора Ранее подробное находится на странице Home. < /p>
Что я пробовал: < /p>
[list]
[*] Обновить конфигурацию Nginx в соответствии с рекомендациями Microsoft для использования Nginx вместе с Asp.net. < /li>
< /ol>
map $http_connection $connection_upgrade {
"~*Upgrade" $http_connection;
default keep-alive;
}
location / {
proxy_pass http://docker-service-name:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
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;
}
< /code>
Явно настройка местоположения для URL Hub, как предложено в ответе здесь, SO. Я добавил его как второе место после существующего "/".
[/list]
location /notifications {
proxy_pass http://docker-service-name:5000;
# Configure WebSockets
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_cache_bypass $http_upgrade;
# Configure ServerSentEvents
proxy_buffering off;
# Configure LongPolling
proxy_read_timeout 100s;
proxy_set_header Host $host;
}
< /code>
Обновить конфигурацию Nginx в соответствии с рекомендациями Microsoft для использования Nginx вместе с Signalr. < /li>
< /ol>
server {
listen 443 ssl;
server_name example.com *.example.com;
server_tokens off;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://docker-service-name:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
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 /notifications {
proxy_pass http://docker-service-name:5000;
# Configuration for WebSockets
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_cache off;
proxy_http_version 1.1;
# Configuration for ServerSentEvents
proxy_buffering off;
# Configuration for LongPolling or if your KeepAliveInterval is longer than 60 seconds
proxy_read_timeout 100s;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Все эти попытки приводят к тому же поведению, выходящему при попытке просмотреть любую страницу, которая пытается установить подключение концентратора.>
Я запускаю приложение Blazor Server в течение нескольких лет. Это довольно маленький и простой сервис, который я и мои друзья используют. Он имеет обратный прокси-сервер Nginx и использует Certbot для автоматического выдачи и обновления сертификатов Let's Encrypt.[code]server { listen 80; server_name example.com *.example.com; server_tokens off;
app.MapHub(NotificationHub.HubUrl); [/code] У меня есть один концентратор с именем notificationHub с указанным URL Hub /Notifications. [code]public class NotificationHub : Hub { public const string HubUrl = "/notifications";
public const string InviteCreatedMethod = "InviteCreated"; public const string InviteAcceptedMethod = "InviteAccepted";
private void HandleInviteAccepted(InviteAcceptedNotification notification) { Log.Debug("{Notification} received", nameof(InviteAcceptedNotification)); } } < /code> То, что происходит при размещении за nginx, так это то, что браузер загрузится в течение длительного времени, пока не будет снят с 504. Журналы для ASP.NET выглядит так же, будто запросы обрабатываются нормально.[14:09:11 INF] Request starting HTTP/2 POST https://localhost:7108/notifications/negotiate?negotiateVersion=1 - null 0 [14:09:11 INF] Executing endpoint '/notifications/negotiate' < /code> При запуске в производстве я не вижу никаких журналов, которые содержит /notifications[/code]. образного /> Когда Nginx Times Out, это то, что регистрируется: < /p> [code]2024/12/18 15:10:36 [error] 39#39: *1 upstream timed out (110: Operation timed out) while reading response header from upstream, client: [client public IP], server: example.com, request: "GET / HTTP/1.1", upstream: "http://172.19.0.7:5000/", host: "www.example.com" < /code> Когда изначально получен запрос, журналы для asp.net содержит следующее: < /p> [15:09:36 INF] Request starting HTTP/1.1 GET http://www.example.com/ - null null [15:09:36 INF] Executed DbCommand (2ms) [Parameters=[@__p_0='?' (DbType = Int64)], CommandType='Text', CommandTimeout='30'] SELECT a."Id", a."AccessFailedCount", a."ConcurrencyStamp", a."Email", a."EmailConfirmed", a."LockoutEnabled", a."LockoutEnd", a."NormalizedEmail", a."NormalizedUserName", a."PasswordHash", a."PhoneNumber", a."PhoneNumberConfirmed", a."SecurityStamp", a."TwoFactorEnabled", a."UserName" FROM "AspNetUsers" AS a WHERE a."Id" = @__p_0 LIMIT 1 [15:09:36 INF] Executed DbCommand (1ms) [Parameters=[@__user_Id_0='?' (DbType = Int64)], CommandType='Text', CommandTimeout='30'] SELECT a."Id", a."ClaimType", a."ClaimValue", a."UserId" FROM "AspNetUserClaims" AS a WHERE a."UserId" = @__user_Id_0 [15:09:36 INF] Executing endpoint '/ (/)' [15:09:36 DBG] Adding entry for 18b0d7e3-dde7-45b6-875b-efb27271616c/MudBlazor.MudPopoverProvider. 1 total observers after add. [15:09:36 DBG] Updating entry for 18b0d7e3-dde7-45b6-875b-efb27271616c/MudBlazor.MudPopoverProvider. 1 total observers. [15:09:36 DBG] Page Home initialized < /code> Подключение концентратора Ранее подробное находится на странице Home. < /p> Что я пробовал: < /p> [list] [*] Обновить конфигурацию Nginx в соответствии с рекомендациями Microsoft для использования Nginx вместе с Asp.net. < /li> < /ol>
Явно настройка местоположения для URL Hub, как предложено в ответе здесь, SO. Я добавил его как второе место после существующего "/". [/list] location /notifications { proxy_pass http://docker-service-name:5000;
Обновить конфигурацию Nginx в соответствии с рекомендациями Microsoft для использования Nginx вместе с Signalr. < /li> < /ol> server { listen 443 ssl; server_name example.com *.example.com; server_tokens off;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# Configuration for ServerSentEvents proxy_buffering off;
# Configuration for LongPolling or if your KeepAliveInterval is longer than 60 seconds proxy_read_timeout 100s;
proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } [/code] Все эти попытки приводят к тому же поведению, выходящему при попытке просмотреть любую страницу, которая пытается установить подключение концентратора.>
Я использую серверное приложение Blazor уже несколько лет. Это довольно небольшой и простой сервис, которым пользуемся я и мои друзья. Он имеет обратный прокси-сервер nginx перед Kestrel и использует certbot для автоматической выдачи и обновления...
Я в процессе добавления аутентификации Google в веб -приложение .NET 8 за nginx Reverse Proxy. У меня есть сертификат Let's Encrypt для HTTPS, он завершается на прокси и трафик между приложением, а прокси -сервера является простым HTTP. Я знаю, что...
Я в процессе добавления аутентификации Google в веб -приложение .NET 8 за nginx Reverse Proxy. У меня есть сертификат Let's Encrypt для HTTPS, он завершается на прокси и трафик между приложением, а прокси -сервера является простым HTTP. Я знаю, что...
Я разработал веб-приложение на основе Plotly's Dash на Python.
App1: аутентификация, обеспечивает аутентификацию и регистрацию пользователей.
App2: Quickbio — приложение для обработка биологических данных.
Каждое приложение представляет собой...
Я использую docker-compose.yaml для определения сервисов, необходимых мне для локальной разработки . Недавно я добавил новую Traefik службу, чтобы воспользоваться возможностями Службы разрешения доменных имен , которые предлагает Traefik.
Типичное...