초보 자 분포 식 - Nginx 설정 을 동적 으로 수정 하 는 아이디어

14631 단어
저 는 분포 식 초보 자 입 니 다. 실제 업무 에서 nginx 를 동적 으로 수정 해 야 한 다 는 수 요 를 만 났 기 때문에 실현 과정 에서 의 생각 을 쓰 십시오.Nginx 의 기능 이 강하 고 유연 하기 때문에 이런 권 리 는 벽돌 을 던 져 옥 을 끌 어 올 리 는 것 이 므 로 여러분 의 토론 과 지 도 를 받 을 수 있 기 를 바 랍 니 다.(구체 적 인 코드 는https://andy-zhangtao.github.io/nginx2svg/ )
Nginx 인 자 를 동적 으로 설정 하 는 방법
Nginx 의 매개 변수 가 많 고 설정 이 유연 하지 않 기 때문에 완벽 한 자동화 설정 을 달성 하 는 것 은 매우 도 전적인 일이 다. 이 도 구 는 완벽 한 자동화 조정 파 라미 터 를 만 들 지 못 한다.현재 자동화 수정 을 지원 하 는 매개 변 수 는 다음 과 같 습 니 다.
  • server
  • upstream
  • proxy_pass
  • root

  • 자동화 수정 파 라 메 터 를 어떻게 실현 하 는 지 소개 한다.
    예비 지식
    더 잘 이해 하기 위해 서 는 간단 한 예비 지식 이 필요 하 다.먼저 Nginx 의 프로필 형식 을 알 아야 합 니 다. 전형 적 인 Nginx 프로필 (여기 Nginx 가 7 층 역방향 부하 로 사용 된다 고 가정) 은 아래 의 모습 으로 보 입 니 다.
    #   nginx   http://nginx.org/en/docs/example.html
         1  user  www www;
         2
         3  worker_processes  2;
         4
         5  pid /var/run/nginx.pid;
         6
         7  #                          [ debug | info | notice | warn | error | crit ]
         8
         9  error_log  /var/log/nginx.error_log  info;
        10
        11  events {
        12      worker_connections   2000;
        13
        14      # use [ kqueue | epoll | /dev/poll | select | poll ];
        15      use kqueue;
        16  }
        17
        18  http {
        19
        20      include       conf/mime.types;
        21      default_type  application/octet-stream;
        22
        23
        24      log_format main      '$remote_addr - $remote_user [$time_local] '
        25                           '"$request" $status $bytes_sent '
        26                           '"$http_referer" "$http_user_agent" '
        27                           '"$gzip_ratio"';
        28
        29      log_format download  '$remote_addr - $remote_user [$time_local] '
        30                           '"$request" $status $bytes_sent '
        31                           '"$http_referer" "$http_user_agent" '
        32                           '"$http_range" "$sent_http_content_range"';
        33
        34      client_header_timeout  3m;
        35      client_body_timeout    3m;
        36      send_timeout           3m;
        37
        38      client_header_buffer_size    1k;
        39      large_client_header_buffers  4 4k;
        40
        41      gzip on;
        42      gzip_min_length  1100;
        43      gzip_buffers     4 8k;
        44      gzip_types       text/plain;
        45
        46      output_buffers   1 32k;
        47      postpone_output  1460;
        48
        49      sendfile         on;
        50      tcp_nopush       on;
        51      tcp_nodelay      on;
        52      send_lowat       12000;
        53
        54      keepalive_timeout  75 20;
        55
        56      #lingering_time     30;
        57      #lingering_timeout  10;
        58      #reset_timedout_connection  on;
        59
        60
        61      server {
        62          listen        one.example.com;
        63          server_name   one.example.com  www.one.example.com;
        64
        65          access_log   /var/log/nginx.access_log  main;
        66
        67          location / {
        68              proxy_pass         http://127.0.0.1/;
        69              proxy_redirect     off;
        70
        71              proxy_set_header   Host             $host;
        72              proxy_set_header   X-Real-IP        $remote_addr;
        73              #proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        74
        75              client_max_body_size       10m;
        76              client_body_buffer_size    128k;
        77
        78              client_body_temp_path      /var/nginx/client_body_temp;
        79
        80              proxy_connect_timeout      70;
        81              proxy_send_timeout         90;
        82              proxy_read_timeout         90;
        83              proxy_send_lowat           12000;
        84
        85              proxy_buffer_size          4k;
        86              proxy_buffers              4 32k;
        87              proxy_busy_buffers_size    64k;
        88              proxy_temp_file_write_size 64k;
        89
        90              proxy_temp_path            /var/nginx/proxy_temp;
        91
        92              charset  koi8-r;
        93          }
        94
        95          error_page  404  /404.html;
        96
        97          location = /404.html {
        98              root  /spool/www;
        99          }
       100
       101          location /old_stuff/ {
       102              rewrite   ^/old_stuff/(.*)$  /new_stuff/$1  permanent;
       103          }
       104
       105          location /download/ {
       106
       107              valid_referers  none  blocked  server_names  *.example.com;
       108
       109              if ($invalid_referer) {
       110                  #rewrite   ^/   http://www.example.com/;
       111                  return   403;
       112              }
       113
       114              #rewrite_log  on;
       115
       116              # rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3
       117              rewrite ^/(download/.*)/mp3/(.*)\..*$
       118                      /$1/mp3/$2.mp3                   break;
       119
       120              root         /spool/www;
       121              #autoindex    on;
       122              access_log   /var/log/nginx-download.access_log  download;
       123          }
       124
       125          location ~* \.(jpg|jpeg|gif)$ {
       126              root         /spool/www;
       127              access_log   off;
       128              expires      30d;
       129          }
       130      }
       131  }

    18 줄 에서 131 줄 까지 Nginx2Svg 설정 내용 에 속 합 니 다. 이 부분 매개 변수 에서 61 줄 에서 130 줄 까지 Nginx2Svg 설정 내용 에 속 합 니 다. (하나의 server 는 하나의 가상 호스트 에 대응 합 니 다) http 매개 변 수 는 server 매개 변수의 부분 집합 에 속 합 니 다. 같은 매개 변수 가 나타 날 때 server 우선 순위 가 http 보다 높 습 니 다.작용 역 에 따라 비 교 를 하면 server 은 전역 변수 이 고 http 는 국부 변수 이다.
    그래서 18 줄 에서 60 줄 은 전체 변수 에 속 하고 61 줄 에서 130 줄 은 부분 변수 에 속한다.뒤의 조작 을 간소화 하기 위해 우 리 는 httpserver 간 의 포함 관 계 를 간소화 할 수 있다. 다음 과 같다.
         1  user  nginx;
         2  worker_processes  1;
         3
         4  error_log  /var/log/nginx/error.log warn;
         5  pid        /var/run/nginx.pid;
         6
         7
         8  events {
         9      worker_connections  1024;
        10  }
        11
        12
        13  http {
        15      include       /etc/nginx/mime.types;
        16      default_type  application/octet-stream;
        17
        18      log_format main      '$remote_addr - $remote_user [$time_local] '
        19                           '"$request" $status $bytes_sent '
        20                           '"$http_referer" "$http_user_agent" '
        21                           '"$gzip_ratio"';
        22
        23      log_format download  '$remote_addr - $remote_user [$time_local] '
        24                           '"$request" $status $bytes_sent '
        25                           '"$http_referer" "$http_user_agent" '
        26                           '"$http_range" "$sent_http_content_range"';
        27
        28      access_log  /var/log/nginx/access.log  main;
        29
        30      sendfile        on;
        31
        32      keepalive_timeout  65;
        33
        34
        35      server {
        36          listen  80  default_server;
        37          server_name  _;
        38
        39          location /status {
        40              vhost_traffic_status_display;
        41              vhost_traffic_status_display_format html;
        42          }
        43      }
        44
        45      include /etc/nginx/conf.d/*.conf;
        46  }
    http 을 통 해 다른 server 프로필 을 도입 하고 위의 내용 은 server 전역 기본 프로필 로 사용 할 수 있 으 며 거의 수정 되 지 않 습 니 다.앞으로 우리 가 동적 으로 수정 해 야 할 프로필 은 include 이 부분 입 니 다.
    설정 규칙
    자동화 배치 의 목 표를 달성 하려 면 규칙 을 설정 해 야 한다.다음은 자동 화 를 만족 시 키 기 위 한 규칙 입 니 다.
  • 프로필 규칙
  • 서버 가 있어 야 합 니 다name。
  • 파일 이름 은 [server name]. conf 로 명명 되 었 습 니 다.가령 servername 이 example. com 이면 프로필 이름 이 example. com. conf 입 니 다.
  • 파일 이 하나 있 고 server 세그먼트 만 있 습 니 다
  • 설정 내용 규칙
  • 같은 프로필 에서 location 은 중복 되 지 않 습 니 다 (정규 표현 식 은 제한 범위 에 있 지 않 습 니 다)

  • 해석 규칙
    상기 두 가지 규칙 을 만족 시 키 는 전제 에서 우 리 는 Nginx 매개 변수의 자동화 설정 을 어떻게 실현 하 는 지 살 펴 보 자.먼저 nginx 자동화 설정 을 실현 하 는 난점 이 어디 에 있 습 니까?나의 사용 경험 을 보면 어 려 운 점 은 다음 과 같은 세 가지 에 있다.
  • nginx 설정 이 상당히 유연 하고 nginx.conf 의미 에 속 합 니 다. nginx 는 설정 파일 의 내용 과 형식 을 명 확 히 했 지만 설정 에 있어 서 임의로 조합 할 수 있 습 니 다 (nginx - t 또는 reload 를 실행 할 때 만 진정 으로 검증 할 수 있 습 니 다).따라서 프로필 은 최소 문턱 /etc/nginx/conf.d/*.conf 만 규정 하고 엄밀 한 설정 형식 을 규정 하지 않 아 의미 에 맞 으 면 모두 검증 에 성공 했다.이 점 은 사용자 의 눈 에는 매우 유연 한 장점 이지 만 자동화 측면 에서 볼 때 매우 큰 통 증 이다. 왜냐하면 통 일 된 해석 형식 을 찾 아 의 미 를 이해 하지 못 하기 때문이다.
  • 검증 과 스크롤 백 nginx 는 텍스트 를 기반 으로 설정 되 어 있 으 며, 매번 수정 은 IO 작업 을 통 해 텍스트 프로필 을 생 성 한 후 모든 worker 에 불 러 옵 니 다.따라서 검증 에 실 패 했 을 때 새로 추가 / 삭 제 된 내용 을 이전 버 전 으로 복원 하 는 방법 이 문제 가 되 었 습 니 다.
  • 개성 화 된 설정 은 실제 업무 장면 에서 nginx 설정 은 하나의 설정 을 할 수 없 을 것 이다.일부 server 가 맞 춤 형 설정 파 라 메 터 를 추가 해 야 할 때 맞 춤 형 설정 과 자동화 설정 을 어떻게 균형 시 키 느 냐 도 고려 해 야 할 문제 가 되 었 다.

  • 상기 세 문제 의 답 을 찾 았 을 때 대체적으로 자동화 배치 의 요 구 를 만족 시 킬 수 있 었 다.
    우선 첫 번 째 문 제 를 살 펴 보 자.
    nginx 설정 이 원활 해서 nginx 설정 파일 을 정면으로 해석 하 는 것 이 어 려 운 일이 라면 이 문 제 를 다른 각도 로 이해 해 볼 수 있 습 니 다.만약 변화 가 많아 서 해석 하기 어렵다 면, 그것 을 변화 시 키 지 마라
    구체 적 으로 어떻게 이해 할 까요?nginx 는 의 미 를 통 해 검 증 된 것 이다. 즉, nginx 자체 가 에 민감 하지 않다 는 것 이다.그래서 우 리 는 모든 프로필 의 설정 형식 을 미리 정의 할 수 있 습 니 다. 다음 과 같 습 니 다.
         1
         2
         3  upstream 5d148ba37f325500011770af {
         4      server  xxxxx ;
         5  }
         6
         7
         8  server{
         9
        10    server_name web1.example.com;
        11
        12
        13
        14
        15    location /server1 {
        16      proxy_pass http://5d148ba37f325500011770af;
        17      proxy_set_header X-Real-IP $remote_addr;
        18      proxy_set_header Host $host;
        19      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        20      proxy_next_upstream error timeout http_500 http_502 http_503 http_504 non_idempotent;
        21
        22
        23
        24    }
        25
        26  }
        27

    모든 프로필 은 다음 과 같이 설정 구 조 를 규정 합 니 다.
  • 모두 이전에 통일 적 으로 배치
  • upstream server 이전
  • server_namelocation 첫 줄
  • 에 배치
    모든 프로필 이 상기 세 가지 조건 을 만족 시 킬 때 자동화 해석 프로그램 은 설 정 된 규칙 에 따라 모든 의 미 를 해석 하고 이해 하려 고 시도 할 수 있다.
    파일 만 분석 하기 에는 부족 합 니 다. proxy_pass 할 수 있어 야 합 니 다.다시 위의 설정 내용 으로 돌아 가면 안의 변 수 는 세 부분 이 있 고 위 에서 아래로 순서대로 다음 과 같다.
  • upstream 의 server IP 목록
  • server_name 의 domain 목록
  • location list
  • 동적 수정 이 더욱 정확 한 것 은 위의 세 부분 값 을 어떻게 동적 으로 수정 하 는 지 하 는 것 이다. 이 세 부분의 관련 관 계 는 다음 과 같다.
    
        +-------------+
        | server_name |
        |   domain1   |
        |   domain2   |                 +-----------------+                 +-----------------+
        |   domain3   |---------------> |    location1    |-------------->  |   upstream1     |
        |   .......   |                 +-----------------+                 +-----------------+
        |   domainN   |
        +-------------+
                                        +-----------------+                 +-----------------+
                                        |    location2    |-------------->  |   upstream2     |
                                        +-----------------+                 +-----------------+
    
    
                                        +-----------------+                 +-----------------+
                                        |    locationN    |-------------->  |  upstreamN      |
                                        +-----------------+                 +-----------------+

    같은 그룹의 location 은 모든 데 이 터 를 공유 하고, 각각 server_namelocation 을 통 해 특정 location (다 를 수도 있 고, 같은 upstream 일 수도 있다) 을 가리킨다.
    위의 그림 에서 알 수 있 듯 이 proxy_passupstream 는 한 작용 역 에서 (같은 server_name 에서), location 는 밖으로 유리 되 어 있다.
    세 문제 중 servername 은 {} 을 통 해 정확 한 포 지 셔 닝 을 할 수 있 고 upstream 도 정확 한 포 지 셔 닝 을 할 수 있 습 니 다. 이때 server_name 를 통 해 location 포 지 셔 닝 을 어떻게 하 는 지 현재 의 난점 이 되 었 습 니 다.
    실제 사용 과정 에서 저 는 추가 location 를 통 해 이 문 제 를 해결 합 니 다. 구체 적 으로 보면 한 조 proxy_pass 의 보조 포 지 셔 닝 데 이 터 를 추가 하 는 것 입 니 다. 예 를 들 어 다음 그림 의 데 이 터 를 추가 하 는 것 입 니 다.
         1
         2  ### [5d148ba37f325500011770af]-[/]-[upstream]-[start]
         3  upstream 5d148ba37f325500011770af {
         4      server  xxxxx ;
         5  }
         6  ### [5d148ba37f325500011770af]-[/]-[upstream]-[end]
         7
         8  server{
         9
        10    server_name web1.example.com;
        11
        12
        13
        14
        15    location /server1 {
        16      proxy_pass http://5d148ba37f325500011770af;
        17      proxy_set_header X-Real-IP $remote_addr;
        18      proxy_set_header Host $host;
        19      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        20      proxy_next_upstream error timeout http_500 http_502 http_503 http_504 non_idempotent;
        21
        22
        23
        24    }
        25
        26  }
        27

    두 번 째 줄 과 여섯 번 째 줄 은 추 가 된 것 이다 upstream.닻 점 데이터 가 만족 해 야 할 조건 은:
  • 같은 프로필 에서 중복 되 지 않 음
  • 좋 은 구분 도
  • 따라서 상기 데 이 터 를 디자인 했 는데 그 형식 은 다음 과 같다.
        ### [5d148ba37f325500011770af]-[/]-[upstream]-[start]
        ----------------------------------------------------
        ### [24    ]-[/]-[upstream]-[  /    ]
        ①       ②           ③             ④
    
        ①   #  
        ②     ,upstream   proxy_pass  ,      ,             24    
        ③     ,              
        ④ start  upstream  , end  upstream  。

    따라서 완전한 자동화 설정 절 차 는 다음 과 같다.
        //     web1.example.com /server1     
    
        if web1.example.com.conf   
                    
    
            if    server1 location 
                   proxy_pass,   24    
    
                          
    
                if    ### [xxxx]-[/]-[upstream]-[start]
                        ,       ip  ,    
                else
                         ,      ,    
            else
                //      location  ,  location upstream
                  location  
                      upstream  
    
        else
            //          ,    
               web1.example.com.conf,          
    

    맞 춤 형 지원
    위의 해석 규칙 을 보면 개성 화 된 지원 을 지원 하려 면 의 미 를 이해 할 때 upstream, 즉 필요 한 데이터 만 분석 하면 되 고 다른 데 이 터 는 그대로 복사 해 야 한다.예 를 들 어 사용자 가 에 맞 춤 형 매개 변수 (만족 를 추가 하면 분석 만 하면 되 고 후속 데 이 터 는 그대로 복사 하여 변경 하지 않 습 니 다.

    좋은 웹페이지 즐겨찾기