我一直在嘗試使用使用嵌入式Tomcat的Spring Boot應用程序來配置Apache Web服務器。春天啓動之前我用來創建像ajp.conf文件:Apache使用ajp用於Spring Boot應用程序的Tomcat
<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>
,包括像
Include /opt/lampp/apache2/conf/ajp.conf
httpd.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>
我有我的春天啓動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後面的apache上使用tomcat的好文檔。最後,我想要負載平衡多個tomcat實例。
http://docs.spring.io/autorepo/docs/spring-boot/1.0.0.RC4/api/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.html#setProtocol %28java.lang.String%29或http://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html#howto-enable-multiple-connectors-in -tomcat。 – 2014-11-21 22:44:16
你爲什麼要創建HTTP NIO連接器?您需要創建AJP連接器 - 「新連接器(」AJP/1.3「)'。 – 2014-11-22 16:11:49
@PavelHoral你把我推向了正確的方向。當我使用org.apache.coyote.ajp.AjpProtocol連接器時,它工作。不知道,我如何做是最好的辦法。但是,它現在起作用了。萬分感謝! – Nayan 2014-11-22 22:50:18