Windows2003에서 Apache와 IIS가 나란히(둘 다 포트 80을 수신함)
-
01-07-2019 - |
문제
이를 수행하는 좋은 방법은 무엇입니까?깔끔하게 할 수도 있나요?
이상적으로는 어떤 서버가 요청을 처리해야 하는지 결정하기 위해 패킷 헤더를 사용하고 싶습니다.그러나 더 쉽고 더 나은 방법이 있으면 알려주십시오.
해결책
두 서버가 동일한 IP 주소의 동일한 포트를 수신하는 것은 불가능합니다.단일 소켓은 단일 프로세스로만 열 수 있으므로 특정 IP/포트 조합에 대해 구성된 첫 번째 서버만 성공적으로 바인딩되고 두 번째 서버는 실패합니다.
따라서 원하는 것을 달성하려면 해결 방법이 필요합니다.가장 쉬운 방법은 기본 IP/포트 조합에서 Apache를 실행하고 다음을 사용하여 IIS(다른 IP 및/또는 포트에 대해 구성되어야 함)에 대한 요청을 Apache로 라우팅하는 것입니다. mod_rewrite.
IIS가 실행되는 대체 IP 및 포트는 서버에 연결하는 클라이언트에 연결할 수 있어야 합니다.사용 가능한 IP 주소가 하나만 있는 경우 일반적으로 방화벽에 의해 차단되지 않는 IIS 포트를 선택해야 합니다(SSL이 아닌 일반 HTTP를 실행하더라도 8080 또는 443이 좋은 옵션일 수 있음).
추신또한 다른 서버가 동일한 서버의 모든 IP 주소에서 포트 80에서 실행되도록 허용하려면 먼저 httpcfg를 사용하여 IIS 기본 구성을 수정해야 합니다.이를 수행하는 절차는 Micky McQuade의 답변을 참조하십시오.
다른 팁
나는 찾았다 이 게시물 이는 둘 다 포트 80에서 수신 대기할 수 있도록 두 개의 별도 IP 주소를 갖도록 제안했습니다.
소켓 풀링으로 인해 IIS에서 변경해야 한다는 주의 사항이 있었습니다.위 링크를 기반으로 한 지침은 다음과 같습니다.
- 추출
httpcfg.exe
Win2003 CD의 지원 도구 영역에 있는 유틸리티입니다. - 모든 IIS 서비스를 중지합니다.
net stop http /y
- IIS가 IIS용으로 지정한 IP 주소에서만 수신하도록 합니다.
httpcfg set iplisten -i 192.168.1.253
- 확실하게 하다:
httpcfg query iplisten
(나열된 IP는 IIS가 수신 대기하는 유일한 IP 주소이며 다른 주소는 없습니다.) - IIS 서비스를 다시 시작합니다.
net start w3svc
- 아파치 서비스 시작
가진 사람들에게는 IP 주소 1개 그리고 여러 사이트 한 서버에서는 IIS가 아닌 다른 포트에서 수신 대기하도록 구성할 수 있습니다. 80
, 예를 들어 8080
각 사이트의 속성에서 TCP 포트를 설정합니다(기본 사이트 포함).
아파치에서 활성화 mod_proxy
그리고 mod_proxy_http
, 그런 다음 Apache가 IIS로 "전달"되는 요청을 명시적으로 처리하지 않도록 범용 VirtualHost(다른 모든 항목 이후)를 추가합니다.
<VirtualHost *:80>
ServerName foo.bar
ServerAlias *
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
</VirtualHost>
이제 사용자에게 눈에 띄는 차이 없이 Apache가 일부 사이트를 제공하고 IIS가 다른 사이트를 제공하도록 할 수 있습니다.
편집하다: IIS 사이트는 헤더를 포함하여 응답 내의 모든 URL에 포트 번호를 포함해서는 안 됩니다.
둘 다 배포판의 일부인 최소한 mod_proxy 및 mod_proxy_http가 필요합니다(아직 자동으로 빌드될 때마다 그렇지는 않음).그러면 여기를 볼 수 있습니다: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
virtualhost 컨텍스트에서 가장 간단한 구성은 다음과 같습니다.
ProxyPass /winapp http://127.0.0.1:8080/somedir/
ProxyPassReverse /winapp http://127.0.0.1:8080/somedir/
(웹앱에 따라 실제 구성이 더 정교해질 수 있습니다.) Path WinApp/의 모든 요청을 Windows 서버로 투명하게 리디렉션하고 결과 출력을 클라이언트로 다시 전송합니다.
주목:제공된 페이지의 링크를 주의하세요:다시 작성되지 않으므로 일반적으로 앱에서 다음과 같은 상대 링크를 사용하는 경우 번거로움을 많이 덜 수 있습니다.
<a href=../pics/mypic.jpg">
모든 링크가 절대적인 일반적인 통합 악몽 대신:
<a href="http://myinternalhostname/somedir/crappydesign.jpg">
후자는 거의 매번 나쁩니다!
페이지의 링크를 다시 작성하려면 mod_proxy_html(mod_proxy_http와 혼동하지 마세요!)이 있지만 이는 또 다른 이야기이자 잔인한 이야기이기도 합니다.
두 개의 서로 다른 IP 주소(권장 사항) 또는 하나의 웹 서버가 다른 서버(포트 <>80에서 수신 대기)를 역방향 프록시합니다.
예를 들어:Apache는 포트 80에서 수신 대기하고 IIS는 포트 8080에서 수신 대기합니다.모든 http 요청은 (물론) 먼저 Apache로 이동합니다.그런 다음 모든 요청을 특정(가상이라는 이름의) 도메인으로 전달하거나 특정 디렉터리(예: http://www.example.com/winapp/)를 IIS에 연결합니다.
이 개념의 장점은 두 대가 아닌 단 한 대의 서버만 공개적으로 청취할 수 있다는 것입니다. 두 대의 개별 서버를 사용하는 것처럼 더 유연합니다.
단점:일부 웹앱은 형편없게 설계되었으며 역방향 프록시 인프라에 통합하기가 정말 어렵습니다.작동하는 IIS 웹앱은 작동하는 Apache에 종속되므로 몇 가지 상호 종속성이 있습니다.
꽤 오래된 게시물인 것 같은데, 이 문제에 대한 답을 찾기 위해 이 게시물을 발견했습니다.일부 답변을 읽은 후 내용이 매우 길어졌으므로 약 5분 후에 다음과 같이 매우 간단하게 문제를 해결할 수 있었습니다.
Apache의 경우 httpd.conf는 수신 포트를 80으로, '서버 이름'을 FQDN/IP :80으로 둡니다.
이제 IIS의 경우 관리 서비스 > IIS 관리자 > 왼쪽 탐색 드롭다운의 '사이트'로 이동하고 오른쪽 창에서 맨 위 줄(기본 웹 사이트)을 선택한 다음 오른쪽에서 바인딩을 선택합니다.
이제 http > edit를 선택하고 81로 변경하고 서버/PC에 대한 로컬 IP를 입력하고 도메인에 FQDN(www.domain.com) 또는 외부 IP 닫기를 입력합니다.
두 서버를 모두 다시 시작하여 라우터와 방화벽 모두에서 포트가 열려 있는지 확인하세요.
장황하게 들리지만 말 그대로 플레이하는 데 5분이 걸렸습니다.완벽하게 작동합니다.
체계:윈도우 8, IIS 8, 아파치 2.2
Windows 10을 설치하면서 다음과 같은 문제가 발생했습니다.Apache(ipv4) 및 스풀러 서비스(ipv6)는 동일한 80 포트를 수신합니다.
Apache httpd.conf 파일 편집에서 줄을 변경하는 문제를 해결했습니다.
들어봐 80
에게
127.0.0.1:80 듣기
그것은 사실이 아닙니다.예:HTTP Windows의 경우 URL 기반 포트 공유를 지원하므로 여러 프로세스가 동일한 IP 주소와 포트를 사용할 수 있습니다.
다른 IP 주소를 사용해야 합니다.Apache이든 IIS이든 서버는 수신 대기 대상인 IP 및 포트를 기반으로 트래픽을 확보합니다.수신이 시작되면 서버 이름과 같은 헤더를 사용하여 액세스 중인 사이트를 필터링하고 결정합니다.단순히 요청에서 서버 이름을 변경하는 것만으로는 할 수 없습니다