2010-04-05 2 views
1

Nginx 및 Apache를 사용하여 동일한 서버에 여러 가상 호스트를 설정하려고하고 있으며 궁금한 구성 문제가 발생했습니다.Nginx 리버스 프록시를 사용하여 Apache에서 여러 WSGI 탑재 지점 사용

나는 nginx가 일반적인 업스트림으로 아파치로 구성되어있다.

upstream backend { 
    server 1.1.1.1:8080; 
} 

아파치에서 다른 마운트 포인트를 치는 nginx에서 여러 하위 도메인을 설정하려고합니다. 각각은 다음 예제와 같이 작동합니다.

server { 
    listen 80; 
    server_name foo.yoursite.com; 

    location/{ 
      proxy_pass http://backend/bar/; 
      include /etc/nginx/proxy.conf; 
    } 
    ... 
} 

server { 
    listen 80; 
    server_name delta.yoursite.com; 

    location/{ 
      proxy_pass http://backend/gamma/; 
      include /etc/nginx/proxy.conf; 
    } 
    ... 
} 

이 마운트 포인트는하지만, 장고 프로젝트의 URL 항목의 각 다시 아파치 마운트 지점 경로 앞에 붙은 오는을 지적하고 있습니다. 그래서 foo.yoursite.com/wiki/biz/에 대한 django url 항목을 호출하면 django가 foo.yoursite.com/bar/wiki/biz/을 반환하는 것으로 보입니다. 마찬가지로 delta.yoursite.com/wiki/biz/에 대한 url 항목을 호출하면 delta.yoursite.com/gamma/wiki/biz/가 표시됩니다.

django 및 apache가 URL 항목에 반환되는 접두사를 제거하는 방법이 있습니까?

답변

1

가장 쉬운 방법은 WSGI 스크립트 파일에서 다음을 사용하는 것입니다

... existing stuff 

import django.core.handlers.wsgi 
_application = django.core.handlers.wsgi.WSGIHandler() 

def application(environ, start_response): 
    # Wrapper to clear SCRIPT_NAME.. 
    environ['SCRIPT_NAME'] = '' 
    return _application(environ, start_response) 

문제는 서로 다른 URL에서 각 서버 마운트 때문에 대해 제공됩니다. 따라서 백엔드가 실제로 SCRIPT_NAME을 삭제하여 서버의 루트에 마운트되었다고 생각하게해야합니다.

백 엔드에 직접 액세스하는 경우 문제가 발생할 수 있습니다. 이 상황에서 프록시를 통해 요청을 보낸 경우에만 위와 같이 수정해야합니다.

+0

SCRIPT_NAME 환경 변수를 지우는 것이 트릭입니다. 고마워, 그레이엄! – Thomas

관련 문제