【发布时间】:2015-01-20 04:26:37
【问题描述】:
我一直在尝试使用使用嵌入式 Tomcat 的 Spring Boot 应用程序配置 Apache Web 服务器。在 Spring Boot 之前,我曾经创建一个 ajp.conf 文件,例如:
<VirtualHost *:80>
ServerName localhost
<Proxy *>
AddDefaultCharset Off
Order deny,allow
Allow from all
</Proxy>
ProxyPass /app ajp://localhost:8009/app
ProxyPassReverse /app ajp://localhost:8009/app
</VirtualHost>
并包含在 httpd.conf 文件中,如
Include /opt/lampp/apache2/conf/ajp.conf
并且在Tomcat的server.xml文件中,我曾经配置它监听8009端口
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" connectionTimeout="5000"
此设置有效。但是,现在使用 Spring Boot,我正在尝试使用嵌入式 tomcat 实现类似的功能。我在这里阅读了Spring Boot Documentation,并在我的 application.yml 文件中添加了以下属性:
server:
port: 8080
tomcat:
remote_ip_header: x-forwarded-for
protocol_header: x-forwarded-proto
我的 ajp.conf 文件如下所示:
<VirtualHost *:80>
ServerName localhost
<Proxy *>
AddDefaultCharset Off
Order deny,allow
Allow from all
</Proxy>
ProxyPass /app ajp://localhost:8009/
ProxyPassReverse /app ajp://localhost:8009/
</VirtualHost>
我的spring boot tomcat配置类为
@Configuration
public class TomcatConfiguration {
private final Logger log = LoggerFactory.getLogger(TomcatConfiguration.class);
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.addAdditionalTomcatConnectors(createConnector());
tomcat.addContextValves(createRemoteIpValves());
return tomcat;
}
private RemoteIpValve createRemoteIpValves(){
RemoteIpValve remoteIpValve = new RemoteIpValve();
remoteIpValve.setRemoteIpHeader("x-forwarded-for");
remoteIpValve.setProtocolHeader("x-forwarded-protocol");
return remoteIpValve;
}
private Connector createConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
connector.setScheme("ajp");
connector.setProtocol("AJP/1.3");
connector.setRedirectPort(8443);
//connector.setSecure(true);
connector.setPort(8009);
return connector;
}
在我的 apache 错误日志中,我看到:
AH01080: ajp_msg_check_header() got bad signature 4854
[proxy_ajp:error] [pid 24073] AH01031: ajp_ilink_receive() received bad header
[proxy_ajp:error] ajp_read_header: ajp_ilink_receive failed
[proxy_ajp:error] (120007)APR does not understand this error code: [client xx.xx.xx.xx:60916] AH00878: read response failed from (null) (*)
不确定这里发生了什么。我在网上搜索了很多,但找不到关于如何使用 spring boot 应用程序在 apache 后面提供 tomcat 的好的文档。最后,我也想对多个 tomcat 实例进行负载平衡。
【问题讨论】:
-
为什么要创建 HTTP NIO 连接器?您需要创建 AJP 连接器 -
new Connector("AJP/1.3")。 -
@PavelHoral 你把我推向了正确的方向。当我使用 org.apache.coyote.ajp.AjpProtocol 连接器时,它起作用了。不确定,我如何做到这一点是最好的方法。但是,它现在有效。非常感谢!
标签: apache tomcat7 spring-boot ubuntu-14.04 ajp