Problem z hostowaniem aplikacji ASP.NET Core w usłudze Apache.

0

Dzień dobry,
mam problem z hostowaniem aplikacji ASP.NET Core na Apache.
Utworzyłem serwis który pracuje sobie na porcie 5002. W tym przypadku gdy wpiszę adres IP 10.0.0.2:5002 to aplikacja uruchamia się bez problemu.
Teraz chciałem wszystko zaimplementować w Apache.
Dodałem na końcu konfiguracji Apache następującą linijkę kodu:

<VirtualHost *:9010>
 ServerName moja_domena.pl
 ProxyPreserveHost On
 RewriteEngine On
 ProxyPass / http://10.0.0.2:5002/
 ProxyPassReverse / http://10.0.0.2:5002/
 RewriteEngine on
 RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
 RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
 RewriteRule /(.*) ws://127.0.0.1:5000/$1 [P]
 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

następnie zresetowałem usługę apache za pomocą systemctl restart apache2.
teraz uruchamiam przeglądarkę i odpalam adres moja_domen.pl:9010 i niestety otrzymuje komunikat: ,,Przekroczono limit czasu połączenia",
Dodam że wpis z ViirtualHost został dodany na końcu innych usług WWW, które działają na poszczególnych portach, ale tamte aplikacje webowe zostały utworzone za pomocą Reacta. Apache pracuje na systemie Linux Rapsberry pi 3.
Wykonałem również polecenie sudo ufw allow 5002, w celu odblokowania portu 5002.
Wersja Apache Apache/2.4.54 (Raspbian)

1

Ale ASP NET nie da się hostować na Apache 🤔, wygląda na to, że się da. W tym przypadku chyba najlepiej sprawdzi się docker. Jeśli nie docker to Host ASP.NET Core on Linux with Nginx

PS.
Usuń jeśli masz

app.UseHttpsRedirection();

Albo wygeneruj SSLa do strony, bo chyba ci się apka próbuje przekierować na https, którego nie masz.

0

A dlaczego apache? To jest warunke konieczny?

1
<VirtualHost *:9010>

Twój Apache słucha na 9010? Domyślnie to port 80. O ile nie słucha na 9010 to nie wiem jakby to miało działać.

Request musi najpierw trafić do Apache żeby ten mógł coś z tym zrobić, tj. zrobić proxy tam gdzie chcesz.

0
not Michal napisał(a):
<VirtualHost *:9010>

Twój Apache słucha na 9010? Domyślnie to port 80. O ile nie słucha na 9010 to nie wiem jakby to miało działać.

Request musi najpierw trafić do Apache żeby ten mógł coś z tym zrobić, tj. zrobić proxy tam gdzie chcesz.

Tutaj mam konfiguracje innej aplikacji webowej, która uruchamia się dopiero jak wpisze adres moja_domena.pl:9001 i tutaj wszystko działa poprawnie. Mam jeszcze inną apkę która pracuje na innym porcie i tam również wszystko chodzi, więc mogę sobie na Apachu poustawiać aplikacje na danych portach :)

<VirtualHost *:9001>
  DocumentRoot /shares/webaplikacje/ksiegowosc
  ServerName moja_domena.pl
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/moja_domena.pl/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/moja_domena.pl/privkey.pem
  SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY13>
</VirtualHost>


0
AdamWox napisał(a):

Ale ASP NET nie da się hostować na Apache 🤔, wygląda na to, że się da. W tym przypadku chyba najlepiej sprawdzi się docker. Jeśli nie docker to Host ASP.NET Core on Linux with Nginx

PS.
Usuń jeśli masz

app.UseHttpsRedirection();

Albo wygeneruj SSLa do strony, bo chyba ci się apka próbuje przekierować na https, którego nie masz.

Ten wpis również próbowałem, ale niestety nie pomogło, jeszcze spróbuje taki myk z SSL, ponieważ nie chce specjalnie generować oddzielnego certyfikatu SSL, tylko chce wykorzystać ten co jest używany przez inne aplikacje pracujące na Apachu, tym bardziej że jest on zaufany.

<VirtualHost *:9010>
 ServerName moja_domena.pl
 ProxyPreserveHost On
 RewriteEngine On
 ProxyPass / https://10.0.0.2:5002/
 ProxyPassReverse / https://10.0.0.2:5002/
 RewriteEngine on
 RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
 RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/moja_domena.pl.net/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live//moja_domena.pl/privkey.pem
  SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY13>

</VirtualHost>
1
virusek391 napisał(a):
not Michal napisał(a):
<VirtualHost *:9010>

Twój Apache słucha na 9010? Domyślnie to port 80. O ile nie słucha na 9010 to nie wiem jakby to miało działać.

Request musi najpierw trafić do Apache żeby ten mógł coś z tym zrobić, tj. zrobić proxy tam gdzie chcesz.

Tutaj mam konfiguracje innej aplikacji webowej, która uruchamia się dopiero jak wpisze adres moja_domena.pl:9001 i tutaj wszystko działa poprawnie. Mam jeszcze inną apkę która pracuje na innym porcie i tam również wszystko chodzi, więc mogę sobie na Apachu poustawiać aplikacje na danych portach :)

<VirtualHost *:9001>
  DocumentRoot /shares/webaplikacje/ksiegowosc
  ServerName moja_domena.pl
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/moja_domena.pl/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/moja_domena.pl/privkey.pem
  SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY13>
</VirtualHost>


To można łatwo zweryfikować, sprawdź access logi Apache czy ten request jest obsłużony

0
virusek391 napisał(a):

Mam jeszcze inną apkę która pracuje na innym porcie i tam również wszystko chodzi, więc mogę sobie na Apachu poustawiać aplikacje na danych portach :)

Poustawiać na innych portach możesz, ale @not Michal zadał dobre pytanie - czy twója apache słucha na tych poustawianych portach, bo zgodnie z dokumentacją:

The use of <VirtualHost> does not affect what addresses Apache httpd listens on. You may need to ensure that Apache httpd is listening on the correct addresses using Listen.

1

Ok okazało się że zapomniałem dodać Listen 9010 w /etc/apache2/ports.conf.

0

Teraz pytanie jak podpiąć certyfikat SSL mojej domeny do aplikacji ASP.NET Core, ponieważ jak dodaje w virtualhost linijkę:

SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/moja_domena.pl/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/moja_domena.pl/privkey.pem
  SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY13>

to po wejściu na moja_domena.pl:9010 otrzymuje komunikat:

rnal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at [no address given] to inform them of the time this error occurred, and the actions you performed just before this error.

Oto zawartość pliku Program.cs

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();

var app = builder.Build();

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller}/{action=Index}/{id?}");

app.MapFallbackToFile("index.html"); ;

app.Run();


0

Jak już masz przed swoją apką Apache to proponuję skonfigurować Apache tak żeby on obsługiwał TLS (co wydaje się, że już masz) i przekierowywał do apki po HTTP.
Zazwyczaj nie ma sensu ubsługiwać HTTPS na dwóch poziomach (najpierw reverse proxy, a później apka).

0
some_ONE napisał(a):

Jak już masz przed swoją apką Apache to proponuję skonfigurować Apache tak żeby on obsługiwał TLS (co wydaje się, że już masz) i przekierowywał do apki po HTTP.
Zazwyczaj nie ma sensu ubsługiwać HTTPS na dwóch poziomach (najpierw reverse proxy, a później apka).

No właśnie myślałem że zrobiłem obsługę obsługę szyfrowania dla aplikacji ASP.NET Core przez Apache, ale jednak coś nie działa :(
Nastawiam się już aby dodać certyfikat do ASP.NET Core i wówczas powinno działać.

1

No według konfiguracji Apache, którą pokazywałeś, przekierowujesz na HTTPS do aplikacji ASP.NET Core.

3

Jak dla mnie to terminację TLS/SSL powinno się robić na reverse-proxy (Apache w twoim wypadku) - łatwiej tym zarządzać dla wielu aplikacji w ten sposób, więc wywaliłbym UseHttpsRedirection() i działał tylko na HTTP w komunikacji proxy-appka.

Natomiast przynajmniej w przypadku nginx komunikacja HTTPS do backendu (appki) wymaga dodatkowej konfiguracji, aby sprawdzało czy certyfikat jest poprawny, być może tutaj też.

(edit: SSLProxyEngine on i SSLProxyVerify none ewentualnie, patrz: https://serverfault.com/questions/964454/how-can-i-use-apache-as-a-reverse-proxy-for-https)

0
Ktos napisał(a):

Jak dla mnie to terminację TLS/SSL powinno się robić na reverse-proxy (Apache w twoim wypadku) - łatwiej tym zarządzać dla wielu aplikacji w ten sposób, więc wywaliłbym UseHttpsRedirection() i działał tylko na HTTP w komunikacji proxy-appka.

Natomiast przynajmniej w przypadku nginx komunikacja HTTPS do backendu (appki) wymaga dodatkowej konfiguracji, aby sprawdzało czy certyfikat jest poprawny, być może tutaj też.

(edit: SSLProxyEngine on i SSLProxyVerify none ewentualnie, patrz: https://serverfault.com/questions/964454/how-can-i-use-apache-as-a-reverse-proxy-for-https)

Wielkie dzięki, po twoich sugestiach trochę pobawiłem się i dopiero poniższy kod sprawił że teraz działa wszystko jak powinno:

<VirtualHost *:9010>
  ServerName moja_domena.pl
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/moja_domena.pl/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/moja_domena.pl/privkey.pem
  SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY13>
  <Location "/">
        ProxyPreserveHost On
        ProxyPass "http://localhost:9011/"
        ProxyPassReverse "http://localhost:9011/"
    </Location>

</VirtualHost>

0

Kurcze ciąg problemów dalszy. O ile lokalnie wszystko fajnie chodzi to jak wpisze adres moja_domena.pl:9010 po za moją siecią lokalną i chce coś pobrać z bazy to wyskakuje mi błąd:

Zablokowano żądanie do zasobu innego pochodzenia: zasady „Same Origin Policy” nie pozwalają wczytywać zdalnych zasobów z „https://10.0.0.2:5000/ksiegowosc/getallbills

Zawartość pliku Program.cs z mojego API ,które pracuje na porcie 5000

...
var  MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
builder.Services.AddCors(options =>
{
    options.AddPolicy(MyAllowSpecificOrigins, builder =>
        builder.AllowAnyOrigin()
            .AllowAnyHeader()
            .AllowAnyMethod());
});
var app = builder.Build();

app.UseCors(MyAllowSpecificOrigins);
app.UseSwaggerUI();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

1 użytkowników online, w tym zalogowanych: 0, gości: 1