Hosten von ASP.NET Core unter Linux mit NginxHost ASP.NET Core on Linux with Nginx
Von Sourabh ShirhattiBy Sourabh Shirhatti
In diesem Leitfaden wird das Einrichten einer produktionsbereiten ASP.NET Core-Umgebung auf einem Ubuntu 16.04-Server erläutert.This guide explains setting up a production-ready ASP.NET Core environment on an Ubuntu 16.04 server. Diese Anweisungen sind wahrscheinlich auf neuere Versionen von Ubuntu anwendbar, sie wurden jedoch noch nicht mit neueren Versionen getestet.These instructions likely work with newer versions of Ubuntu, but the instructions haven't been tested with newer versions.
Weitere Informationen zu anderen Linux-Distributionen, die von ASP.NET Core unterstützt werden, finden Sie unter Voraussetzungen für .NET Core unter Linux.For information on other Linux distributions supported by ASP.NET Core, see Prerequisites for .NET Core on Linux.
Hinweis
Für Ubuntu 14.04 wird supervisord
für die Überwachung des Kestrel-Prozesses empfohlen.For Ubuntu 14.04, supervisord
is recommended as a solution for monitoring the Kestrel process. systemd
ist unter Ubuntu 14.04 nicht verfügbar.systemd
isn't available on Ubuntu 14.04. Anweisungen zu Ubuntu 14.04 finden Sie in der vorherigen Version dieses Themas.For Ubuntu 14.04 instructions, see the previous version of this topic.
In diesem Leitfaden:This guide:
- Wird eine bestehende ASP.NET Core-App hinter einem Reverseproxyserver eingefügt.Places an existing ASP.NET Core app behind a reverse proxy server.
- Wird der Reverseproxyserver eingerichtet, um Anforderungen an den Kestrel-Webserver weiterzuleiten.Sets up the reverse proxy server to forward requests to the Kestrel web server.
- Wird sichergestellt, dass die Web-App beim Start als Daemon ausgeführt wird.Ensures the web app runs on startup as a daemon.
- Wird ein Prozessverwaltungstool konfiguriert, das die Web-App beim Neustarten unterstützt.Configures a process management tool to help restart the web app.
VoraussetzungenPrerequisites
- Greifen Sie auf einen Ubuntu 16.04-Server mit einem Standardbenutzerkonto mit sudo-Berechtigung zu.Access to an Ubuntu 16.04 server with a standard user account with sudo privilege.
- Installieren Sie die .NET Core-Runtime auf dem Server.Install the .NET Core runtime on the server.
- Besuchen Sie die .NET Core-Downloadseite.Visit the Download .NET Core page.
- Wählen Sie die neueste Version von .NET Core aus, die keine Vorschauversion ist.Select the latest non-preview .NET Core version.
- Laden Sie die neueste Runtime aus der Tabelle unter Run apps - Runtime (App-Ausführung – Runtime) herunter, bei der es sich nicht um eine Vorschauversion handelt.Download the latest non-preview runtime in the table under Run apps - Runtime.
- Klicken Sie auf den Link zu den Anweisungen zum Linux-Paket-Manager, und führen Sie die Ubuntu-Anweisungen zu Ihrer Version von Ubuntu aus.Select the Linux Package manager instructions link and follow the Ubuntu instructions for your version of Ubuntu.
- Eine vorhandene ASP.NET Core-App.An existing ASP.NET Core app.
Starten Sie die vom Server gehosteten ASP.NET Core-Apps zu einem beliebigen Zeitpunkt nach dem Upgrade des freigegebenen Frameworks neu.At any point in the future after upgrading the shared framework, restart the ASP.NET Core apps hosted by the server.
Veröffentlichen und Kopieren der AppPublish and copy over the app
Konfigurieren Sie die App für eine Framework-abhängige Bereitstellung.Configure the app for a framework-dependent deployment.
Wenn die App lokal ausgeführt wird und nicht so konfiguriert wurde, dass sie sichere Verbindungen (HTTPS) herstellt, können Sie einen der folgenden Ansätze verwenden:If the app is run locally and isn't configured to make secure connections (HTTPS), adopt either of the following approaches:
- Konfigurieren der App, sodass diese sichere lokale Verbindungen verarbeitet.Configure the app to handle secure local connections. Weitere Informationen finden Sie im Abschnitt HTTPS-Konfiguration.For more information, see the HTTPS configuration section.
- Entfernen Sie
https://localhost:5001
(falls vorhanden) aus derapplicationUrl
-Eigenschaft in der DateiProperties/launchSettings.json
.Removehttps://localhost:5001
(if present) from theapplicationUrl
property in theProperties/launchSettings.json
file.
Führen Sie in der Entwicklungsumgebung dotnet publish aus, um eine App in ein Verzeichnis zu packen (z. B. bin/Release/{TARGET FRAMEWORK MONIKER}/publish
, wobei der Platzhalter {TARGET FRAMEWORK MONIKER}
der TFM [Target Framework Moniker, Zielframeworkmoniker] ist), das auf dem Server ausgeführt werden kann:Run dotnet publish from the development environment to package an app into a directory (for example, bin/Release/{TARGET FRAMEWORK MONIKER}/publish
, where the placeholder {TARGET FRAMEWORK MONIKER}
is the Target Framework Moniker/TFM) that can run on the server:
dotnet publish --configuration Release
Die App kann auch als eine eigenständige Bereitstellung veröffentlicht werden, wenn Sie die .NET Core-Runtime nicht auf dem Server verwalten möchten.The app can also be published as a self-contained deployment if you prefer not to maintain the .NET Core runtime on the server.
Kopieren Sie die ASP.NET Core-App auf den Server, indem Sie ein beliebiges Tool verwenden, das in den Workflow der Organisation integriert ist (z. B. SCP
oder SFTP
).Copy the ASP.NET Core app to the server using a tool that integrates into the organization's workflow (for example, SCP
, SFTP
). Web-Apps befinden sich üblicherweise im Verzeichnis var
(z.B. var/www/helloapp
).It's common to locate web apps under the var
directory (for example, var/www/helloapp
).
Hinweis
In einem Szenario für die Bereitstellung in der Produktion übernimmt ein Continuous Integration-Workflow die Veröffentlichung der App und das Kopieren der Objekte auf den Server.Under a production deployment scenario, a continuous integration workflow does the work of publishing the app and copying the assets to the server.
Testen der App:Test the app:
- Führen Sie die App über die Befehlszeile aus:
dotnet <app_assembly>.dll
.From the command line, run the app:dotnet <app_assembly>.dll
. - Navigieren Sie in einem Browser zu
http://<serveraddress>:<port>
, und überprüfen Sie, ob die App lokal unter Linux funktioniert.In a browser, navigate tohttp://<serveraddress>:<port>
to verify the app works on Linux locally.
Konfigurieren eines ReverseproxyserversConfigure a reverse proxy server
Ein Reverseproxy wird im Allgemeinen zur Unterstützung dynamischer Web-Apps eingerichtet.A reverse proxy is a common setup for serving dynamic web apps. Ein Reverseproxy beendet die HTTP-Anforderung und leitet diese an die ASP.NET Core-App weiter.A reverse proxy terminates the HTTP request and forwards it to the ASP.NET Core app.
Verwenden eines ReverseproxyserversUse a reverse proxy server
Kestrel eignet sich hervorragend für die Bereitstellung dynamischer Inhalte aus ASP.NET Core.Kestrel is great for serving dynamic content from ASP.NET Core. Die Webbereitstellungsfunktionen sind jedoch nicht so umfangreich wie bei Servern wie IIS, Apache oder Nginx.However, the web serving capabilities aren't as feature rich as servers such as IIS, Apache, or Nginx. Ein Reverseproxyserver kann Arbeiten wie das Verarbeiten von statischen Inhalten, das Zwischenspeichern und Komprimieren von Anforderungen und das Beenden von HTTPS vom HTTP-Server auslagern.A reverse proxy server can offload work such as serving static content, caching requests, compressing requests, and HTTPS termination from the HTTP server. Ein Reverseproxyserver kann sich auf einem dedizierten Computer befinden oder zusammen mit einem HTTP-Server bereitgestellt werden.A reverse proxy server may reside on a dedicated machine or may be deployed alongside an HTTP server.
Für diesen Leitfaden wird eine einzelne Instanz von Nginx verwendet.For the purposes of this guide, a single instance of Nginx is used. Diese wird auf demselben Server ausgeführt, zusammen mit dem HTTP-Server.It runs on the same server, alongside the HTTP server. Je nach Anforderungen kann ein anderes Setup ausgewählt werden.Based on requirements, a different setup may be chosen.
Da Anforderungen vom Reverseproxy weitergeleitet werden, verwenden Sie die Forwarded Headers Middleware im Paket Microsoft.AspNetCore.HttpOverrides
.Because requests are forwarded by reverse proxy, use the Forwarded Headers Middleware from the Microsoft.AspNetCore.HttpOverrides
package. Diese Middleware aktualisiert Request.Scheme
mithilfe des X-Forwarded-Proto
-Headers, sodass Umleitungs-URIs und andere Sicherheitsrichtlinien ordnungsgemäß funktionieren.The middleware updates the Request.Scheme
, using the X-Forwarded-Proto
header, so that redirect URIs and other security policies work correctly.
Die Middleware für weitergeleitete Header muss noch vor einer anderen Middleware ausgeführt werden.Forwarded Headers Middleware should run before other middleware. Mit dieser Reihenfolge wird sichergestellt, dass die auf Informationen von weitergeleiteten Headern basierende Middleware die zu verarbeitenden Headerwerte nutzen kann.This ordering ensures that the middleware relying on forwarded headers information can consume the header values for processing. Unter Middleware für weitergeleitete Header: Auftrag finden Sie Informationen zum Ausführen der Middleware für weitergeleitete Header nach der diagnostischen Middleware und der Middleware für die Fehlerbehandlung.To run Forwarded Headers Middleware after diagnostics and error handling middleware, see Forwarded Headers Middleware order.
Rufen Sie die Methode UseForwardedHeaders am Anfang von Startup.Configure
auf, bevor Sie andere Middleware aufrufen.Invoke the UseForwardedHeaders method at the top of Startup.Configure
before calling other middleware. Konfigurieren Sie die Middleware so, dass die Header X-Forwarded-For
und X-Forwarded-Proto
weitergeleitet werden:Configure the middleware to forward the X-Forwarded-For
and X-Forwarded-Proto
headers:
using Microsoft.AspNetCore.HttpOverrides;
...
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseAuthentication();
Wenn für die Middleware keine ForwardedHeadersOptions angegeben sind, lauten die weiterzuleitenden Standardheader None
.If no ForwardedHeadersOptions are specified to the middleware, the default headers to forward are None
.
Proxys, die unter Loopbackadressen (127.0.0.0/8
, [::1]
) ausgeführt werden, einschließlich der standardmäßigen Adresse von localhost (127.0.0.1
), werden standardmäßig als vertrauenswürdig eingestuft.Proxies running on loopback addresses (127.0.0.0/8
, [::1]
), including the standard localhost address (127.0.0.1
), are trusted by default. Wenn andere vertrauenswürdige Proxys oder Netzwerke innerhalb des Unternehmens Anforderungen zwischen dem Internet und dem Webserver verarbeiten, fügen Sie diese der Liste der KnownProxies oder KnownNetworks mit ForwardedHeadersOptions hinzu.If other trusted proxies or networks within the organization handle requests between the Internet and the web server, add them to the list of KnownProxies or KnownNetworks with ForwardedHeadersOptions. Das folgende Beispiel fügt einen vertrauenswürdigen Proxyserver mit der IP-Adresse 10.0.0.0.100 der Middleware für weitergeleitete Header KnownProxies
in Startup.ConfigureServices
hinzu:The following example adds a trusted proxy server at IP address 10.0.0.100 to the Forwarded Headers Middleware KnownProxies
in Startup.ConfigureServices
:
using System.Net;
...
services.Configure<ForwardedHeadersOptions>(options =>
{
options.KnownProxies.Add(IPAddress.Parse("10.0.0.100"));
});
Weitere Informationen finden Sie unter Konfigurieren von ASP.NET Core zur Verwendung mit Proxyservern und Lastenausgleich.For more information, see Konfigurieren von ASP.NET Core zur Verwendung mit Proxyservern und Lastenausgleich.
Installieren von NginxInstall Nginx
Verwenden Sie apt-get
zum Installieren von Nginx.Use apt-get
to install Nginx. Das Installationsprogramm erstellt ein systemd
-Initialisierungsskript, das Nginx beim Systemstart als Dämon ausführt.The installer creates a systemd
init script that runs Nginx as daemon on system startup. Befolgen Sie die Installationsanleitungen für Ubuntu auf NGINX: Official Debian/Ubuntu packages.Follow the installation instructions for Ubuntu at Nginx: Official Debian/Ubuntu packages.
Hinweis
Wenn optionale Nginx-Module benötigt werden, kann die Erstellung von Nginx aus der Quelle erforderlich sein.If optional Nginx modules are required, building Nginx from source might be required.
Da Nginx zum ersten Mal installiert wurde, starten Sie es explizit, indem Sie Folgendes ausführen:Since Nginx was installed for the first time, explicitly start it by running:
sudo service nginx start
Stellen Sie sicher, dass ein Browser die Standardangebotsseite für Nginx anzeigt.Verify a browser displays the default landing page for Nginx. Die Landing Page ist unter http://<server_IP_address>/index.nginx-debian.html
erreichbar.The landing page is reachable at http://<server_IP_address>/index.nginx-debian.html
.
Konfigurieren von NginxConfigure Nginx
Ändern Sie /etc/nginx/sites-available/default
, um Nginx als Reverseproxy für das Weiterleiten von Anforderungen zu Ihrer ASP.NET Core-App zu konfigurieren.To configure Nginx as a reverse proxy to forward HTTP requests to your ASP.NET Core app, modify /etc/nginx/sites-available/default
. Öffnen Sie die Datei in einem Text-Editor und ersetzen Sie den Inhalt durch den Folgendes:Open it in a text editor, and replace the contents with the following:
server {
listen 80;
server_name example.com *.example.com;
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;
}
}
Wenn es sich bei der App um eine SignalR- oder Blazor Server-App handelt, finden Sie jeweils unter ASP.net Core SignalR Produktions Hosting und-Skalierung und Hosten und Bereitstellen von ASP.NET Core Blazor Server weitere Informationen.If the app is a SignalR or Blazor Server app see ASP.net Core SignalR Produktions Hosting und-Skalierung and Hosten und Bereitstellen von ASP.NET Core Blazor Server respectively for more information.
Wenn keine Übereinstimmung mit server_name
gefunden wird, verwendet Nginx den Standardserver.When no server_name
matches, Nginx uses the default server. Wenn kein Server definiert ist, ist der erste Server in der Konfigurationsdatei der Standardserver.If no default server is defined, the first server in the configuration file is the default server. Als bewährte Methode gilt, einen bestimmten Standardserver hinzuzufügen, der den Statuscode 444 in Ihrer Konfigurationsdatei zurückgibt.As a best practice, add a specific default server which returns a status code of 444 in your configuration file. Im Folgenden wird ein Beispiel für eine Standardserverkonfiguration aufgeführt:A default server configuration example is:
server {
listen 80 default_server;
# listen [::]:80 default_server deferred;
return 444;
}
Mit der vorhergehenden Konfigurationsdatei und dem vorhergehenden Standardserver akzeptiert Nginx den öffentlichen Datenverkehr über Port 80 mit dem Hostheader example.com
oder *.example.com
.With the preceding configuration file and default server, Nginx accepts public traffic on port 80 with host header example.com
or *.example.com
. Anforderungen, die mit diesen Hosts nicht übereinstimmen, werden nicht an Kestrel weitergeleitet.Requests not matching these hosts won't get forwarded to Kestrel. Nginx leitet die übereinstimmenden Anforderungen unter http://localhost:5000
an Kestrel weiter.Nginx forwards the matching requests to Kestrel at http://localhost:5000
. Weitere Informationen finden Sie unter Verarbeitung einer Anforderung mit Nginx.See How nginx processes a request for more information. Informationen zum Ändern der IP-Adresse bzw. des Ports von Kestrel finden Sie unter Kestrel: Endpoint configuration (Kestrel: Endpunktkonfiguration).To change Kestrel's IP/port, see Kestrel: Endpoint configuration.
Warnung
Schlägt die Angabe einer ordnungsgemäßen server_name-Anweisung fehlt, ist Ihre App Sicherheitsrisiken ausgesetzt.Failure to specify a proper server_name directive exposes your app to security vulnerabilities. Platzhalterbindungen in untergeordneten Domänen (z.B. *.example.com
) verursachen kein Sicherheitsrisiko, wenn Sie die gesamte übergeordnete Domäne steuern (im Gegensatz zu *.com
, das angreifbar ist).Subdomain wildcard binding (for example, *.example.com
) doesn't pose this security risk if you control the entire parent domain (as opposed to *.com
, which is vulnerable). Weitere Informationen finden Sie unter rfc7230 im Abschnitt 5.4.See rfc7230 section-5.4 for more information.
Wenn die Nginx-Konfiguration eingerichtet ist, können Sie zur Überprüfung der Syntax der Konfigurationsdateien sudo nginx -t
ausführen.Once the Nginx configuration is established, run sudo nginx -t
to verify the syntax of the configuration files. Wenn der Test der Konfigurationsdatei erfolgreich ist, können Sie durch Ausführen von sudo nginx -s reload
erzwingen, dass Nginx die Änderungen übernimmt.If the configuration file test is successful, force Nginx to pick up the changes by running sudo nginx -s reload
.
Gehen Sie wie folgt vor, um die App auf dem Server direkt auszuführen:To directly run the app on the server:
- Navigieren Sie zum Verzeichnis der App.Navigate to the app's directory.
- Führen Sie die App
dotnet <app_assembly.dll>
aus, wobeiapp_assembly.dll
der Name der Assemblydatei der App ist.Run the app:dotnet <app_assembly.dll>
, whereapp_assembly.dll
is the assembly file name of the app.
Wenn die App auf dem Server ausgeführt wird, über das Internet jedoch nicht reagiert, sollten Sie die Firewall des Servers überprüfen und sicherstellen, dass Port 80 geöffnet ist.If the app runs on the server but fails to respond over the Internet, check the server's firewall and confirm that port 80 is open. Fügen Sie bei Verwendung einer Azure-Ubuntu-VM eine Regel der Netzwerksicherheitsgruppe (NSG) zur Aktivierung des eingehenden Datenverkehrs an Port 80 hinzu.If using an Azure Ubuntu VM, add a Network Security Group (NSG) rule that enables inbound port 80 traffic. Eine Regel für ausgehenden Datenverkehr an Port 80 muss nicht aktiviert werden, da der ausgehende Datenverkehr automatisch gewährt wird, wenn die Regel für den eingehenden Datenverkehr aktiviert ist.There's no need to enable an outbound port 80 rule, as the outbound traffic is automatically granted when the inbound rule is enabled.
Nach dem Testen der App können Sie die App mit Ctrl+C
in der Eingabeaufforderung beenden.When done testing the app, shut the app down with Ctrl+C
at the command prompt.
Überwachen der AppMonitor the app
Der Server ist dafür eingerichtet, Anforderungen an http://<serveraddress>:80
an die ASP.NET Core-App weiterzuleiten, die unter http://127.0.0.1:5000
unter Kestrel ausgeführt wird.The server is setup to forward requests made to http://<serveraddress>:80
on to the ASP.NET Core app running on Kestrel at http://127.0.0.1:5000
. Nginx wurde jedoch nicht dafür eingerichtet, den Kestrel-Prozess zu verwalten.However, Nginx isn't set up to manage the Kestrel process. systemd
kann für die Erstellung einer Dienstdatei verwendet werden, um die zugrunde liegende Web-App zu starten und zu überwachen.systemd
can be used to create a service file to start and monitor the underlying web app. systemd
ist ein Initialisierungssystem, das viele leistungsstarke Features zum Starten, Beenden und Verwalten von Prozessen bereitstellt.systemd
is an init system that provides many powerful features for starting, stopping, and managing processes.
Erstellen der DienstdateiCreate the service file
Erstellen Sie die Dienstdefinitionsdatei:Create the service definition file:
sudo nano /etc/systemd/system/kestrel-helloapp.service
Im Folgenden wird ein Beispiel für eine Dienstdatei der App aufgeführt:The following is an example service file for the app:
[Unit]
Description=Example .NET Web API App running on Ubuntu
[Service]
WorkingDirectory=/var/www/helloapp
ExecStart=/usr/bin/dotnet /var/www/helloapp/helloapp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
Im vorherigen Beispiel wird der Benutzer, der den Dienst verwaltet, durch die Option User
angegeben.In the preceding example, the user that manages the service is specified by the User
option. Der Benutzer (www-data
) muss vorhanden und der ordnungsgemäße Besitzer der App-Dateien sein.The user (www-data
) must exist and have proper ownership of the app's files.
Verwenden Sie TimeoutStopSec
, um die Dauer der Wartezeit bis zum Herunterfahren der App zu konfigurieren, nachdem diese das anfängliche Interruptsignal empfangen hat.Use TimeoutStopSec
to configure the duration of time to wait for the app to shut down after it receives the initial interrupt signal. Wenn die App in diesem Zeitraum nicht heruntergefahren wird, wird SIGKILL ausgegeben, um die App zu beenden.If the app doesn't shut down in this period, SIGKILL is issued to terminate the app. Geben Sie den Wert als einheitenlose Sekunden (z.B. 150
), einen Zeitspannenwert (z.B. 2min 30s
) oder infinity
an, um das Timeout zu deaktivieren.Provide the value as unitless seconds (for example, 150
), a time span value (for example, 2min 30s
), or infinity
to disable the timeout. TimeoutStopSec
hat den Standardwert DefaultTimeoutStopSec
in der Manager-Konfigurationsdatei (systemd-system.conf
, system.conf.d
, systemd-user.conf
, user.conf.d
).TimeoutStopSec
defaults to the value of DefaultTimeoutStopSec
in the manager configuration file (systemd-system.conf
, system.conf.d
, systemd-user.conf
, user.conf.d
). Das Standardtimeout für die meisten Distributionen beträgt 90 Sekunden.The default timeout for most distributions is 90 seconds.
# The default value is 90 seconds for most distributions.
TimeoutStopSec=90
Linux verfügt über ein Dateisystem, bei dem die Groß-/Kleinschreibung beachtet wird.Linux has a case-sensitive file system. Wenn Sie ASPNETCORE_ENVIRONMENT
auf Production
festlegen, wird die Konfigurationsdatei appsettings.Production.json
und nicht appsettings.production.json
gesucht.Setting ASPNETCORE_ENVIRONMENT
to Production
results in searching for the configuration file appsettings.Production.json
, not appsettings.production.json
.
Einige Werte (z.B. SQL-Verbindungszeichenfolgen) müssen mit Escapezeichen versehen werden, damit die Konfigurationsanbieter die Umgebungsvariablen lesen können.Some values (for example, SQL connection strings) must be escaped for the configuration providers to read the environment variables. Mit dem folgenden Befehl können Sie einen ordnungsgemäß mit Escapezeichen versehenen Wert für die Verwendung in der Konfigurationsdatei generieren:Use the following command to generate a properly escaped value for use in the configuration file:
systemd-escape "<value-to-escape>"
Doppelpunkte (:
) als Trennzeichen werden in Umgebungsvariablennamen nicht unterstützt.Colon (:
) separators aren't supported in environment variable names. Verwenden Sie statt eines Doppelpunkts zwei Unterstriche (__
).Use a double underscore (__
) in place of a colon. Der Umgebungsvariablen-Konfigurationsanbieter konvertiert jeweils die zwei Unterstriche in einen Doppelpunkt, wenn die Umgebungsvariablen in die Konfiguration gelesen werden.The Environment Variables configuration provider converts double-underscores into colons when environment variables are read into configuration. Im folgenden Beispiel wird der Verbindungszeichenfolgeschlüssel ConnectionStrings:DefaultConnection
als ConnectionStrings__DefaultConnection
in die Dienstdefinitionsdatei platziert:In the following example, the connection string key ConnectionStrings:DefaultConnection
is set into the service definition file as ConnectionStrings__DefaultConnection
:
Doppelpunkte (:
) als Trennzeichen werden in Umgebungsvariablennamen nicht unterstützt.Colon (:
) separators aren't supported in environment variable names. Verwenden Sie statt eines Doppelpunkts zwei Unterstriche (__
).Use a double underscore (__
) in place of a colon. Der Umgebungsvariablen-Konfigurationsanbieter konvertiert jeweils die zwei Unterstriche in einen Doppelpunkt, wenn die Umgebungsvariablen in die Konfiguration gelesen werden.The Environment Variables configuration provider converts double-underscores into colons when environment variables are read into configuration. Im folgenden Beispiel wird der Verbindungszeichenfolgeschlüssel ConnectionStrings:DefaultConnection
als ConnectionStrings__DefaultConnection
in die Dienstdefinitionsdatei platziert:In the following example, the connection string key ConnectionStrings:DefaultConnection
is set into the service definition file as ConnectionStrings__DefaultConnection
:
Environment=ConnectionStrings__DefaultConnection={Connection String}
Speichern Sie die Datei, und aktivieren Sie den Dienst.Save the file and enable the service.
sudo systemctl enable kestrel-helloapp.service
Starten Sie den Dienst, und überprüfen Sie, ob er ausgeführt wird.Start the service and verify that it's running.
sudo systemctl start kestrel-helloapp.service
sudo systemctl status kestrel-helloapp.service
◝ kestrel-helloapp.service - Example .NET Web API App running on Ubuntu
Loaded: loaded (/etc/systemd/system/kestrel-helloapp.service; enabled)
Active: active (running) since Thu 2016-10-18 04:09:35 NZDT; 35s ago
Main PID: 9021 (dotnet)
CGroup: /system.slice/kestrel-helloapp.service
└─9021 /usr/local/bin/dotnet /var/www/helloapp/helloapp.dll
Wenn der Reverseproxy konfiguriert ist und Kestrel durch systemd
verwaltet wird, ist die Webanwendung vollständig konfiguriert. Auf diese kann dann über einen Browser auf dem lokalen Computer unter http://localhost
zugegriffen werden.With the reverse proxy configured and Kestrel managed through systemd
, the web app is fully configured and can be accessed from a browser on the local machine at http://localhost
. Der Zugriff ist auch von einem Remotecomputer aus möglich, sofern keine Firewall diesen blockiert.It's also accessible from a remote machine, barring any firewall that might be blocking. Beim Überprüfen der Antwortheader zeigt der Header Server
die ASP.NET Core-App an, die von Kestrel verarbeitet wird.Inspecting the response headers, the Server
header shows the ASP.NET Core app being served by Kestrel.
HTTP/1.1 200 OK
Date: Tue, 11 Oct 2016 16:22:23 GMT
Server: Kestrel
Keep-Alive: timeout=5, max=98
Connection: Keep-Alive
Transfer-Encoding: chunked
Protokoll anzeigen...View logs
Da die Web-App, die Kestrel verwendet, von systemd
verwaltet wird, werden alle Ereignisse und Prozesse in einem zentralen Journal protokolliert.Since the web app using Kestrel is managed using systemd
, all events and processes are logged to a centralized journal. Dieses Journal enthält jedoch alle Einträge für alle Dienste und Prozesse, die von systemd
verwaltet werden.However, this journal includes all entries for all services and processes managed by systemd
. Verwenden Sie folgenden Befehl, um die kestrel-helloapp.service
-spezifischen Elemente anzuzeigen:To view the kestrel-helloapp.service
-specific items, use the following command:
sudo journalctl -fu kestrel-helloapp.service
Für weiteres Filtern können Zeitoptionen wie --since today
, --until 1 hour ago
oder eine Kombination aus diesen die Menge der zurückgegebenen Einträge verringern.For further filtering, time options such as --since today
, --until 1 hour ago
or a combination of these can reduce the amount of entries returned.
sudo journalctl -fu kestrel-helloapp.service --since "2016-10-18" --until "2016-10-18 04:00"
Schutz von DatenData protection
Der Stapel zum Schutz von Daten in ASP.NET Core wird von mehreren ASP.NET Core-Middlewares verwendet. Hierzu gehören die Authentifizierungsmiddleware (zum Beispiel die cookiemiddleware) und Maßnahmen zum Schutz vor websiteübergreifenden Anforderungsfälschungen (CSRF).The ASP.NET Core Data Protection stack is used by several ASP.NET Core middlewares, including authentication middleware (for example, cookie middleware) and cross-site request forgery (CSRF) protections. Selbst wenn Datenschutz-APIs nicht im Benutzercode aufgerufen werden, sollte der Schutz von Daten konfiguriert werden, um einen persistenten kryptografischen Schlüsselspeicher zu erstellen.Even if Data Protection APIs aren't called by user code, data protection should be configured to create a persistent cryptographic key store. Wenn der Schutz von Daten nicht konfiguriert ist, werden die Schlüssel beim Neustarten der App im Arbeitsspeicher gespeichert und verworfen.If data protection isn't configured, the keys are held in memory and discarded when the app restarts.
Falls der Schlüsselbund im Arbeitsspeicher gespeichert wird, wenn die App neu gestartet wird, gilt Folgendes:If the key ring is stored in memory when the app restarts:
- Alle cookiebasierten Authentifizierungstoken werden für ungültig erklärt.All cookie-based authentication tokens are invalidated.
- Benutzer müssen sich bei ihrer nächsten Anforderung erneut anmelden.Users are required to sign in again on their next request.
- Alle mit dem Schlüsselbund geschützte Daten können nicht mehr entschlüsselt werden.Any data protected with the key ring can no longer be decrypted. Dies kann CSRF-Token und ASP.NET Core-MVC-TempData-cookies einschließen.This may include CSRF tokens and ASP.NET Core MVC TempData cookies.
Wenn Sie den Schutz von Daten konfigurieren möchten, um den Schlüsselring persistent zu speichern und zu verschlüsseln, finden Sie in den folgenden Artikeln weitere Informationen:To configure data protection to persist and encrypt the key ring, see:
- Schlüsselspeicher Anbieter in ASP.net Core
- Verschlüsselung ruhender Schlüssel in Windows und Azure mithilfe ASP.net Core
Lange AnforderungsheaderfelderLong request header fields
Die Standardeinstellungen für den Proxyserver schränken die Anforderungsheaderfelder in der Regel je nach Plattform auf 4 K oder 8 K ein.Proxy server default settings typically limit request header fields to 4 K or 8 K depending on the platform. Eine App erfordert möglicherweise Felder, die länger als die Standardwerte sind (z. B. Apps, die Azure Active Directory verwenden).An app may require fields longer than the default (for example, apps that use Azure Active Directory). Wenn längere Felder erforderlich sind, müssen die Standardeinstellungen des Proxyservers angepasst werden.If longer fields are required, the proxy server's default settings require adjustment. Die anzuwendenden Werte hängen vom jeweiligen Szenario ab.The values to apply depend on the scenario. Weitere Informationen finden Sie in der Dokumentation Ihres Servers.For more information, see your server's documentation.
- proxy_buffer_sizeproxy_buffer_size
- proxy_buffersproxy_buffers
- proxy_busy_buffers_sizeproxy_busy_buffers_size
- large_client_header_bufferslarge_client_header_buffers
Warnung
Erhöhen Sie die Standardwerte der Proxypuffer nur dann, wenn dies absolut erforderlich ist.Don't increase the default values of proxy buffers unless necessary. Ein Erhöhen dieser Werte vergrößert das Risiko von Pufferüberlauf- (Überlauf-) und Denial-of-Service-Angriffen durch böswillige Benutzer.Increasing these values increases the risk of buffer overrun (overflow) and Denial of Service (DoS) attacks by malicious users.
Sichern der AppSecure the app
Aktivieren von AppArmorEnable AppArmor
Bei Linux Security Modules (LSM) handelt es sich um ein Framework, das seit Linux 2.6 Teil des Linux-Kernels ist.Linux Security Modules (LSM) is a framework that's part of the Linux kernel since Linux 2.6. LSM unterstützt verschiedene Implementierungen von Sicherheitsmodulen.LSM supports different implementations of security modules. AppArmor ist ein LSM, das ein obligatorisches Zugriffssteuerungssystem implementiert, das das Programm auf einen beschränkten Satz von Ressourcen begrenzt.AppArmor is a LSM that implements a Mandatory Access Control system which allows confining the program to a limited set of resources. Versichern Sie sich, dass AppArmor aktiviert und ordnungsgemäß konfiguriert ist.Ensure AppArmor is enabled and properly configured.
Konfigurieren der FirewallConfigure the firewall
Schließen Sie alle externen Ports, die nicht verwendet werden.Close off all external ports that are not in use. „Uncomplicated Firewall“ (UFW) stellt ein Front-End für iptables
bereit, indem eine CLI zum Konfigurieren der Firewall bereitgestellt wird.Uncomplicated firewall (ufw) provides a front end for iptables
by providing a CLI for configuring the firewall.
Warnung
Eine Firewall verhindert den Zugriff auf das gesamte System, wenn dieses nicht ordnungsgemäß konfiguriert ist.A firewall will prevent access to the whole system if not configured correctly. Falls Sie SSH zum Verbindungsaufbau verwenden und den falschen SSH-Port angeben, können Sie nicht mehr auf das System zugreifen.Failure to specify the correct SSH port will effectively lock you out of the system if you are using SSH to connect to it. Der Standardport ist 22.The default port is 22. Weitere Informationen finden Sie unter introduction to ufw (Einführung in ufw) und in den Manpages.For more information, see the introduction to ufw and the manual.
Installieren Sie ufw
, und konfigurieren Sie das Tool so, dass der Datenverkehr auf allen erforderlich Ports zugelassen wird.Install ufw
and configure it to allow traffic on any ports needed.
sudo apt-get install ufw
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Sichern von NginxSecure Nginx
Ändern des Namens der Nginx-AntwortChange the Nginx response name
Bearbeiten Sie src/http/ngx_http_header_filter_module.c
:Edit src/http/ngx_http_header_filter_module.c
:
static char ngx_http_server_string[] = "Server: Web Server" CRLF;
static char ngx_http_server_full_string[] = "Server: Web Server" CRLF;
Konfigurieren von OptionenConfigure options
Konfigurieren Sie den Server mit zusätzlichen erforderlichen Modulen.Configure the server with additional required modules. Erwägen Sie zum Schutz der App die Verwendung einer Web-App-Firewall wie z.B. ModSecurity.Consider using a web app firewall, such as ModSecurity, to harden the app.
HTTPS-KonfigurationHTTPS configuration
Konfigurieren der App für sichere (HTTPS) lokale VerbindungenConfigure the app for secure (HTTPS) local connections
Der dotnet run-Befehl verwendet die Properties/launchSettings.json
-Datei der App, die die App so konfiguriert, dass diese an den URLs lauscht, die von der applicationUrl
-Eigenschaft bereitgestellt werden, z. B. https://localhost:5001;http://localhost:5000
.The dotnet run command uses the app's Properties/launchSettings.json
file, which configures the app to listen on the URLs provided by the applicationUrl
property (for example, https://localhost:5001;http://localhost:5000
).
Konfigurieren Sie mithilfe eines der folgenden Ansätze die App so, dass sie bei der Entwicklung für den Befehl dotnet run
oder die Entwicklungsumgebung (F5 oder STRG+F5 in Visual Studio Code) ein Zertifikat verwendet:Configure the app to use a certificate in development for the dotnet run
command or development environment (F5 or Ctrl+F5 in Visual Studio Code) using one of the following approaches:
- Ersetzen des Standardzertifikats aus der Konfiguration (Empfohlen)Replace the default certificate from configuration (Recommended)
- KestrelServerOptions.ConfigureHttpsDefaultsKestrelServerOptions.ConfigureHttpsDefaults
Konfigurieren des Reverseproxys für sichere (HTTPS) ClientverbindungenConfigure the reverse proxy for secure (HTTPS) client connections
Konfigurieren Sie den Server, damit dieser für den HTTPS-Datenverkehr an Port
443
empfangsbereit ist, indem Sie ein gültiges Zertifikat angeben, das von einer vertrauenswürdigen Zertifizierungsstelle (Certificate Authority, CA) ausgestellt wurde.Configure the server to listen to HTTPS traffic on port443
by specifying a valid certificate issued by a trusted Certificate Authority (CA).Stärken Sie Ihre Sicherheit, indem Sie einige der in der folgenden Datei (
/etc/nginx/nginx.conf
) dargestellten Methoden verwenden.Harden the security by employing some of the practices depicted in the following/etc/nginx/nginx.conf
file. Die Beispiele schließen das Auswählen einer stärkeren Verschlüsselung und das Weiterleiten allen Datenverkehrs über HTTP auf HTTPS ein.Examples include choosing a stronger cipher and redirecting all traffic over HTTP to HTTPS.Hinweis
Für Entwicklungsumgebungen empfehlen sich temporäre Umleitungen (302) anstelle permanenter Umleitungen (301).For development environments, we recommend using temporary redirects (302) rather than permanent redirects (301). Das Zwischenspeichern von Links kann in Entwicklungsumgebungen zu instabilem Verhalten führen.Link caching can cause unstable behavior in development environments.
Durch das Hinzufügen eines
HTTP Strict-Transport-Security
-Headers (HSTS) wird sichergestellt, dass alle nachfolgenden Anforderungen vom Client über HTTPS erfolgen.Adding anHTTP Strict-Transport-Security
(HSTS) header ensures all subsequent requests made by the client are over HTTPS.Wichtige Anleitungen zu HSTS finden Sie unter Erzwingen von HTTPS in ASP.net Core.For important guidance on HSTS, see Erzwingen von HTTPS in ASP.net Core.
Wenn HTTPS in Zukunft deaktiviert wird, halten Sie sich an einen der folgenden Ansätze:If HTTPS will be disabled in the future, use one of the following approaches:
- Fügen Sie den HSTS-Header nicht hinzu.Don't add the HSTS header.
- Wählen Sie einen kurzen
max-age
-Wert aus.Choose a shortmax-age
value.
Fügen Sie die Konfigurationsdatei /etc/nginx/proxy.conf
hinzu:Add the /etc/nginx/proxy.conf
configuration file:
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
Ersetzen Sie den Inhalt der Konfigurationsdatei /etc/nginx/nginx.conf
durch die folgende Datei.Replace the contents of the /etc/nginx/nginx.conf
configuration file with the following file. Das Beispiel enthält die Abschnitte http
und server
in einer Konfigurationsdatei.The example contains both http
and server
sections in one configuration file.
http {
include /etc/nginx/proxy.conf;
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server_tokens off;
sendfile on;
keepalive_timeout 29; # Adjust to the lowest possible value that makes sense for your use case.
client_body_timeout 10; client_header_timeout 10; send_timeout 10;
upstream helloapp{
server localhost:5000;
}
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com *.example.com;
ssl_certificate /etc/ssl/certs/testCert.crt;
ssl_certificate_key /etc/ssl/certs/testCert.key;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on; #ensure your cert is capable
ssl_stapling_verify on; #ensure your cert is capable
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
#Redirects all traffic
location / {
proxy_pass http://helloapp;
limit_req zone=one burst=10 nodelay;
}
}
}
Hinweis
Blazor WebAssembly-Apps erfordern einen größeren burst
-Parameterwert, damit die größere Anzahl von Anforderungen verarbeitet werden kann, die von einer App ausgeführt werden.Blazor WebAssembly apps require a larger burst
parameter value to accommodate the larger number of requests made by an app. Weitere Informationen finden Sie unter Hosten und Bereitstellen von ASP.NET Core Blazor WebAssembly.For more information, see Hosten und Bereitstellen von ASP.NET Core Blazor WebAssembly.
Sichern von Nginx vor ClickjackingSecure Nginx from clickjacking
Clickjacking, auch bekannt als UI Redress-Angriff, ist ein böswilliger Angriff, bei dem ein Websitebesucher dazu verleitet wird, auf einen Link oder eine Schaltfläche zu klicken, der bzw. die sich auf einer anderen Seite als der aktuell besuchten Seite befindet.Clickjacking, also known as a UI redress attack, is a malicious attack where a website visitor is tricked into clicking a link or button on a different page than they're currently visiting. Verwenden Sie X-FRAME-OPTIONS
zum Sichern der Website.Use X-FRAME-OPTIONS
to secure the site.
So wehren Sie Clickjacking-Angriffe ab:To mitigate clickjacking attacks:
Bearbeiten Sie die Datei
nginx.conf
:Edit thenginx.conf
file:sudo nano /etc/nginx/nginx.conf
Fügen Sie die Zeile
add_header X-Frame-Options "SAMEORIGIN";
hinzu:Add the line:add_header X-Frame-Options "SAMEORIGIN";
Speichern Sie die Datei.Save the file.
Starten Sie Nginx neu.Restart Nginx.
MIME-TypermittlungMIME-type sniffing
Dieser Header hindert die meisten Browser an der MIME-Ermittlung einer Antwort vom deklarierten Inhaltstyp weg, da der Header den Browser anweist, den Inhaltstyp der Antwort nicht zu überschreiben.This header prevents most browsers from MIME-sniffing a response away from the declared content type, as the header instructs the browser not to override the response content type. Durch die Option nosniff
wird der Inhalt vom Browser als text/html
gerendert, wenn der Server sagt, dass es sich bei diesem um text/html
handelt.With the nosniff
option, if the server says the content is text/html
, the browser renders it as text/html
.
Bearbeiten Sie die Datei
nginx.conf
:Edit thenginx.conf
file:sudo nano /etc/nginx/nginx.conf
Fügen Sie die Zeile
add_header X-Content-Type-Options "nosniff";
hinzu:Add the line:add_header X-Content-Type-Options "nosniff";
Speichern Sie die Datei.Save the file.
Starten Sie Nginx neu.Restart Nginx.
Zusätzliche Vorschläge zu NginxAdditional Nginx suggestions
Starten Sie die vom Server gehosteten ASP.NET Core-Apps nach dem Upgrade des freigegebenen Frameworks neu.After upgrading the shared framework on the server, restart the ASP.NET Core apps hosted by the server.
Zusätzliche RessourcenAdditional resources
- Voraussetzungen für .NET Core unter LinuxPrerequisites for .NET Core on Linux
- Nginx: Binary Releases: Official Debian/Ubuntu packagesNginx: Binary Releases: Official Debian/Ubuntu packages
- Problembehandlung und Debuggen von ASP.NET Core-Projekten
- Konfigurieren von ASP.NET Core zur Verwendung mit Proxyservern und Lastenausgleich
- NGINX: Using the Forwarded header (NGINX: Verwenden des weitergeleiteten Headers)NGINX: Using the Forwarded header