Nay*_*yan 10 apache ajp tomcat7 spring-boot ubuntu-14.04
我一直在尝试使用嵌入式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>
Run Code Online (Sandbox Code Playgroud)
并包含在httpd.conf文件中
Include /opt/lampp/apache2/conf/ajp.conf
Run Code Online (Sandbox Code Playgroud)
在Tomcat的server.xml文件中,我曾经将它配置为侦听端口8009
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" connectionTimeout="5000"
Run Code Online (Sandbox Code Playgroud)
此设置有效.但是,现在使用Spring Boot我正在尝试使用嵌入式tomcat实现类似的功能.我在这里阅读了Spring Boot Documentation,并在我的application.yml文件中添加了以下属性:
server:
port: 8080
tomcat:
remote_ip_header: x-forwarded-for
protocol_header: x-forwarded-proto
Run Code Online (Sandbox Code Playgroud)
我的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>
Run Code Online (Sandbox Code Playgroud)
我有我的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;
}
Run Code Online (Sandbox Code Playgroud)
在我的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) (*)
Run Code Online (Sandbox Code Playgroud)
不知道这里发生了什么.我在网上搜索了很多,但找不到关于如何使用spring boot应用程序在apache后面提供tomcat的好文档.最后,我想对多个tomcat实例进行负载均衡.
从以上评论中推断:
@Configuration
public class TomcatAjpConfig {
@Bean
@SuppressWarnings("static-method")
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.addAdditionalTomcatConnectors(createConnector());
tomcat.addContextValves(createRemoteIpValves());
return tomcat;
}
private static RemoteIpValve createRemoteIpValves() {
RemoteIpValve remoteIpValve = new RemoteIpValve();
remoteIpValve.setRemoteIpHeader("x-forwarded-for");
remoteIpValve.setProtocolHeader("x-forwarded-proto");
return remoteIpValve;
}
private static Connector createConnector() {
Connector connector = new Connector("AJP/1.3");
connector.setPort(8009);
return connector;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14583 次 |
| 最近记录: |