Glassfish / JBoss / Tomcat의 프론트 엔드로 Apache를 실행해야합니까?


14

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

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

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

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

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

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

답변:


8

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

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

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

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

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


Adam, StackOverflow에서 Serverfault로 스토킹하고 있습니까? :-) 귀하의 답변에 동의합니다. 돌이켜 보면 실제 상황을 반영하기 위해 질문에 더 잘 말해야했습니다 .DB가 거의 모든 페이지 히트에 관련되어 있기 때문에 말할 정적 콘텐츠가 거의 없습니다. 현재 (초기 스타트 업 탐색)에는로드 밸런싱이 필요하지 않지만 운이 좋으면 앞으로 필요할 것입니다.
카페인 코마

@ 카페인 코마 나는 같은 보트에 있고 우리가 동일한 기술을 사용하고있는 것 같습니다. 따라서 Stackexchanges에서 동일한 스레드에있는 serendipity가 있습니다 (스토킹하지 않습니다 :). BTW는 Nginx + Tomcat을 사용하고 있습니다.
Adam Gent

5

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

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

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

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


1

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


어쨌든 정적 콘텐츠를 많이 제공하지는 않습니다. 내 질문은 : Apache / Nginx 프론트 엔드를 귀찮게해야합니까, 아니면 그냥 Glassfish를 사용해야합니까? 감사.
카페인 코마

실제로 서버가 비동기 I / O 클라이언트를 사용하지 않으면 연결 속도가 느린 서버가 컨텐츠를 완전히 얻을 때까지 서버의 실행 스레드를 차단하므로 정적 컨텐츠를 제공하는 것보다 문제가 더 광범위합니다. 따라서 AIO 기반 프론트 엔드를 사용하는 것이 어떤 경우에도 도움이됩니다. 그러나 이미 언급했듯이 Tomcat에는 AIO 기능이 있습니다. 재고 Glassfish 패키지에는 이미 AIO 라이브러리가 포함되어 있으므로 귀찮게해서는 안됩니다.
Alex

아파치는 반드시 다중 프로세스 일 필요는 없습니다. mpm worker는 한동안 httpd.apache.org/docs/2.2/mod/worker.html 을 사용했으며 프로덕션 환경에서 멀티 스레드 웹 서버를 사용하고 있습니다.
dialt0ne

다중 스레드 Apache는 여전히 동기 I / O를 사용합니다. 프로세스가 아닌 스레드가 느린 클라이언트에 의해 소켓에서 차단되면 큰 차이가 보이지 않습니다. Nginx는 단일 스레드 단일 프로세스 유한 상태 머신으로 설계되었습니다 (필요한 단일 프로세스는 아니고 프로세스 수는 멀티 코어 시스템에서 CPU 코어 수로 설정해야 함).
Alex

1

놀랍고, 이러한 답변 중 일부는 실제로 고성능 다중 계층 및 다중 서버 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 앞에서 좋은 생각이 아닙니다.


4
당신은 매우 기분이 상쾌합니다.
Caffeine Coma

사람들이 ServerFault에 대해 그러한 나쁜 조언을 제공한다는 것에 혐오감을 느꼈습니다.

그러한 주장을 뒷받침 할만한 숫자가없는 사람은 조심하십시오. 귀하의 사이트가 대부분 동적이라면 직접 바람둥이가 더 빠를 것입니다. 오늘날 대부분의 트래픽이 많은 사이트는 정적 컨텐츠에 CDN (콘텐츠 전송 네트워크)을 사용하므로 정적 컨텐츠를 제공하기 위해 Apache를 사용할 이유가 없습니다. 즉, 여전히로드 밸런싱 / ssl을위한 무언가가 있어야합니다.
Adam Gent

0

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.