Nginx 의 변 수 는 도대체 어떻게 된 것 입 니까?

7920 단어
이전에 Nginx 모듈 에 관 한 내용 을 많이 말 했 고 중요 한 내용 도 있 습 니 다. 그것 이 바로 Nginx 의 변수 입 니 다.변 수 는 Nginx 에서 없 는 곳 이 없다 고 할 수 있 습 니 다. 이러한 변수의 역할 과 원 리 를 이해 하 는 것 도 필요 합 니 다. 다음은 Nginx 에 관 한 모든 변 수 를 포함 하고 단독 적 으로 보면 비교적 무미건조 하고 안심 할 수 있 으 며 뒤에 도 실전 내용 이 있 습 니 다.
Nginx 변수의 운행 원리
Nginx 를 둘 러 싼 변수 모듈 은 두 가지 로 나 눌 수 있 습 니 다. 하 나 는 변 수 를 제공 하 는 모듈 이 고 다른 하 나 는 변 수 를 사용 하 는 모듈 입 니 다.
  • 변 수 를 제공 하 는 모듈
  • Preconfiguration 소스 코드 에서 변수 이름 을 정의 하고 변 수 를 해석 할 수 있 는 방법
  • 변 수 를 사용 하 는 모듈
  • nginx. conf 를 분석 할 때 변 수 를 정의 하 는 사용 방식

  • 즉, Nginx 가 시 작 될 때 변 수 를 정 의 했 고 요청 을 진정 으로 처리 할 때 만 nginx. conf 가 분석 한 변수 사용 방식 에 따라 Preconfiguration 에서 정 의 된 방법 으로 값 을 실제 가 져 올 수 있 습 니 다.
    이것 도 변수의 두 가지 특성 입 니 다.
  • 타성 구 치: 사용 할 때 만 조정 방법 으로 해석
  • 변 수 는 항상 변화 할 수 있 고 그 값 은 사용 하 는 그 시간의 값 입 니 다.예 를 들 어 응답 패키지 바이트 수 를 보 내 는 것 은 실제 보 내 는 과정 에서 계속 변화 하고 있 습 니 다.

  • Nginx 모듈 을 제외 하고 Nginx 프레임 워 크 에 도 많은 변수 가 포함 되 어 있 습 니 다. 이러한 변 수 는 컴 파일 모듈 을 통 해 도입 할 필요 가 없습니다. 또한 Nginx 프레임 워 크 가 제공 하 는 변 수 는 처리 요청 의 세부 사항 을 반영 하기 때문에 Nginx 프레임 워 크 가 제공 하 는 변 수 를 이해 하 는 것 이 필요 합 니 다.
    HTTP 요청 관련 변수
    HTTP 요청 에 대한 변 수 를 살 펴 보 겠 습 니 다.
  • arg_매개 변수 이름: URL 의 특정한 매개 변수의 값
  • query_string: args 변수 와 완전히 같 음
  • args: 모든 URL 매개 변수
  • is_args: URL 에 인자 가 있 으 면 되 돌려 주 시 겠 습 니까?그렇지 않 으 면 빈 상태 로 돌아 갑 니 다
  • content_length: HTTP 요청 에서 패키지 길 이 를 표시 하 는 Content - length 머리의 값 입 니 다.요청 에 이 인 자 를 가지 고 있 지 않 으 면 해당 하 는 값 을 찾 을 수 없습니다.
  • content_type: 표지 요청 패키지 형식의 Content - type 머리 값 입 니 다.사용자 요청 에 대응 하 는 인 자 를 휴대 해 야 합 니 다.
  • uri: 요청 한 URI (URL 과 다 르 고? 후의 매개 변 수 는 포함 되 지 않 음)
  • document_uri: uri 와 똑 같 습 니 다.역사적 원인 으로 존재 하 는.
  • request_uri: 요청 한 URL (URI 및 전체 인자 포함)
  • scheme: 프로 토 콜 이름, 예 를 들 어 HTTP 또는 HTTPS
  • request_method: 요청 방법, 예 를 들 어 GET 또는 POST
  • request_length: 모든 요청 내용 의 크기, 요청 행, 머리, 패키지 등
  • remote_user: HTTP Basic Authentication 프로 토 콜 에서 들 어 온 사용자 이름
  • request_body_file: 사용자 가 요청 한 패 키 지 를 파일 에 저장 하 는 경우 가 많 습 니 다. 이 변 수 는 요청 패 키 지 를 임시로 저장 하 는 파일 입 니 다.
  • 패키지 가 매우 작 으 면 파일 을 저장 하지 않 습 니 다
  • client_body_in_file_only 명령 은 모든 패키지 에 파일 을 강제로 저장 하고 삭제 여 부 를 결정 할 수 있 습 니 다
  • request_body: 요청 한 패키지 입 니 다. 이 변 수 는 역방향 프 록 시 를 사용 하고 메모리 임시 저장 패키지 로 설정 할 때 만 유효 합 니 다
  • request: 원본 URL 요청, 예 를 들 어 GET /? a = 1 & b = 22 HTTP / 1.1
  • host
  • 요청 줄 에서 먼저 가 져 오기
  • Host 헤드 가 있 으 면 요청 줄 의 호스트 이름
  • 을 그 값 으로 교체 합 니 다.
  • 앞의 두 가 지 를 모두 얻 지 못 하면 일치 하 는 server 를 사용 합 니 다.name

  • http_머리 이름: 머리 에 요청 한 값 의 특수 변 수 를 되 돌려 줍 니 다. 이 변 수 는 처 리 됩 니 다.
  • http_host
  • http_user_agent
  • http_referer
  • http_via
  • http_x_forwarded_for
  • http_cookie

  • 일반적인 변 수 는 상기 변 수 를 제외 하고 대응 하 는 값 을 얻 을 수 있 습 니 다.
    TCP 연결 변수
    다음은 TCP 연결 에 대한 변수 입 니 다.
  • binary_remote_addr: 클 라 이언 트 주소 의 성형 형식 은 IPv 4 에 대해 4 바이트 이 고 IPv 6 에 대해 16 바이트 이기 때문에 limitreq 와 limitconn 에 서 는 보통 key (상세 한 내용: Nginx 가 HTTP 요청 을 처리 하 는 11 단계 의 preaccess 단계)
  • 로 사용 할 수 있 습 니 다.
  • connection: 증가 하 는 연결 번호
  • connection_requests: 현재 연결 에서 실 행 된 요청 수 는 keepalive 연결 에 의미 가 있 습 니 다
  • remote_addr: 클 라 이언 트 주소
  • remote_port: 클 라 이언 트 포트
  • proxy_protocol_addr: proxy 를 사용 하면protocol 프로 토 콜 은 프로 토 콜 의 주 소 를 되 돌려 줍 니 다. 그렇지 않 으 면 비어 있 습 니 다
  • proxy_protocol_port: proxy 를 사용 하면protocol 프로 토 콜 은 프로 토 콜 의 포트 를 되 돌려 줍 니 다. 그렇지 않 으 면 비어 있 습 니 다
  • server_addr: 서버 주소
  • server_port: 서버 엔 드 포트
  • TCP_INFO: TCP 내 핵 층 파라미터, $tcpinfo 포함rtt, ​$tcpinfo_rttvar,​$tcpinfo_snd_cwnd, $tcpinfo_rcv_space
  • server_protocol: 서버 엔 드 프로 토 콜, 예 를 들 어 HTTP / 1.1
  • Nginx 처리 요청 과정 에서 발생 하 는 변수
    Nginx 가 HTTP 요청 을 처리 하 는 과정 에서 도 많은 변수 가 발생 합 니 다.
  • request_time: 현재 까지 처리 요청 시간, 단 위 는 초, 밀리초
  • 까지 정확 합 니 다.
  • server_name: 요청 한 server 와 일치 합 니 다.name 값
  • https: TLS / SSL 을 켜 면 on 으로 돌아 갑 니 다. 그렇지 않 으 면 비어 있 습 니 다
  • request_completion: 처리 요청 이 완료 되면 OK 로 돌아 갑 니 다. 그렇지 않 으 면 비어 있 습 니 다
  • request_id: 16 진 출력 요청 으로 id 를 표시 합 니 다. 이 id 는 모두 16 개의 바이트 가 포함 되 어 있 으 며 무 작위 로 생 성 되 었 습 니 다
  • request_filename: 접근 할 파일 의 전체 경로
  • document_루트: URI 와 루트, alias 규칙 으로 생 성 된 폴 더 경로
  • realpath_root: document루트 의 소프트 링크 등 을 실제 경로 로 바 꿉 니 다
  • limit_rate: 클 라 이언 트 응답 시 속도 상한 선 을 되 돌려 줍 니 다. 단 위 는 초당 바이트 입 니 다.set 명령 을 통 해 요청 에 대한 효 과 를 수정 할 수 있 습 니 다
  • HTTP 응답 을 보 낼 때 관련 변수
  • body_bytes_sent: 응답 중인 body 패키지 의 길이
  • bytes_sent: 모든 http 응답 길이
  • status: http 응답 중의 반환 코드
  • sent_trailer_이름: 응답 끝 내용 의 값 을 되 돌려 줍 니 다
  • sent_http_머리 이름: 응답 중의 구체 적 인 머리 값 특수 처리, 아래 변 수 는 특수 처 리 를 거 쳐 야 합 니 다.
  • sent_http_content_type
  • sent_http_content_length
  • sent_http_location
  • sent_http_last_modified
  • sent_http_connection
  • sent_http_keep_alive
  • sent_http_transfer_encoding
  • sent_http_cache_control
  • sent_http_link

  • 통용: 위의 이 머리 를 제외 하고 다른 머리 는 모두 통용 형 이 며, 즉 직접 사용 할 수 있다.
    Nginx 시스템 변수
  • time_local: 로 컬 시간 기준 으로 출력 되 는 현재 시간, 예 를 들 어 14 / nov / 2018: 15: 55: 37 + 0800
  • time_iso 8601: ISO 8601 표준 출력 을 사용 하 는 현재 시간, 예 를 들 어 2018 - 11 - 14T 15: 55: 37 + 08: 00
  • nginx_version: Nginx 버 전 번호
  • pid: worker 프로 세 스 의 프로 세 스 id
  • pipe: 파 이 프 를 사용 하면 p 로 돌아 갑 니 다. 그렇지 않 으 면 돌아 갑 니 다.
  • hostname: 서버 의 호스트 이름 으로 hostname 명령 출력 과 일치 합 니 다
  • msec: 1970 년 1 월 1 일부 터 지금까지 의 시간, 단 위 는 초, 소수점 후 밀리초
  • 까지 정확 합 니 다.
    실전
    프로필:
    log_format  vartest  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status bytes_sent=$bytes_sent body_bytes_sent=$body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$sent_http_abc"';
    
    server {
    	server_name var.ziyang.com localhost;
    	#error_log logs/myerror.log debug;
    	access_log logs/vartest.log vartest;
    	listen 9090;
    	
    	location / {
    		set $limit_rate 10k;
            # return 200; tcpinfo: $tcpinfo_rtt,$tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space 
    		return 200 '
    arg_a: $arg_a,arg_b: $arg_b,args: $args
    connection: $connection,connection_requests: $connection_requests
    cookie_a: $cookie_a
    uri: $uri,document_uri: $document_uri, request_uri: $request_uri
    request: $request
    request_id: $request_id
    server: $server_addr,$server_name,$server_port,$server_protocol
                
    host: $host,server_name: $server_name,http_host: $http_host
    limit_rate: $limit_rate
    hostname: $hostname
    content_length: $content_length
    status: $status
    body_bytes_sent: $body_bytes_sent,bytes_sent: $bytes_sent
    time: $request_time,$msec,$time_iso8601,$time_local
    ';
    	}	
    }
    

    위의 이 프로필 에서 우 리 는 되 돌아 오 는 응답 에 일련의 변수 가 포함 되 어 있 음 을 알 수 있 습 니 다. 실제 검증 해 보십시오.
    ➜  test_nginx curl -H 'Content-Length: 0' -H 'Cookie: a=c1' 'localhost:9090?a=1&b=22'
    
    arg_a: 1,arg_b: 22,args: a=1&b=22
    connection: 2,connection_requests: 1
    cookie_a: c1
    uri: /,document_uri: /, request_uri: /?a=1&b=22
    request: GET /?a=1&b=22 HTTP/1.1
    request_id: 5d40b1ff29d2b87d5db5c4f95ebf5e4d
    server: 127.0.0.1,var.ziyang.com,9090,HTTP/1.1
    host: localhost,server_name: var.ziyang.com,http_host: localhost:9090
    limit_rate: 10240
    hostname: yuanzizhen.local
    content_length: 0
    status: 200
    body_bytes_sent: 0,bytes_sent: 0
    time: 0.000,1590842354.866,2020-05-30T20:39:14+08:00,30/May/2020:20:39:14 +0800
    

    응답 과 설정 파일 의 값 이 일일이 대응 하 는 지 비교 하여 변수의 의 미 를 더욱 깊이 이해 할 수 있 습 니 다.
    자, 이번 절 에 우 리 는 공부 했다.Nginx 의 변 수 는 끝 났 습 니 다. 다음 절 에 실제 응용 변수의 두 모듈 을 이야기 하면 더욱 깊 은 이 해 를 얻 을 수 있 습 니 다.
    본 고 는 제 개인 블 로그: iziyang. github. io 에서 시작 되 었 습 니 다. 모든 프로필 은 Nginx 프로필 에 두 었 습 니 다. 여러분 이 직접 찾 으 실 수 있 습 니 다.

    좋은 웹페이지 즐겨찾기