Hospedar o ASP.NET Core no Linux com o ApacheHost ASP.NET Core on Linux with Apache

Por Shayne BoyerBy Shayne Boyer

Usando este guia, saiba como configurar o Apache como um servidor proxy reverso no CentOS 7 para redirecionar o tráfego HTTP para um aplicativo Web ASP.NET Core em execução no servidor 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 server. A extensão mod_proxy e os módulos relacionados criam o proxy reverso do servidor.The mod_proxy extension and related modules create the server's reverse proxy.

Pré-requisitosPrerequisites

  • Servidor que executa o CentOS 7 com uma conta de usuário padrão com privilégio sudo.Server running CentOS 7 with a standard user account with sudo privilege.
  • Instale o tempo de execução do .NET Core no servidor.Install the .NET Core runtime on the server.
    1. Acesse a página Todos os Downloads do .NET Core.Visit the .NET Core All Downloads page.
    2. Selecione o tempo de execução não de versão prévia mais recente da lista em Tempo de Execução.Select the latest non-preview runtime from the list under Runtime.
    3. Selecione e siga as instruções para CentOS/Oracle.Select and follow the instructions for CentOS/Oracle.
  • Um aplicativo ASP.NET Core existente.An existing ASP.NET Core app.

Publicar e copiar o aplicativoPublish and copy over the app

Configurar o aplicativo para um implantação dependente de estrutura.Configure the app for a framework-dependent deployment.

Se o aplicativo for executado localmente e não estiver configurado para fazer conexões seguras (HTTPS), adote uma das seguintes abordagens:If the app is run locally and isn't configured to make secure connections (HTTPS), adopt either of the following approaches:

  • Configure o aplicativo para lidar com conexões seguras locais.Configure the app to handle secure local connections. Para obter mais informações, veja a seção Configuração de HTTPS.For more information, see the HTTPS configuration section.
  • Remova https://localhost:5001 (se houver) da propriedade applicationUrl no arquivo Properties/launchSettings.json.Remove https://localhost:5001 (if present) from the applicationUrl property in the Properties/launchSettings.json file.

Execute dotnet publish do ambiente de desenvolvimento para empacotar um aplicativo em um diretório (por exemplo, bin/Release/<target_framework_moniker>/publish) que pode ser executado no servidor:Run dotnet publish from the development environment to package an app into a directory (for example, bin/Release/<target_framework_moniker>/publish) that can run on the server:

dotnet publish --configuration Release

O aplicativo também poderá ser publicado como uma implantação autossuficiente se você preferir não manter o tempo de execução do .NET Core no servidor.The app can also be published as a self-contained deployment if you prefer not to maintain the .NET Core runtime on the server.

Copie o aplicativo ASP.NET Core para o servidor usando uma ferramenta que se integre ao fluxo de trabalho da organização (por exemplo, SCP, SFTP).Copy the ASP.NET Core app to the server using a tool that integrates into the organization's workflow (for example, SCP, SFTP). É comum para localizar os aplicativos Web no diretório var (por exemplo, var/www/helloapp).It's common to locate web apps under the var directory (for example, var/www/helloapp).

Observação

Em um cenário de implantação de produção, um fluxo de trabalho de integração contínua faz o trabalho de publicar o aplicativo e copiar os ativos para o servidor.Under a production deployment scenario, a continuous integration workflow does the work of publishing the app and copying the assets to the server.

Configurar um servidor proxyConfigure a proxy server

Um proxy reverso é uma configuração comum para atender a aplicativos Web dinâmicos.A reverse proxy is a common setup for serving dynamic web apps. O proxy reverso encerra a solicitação HTTP e a encaminha para o aplicativo ASP.NET.The reverse proxy terminates the HTTP request and forwards it to the ASP.NET app.

Um servidor proxy é aquele que encaminha as solicitações de cliente para outro servidor, em vez de atendê-las por conta própria.A proxy server is one which forwards client requests to another server instead of fulfilling requests itself. Um proxy reverso encaminha para um destino fixo, normalmente, em nome de clientes arbitrários.A reverse proxy forwards to a fixed destination, typically on behalf of arbitrary clients. Neste guia, o Apache é configurado como o proxy reverso em execução no mesmo servidor em que o Kestrel está servindo o aplicativo 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.

Uma vez que as solicitações são encaminhadas pelo proxy reverso, use o Middleware de Cabeçalhos Encaminhados do pacote Microsoft.AspNetCore.HttpOverrides.Because requests are forwarded by reverse proxy, use the Forwarded Headers Middleware from the Microsoft.AspNetCore.HttpOverrides package. O middleware atualiza o Request.Scheme usando o cabeçalho X-Forwarded-Proto, de forma que URIs de redirecionamento e outras políticas de segurança funcionam corretamente.The middleware updates the Request.Scheme, using the X-Forwarded-Proto header, so that redirect URIs and other security policies work correctly.

Qualquer componente que dependa do esquema, como autenticação, geração de link, redirecionamentos e localização geográfica, deverá ser colocado depois de invocar o Middleware de Cabeçalhos Encaminhados.Any component that depends on the scheme, such as authentication, link generation, redirects, and geolocation, must be placed after invoking the Forwarded Headers Middleware. Como regra geral, o Middleware de Cabeçalhos Encaminhados deve ser executado antes de outro middleware, exceto middleware de tratamento de erro e de diagnóstico.As a general rule, Forwarded Headers Middleware should run before other middleware except diagnostics and error handling middleware. Essa ordenação garantirá que o middleware conte com informações de cabeçalhos encaminhadas que podem consumir os valores de cabeçalho para processamento.This ordering ensures that the middleware relying on forwarded headers information can consume the header values for processing.

Invoque o método UseForwardedHeaders em Startup.Configure antes de chamar UseAuthentication ou outro middleware de esquema de autenticação semelhante.Invoke the UseForwardedHeaders method in Startup.Configure before calling UseAuthentication or similar authentication scheme middleware. Configure o middleware para encaminhar os cabeçalhos X-Forwarded-For e X-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();

Se nenhum ForwardedHeadersOptions for especificado para o middleware, os cabeçalhos padrão para encaminhar serão None.If no ForwardedHeadersOptions are specified to the middleware, the default headers to forward are None.

Os proxies em execução em endereços de loopback (127.0.0.0/8, [::1]), incluindo o endereço de host local padrão (127.0.0.1), são confiáveis por padrão.Proxies running on loopback addresses (127.0.0.0/8, [::1]), including the standard localhost address (127.0.0.1), are trusted by default. Se outros proxies ou redes confiáveis em que a organização trata solicitações entre a Internet e o servidor Web, adicione-os à lista de KnownProxies ou KnownNetworks com ForwardedHeadersOptions.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. O exemplo a seguir adiciona um servidor proxy confiável no endereço IP 10.0.0.100 ao Middleware de cabeçalhos encaminhados KnownProxies em Startup.ConfigureServices:The following example adds a trusted proxy server at IP address 10.0.0.100 to the Forwarded Headers Middleware KnownProxies in Startup.ConfigureServices:

services.Configure<ForwardedHeadersOptions>(options =>
{
    options.KnownProxies.Add(IPAddress.Parse("10.0.0.100"));
});

Para obter mais informações, consulte Configure o ASP.NET Core para trabalhar com servidores proxy e balanceadores de carga.For more information, see Configure o ASP.NET Core para trabalhar com servidores proxy e balanceadores de carga.

Instalar o ApacheInstall Apache

Atualize os pacotes CentOS para as respectivas versões estáveis mais recentes:Update CentOS packages to their latest stable versions:

sudo yum update -y

Instale o servidor Web do Apache no CentOS com um único comando yum:Install the Apache web server on CentOS with a single yum command:

sudo yum -y install httpd mod_ssl

Saída de exemplo depois de executar o comando: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!

Observação

Neste exemplo, o resultado reflete httpd.86_64, pois a versão do CentOS 7 é de 64 bits.In this example, the output reflects httpd.86_64 since the CentOS 7 version is 64 bit. Para verificar o local em que o Apache está instalado, execute whereis httpd em um prompt de comando.To verify where Apache is installed, run whereis httpd from a command prompt.

Configurar o ApacheConfigure Apache

Os arquivos de configuração do Apache estão localizados no diretório /etc/httpd/conf.d/.Configuration files for Apache are located within the /etc/httpd/conf.d/ directory. Qualquer arquivo com a extensão .conf é processado em ordem alfabética, além dos arquivos de configuração do módulo em /etc/httpd/conf.modules.d/, que contém todos os arquivos de configuração necessários para carregar os módulos.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.

Crie um arquivo de configuração chamado helloapp.conf para o aplicativo:Create a configuration file, named helloapp.conf, for the app:

<VirtualHost *:*>
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>

<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}helloapp-error.log
    CustomLog ${APACHE_LOG_DIR}helloapp-access.log common
</VirtualHost>

O bloco VirtualHost pode aparecer várias vezes, em um ou mais arquivos em um servidor.The VirtualHost block can appear multiple times, in one or more files on a server. No arquivo de configuração anterior, o Apache aceita tráfego público na porta 80.In the preceding configuration file, Apache accepts public traffic on port 80. O domínio www.example.com está sendo atendido e o alias *.example.com é resolvido para o mesmo site.The domain www.example.com is being served, and the *.example.com alias resolves to the same website. Veja Suporte a host virtual baseado em nome para obter mais informações.See Name-based virtual host support for more information. As solicitações passadas por proxy na raiz para a porta 5000 do servidor em 127.0.0.1.Requests are proxied at the root to port 5000 of the server at 127.0.0.1. Para a comunicação bidirecional, ProxyPass e ProxyPassReverse são necessários.For bi-directional communication, ProxyPass and ProxyPassReverse are required. Para alterar o IP/porta do Kestrel, veja Kestrel: configuração do ponto de extremidade.To change Kestrel's IP/port, see Kestrel: Endpoint configuration.

Aviso

Falha ao especificar uma diretiva ServerName no bloco VirtualHost expõe seu aplicativo para vulnerabilidades de segurança.Failure to specify a proper ServerName directive in the VirtualHost block exposes your app to security vulnerabilities. Associações de curinga de subdomínio (por exemplo, *.example.com) não oferecerão esse risco de segurança se você controlar o domínio pai completo (em vez de *.com, o qual é vulnerável).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). Veja rfc7230 section-5.4 para obter mais informações.See rfc7230 section-5.4 for more information.

O registro em log pode ser configurado por VirtualHost usando diretivas ErrorLog e CustomLog.Logging can be configured per VirtualHost using ErrorLog and CustomLog directives. ErrorLog é o local em que o servidor registrará em log os erros, enquanto CustomLog define o nome de arquivo e o formato do arquivo de log.ErrorLog is the location where the server logs errors, and CustomLog sets the filename and format of log file. Nesse caso, esse é o local em que as informações de solicitação são registradas em log.In this case, this is where request information is logged. Há uma linha para cada solicitação.There's one line for each request.

Salve o arquivo e teste a configuração.Save the file and test the configuration. Se tudo passar, a resposta deverá ser Syntax [OK].If everything passes, the response should be Syntax [OK].

sudo service httpd configtest

Reinicie o Apache:Restart Apache:

sudo systemctl restart httpd
sudo systemctl enable httpd

Monitorar o aplicativoMonitor the app

O Apache agora está configurado para encaminhar solicitações feitas a http://localhost:80 para o aplicativo ASP.NET Core em execução no Kestrel em 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. No entanto, o Apache não está configurado para gerenciar o processo do Kestrel.However, Apache isn't set up to manage the Kestrel process. Use systemd e crie um arquivo de serviço para iniciar e monitorar o aplicativo Web subjacente.Use systemd and create a service file to start and monitor the underlying web app. systemd é um sistema de inicialização que fornece muitos recursos poderosos para iniciar, parar e gerenciar processos.systemd is an init system that provides many powerful features for starting, stopping, and managing processes.

Criar o arquivo de serviçoCreate the service file

Crie o arquivo de definição de serviço:Create the service definition file:

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

Eis um exemplo de arquivo de serviço para o aplicativo:An example service file for the app:

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

[Service]
WorkingDirectory=/var/www/helloapp
ExecStart=/usr/local/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=apache
Environment=ASPNETCORE_ENVIRONMENT=Production 

[Install]
WantedBy=multi-user.target

Se o usuário apache não for usado pela configuração, o usuário precisará ser criado primeiro e a propriedade adequada dos arquivos precisará ser concedida a ele.If the user apache isn't used by the configuration, the user must be created first and given proper ownership of files.

Use TimeoutStopSec para configurar a duração do tempo de espera para o aplicativo desligar depois de receber o sinal de interrupção inicial.Use TimeoutStopSec to configure the duration of time to wait for the app to shut down after it receives the initial interrupt signal. Se o aplicativo não desligar nesse período, o SIGKILL será emitido para encerrá-lo.If the app doesn't shut down in this period, SIGKILL is issued to terminate the app. Forneça o valor como segundos sem unidade (por exemplo, 150), um valor de duração (por exemplo, 2min 30s) ou infinity para desabilitar o tempo limite.Provide the value as unitless seconds (for example, 150), a time span value (for example, 2min 30s), or infinity to disable the timeout. TimeoutStopSec é revertido para o valor padrão de DefaultTimeoutStopSec no arquivo de configuração do gerenciador (systemd-system.conf, system.conf.d, systemd-user.conf e 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). O tempo limite padrão para a maioria das distribuições é de 90 segundos.The default timeout for most distributions is 90 seconds.

# The default value is 90 seconds for most distributions.
TimeoutStopSec=90

Alguns valores (por exemplo, cadeias de conexão de SQL) devem ser escapadas para que os provedores de configuração leiam as variáveis de ambiente.Some values (for example, SQL connection strings) must be escaped for the configuration providers to read the environment variables. Use o seguinte comando para gerar um valor corretamente com caracteres de escape para uso no arquivo de configuração:Use the following command to generate a properly escaped value for use in the configuration file:

systemd-escape "<value-to-escape>"

Separadores do tipo dois-pontos (:) não são compatíveis com nomes de variáveis de ambiente.Colon (:) separators aren't supported in environment variable names. Use um sublinhado duplo (__) no lugar de dois-pontos.Use a double underscore (__) in place of a colon. O provedor de configuração de Variáveis de Ambiente converte caracteres de sublinhado duplo em dois-pontos quando as variáveis de ambiente são lidas na configuração.The Environment Variables configuration provider converts double-underscores into colons when environment variables are read into configuration. No exemplo a seguir, a chave de cadeia de conexão ConnectionStrings:DefaultConnection está definida no arquivo de definição de serviço como ConnectionStrings__DefaultConnection: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}

Salve o arquivo e habilite o serviço:Save the file and enable the service:

sudo systemctl enable kestrel-helloapp.service

Inicie o serviço e verifique se ele está em execução: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 CentOS 7
    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

Com o proxy reverso configurado e o Kestrel gerenciado por meio de systemd, o aplicativo Web está totalmente configurado e pode ser acessado em um navegador no computador local em 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. Inspecionando os cabeçalhos de resposta, o cabeçalho Server indica que o aplicativo ASP.NET Core é servido pelo 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

Exibir logsView logs

Já que o aplicativo Web usando Kestrel é gerenciado usando systemd, os eventos e os processos são registrados em um diário centralizado.Since the web app using Kestrel is managed using systemd, events and processes are logged to a centralized journal. No entanto, esse diário contém todas as entradas para todos os serviços e processos gerenciados por systemd.However, this journal includes entries for all of the services and processes managed by systemd. Para exibir os itens específicos de kestrel-helloapp.service, use o seguinte comando:To view the kestrel-helloapp.service-specific items, use the following command:

sudo journalctl -fu kestrel-helloapp.service

Para filtragem de hora, especifique opções de tempo com o comando.For time filtering, specify time options with the command. Por exemplo, use --since today para filtrar o dia atual ou --until 1 hour ago para ver as entradas da hora anterior.For example, use --since today to filter for the current day or --until 1 hour ago to see the previous hour's entries. Para obter mais informações, confira a página de manual para journalctl.For more information, see the man page for journalctl.

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

Proteção de dadosData protection

A pilha de proteção de dados do ASP.NET Core é usada por vários middlewares do ASP.NET Core, incluindo o middleware de autenticação (por exemplo, o middleware de cookie) e as proteções de CSRF (solicitação intersite forjada).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. Mesmo se as APIs de Proteção de Dados não forem chamadas pelo código do usuário, a proteção de dados deverá ser configurada para criar um repositório de chaves criptográfico persistente.Even if Data Protection APIs aren't called by user code, data protection should be configured to create a persistent cryptographic key store. Se a proteção de dados não estiver configurada, as chaves serão mantidas na memória e descartadas quando o aplicativo for reiniciado.If data protection isn't configured, the keys are held in memory and discarded when the app restarts.

Se o token de autenticação for armazenado na memória quando o aplicativo for reiniciado:If the key ring is stored in memory when the app restarts:

  • Todos os tokens de autenticação baseados em cookies serão invalidados.All cookie-based authentication tokens are invalidated.
  • Os usuários precisam entrar novamente na próxima solicitação deles.Users are required to sign in again on their next request.
  • Todos os dados protegidos com o token de autenticação não poderão mais ser descriptografados.Any data protected with the key ring can no longer be decrypted. Isso pode incluir os tokens CSRF e cookies TempData do MVC do ASP.NET Core.This may include CSRF tokens and ASP.NET Core MVC TempData cookies.

Para configurar a proteção de dados de modo que ela mantenha e criptografe o token de autenticação, consulte:To configure data protection to persist and encrypt the key ring, see:

Proteger o aplicativoSecure the app

Configurar o firewallConfigure firewall

Firewalld é um daemon dinâmico para gerenciar o firewall com suporte para zonas de rede.Firewalld is a dynamic daemon to manage the firewall with support for network zones. Portas e filtragem de pacote ainda podem ser gerenciados pelo iptables.Ports and packet filtering can still be managed by iptables. Firewalld deve ser instalado por padrão.Firewalld should be installed by default. yum pode ser usado para instalar o pacote ou verificar se ele está instalado.yum can be used to install the package or verify it's installed.

sudo yum install firewalld -y

Use firewalld para abrir somente as portas necessárias para o aplicativo.Use firewalld to open only the ports needed for the app. Nesse caso, as portas 80 e 443 são usadas.In this case, port 80 and 443 are used. Os comandos a seguir definem permanentemente as portas 80 e 443 para estarem abertas: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

Recarregue as configurações de firewall.Reload the firewall settings. Verifique os serviços e as portas disponíveis na zona padrão.Check the available services and ports in the default zone. As opções estão disponíveis por meio da inspeção de 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: 

Configuração de HTTPSHTTPS configuration

Configurar o aplicativo para conexões seguras (HTTPS) locaisConfigure the app for secure (HTTPS) local connections

O comando dotnet run usa o arquivo Properties/launchSettings.json do aplicativo, que configura o aplicativo para escutar nas URLs fornecidas pela propriedade applicationUrl (por exemplo, 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).

Configure o aplicativo para usar um certificado no desenvolvimento para o comando dotnet run ou no ambiente de desenvolvimento (F5 ou Ctrl + F5 no Visual Studio Code) usando uma das seguintes abordagens: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:

Configurar o proxy reverso para conexões de cliente seguras (HTTPS)Configure the reverse proxy for secure (HTTPS) client connections

Para configurar o Apache para HTTPS, o módulo mod_ssl é usado.To configure Apache for HTTPS, the mod_ssl module is used. Quando o módulo httpd foi instalado, o módulo mod_ssl também foi instalado.When the httpd module was installed, the mod_ssl module was also installed. Se ele não foi instalado, use yum para adicioná-lo à configuração.If it wasn't installed, use yum to add it to the configuration.

sudo yum install mod_ssl

Para impor o HTTPS, instale o módulo mod_rewrite para habilitar a regravação de URL:To enforce HTTPS, install the mod_rewrite module to enable URL rewriting:

sudo yum install mod_rewrite

Modifique o arquivo helloapp.conf para habilitar a regravação de URL e proteger a comunicação na porta 443:Modify the helloapp.conf file to enable URL rewriting and secure communication on port 443:

<VirtualHost *:*>
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>

<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [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/helloapp-error.log
    CustomLog /var/log/httpd/helloapp-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>

Observação

Este exemplo usa um certificado gerado localmente.This example is using a locally-generated certificate. SSLCertificateFile deve ser o arquivo de certificado primário para o nome de domínio.SSLCertificateFile should be the primary certificate file for the domain name. SSLCertificateKeyFile deve ser o arquivo de chave gerado quando o CSR é criado.SSLCertificateKeyFile should be the key file generated when CSR is created. SSLCertificateChainFile deve ser o arquivo de certificado intermediário (se houver) fornecido pela autoridade de certificação.SSLCertificateChainFile should be the intermediate certificate file (if any) that was supplied by the certificate authority.

Salve o arquivo e teste a configuração:Save the file and test the configuration:

sudo service httpd configtest

Reinicie o Apache:Restart Apache:

sudo systemctl restart httpd

Sugestões adicionais do ApacheAdditional Apache suggestions

Cabeçalhos adicionaisAdditional headers

Para proteção contra ataques mal-intencionados, há alguns cabeçalhos que devem ser modificados ou adicionados.In order to secure against malicious attacks, there are a few headers that should either be modified or added. Verifique se o módulo mod_headers está instalado:Ensure that the mod_headers module is installed:

sudo yum install mod_headers

Proteger o Apache contra ataques de clickjackingSecure Apache from clickjacking attacks

Clickjacking, também conhecido como um ataque por inferência na interface do usuário, é um ataque mal-intencionado em que o visitante do site é levado a clicar em um link ou botão em uma página diferente daquela que está visitando atualmente.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. Use X-FRAME-OPTIONS para proteger o site.Use X-FRAME-OPTIONS to secure the site.

Para atenuar ataques de clickjacking:To mitigate clickjacking attacks:

  1. Edite o arquivo httpd.conf:Edit the httpd.conf file:

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

    Adicione a linha Header append X-FRAME-OPTIONS "SAMEORIGIN".Add the line Header append X-FRAME-OPTIONS "SAMEORIGIN".

  2. Salve o arquivo.Save the file.

  3. Reinicie o Apache.Restart Apache.

Detecção de tipo MIMEMIME-type sniffing

O cabeçalho X-Content-Type-Options impedirá o Internet Explorer de farejar por MIME (determinar o Content-Type de um arquivo com base no conteúdo do arquivo).The X-Content-Type-Options header prevents Internet Explorer from MIME-sniffing (determining a file's Content-Type from the file's content). Se o servidor define o cabeçalho Content-Type para text/html com a opção nosniff definida, o Internet Explorer renderiza o conteúdo como text/html, independentemente do conteúdo do arquivo.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.

Edite o arquivo httpd.conf:Edit the httpd.conf file:

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

Adicione a linha Header set X-Content-Type-Options "nosniff".Add the line Header set X-Content-Type-Options "nosniff". Salve o arquivo.Save the file. Reinicie o Apache.Restart Apache.

Balanceamento de cargaLoad Balancing

Este exemplo mostra como instalar e configurar o Apache no CentOS 7 e no Kestrel no mesmo computador da instância.This example shows how to setup and configure Apache on CentOS 7 and Kestrel on the same instance machine. Para não ter um ponto único de falha, o uso de mod_proxy_balancer e a modificação do VirtualHost permitiriam o gerenciamento de várias instâncias dos aplicativos Web protegidos pelo servidor proxy do Apache.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

No arquivo de configuração mostrado abaixo, uma instância adicional do helloapp é configurada para ser executada na porta 5001.In the configuration file shown below, an additional instance of the helloapp is set up to run on port 5001. A seção Proxy é definida com uma configuração de balanceador com dois membros para balancear carga de byrequests.The Proxy section is set with a balancer configuration with two members to load balance byrequests.

<VirtualHost *:*>
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>

<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [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/helloapp-error.log
    CustomLog /var/log/httpd/helloapp-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>

Limites de taxaRate Limits

Usando mod_ratelimit, que está incluído no módulo httpd, a largura de banda de clientes pode ser limitada: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

O arquivo de exemplo limita a largura de banda a 600 KB/s no local raiz: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>

Campos de cabeçalho da solicitação muito grandesLong request header fields

Se o aplicativo exigir campos de cabeçalho de solicitação maiores do que o permitido pela configuração padrão do servidor proxy (normalmente 8.190 bytes), ajuste o valor da diretiva LimitRequestFieldSize.If the app requires request header fields longer than permitted by the proxy server's default setting (typically 8,190 bytes), adjust the value of the LimitRequestFieldSize directive. O valor que será aplicada é dependentes de cenário.The value to apply is scenario-dependent. Para obter mais informações, confira a documentação do servidor.For more information, see your server's documentation.

Aviso

Não aumente o valor padrão de LimitRequestFieldSize a menos que necessário.Don't increase the default value of LimitRequestFieldSize unless necessary. Aumentar esse valor aumenta o risco de estouro de buffer (estouro) e ataques de DoS (negação de serviço) por usuários mal-intencionados.Increasing the value increases the risk of buffer overrun (overflow) and Denial of Service (DoS) attacks by malicious users.

Recursos adicionaisAdditional resources