Nginx 정적 자원 의 역방향 에이전트 구현

4140 단어
github 의 많은 프로젝트 에 readme 파일 이 있 습 니 다. 많은 사람들 이 파일 에 자신의 창작 이나 표지 그림 을 추가 하 는 것 을 좋아 합 니 다. 예 를 들 어 substack 은 그의 모든 프로젝트 에 로 고 를 그 렸 습 니 다.이 그림 들 은 github 에서 페이지 에 직접 표시 되 지만 url 은 github 자신의 것 으로 바 뀌 었 다.예 를 들 어 브 라 우 저 ify 프로젝트 에서 로고 의 링크 가 바 뀌 었 습 니 다.
 
  
https://camo.githubusercontent.com/e19e230a9371a44a2eeb484b83ff4fcf8c824cf7/687474703a2f2f737562737461636b2e6e65742f696d616765732f62726f777365726966795f6c6f676f2e706e67

우 리 는 raw 를 통 해 원 url 을 발견 할 수 있 습 니 다.
 
  
http://substack.net/images/browserify_logo.png

이렇게 하 는 장점 중 하 나 는 https 사이트 에 http 링크 가 나타 나 는 것 을 방지 하 는 것 이다. 그렇지 않 으 면 클 라 이언 트 에서 위험 경 고 를 받 을 수 있다.github 은 세부 적 으로 매우 주도면밀 하 게 고려 했다.
기왕 수요 가 있 는 바 에 야 우 리 는 그것 을 실현 할 것 이다.일반적인 방법 은 응용 프로그램 을 써 서 원 격 정적 자원 을 캡 처 한 다음 에 전단 에 피드백 하 는 것 이다. 이것 은 간단 한 역방향 대리 이다.그러나 이렇게 하 는 것 이 비교적 번 거 롭 고 효율 도 높 지 않다. 사실은 우 리 는 nginx 를 통 해 이 정적 파일 들 을 직접 대리 할 수 있다.
nginx 의 proxypass 는 임의의 주 소 를 입력 하고 dns 분석 을 지원 합 니 다.그래서 제 생각 은 원래 url 을 사이트 자체 의 url 로 암호 화 하 는 것 입 니 다.위의
 
  
http://substack.net/images/browserify_logo.png

암호 화 가능
 
  
764feebffb1d3f877e9e0d0fadcf29b85e8fe84ae4ce52f7dc4ca4b3e05bf1718177870a996fe5804a232fcae5b893ea ( , )

그리고 우리 자신의 도 메 인 이름 아래 두 기:
 
  
https://ssl.youdomain.com/camo/764feebffb1d3f877e9e0d0fadcf29b85e8fe84ae4ce52f7dc4ca4b3e05bf1718177870a996fe5804a232fcae5b893ea

복호화 절 차 는 nginx 를 사용 하면 실현 하기 어 려 울 수 있 습 니 다. 따라서 사용자 가 상기 링크 를 통 해 요청 할 때 복호화 프로그램 에 전달 하 는 것 을 먼저 말 합 니 다. 여기 coffeescript 버 전의 예 가 있 습 니 다.
 
  
express = require 'express'
app = express()
app.get '/camo/:eurl', (req, res) ->
  {eurl} = req.params
  {camoSecret} = config  #
  rawUrl = util.decrypt eurl, camoSecret
  return res.status(403).end('INVALID URL') unless rawUrl
  res.set 'X-Origin-Url', rawUrl
  res.set 'X-Accel-Redirect', '/remote'
  res.end()
app.listen 3000

그리고 X - Accel - Redirect 응답 헤드 를 써 서 내부 점프 를 하면 다음 절 차 는 nginx 가 완성 합 니 다.다음은 완전한 nginx 프로필 예 입 니 다.
 
  
server {
    listen 80;
    server_name ssl.youdomain.com;
    location /camo/ {
        proxy_pass http://localhost:3000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_redirect off;
        break;
    }
    location /remote {
        internal;
        resolver 192.168.0.21;  # dns , nginx
        set $origin_url $upstream_http_x_origin_url;
        proxy_pass $origin_url;
        add_header Host "file.local.com";
        break;
    }
}

nginx 의 upstream 모듈 은 모든 응답 헤드 에 $upstream 을 추가 합 니 다.http_ 접 두 사 를 변수 로 저장 하기 때문에 위의 예 에서 우 리 는 원래 url 을 X - Origin - Url 응답 헤드 에 두 었 고 nginx 에 서 는 $upstream 이 되 었 습 니 다.http_x_origin_url 변수, 하지만 proxypass 에 서 는 직접 인용 할 수 없습니다. set 를 통 해 설정 해 야 인용 할 수 있 습 니 다. 이것 은 이해 가 되 지 않 습 니 다. 고수 가 대답 할 수 있 기 를 바 랍 니 다.이렇게 되면 매번 사용자 가 요청 할 때마다
 
  
https://ssl.youdomain.com/camo/764feebffb1d3f877e9e0d0fadcf29b85e8fe84ae4ce52f7dc4ca4b3e05bf1718177870a996fe5804a232fcae5b893ea

nginx 가 잡 으 러 갑 니 다.
 
  
http://substack.net/images/browserify_logo.png

의 내용 을 사용자 에 게 되 돌려 줍 니 다.nginx 전에 varnish 를 추가 하여 정적 파일 의 내용 을 캐 시 할 수 있 습 니 다.이렇게 하면 githubuscontent 의 방법 과 더욱 일치 합 니 다.

좋은 웹페이지 즐겨찾기