@Vellis-msk

Как проксировать в ASP.NET core через nginx?

Добрый день.
Есть задача разместить на одном сервере Centos несколько web-сервисов ASP.NET Core.
Сами сервисы успешно созданы, и работают.
Пример конфигурации сервиса 1:
[Unit]
Description=Test service 1
[Service]
WorkingDirectory=/home/www/test1
ExecStart=/usr/bin/dotnet /home/www/test1/test1.dll--urls "http://*:5002"
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target

Конфигурация сервиса 2:
[Unit]
Description=Test service 2
[Service]
WorkingDirectory=/home/www/test2
ExecStart=/usr/bin/dotnet /home/www/test2/test2.dll--urls "http://*:5003"
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target

Всё здорово и замечательно, если обращаться к данным сервисам по примеру net-core.lan:5002 и net-core.lan:5003 - никаких проблем.
Однако, задача стоит таким образом, что необходимо для данного сервера опубликовать наружу 443 порт, прикрутить сертификат и проксировать обращения к сервисам через nginx.
Создаём конфигурацию nginx:
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/proxy.conf;
}

И в /etc/nginx/conf.d/ создаем наш произвольный конфиг для сервисов:
server {
    client_header_buffer_size 1k;
    large_client_header_buffers 2 1k;
    #Listening port:
    listen     80;
    listen     443 ssl;
    #Server names:
    server_name  domain.com;
    #SSL oprions:
    ssl_certificate /etc/ssl/domain_com.crt;
    ssl_certificate_key     /etc/ssl/private.key;
    #Locations config:
location /test1 {
    # redirect all HTTP traffic to localhost:5002
    proxy_pass http://127.0.0.1:5002;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # WebSocket support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
location /test2 {
    # redirect all HTTP traffic to localhost:5003
    proxy_pass http://127.0.0.1:5003;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # WebSocket support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
}

Тем самым, когда мы обращаемся к domain.com/test1 наш запрос должен идти на 127.0.0.1:5002 и обрабатываеться сервисом, но судя по логам nginx, запрос получается вида 127.0.0.1:5002/test и следовательно сервис не отрабатывает должным образом.
Что делаю не так?
  • Вопрос задан
  • 79 просмотров
Решения вопроса 1
@Wexter
location nginx прокидывает как есть, т.е если у вас location /test1, то и запросы туда приходить будут с url /test1.
Можете добавить rewrite чтобы он убирал из url ваш location, либо сделать 2 разных домена и проксировать напрямую location / на нужные сервисы.
rewrite будет что-то наподобии такого
rewrite ^/test1/(.*) /$1 break;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы