Apache 搭載の Linux で ASP.NET Core をホストするHost ASP.NET Core on Linux with Apache

作成者: Shayne BoyerBy Shayne Boyer

このガイドを使用して設定する方法を学習Apacheにリバース プロキシ サーバーとしてCentOS 7で実行されている ASP.NET Core web アプリへの HTTP トラフィックをリダイレクトするKestrelです。Using this guide, learn how to set up Apache as a reverse proxy server on CentOS 7 to redirect HTTP traffic to an ASP.NET Core web app running on Kestrel. Mod_proxy 拡張子関連モジュールが、サーバーのリバース プロキシを作成します。The mod_proxy extension and related modules create the server's reverse proxy.

必須コンポーネントPrerequisites

  1. Sudo 権限を持つ標準ユーザー アカウントを使用して CentOS 7 を実行しているサーバーServer running CentOS 7 with a standard user account with sudo privilege
  2. ASP.NET Core アプリケーションASP.NET Core app

アプリの発行Publish the app

アプリを発行すると、自己完結型の配置CentOS 7 ランタイムのリリースの構成で (centos.7-x64)。Publish the app as a self-contained deployment in Release configuration for the CentOS 7 runtime (centos.7-x64). 内容をコピー、 bin/Release/netcoreapp2.0/centos.7-x64/publish SCP、FTP、またはその他のファイルの転送方法を使用してサーバーのフォルダーです。Copy the contents of the bin/Release/netcoreapp2.0/centos.7-x64/publish folder to the server using SCP, FTP, or other file transfer method.

注意

運用展開シナリオでは、継続的インテグレーション ワークフローは、アプリを発行し、サーバーへの資産のコピーの作業を行います。Under a production deployment scenario, a continuous integration workflow does the work of publishing the app and copying the assets to the server.

プロキシ サーバーを構成するConfigure a proxy server

リバース プロキシは、動的な web アプリの送信用の共通のセットアップです。A reverse proxy is a common setup for serving dynamic web apps. リバース プロキシは、HTTP 要求を終了し、ASP.NET アプリケーションに転送します。The reverse proxy terminates the HTTP request and forwards it to the ASP.NET app.

プロキシ サーバーは、要求を満たせません自体ではなく別のサーバーにクライアント要求を転送する 1 つです。A proxy server is one which forwards client requests to another server instead of fulfilling requests itself. リバース プロキシは、一般的に任意のクライアントに代わって固定の送信先に転送します。A reverse proxy forwards to a fixed destination, typically on behalf of arbitrary clients. このガイドでは、Apache は Kestrel ASP.NET Core アプリケーションが機能していること、同じサーバーで実行されているリバース プロキシとして構成されます。In this guide, Apache is configured as the reverse proxy running on the same server that Kestrel is serving the ASP.NET Core app.

要求は、リバース プロキシによって転送される、ためから転送されるヘッダー ミドルウェアを使用して、 Microsoft.AspNetCore.HttpOverridesパッケージです。Because requests are forwarded by reverse proxy, use the Forwarded Headers Middleware from the Microsoft.AspNetCore.HttpOverrides package. ミドルウェアの更新プログラム、Request.Schemeを使用して、X-Forwarded-Protoヘッダー、そのリダイレクト Uri とその他のセキュリティ ポリシーが正常に動作するようにします。The middleware updates the Request.Scheme, using the X-Forwarded-Proto header, so that redirect URIs and other security policies work correctly.

認証ミドルウェアの任意の型を使用する場合、転送ヘッダー ミドルウェアが最初に実行する必要があります。When using any type of authentication middleware, the Forwarded Headers Middleware must run first. この順序により、認証ミドルウェアがヘッダーの値を使用して正しくリダイレクト Uri を生成することができます。This ordering ensures that the authentication middleware can consume the header values and generate correct redirect URIs.

呼び出す、 UseForwardedHeadersメソッドStartup.Configure呼び出す前にUseAuthenticationまたは類似の認証スキームのミドルウェア。Invoke the UseForwardedHeaders method in Startup.Configure before calling UseAuthentication or similar authentication scheme middleware. 転送するミドルウェアを構成、X-Forwarded-ForX-Forwarded-Protoヘッダー。Configure the middleware to forward the X-Forwarded-For and X-Forwarded-Proto headers:

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

app.UseAuthentication();

ない場合はForwardedHeadersOptionsは指定した、ミドルウェアに転送する既定のヘッダーがNoneです。If no ForwardedHeadersOptions are specified to the middleware, the default headers to forward are None.

追加の構成は、プロキシ サーバーとロード バランサーの背後にホストされているアプリの必要があります。Additional configuration might be required for apps hosted behind proxy servers and load balancers. 詳細については、次を参照してください。にプロキシ サーバーを操作すると、ロード バランサーの ASP.NET Core の構成です。For more information, see Configure ASP.NET Core to work with proxy servers and load balancers.

Apache をインストールするInstall Apache

CentOS パッケージを最新の安定したバージョンに更新プログラム:Update CentOS packages to their latest stable versions:

sudo yum update -y

1 つの CentOS に Apache web サーバーをインストールyumコマンド。Install the Apache web server on CentOS with a single yum command:

sudo yum -y install httpd mod_ssl

コマンドの実行後の出力例:Sample output after running the command:

Downloading packages:
httpd-2.4.6-40.el7.centos.4.x86_64.rpm               | 2.7 MB  00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : httpd-2.4.6-40.el7.centos.4.x86_64      1/1 
Verifying  : httpd-2.4.6-40.el7.centos.4.x86_64      1/1 

Installed:
httpd.x86_64 0:2.4.6-40.el7.centos.4

Complete!

注意

この例では、出力は、CentOS 7 バージョンが 64 ビットであるために httpd.86_64 を反映します。In this example, the output reflects httpd.86_64 since the CentOS 7 version is 64 bit. Apache がインストールされている場所を確認するには、コマンド プロンプトから whereis httpd を実行します。To verify where Apache is installed, run whereis httpd from a command prompt.

Apache をリバース プロキシとして構成するConfigure Apache for reverse proxy

Apache の構成ファイルは、/etc/httpd/conf.d/ ディレクトリ内にあります。Configuration files for Apache are located within the /etc/httpd/conf.d/ directory. ファイルのいずれか、 .conf拡張機能が、モジュール構成ファイルでだけでなくアルファベット順に処理される/etc/httpd/conf.modules.d/、ファイルのモジュールを読み込むために必要な構成が含まれています。Any file with the .conf extension is processed in alphabetical order in addition to the module configuration files in /etc/httpd/conf.modules.d/, which contains any configuration files necessary to load modules.

という名前の構成ファイルを作成するhellomvc.confアプリの。Create a configuration file, named hellomvc.conf, for the app:

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5000/
    ServerName www.example.com
    ServerAlias *.example.com
    ErrorLog ${APACHE_LOG_DIR}hellomvc-error.log
    CustomLog ${APACHE_LOG_DIR}hellomvc-access.log common
</VirtualHost>

VirtualHostブロックは、サーバー上の 1 つまたは複数のファイルに複数回を表示することができます。The VirtualHost block can appear multiple times, in one or more files on a server. 上記の構成ファイルでは、Apache は、ポート 80 でパブリック トラフィックを受け入れます。In the preceding configuration file, Apache accepts public traffic on port 80. ドメインwww.example.comが提供される、および*.example.comエイリアスが同じ web サイトに解決されます。The domain www.example.com is being served, and the *.example.com alias resolves to the same website. 参照してください仮想ホストの名前に基づくサポート詳細についてはします。See Name-based virtual host support for more information. 要求は、ポート 5000 127.0.0.1 のサーバーのルートにあるプロキシ。Requests are proxied at the root to port 5000 of the server at 127.0.0.1. 双方向通信のProxyPassProxyPassReverseが必要です。For bi-directional communication, ProxyPass and ProxyPassReverse are required.

警告

適切なを指定するServerName ディレクティブで、 VirtualHostブロックはセキュリティの脆弱性にアプリを公開します。Failure to specify a proper ServerName directive in the VirtualHost block exposes your app to security vulnerabilities. サブドメイン ワイルドカード バインド (たとえば、 *.example.com) 全体の親ドメインを制御する場合、このセキュリティ上のリスクは発生しません (to *.com、に対して脆弱である)。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). 詳細については、rfc7230 セクション-5.4 を参照してください。See rfc7230 section-5.4 for more information.

ごとにログ記録を構成できるVirtualHostを使用してErrorLogCustomLogディレクティブです。Logging can be configured per VirtualHost using ErrorLog and CustomLog directives. ErrorLog サーバーが、エラーをログの場所とCustomLogファイル名とログ ファイルの形式を設定します。ErrorLog is the location where the server logs errors, and CustomLog sets the filename and format of log file. この場合、要求の情報が記録される場所はします。In this case, this is where request information is logged. 要求ごとに行が表示されます。There's one line for each request.

ファイルを保存し、構成をテストします。Save the file and test the configuration. すべてに合格すると、応答は Syntax [OK] になります。If everything passes, the response should be Syntax [OK].

sudo service httpd configtest

Apache を再起動します。Restart Apache:

sudo systemctl restart httpd
sudo systemctl enable httpd

アプリの監視Monitoring the app

Apache がへの要求を転送するセットアップでは今すぐhttp://localhost:80で Kestrel で実行されている ASP.NET Core アプリケーションにhttp://127.0.0.1:5000です。Apache is now setup to forward requests made to http://localhost:80 to the ASP.NET Core app running on Kestrel at http://127.0.0.1:5000. ただし、Apache は Kestrel プロセスを管理するセットアップをされていません。However, Apache isn't set up to manage the Kestrel process. 使用してsystemdを起動し、基になる web アプリを監視するサービス ファイルを作成します。Use systemd and create a service file to start and monitor the underlying web app. systemd は init システムであり、プロセスを起動、停止、管理するためのさまざまな高性能機能を提供します。systemd is an init system that provides many powerful features for starting, stopping, and managing processes.

サービス ファイルを作成するCreate the service file

次のように、サービス定義ファイルを作成します。Create the service definition file:

sudo nano /etc/systemd/system/kestrel-hellomvc.service

アプリのサービス ファイルの例:An example service file for the app:

[Unit]
Description=Example .NET Web API App running on CentOS 7

[Service]
WorkingDirectory=/var/aspnetcore/hellomvc
ExecStart=/usr/local/bin/dotnet /var/aspnetcore/hellomvc/hellomvc.dll
Restart=always
# Restart service after 10 seconds if dotnet service crashes
RestartSec=10
SyslogIdentifier=dotnet-example
User=apache
Environment=ASPNETCORE_ENVIRONMENT=Production 

[Install]
WantedBy=multi-user.target

注意

ユーザー —場合、ユーザー apache使用されていない、構成によってユーザー必要があります最初に作成してファイルの適切な所有権を指定します。User — If the user apache isn't used by the configuration, the user must be created first and given proper ownership for files.

ファイルを保存し、サービスを有効にします。Save the file and enable the service:

systemctl enable kestrel-hellomvc.service

サービスを開始し、実行されていることを確認します。Start the service and verify that it's running:

systemctl start kestrel-hellomvc.service
systemctl status kestrel-hellomvc.service

● kestrel-hellomvc.service - Example .NET Web API App running on CentOS 7
    Loaded: loaded (/etc/systemd/system/kestrel-hellomvc.service; enabled)
    Active: active (running) since Thu 2016-10-18 04:09:35 NZDT; 35s ago
Main PID: 9021 (dotnet)
    CGroup: /system.slice/kestrel-hellomvc.service
            └─9021 /usr/local/bin/dotnet /var/aspnetcore/hellomvc/hellomvc.dll

リバース プロキシが構成されているとを通じて管理 Kestrel systemd、web アプリが完全に構成されているし、ローカルのコンピューター上のブラウザーからアクセスできるhttp://localhostです。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. 応答ヘッダーの検査、サーバーヘッダーは、ASP.NET Core アプリケーションが Kestrel によって処理されることを示します。Inspecting the response headers, the Server header indicates that the ASP.NET Core app is 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

ログを表示するViewing logs

Web アプリから Kestrel を使用して管理を使用してsystemdイベントとプロセスは、一元的な履歴に記録されます。Since the web app using Kestrel is managed using systemd, events and processes are logged to a centralized journal. ただし、このジャーナルには、サービスとプロセスによって管理されるすべてのエントリが含まれますsystemdです。However, this journal includes entries for all of the services and processes managed by systemd. kestrel-hellomvc.service 固有の項目を表示するには、次のコマンドを使用します。To view the kestrel-hellomvc.service-specific items, use the following command:

sudo journalctl -fu kestrel-hellomvc.service

時間のフィルタ リング、コマンドを使用して時間のオプションを指定します。For time filtering, specify time options with the command. たとえば、使用して--since todayを現在の日付のフィルター処理または--until 1 hour ago前の 1 時間のエントリを参照します。For example, use --since today to filter for the current day or --until 1 hour ago to see the previous hour's entries. 詳細については、次を参照してください。、 journalctl についてマニュアルです。For more information, see the man page for journalctl.

sudo journalctl -fu kestrel-hellomvc.service --since "2016-10-18" --until "2016-10-18 04:00"

アプリをセキュリティで保護します。Securing the app

ファイアウォールを構成するConfigure firewall

Firewalld動的デーモンでネットワーク ゾーンのサポートされたファイアウォールを管理します。Firewalld is a dynamic daemon to manage the firewall with support for network zones. ポートとパケット フィルタ リングは、iptables によって引き続き管理できます。Ports and packet filtering can still be managed by iptables. Firewalld既定でインストールする必要があります。Firewalld should be installed by default. yum パッケージをインストールまたはがインストールされていることを確認するために使用します。yum can be used to install the package or verify it's installed.

sudo yum install firewalld -y

使用してfirewalldを開くには、アプリに必要なポートのみです。Use firewalld to open only the ports needed for the app. この場合、ポート 80 と 443 が使用されています。In this case, port 80 and 443 are used. 次のコマンドでは、ポート 80 と 443 を開くには完全に設定します。The following commands permanently set ports 80 and 443 to open:

sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --add-port=443/tcp --permanent

ファイアウォールの設定を再読み込みされます。Reload the firewall settings. 使用可能なサービスと、既定のゾーン内のポートを確認してください。Check the available services and ports in the default zone. 検査することによってオプションがあるfirewall-cmd -hです。Options are available by inspecting firewall-cmd -h.

sudo firewall-cmd --reload
sudo firewall-cmd --list-all
public (default, active)
interfaces: eth0
sources: 
services: dhcpv6-client
ports: 443/tcp 80/tcp
masquerade: no
forward-ports: 
icmp-blocks: 
rich rules: 

SSL の構成SSL configuration

Ssl は、Apache を構成する、 mod_sslモジュールを使用します。To configure Apache for SSL, the mod_ssl module is used. ときに、 httpdモジュールがインストールされている、 mod_sslモジュールもインストールするとします。When the httpd module was installed, the mod_ssl module was also installed. インストールされている場合を使用してyum構成に追加します。If it wasn't installed, use yum to add it to the configuration.

sudo yum install mod_ssl

SSL を強制するのには、インストール、 mod_rewrite URL 書き換えを有効にするモジュール。To enforce SSL, install the mod_rewrite module to enable URL rewriting:

sudo yum install mod_rewrite

変更、 hellomvc.conf URL 書き換えを有効にして、ポート 443 での通信をセキュリティで保護するファイル。Modify the hellomvc.conf file to enable URL rewriting and secure communication on port 443:

<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/ [R,L]
</VirtualHost>

<VirtualHost *:443>
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5000/
    ErrorLog /var/log/httpd/hellomvc-error.log
    CustomLog /var/log/httpd/hellomvc-access.log common
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:!RC4+RSA:+HIGH:+MEDIUM:!LOW:!RC4
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
</VirtualHost>

注意

この例は、ローカルに生成された証明書を使用します。This example is using a locally-generated certificate. SSLCertificateFileドメイン名のプライマリ証明書ファイルでなければなりません。SSLCertificateFile should be the primary certificate file for the domain name. SSLCertificateKeyFile生成するか、キー ファイル CSR を作成します。SSLCertificateKeyFile should be the key file generated when CSR is created. SSLCertificateChainFile (存在する場合)、中間証明書ファイルをする必要があります証明機関から提供されています。SSLCertificateChainFile should be the intermediate certificate file (if any) that was supplied by the certificate authority.

ファイルを保存し、構成をテストします。Save the file and test the configuration:

sudo service httpd configtest

Apache を再起動します。Restart Apache:

sudo systemctl restart httpd

Apache に関するその他の推奨事項Additional Apache suggestions

追加のヘッダーAdditional headers

悪意のある攻撃からセキュリティで保護するためには、いくつかのヘッダーをする必要がありますか、変更または追加できます。In order to secure against malicious attacks, there are a few headers that should either be modified or added. いることを確認、mod_headersモジュールがインストールされています。Ensure that the mod_headers module is installed:

sudo yum install mod_headers

Clickjacking の攻撃からセキュリティで保護された ApacheSecure Apache from clickjacking attacks

Clickjackingとも呼ばれる、 UI redress 攻撃、悪意のある攻撃は、ここで web サイトの訪問者は、騙されてクリックしてリンクやボタンは別のページをしている現在のページです。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. 使用してX-FRAME-OPTIONSサイトをセキュリティで保護します。Use X-FRAME-OPTIONS to secure the site.

編集、 httpd.confファイル。Edit the httpd.conf file:

sudo nano /etc/httpd/conf/httpd.conf

行を追加Header append X-FRAME-OPTIONS "SAMEORIGIN"です。Add the line Header append X-FRAME-OPTIONS "SAMEORIGIN". ファイルを保存します。Save the file. Apache を再起動します。Restart Apache.

MIME タイプ スニッフィングMIME-type sniffing

X-Content-Type-Optionsヘッダーにより、Internet Explorer からMIME スニッフィング(ファイルの決定Content-Typeファイルの内容から)。The X-Content-Type-Options header prevents Internet Explorer from MIME-sniffing (determining a file's Content-Type from the file's content). サーバーを設定する場合、Content-Typeヘッダーをtext/htmlで、 nosniff Internet Explorer、オプションのセットとして内容を表示するtext/htmlファイルの内容に関係なく。If the server sets the Content-Type header to text/html with the nosniff option set, Internet Explorer renders the content as text/html regardless of the file's content.

編集、 httpd.confファイル。Edit the httpd.conf file:

sudo nano /etc/httpd/conf/httpd.conf

行を追加Header set X-Content-Type-Options "nosniff"です。Add the line Header set X-Content-Type-Options "nosniff". ファイルを保存します。Save the file. Apache を再起動します。Restart Apache.

負荷分散Load Balancing

この例では、同じインスタンス コンピューターに CentOS 7 と Kestrel をインストールし、Apache をセットアップおよび構成する方法を示します。This example shows how to setup and configure Apache on CentOS 7 and Kestrel on the same instance machine. ためにないの単一障害点です。使用してmod_proxy_balancerを変更して、 VirtualHostなります Apache プロキシ サーバーの背後に web アプリの複数のインスタンスを管理するためです。In order to not have a single point of failure; using mod_proxy_balancer and modifying the VirtualHost would allow for managing multiple instances of the web apps behind the Apache proxy server.

sudo yum install mod_proxy_balancer

追加のインスタンスの次に示す構成ファイルで、hellomvcアプリは 5001 ポート上で実行するセットアップです。In the configuration file shown below, an additional instance of the hellomvc app is setup to run on port 5001. プロキシセクションは、負荷を分散する 2 つのメンバー バランサー構成で設定がbyrequestsです。The Proxy section is set with a balancer configuration with two members to load balance byrequests.

<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/ [R,L]
</VirtualHost>

<VirtualHost *:443>
    ProxyPass / balancer://mycluster/ 

    ProxyPassReverse / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5001/

    <Proxy balancer://mycluster>
        BalancerMember http://127.0.0.1:5000
        BalancerMember http://127.0.0.1:5001 
        ProxySet lbmethod=byrequests
    </Proxy>

    <Location />
        SetHandler balancer
    </Location>
    ErrorLog /var/log/httpd/hellomvc-error.log
    CustomLog /var/log/httpd/hellomvc-access.log common
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:!RC4+RSA:+HIGH:+MEDIUM:!LOW:!RC4
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
</VirtualHost>

速度の制限Rate Limits

使用してmod_ratelimitに含まれている、 httpdモジュールのクライアントの帯域幅は制限されることができます。Using mod_ratelimit, which is included in the httpd module, the bandwidth of clients can be limited:

sudo nano /etc/httpd/conf.d/ratelimit.conf

ファイルの例では、600 KB/秒 ルートの場所として帯域幅を制限します。The example file limits bandwidth as 600 KB/sec under the root location:

<IfModule mod_ratelimit.c>
    <Location />
        SetOutputFilter RATE_LIMIT
        SetEnv rate-limit 600
    </Location>
</IfModule>