deploy django with url prefix in nginx

4309 단어
저 는 예전 에 일반 배치 사 이 트 는 루트 디 렉 터 리 에 배 치 했 습 니 다. 예 를 들 어 www. example. com 은 백 엔 드 서버 감청 포트 에 직접 전달 하 는 것 이 간단 합 니 다. 이렇게 하면 됩 니 다.
 location / {
              proxy_pass http://127.0.0.1:8888 ;
	    }
그러나 우리 가 웹 사 이 트 를 특정한 하위 디 렉 터 리 에 배치 하고 싶다 면 예 를 들 어 www. example. com / admin / 는 그리 간단 한 일이 아니다.
다행히 django 프레임 워 크 는 비교적 완벽 해서 쉽게 이 임 무 를 완성 할 수 있 습 니 다.
https://docs.djangoproject.com/en/dev/ref/settings/#force-script-name
settings. py 에 FORCE 설정 하기SCRIPT_NAME, url 앞 에 쉽게 접 두 사 를 붙 일 수 있 습 니 다.
FORCESCRIPT_NAME = '/ admin' (마지막 에는 슬 래 쉬 / 가 없습니다)
또한 주의해 야 할 것 은 django template 의 url 은 {% url url name%} 로 생 성 되 어야 하 며, 백 엔 드 의 redirect 도 reverse 를 사용 해 야 합 니 다.
그리고 Nignx 에 서 는 다음 과 같은 설정 이 필요 합 니 다.
	    location ~ ^/admin(/?)(.*) {
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header Host $http_host;
              proxy_pass http://127.0.0.1:8888/$2 ;
              proxy_redirect http://www.example.com/ http://www.example.com/admin/;
	    }

ref:  http://nginx.org/cn/docs/http/ngx_http_proxy_module.html
잠시 소개 해 드 리 겠 습 니 다.
proxy_pass 형식 은 proxypass http://host:port/uri/ location 에 맞 는 url 은 uri 로 바 뀌 기 때문에http://127.0.0.:8888완전한 url 을 전달 합 니 다.http://127.0.0.1:8888/ localtion 과 일치 하 는 것 을 제거 합 니 다.
URI 가 백 엔 드 서버 에 다음 규칙 에 따라 전 송 될 것 을 요청 합 니 다:proxy_pass URI 를 사용 하면 백 엔 드 서버 로 전송 요청 을 할 때, 설 정 된 경로 와 일치 하 는 요청 경 로 를 규범화 하면 명령 에 정 의 된 URI 로 대 체 됩 니 다.
location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}

proxy_pass URI 를 사용 하지 않 으 면 백 엔 드 서버 로 전 송 된 요청 URI 일반 클 라 이언 트 가 시작 하 는 원본 URI 입 니 다. nginx 가 요청 URI 를 변경 하면 전 송 된 URI 는 nginx 가 변 경 된 후에 완전한 규범화 URI 입 니 다.
location /some/path/ {
    proxy_pass http://127.0.0.1;
}


proxy_redirct 역할 은 되 돌아 오 는 조정 url 을 바 꾸 는 것 입 니 다.
문법:proxy_redirect default ; proxy_redirect off ; proxy_redirect redirect   replacement ;
기본 값:
proxy_redirect default;

문맥:httpserverlocation
백 엔 드 서버 'Location' 응답 헤드 와 'Refresh' 응답 헤드 의 교체 텍스트 를 설정 합 니 다.백 엔 드 서버 가 돌아 오 는 응답 헤드 가 'Location: http://localhost:8000/two/some/uri/' 라 고 가정 하면 명령
proxy_redirect http://localhost:8000/two/ http://frontend/one/;

문자열 을 'Location: http://frontend/one/some/uri/' 로 바 꿉 니 다.replacement 문자열 은 서버 이름 을 생략 할 수 있 습 니 다.
proxy_redirect http://localhost:8000/two/ /;

ps. nginx 의 설정 이 정말 많 습 니 다. 도구 나 언어 를 잘 사용 하기 가 쉽 지 않 습 니 다.
##############################################################
보충: 위 설정 은 GET 요청 시 가 져 온 인 자 를 제거 합 니 다. 이렇게 바 꾸 면 됩 니 다.
	    location ^~ /admin/ {
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header Host $http_host;
              proxy_pass http://127.0.0.1:8888/ ;
              proxy_redirect http://www.example.com/ http://www.example.com/admin/;
	    }

이것 때문에 저 는 다음 nginx 의 location 에 관 한 문 서 를 자세히 보 았 습 니 다. 예전 에 본 적 이 없고 모두 복사 하고 독선 적 인 이 해 를 가 집 니 다.
http://wiki.nginx.org/HttpCoreModule#location
위치 문법:
Syntax:
location [  =  |  ~  |  ~*  |  ^~  ] uri { ... }
우선 location 의 url 매 칭 은 두 가지 로 나 뉜 다. 정규 매 칭 은 일반 (글자) 과 일치 하고 ~ (대소 문자 민감) 또는 ~ * (대소 문자 민감 하지 않 음) 는 정규 매 칭 이 며, 기타 (= 접두사, ^ ~ 접두사 와 접두사 없 음) 는 모두 일반 매 칭 이다.
일치 하 는 순 서 는:
1. 정확하게 일치 하 는 (= 접두사) 와 일치 합 니 다. 있 으 면 일치 하지 않 습 니 다.
2. 일반 일치 와 일치 합 니 다. ^ ~ 접두사 라면 일치 하지 않 습 니 다. 그렇지 않 으 면 세 번 째 정규 일치 가 진 행 됩 니 다.
3. 정규 일치, 정규 정의 순서에 따라 일치, 일치 가 정지 되면 일치
4. 정규 매 칭 이 없 으 면 2 단계 에서 얻 은 매 칭 을 되 돌려 줍 니 다 (최대 접두사 가 일치 합 니 다. 예 를 들 어 상 / 과 / doc / 가 일치 하면 / doc / 의 매 칭 을 되 돌려 줍 니 다)
이 절 내용 은 나 로 하여 금 정규 일치 가 왜 GET 방법 파라미터 에 영향 을 미 치 는 지 알 게 하지 못 했 지만, 나 로 하여 금 nginx 의 location 일치 규칙 을 더욱 잘 이해 하 게 했다.

좋은 웹페이지 즐겨찾기