Apache Mod_Proxy como Front-End de acesso e balanceamento de diversas aplicações web
Já pensou em ter que disponibilizar uma porta 80 ou 443 para cada aplicação web? Não seria nada barato e nem prático. Mesmo que você tenha um range de IPs fixos para isso, não seria muito interessante. Então, conheça (caso ainda não) o Apache Mod_Proxy para resolver este problema!
Parte 8: Front-End para SSL
Agora, que tal utilizarmos o Mod_Proxy + SSL (HTTPS)? Sim, ele também pode ser utilizado para as requisições que trafegam em HTTPS.
Vamos ao exemplo do item 4, onde já temos um balanceador de carga configurado com o Mod_Cluste,r que é bastante utilizado para front-end de servidores JBoss (a configuração desse módulo é assunto para outro artigo) e que não pode estar configurado diretamente como front-end no mesmo servidor que estamos utilizando, por incompatibilidade entre os módulos. Nesse caso, vamos transformá-lo também em um back-end.
Veja como configuramos este exemplo:
Observe as linhas comentadas, elas são respectivamente a ativação do modo proxy para SSL e as 2 linhas que especificam o certificado SSL do site. Mais abaixo, as instruções ProxyPass e ProxyPassReverse para HTTPS.
É importante que o back-end aceite requisições HTTPS, porém, apenas o front-end precisa ter o certificado válido (apenas por conveniência e para não aparecer a tradicional mensagem de certificado inválido, não há qualquer problema em utilizar um certificado auto-assinado).
Vamos ao exemplo do item 4, onde já temos um balanceador de carga configurado com o Mod_Cluste,r que é bastante utilizado para front-end de servidores JBoss (a configuração desse módulo é assunto para outro artigo) e que não pode estar configurado diretamente como front-end no mesmo servidor que estamos utilizando, por incompatibilidade entre os módulos. Nesse caso, vamos transformá-lo também em um back-end.
Veja como configuramos este exemplo:
<VirtualHost _default_:443>
ServerName nome3.site.com:443
ServerAlias nome3.site.com:443
ErrorLog logs/nome3_site_ssl_error_log
TransferLog logs/nome3_site_ssl_access_log
LogLevel warn
SSLEngine on
SSLProxyEngine on # Ativação de proxy SSL
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile "/etc/httpd/conf.d/ssl/app.cer" # Certificado válido assinado pela CA
SSLCertificateKeyFile "/etc/httpd/conf.d/ssl/app.key" # Chave privada utilizada para gerar a CSR
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
ProxyRequests Off
ProxyPreserveHost On
<Proxy 192.168.1.1:443>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /app https://192.168.1.5/app # Redirecionamento em https
ProxyPassReverse /app https://192.168.1.5/app # Redirecionamento em https
</VirtualHost>
ServerName nome3.site.com:443
ServerAlias nome3.site.com:443
ErrorLog logs/nome3_site_ssl_error_log
TransferLog logs/nome3_site_ssl_access_log
LogLevel warn
SSLEngine on
SSLProxyEngine on # Ativação de proxy SSL
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile "/etc/httpd/conf.d/ssl/app.cer" # Certificado válido assinado pela CA
SSLCertificateKeyFile "/etc/httpd/conf.d/ssl/app.key" # Chave privada utilizada para gerar a CSR
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
ProxyRequests Off
ProxyPreserveHost On
<Proxy 192.168.1.1:443>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /app https://192.168.1.5/app # Redirecionamento em https
ProxyPassReverse /app https://192.168.1.5/app # Redirecionamento em https
</VirtualHost>
Observe as linhas comentadas, elas são respectivamente a ativação do modo proxy para SSL e as 2 linhas que especificam o certificado SSL do site. Mais abaixo, as instruções ProxyPass e ProxyPassReverse para HTTPS.
É importante que o back-end aceite requisições HTTPS, porém, apenas o front-end precisa ter o certificado válido (apenas por conveniência e para não aparecer a tradicional mensagem de certificado inválido, não há qualquer problema em utilizar um certificado auto-assinado).