nginx에서 bot에 대해 캐시를 보이고 싶습니다.

매번 질서가 DB에 문의가 발생하는 페이지가 있어 google님이나 Bot으로 가득 찼을 수 있습니다.
그렇다고 해서, 옛 유산이므로 지금도 리팩토링 윤기. 시간이 걸립니다.

그럼 nginx로 캐시하면 좋을까? 라고 생각했지만 갱신 내용은 되는 빨리 보여주고 싶다는 요건도 있어 또 귀찮다.
  • 사람에 대한 최신 페이지
  • Bot은 며칠 전 캐시

  • 같은 것을 할 수 없을까-, 라고 생각했으므로 검증해 보겠습니다.

    검증 환경



    win10 Home입니다.
    Docker Toolbox 넣습니다.
    htps : // 기주 b. 코 m / 도 c 케 r / 토오보 x / 레아 아세 s
    함께 docker-compose도 넣고 있습니다.
    설치하고 시작했습니다.

    일단 기본 nginx를 움직입니다.

    docker-compose.yml
    version: '3'
    services:
      nginx:
        image: nginx
        ports:
          - "8080:80"
        volumes:
          - ./content:/usr/share/nginx/html/content
          - ./conf.d:/etc/nginx/conf.d
          - ./cache:/usr/share/nginx/cache
    

    ./content/index.html
    <html>
      <body>
        Hello, 俺
      </body>
    </html>
    

    ./conf.d/default.conf
    server {
        listen 80;
        server_name _;
    
        root  /usr/share/nginx/html;
        index index.html;
    
        access_log /var/log/nginx/access.log;
        error_log  /var/log/nginx/error.log;
    }
    
    $ docker pull nginx:latest
    $ docker-compose up -d
    $ docker-compose ps
         Name               Command          State          Ports
    ---------------------------------------------------------------------
    dockers_nginx_1   nginx -g daemon off;   Up      0.0.0.0:8080->80/tcp
    $ docker-machine ip
    192.168.99.100
    

    그리고 192.168.99.100을 열면 default의 녀석이 표시된다.



    다만, 192.168.99.100/content/는 403이 되어, 뭔가 표시되지 않았으므로,
    컨테이너 들어 index.html을 다시 만들어 보았다. 파일의 permission 라든지.
    $ docker-compose.exe exec nginx bash  
    

    그러면 표시되었다. 어쩐지 문자 깨져 있지만 여기에서는 신경 쓰지 않는다.

    캐시 설정



    그런 이유로 우선 캐시 설정.

    ./conf.d/default.conf
    proxy_cache_path /usr/share/nginx/cache keys_zone=zone1:1m levels=1:2;
    server {
        listen 80;
        server_name _;
    
        root  /usr/share/nginx/html;
        index index.html;
    
        access_log /var/log/nginx/access.log;
        error_log  /var/log/nginx/error.log;
    
        location /content {
            proxy_cache zone1;
            proxy_cache_valid any 60m;
            proxy_pass http://localhost:81;
            break;
        }
    }
    
    server {
        listen 81;
        server_name _;
    
        root  /usr/share/nginx/html;
        index index.html;
    
        access_log /var/log/nginx/access81.log;
        error_log  /var/log/nginx/error81.log;
    }
    

    이것을 저장하고 docker-compose restart 를 실행하십시오.
    proxy_cache는 proxy에서 사용하는 것 같기 때문에 다른 포트 세우면서 같은 컨텐츠를 보고 있습니다.
    192.168.99.100/content/을 열면 ./cache/에 파일이 있습니다.
    $ curl http://192.168.99.100:8080/content/                                                                                                 <html>
      <body>
        Hello,俺
      </body>
    </html>
    
    $ du -l ./cache
    4       ./cache/0/81
    4       ./cache/0
    4       ./cache/e/7a
    4       ./cache/e
    8       ./cache
    

    여기까지는 보통

    Bot과 사람으로 처리를 분리



    이것으로 어떨까.

    ./conf.d/default.conf
    proxy_cache_path /usr/share/nginx/cache keys_zone=zone1:1m levels=1:2;
    server {
        listen 80;
        server_name _;
    
        root  /usr/share/nginx/html;
        index index.html;
    
        access_log /var/log/nginx/access.log;
        error_log  /var/log/nginx/error.log;
    
        set $nocache 1;
        if ( $http_user_agent ~* (bot|crawler) ) {
            set $nocache 0;
        }
    
        location /content {
            proxy_no_cache $nocache;
            proxy_cache_bypass $nocache;
            proxy_cache zone1;
            proxy_cache_valid any 60m;
            proxy_pass http://localhost:81;
            break;
        }
    }
    
    server {
        listen 81;
        server_name _;
    
        root  /usr/share/nginx/html;
        index index.html;
    
        access_log /var/log/nginx/access81.log;
        error_log  /var/log/nginx/error81.log;
    }
    

    html을 업데이트합니다.
    $ sed -i 's/Hello/Bye/' content/index.html
    $ cat content/index.html
    <html>
      <body>
        Bye, 俺
      </body>
    </html>
    

    그리고 Docker-compose restart하여 재확인
    $ curl http://192.168.99.100:8080/content/
    <html>
      <body>
        Bye,俺
      </body>
    </html>
    

    캐시가 아닌 것이 돌아왔다.
    그래서, bot의 경우는 · ·
    $ curl http://192.168.99.100:8080/content/ -H "User-Agent: hogehoge-bo
    t (http://hogehoge)"
    <html>
      <body>
        Hello,俺
      </body>
    </html>
    

    캐시가 돌아왔다!
    갔다.
    시도에 캐시 지우자.
    $ rm -rf ./cache/*
    $ curl http://192.168.99.100:8080/content/ -H "User-Agent: hogehoge-bot (http://hogehoge)"
    <html>
      <body>
        Bye,俺
      </body>
    </html>
    

    당연하지만 최신 데이터가 돌아온다.
    갔다!

    이것 (proxy_no_cache) 사용하면 좋겠네요.
    htp // w w2. 마츠에 ct. 아 c. jp / 칭찬 / 가나야마 / xt / ngin x / 65. HTML

    좋은 웹페이지 즐겨찾기