在 ssl VirtualHost 中设置 Apache mod_jk

Posted

技术标签:

【中文标题】在 ssl VirtualHost 中设置 Apache mod_jk【英文标题】:Setting up Apache mod_jk in ssl VirtualHost 【发布时间】:2016-05-04 06:10:09 【问题描述】:

我在将我的 Apache mod_jk 配置从它自己的 VirtualHost 配置移动到我的主 ssl VirtualHost 配置时遇到问题。

Tomcat 使用 mod_jk 和 VirtualHost 配置使用自己的域工作正常 - 工作配置....

LoadModule jk_module  /etc/httpd/modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkShmFile     /var/log/httpd/mod_jk.shm
JkLogFile     /var/log/httpd/mod_jk.log
JkLogLevel    info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

<VirtualHost *:80>
    ServerName <my cname>
    DocumentRoot /opt/appserver/webapps/ROOT
    DirectoryIndex index_page.jsp       

    <Directory />
                Options FollowSymLinks
                AllowOverride None
    </Directory>

    <Directory /opt/appserver/webapps/ROOT>
                AllowOverride None
                Options FollowSymLinks
                Order allow,deny
                allow from all
    </Directory>

    JkMount /* ajp13
</VirtualHost>

但是,因为我想将我的 Tomcat 表单嵌入到我的 ssl 主服务器页面中(不能混合使用 http 和 https),我需要将我的 mod_jk 配置作为子文件夹移动到我的主 ssl VirtualHost 中。我尝试了以下更改,但在尝试访问 https:// 时出现 Tomcat 错误“HTTP 状态 404 - /servlet/”

新的服务器配置:

<VirtualHost _default_:443>

...lots of my main ssl server config stuff...

Alias /servlet /opt/appserver/webapps/ROOT

JkMount /servlet/* ajp13

<Directory /opt/appserver/webapps/ROOT>
        AllowOverride None
        Options FollowSymLinks
        Order allow,deny
        allow from all
        DirectoryIndex index_page.jsp
</Directory>

</VirtualHost>

【问题讨论】:

请发布 mod-jk、httpd 和 tomcat 日志以了解确切问题 页面请求没有 tomcat 日志。 ssl_access_log 中有一个 404 日志,但是呈现给浏览器的 404 消息来自于 tomcat(它有一个 'Apache Tomcat/7.0.59' 页脚)。 【参考方案1】:
    确保您的域证书生成准确 在 /etc/apache2/ 目录中复制 *key.pem 和 *cert.pem 写如下

<VirtualHost _default_:443> DocumentRoot "/opt/appserver/webapps/Your-Project-Directory" ServerName YourDomain.com ErrorLog "/var/log/apache2/https_YourDomain.com-error_log" CustomLog "/var/log/apache2/https_YourDomain.com-access_log" common SSLEngine On SSLCertificateFile /etc/apache2/*cert.pem SSLCertificateKeyFile /etc/apache2/*key.pem JkMountCopy On JkMount /* ajp13 </VirtualHost>

    在 /etc/httpd/httpd.conf 文件中添加 Listen 443,只需在开头找到的 Listen 80 下添加这一行即可。

现在你可以同时访问 http 和 https

【讨论】:

您的所有建议都已在我的配置中生效(我的...很多其他的东西...评论)。问题似乎是当 DocumentRoot 设置为 /opt/appserver/webapps/ROOT 时 mod_jk 正在工作,但是当我使用别名时它停止工作(可能,我的想法已经用完了)。 您是否在 server.xml 文件中设置了虚拟主机?【参考方案2】:

结果证明这是一个 Apache Alias 问题。实际上我无法让 mod_jk 与 Apache Alias 一起工作,所以我将 Tomcat 内容放在 Apache DirectoryRoot 中(原始配置,但打开了 ssl)并使用:

SetEnvIf Request_URI "/content/*" no-jk
Alias /content /path/to/content

启用非 Tomcat 内容。读者还应该检查(如果他们正在使用这种技术)他们是否已将“RewriteBase /content”添加到他们的 .htaccess 文件中。

【讨论】:

以上是关于在 ssl VirtualHost 中设置 Apache mod_jk的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Zeppelin 中设置 SSL

OSX Apache Virtualhost 仅返回默认页面

在 python http.client.HTTPSConnection 中设置更新的 ssl 版本

SSL pinning - 在 AFSecurityPolicy 中设置固定公钥而不是固定证书

在 Amazon ec2 中设置 GoDaddy SSL

grpc/go 如何在 grpc.Dial 中设置 grpc.ssl_target_name_override