Glassfish / JBoss / Tomcat의 프론트 엔드로 Apache를 실행해야합니까? 전, Tomcat을 앱 서버로 실행하는

저는 주로 Java 개발자이며 개발자와 sysadmins의 차이를 둘러싼 질문을하게됩니다.

몇 년 전, Tomcat을 앱 서버로 실행하는 것이 참신한 일이었을 때 Apache와 함께 사용하는 것이 관례였습니다. 내가 이해하는 것처럼 이것은 다음과 같은 이유로 수행되었습니다.

  1. Java는 “느린”것으로 간주되어 Apache가 정적 컨텐츠를 직접 제공하도록하는 것이 도움이되었습니다.
  2. 루트로 실행하지 않으면 Tomcat이 포트 80/443을 수신 할 수 없었습니다.

Java는 더 이상 느린 것으로 간주되지 않으며 Apache를 믹스에 추가하면 실제로 속도를 높이는 데 도움이되지 않습니다.

포트 문제에 관해서는 요즘 앱 서버를 포트 80/443에 연결하는 더 간단한 방법이 있습니다.

그래서 제 질문은 요즘 Apache와 Java Webapps를 정면으로 맞설 때 어떤 이점이 있습니까? 그렇다면 아파치는 여전히 갈 길입니까? Nginx를 봐야합니까? Tomcat 대신 Glassfish를 사용하고 있습니다.



답변

대부분의 사람들은 정적 파일 때문에 앞에 뭔가가 필요하다고 말합니다.

다음과 같은 이유로 다소 바보입니다.

  • APR에서 아파치와 동일한 IO를 사용하도록 Tomcat을 구성 할 수 있습니다.
  • 어쨌든 CDN (콘텐츠 전송 네트워크)을 사용해야합니다.

부하 분산 및 장애 조치를 처리하기 위해 Tomcat / jetty / jboss 앞에 무언가가 필요한 실제 이유.

… Tomcat 엔진은 전체 생태계의 아킬레스 건입니다 … “라는 말을 듣지 않는 것이 좋습니다. 우리 모두가 사실이 아님을 알기 때문에 데이터베이스와 연결 풀링은 그럴 것입니다.


답변

앱 주변의 생태계에 따라 다릅니다. 인트라넷 환경에서 Tomcat 앞에는 아무것도 필요하지 않습니다.

인터넷을 통해 대중을 대상으로하는 서비스 인 경우에 따라 다릅니다. 아파치는 mod_security와 같은 모듈을 제공하기 때문에 좋습니다. 그러나 아파치 (또는 ngix)의 구성에 대해 잘 모르면 구성 오류로 인해 더 많은 공격이나 실패 지점에 노출 될 수 있습니다.

앞의 Apache는 webapp을 업그레이드하고 재시작을 기다려야하는 경우 중단 페이지를 제공하는 데 유용합니다. 그러나 재시작이 드물거나 올바르게 시간이 정해진 경우 Tomcat을 독립형으로 전환해야하는 또 다른 이유입니다.

Tomcat FAQ는 http://wiki.apache.org/tomcat/FAQ/Connectors#Q3과 같은 추가 사항을 다루는 이것에 대해서도 설명합니다
.


답변

Apache는 다중 프로세스 특성으로 인해 정적 컨텐츠를 제공하기에 적합하지 않습니다. Nginx는 비동기 I / O를 사용하여 요청을 처리하므로 더 적합합니다. 최신 Tomcat은 비동기 I / O (Java 용어의 NIO)도 사용할 수 있습니다. 예를 들어 tomcat-nativeTomcat이 비동기 I / O를 사용하도록 Fedora에 패키지를 설치해야합니다 .


답변

놀랍고, 이러한 답변 중 일부는 실제로 고성능 다중 계층 및 다중 서버 Tomcat 지원 웹 사이트를 운영하는 사람이 있습니까? OP, Tomcat이 “느린”것이 아니라는 당신의 원래 가정 … 와우. Tomcat 엔진은 전체 생태계의 아킬레스 건입니다.

예, 아파치를 앞두고 싶습니다. 웹 서버를 보호하는 htaccess 파일뿐만 아니라 가장 먼저 mod_rewrite (Tomcat에서 UrlRewriteFilter를 구현 했습니까?)를 제공합니다. Apache를 사용하면 Tomcat 노드 뒤에로드 밸런싱을 할 수 있고 정적 컨텐츠를 훨씬 빠르게 제공하고 Tomcat에서 비 Java (js / css / html / jpg / etc 등)로 요청 파이프를 오버로드하지 않기 때문에 Tomcat에서 더 나은 성능을 얻을 수 있습니다. 소지품. Apache에서 SSL을 오프로드 (하드웨어 LB에서 오프로드하지 않는 경우)하고 Java Keystore라는 트래픽을 처리하지 않아도됩니다. 많은 승리가 있습니다-일반적으로 평균 Java 코더로 대규모 트래픽을 처리 할 수 ​​없기 때문에 mod_jk를 백엔드 노드로 조정하여 Java의 빈약 한 작은 두뇌를 과도하게 피할 수 있습니다

아파치 (또는 nginx 등)를 말하는 사람은 아파치 (Apache의 성능은 어쨌든 Tomcat보다 뛰어나므로 중요하지 않습니다)는 Tomcat 앞에서 좋은 생각이 아닙니다.


답변

Tomcat을 사용할 때 루트 권한이없는 권한 포트 바인딩의 문제 인 경우 Apache httpd로 앞면을 가리지 않아도됩니다. Tomcat은 기본적 jsvc으로 컴파일해야합니다.

jsvcTomcat을 서비스로 시작하는 Java 서비스 래퍼입니다. 이 서비스는 루트로 시작하지만 일반 사용자로 Tomcat을 시작합니다. 따라서 Tomcat을 권한있는 포트에 바인딩 할 수 있습니다.

Glassfish에 대해서는 잘 모르지만 솔루션이 있는지 확인하고 그렇지 않은 경우 포트 전달 기술 (iptables 등)을 반드시 사용할 수 있습니다.

웹 서버 (예 : Apache httpd)로 응용 프로그램 서버를 선택하는 것은 웹 서버로만로드 밸런싱, 클러스터링 또는 정적 리소스 및 응용 프로그램 서버로 동적 리소스를 제공하는 것입니다.


답변