如何使用基本身份验证保护在 Apache2 虚拟主机中反向代理的 Tomcat Web 应用程序?

如何使用基本身份验证保护在 Apache2 虚拟主机中反向代理的 Tomcat Web 应用程序?

我无法弄清楚如何添加基本 HTTP 身份验证来为在生产 Web 服务器上运行的开发测试环境提供密码保护。主站点和测试环境都是使用 AJP 代理来为 Tomcat Web 应用程序的单独实例提供服务的虚拟主机。我们需要防止公众在不对 Tomcat 环境中的 web.xml 进行更改的情况下访问测试环境,保护必须通过 Apache 而不是 Tomcat 实现。但是虚拟主机中的 ProxyPass 和 ProxyPassReverse 指令似乎会覆盖 .htaccess 的使用或我在 <Directory> 控制块中放置的任何内容,同时我似乎无法在 <VirtualHost> 控制块的主体中​​使用 AuthType 之类的指令。我对 Apache(或 Tomcat)不是很有经验,不确定哪些指令可以在哪里应用以及哪些指令可能会覆盖其他指令。因为需要在生产服务器上进行更改,所以我不能轻易进行实验,因为担心会导致任何停机。

httpd.conf 本身非常简单:

LoadModule  proxy_http_module   /usr/lib/apache2/modules/mod_proxy_http.so
LoadModule  headers_module      /usr/lib/apache2/modules/mod_headers.so

LoadFile    /usr/lib/libxml2.so

相关虚拟主机文件/etc/apache2/sites-available/dev443如下:

<IfModule mod_ssl.c>
<VirtualHost dev.mydomain.com:80443>
    ServerName  dev.mydomain.com:80443
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/dev

    ProxyPass / ajp://127.0.0.1:8010/
    ProxyPassReverse / ajp://127.0.0.1:8010/

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/dev/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All 
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log

    LogLevel info

    CustomLog /var/log/apache2/ssl_access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

    SSLEngine on

    SSLCertificateFile    /etc/ssl/certs/server.crt
    SSLCertificateKeyFile /etc/ssl/private/server.key
    SSLCACertificateFile  /etc/ssl/certs/intermediate.crt

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
        SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
        SSLOptions +StdEnvVars
    </Directory>

    BrowserMatch "MSIE [2-6]" \
        nokeepalive ssl-unclean-shutdown \
        downgrade-1.0 force-response-1.0
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

</VirtualHost>
</IfModule>

据记录,涉及以下版本:Apache:2.2.14 / Tomcat:7.0.23 / Java:SE 1.6.0_26-b03 / OS:Ubuntu 10.04 LTS

答案1

正如您所发现的,这些<Directory>阻止不适用,因为您正在从代理服务器而不是本地目录提供内容。

不妨尝试<Location>一下。

<Location />
    ProxyPass ajp://127.0.0.1:8010/
    ProxyPassReverse ajp://127.0.0.1:8010/
    AuthType Basic
    AuthName "something"
    AuthUserFile /path/to/htpasswd
    Require valid-user
</Location>

相关内容