자원 서버 구축

5473 단어
한가 해서 자원 서버 를 만 들 면 나중에 사용 할 수 있 을 거 라 고 생각 합 니 다.사용 Nginx + Golang 을 선택 하여 만 들 었 는데 그 결과 3 일 밤 이 걸 렸 습 니 다. 모두 눈물 이 었 습 니 다.그래서 지나 간 3 박 3 일 을 추모 하기 위해 블 로 그 를 쓰기 로 했다.
환경 의존
  • Nginx 제 가 설치 한 버 전 은 nginx version: nginx/1.12.2
  • 입 니 다.
  • upload-nginx-module 표준 Nginx 은 포함 되 지 않 습 니 다 upload-nginx-module. 컴 파일 할 때 추가 하 십시오
  • .
  • Golang 환경 go version go1.8.1 darwin/amd64
  • 위 에서 이런 구체 적 인 설치 방법 을 언급 하면 저 는 여기 서 상세 하 게 설명 하지 않 겠 습 니 다. 여러분 스스로 Google 해결 할 수 있 습 니 다.
    자원 서버 구축 방향
  • 클 라 이언 트 가 파일 자원 을 Nginx 서버 에 업로드
  • Nginx 서버 는 자원 을 임시 디 렉 터 리 에 저장 하고 Golang 업무 서버
  • 에 전송 요청 을 합 니 다.
  • 업무 서버 가 자원 의 위 치 를 이동 시 키 고 이름 을 바 꿉 니 다
  • 업무 서버 가 처리 결 과 를 클 라 이언 트 에 게 되 돌려 줍 니 다
  • 물론 다른 디자인 방향 도 있다. 예 를 들 어 그림 을 업무 서버 에 직접 올 리 고 업무 서버 에서 자원 서버 에 전달 할 수 있다.또는 비 즈 니스 서버 에 직접 그림 을 전송 하고 클 라 이언 트 가 자원 서버 에 자원 을 요청 할 때 자원 서버 에서 비 즈 니스 서버 로 가 져 옵 니 다.그러나 뒤에 말 한 이 두 가 지 는 정지점 전송 을 하려 면 업무 서버 가 스스로 논 리 를 처리 해 야 한다.그러나 첫 번 째 디자인 은 단전 속전 등 기능 을 모두 자원 서버 에 맡 길 수 있 기 때문에 저 는 첫 번 째 디자인 을 선 택 했 습 니 다.
    nginx 설정
        
            location /upload {
                #              
                upload_pass @uploadImageGo;
                #      ,       
                upload_store /Users/liuhu/Desktop/nginxRoot/www/upload/images; 
                #      
                upload_limit_rate 2048k;
                #       
                upload_store_access user:rw;
                #        
                upload_set_form_field $upload_field_name.name "$upload_file_name";
                upload_set_form_field $upload_field_name.content_type "$upload_content_type";
                upload_set_form_field $upload_field_name.path "$upload_tmp_path";
                #        
                upload_aggregate_form_field "$upload_field_name.md5" "$upload_file_md5";
                upload_aggregate_form_field "$upload_field_name.size" "$upload_file_size";
                #       submit description
                #upload_pass_form_field "^submit$|^description$";
                #    ,                 
                upload_pass_args on; 
                #               ,           
                upload_pass_form_field "^.*$";
                #             
                upload_cleanup 400 404 499 500-505; 
            }
            
            location @uploadImageGo {
              proxy_method POST;
                proxy_pass http://localhost:8081;
            }
    

    메모: Post 요청 / uoload 인 터 페 이 스 를 사용 해 야 합 니 다. nginx 가 직접 오 류 를 보고 할 수 없습니다.
    비 즈 니스 서버 처리
    3 일 밤 동안 여기에 갇 혀 있 었 다.
  • 당시 호출 r.ParseForm() 이후 직접 호출 r.Form 한 결과 Form 빈 것 Map 이 었 으 나 Content-Length0 보다 큰 것
  • 이 었 다.
  • 그러나 파 라 메 터 를 입 었 는 지 보고 싶 어서 nginx 의 몇 가지 설정 을 바 꾸 었 다.예 를 들 어 몇 개의 파 라 메 터 를 적 게 전달 하거나 몇 개의 파 라 메 터 를 더 전달 하면 Content-Length 또 변화 가 있 는 것 을 발견 하고 매개 변수 가 입 은 것 임 을 증명 한다
  • .
  • 어 쩔 수 없 이 전체 httpdump 나 왔 습 니 다.
  • dump 전체 http 의 코드 는 다음 과 같다
        httpData, _ := httputil.DumpRequest(r, true)
        log.Println(string(httpData))
    
  • dump 의 결 과 는
        POST /upload HTTP/1.0
        Host: localhost:8081
        Connection: close
        Accept: */*
        Connection: close
        Content-Length: 778
        Content-Type: multipart/form-data; boundary=------------------------767b3fb9efcce66b
        User-Agent: curl/7.54.0
    
        --------------------------767b3fb9efcce66b
        Content-Disposition: form-data; name="image.name"
    
        vim_keymap.png
        --------------------------767b3fb9efcce66b
        Content-Disposition: form-data; name="image.content_type"
    
        application/octet-stream
        --------------------------767b3fb9efcce66b
        Content-Disposition: form-data; name="image.path"
    
        /Users/liuhu/Desktop/nginxRoot/www/upload/images/0006817569
        --------------------------767b3fb9efcce66b
        Content-Disposition: form-data; name="image.md5"
    
        62519e639e490a69d0106bceb7e0f184
        --------------------------767b3fb9efcce66b
        Content-Disposition: form-data; name="image.size"
    
        176536
        --------------------------767b3fb9efcce66b
        Content-Disposition: form-data; name="sss"
    
        sss
        --------------------------767b3fb9efcce66b--
    
  • 매개 변 수 는 모두 Content-Disposition 안에 놓 여 있 고 매개 변 수 는 하나의 동적 boundary 으로 분할 되 어 있 음 을 발견 했다.

  • 정 보 를 통 해 요청 한 dumpContent-Type 이다.따라서 multipart/form-data 문 서 를 찾 아 보 니 Golang 전체 요청 multipart/form-data 을 메모리 에 분석 해 야 body 에서 해당 필드 를 얻 을 수 있 습 니 다.
    ParseMultipartForm parses a request body as multipart/form-data. The whole request body is parsed and up to a total of maxMemory bytes of its file parts are stored in memory, with the remainder stored on disk in temporary files. ParseMultipartForm calls ParseForm if necessary. After one call to ParseMultipartForm, subsequent calls have no effect.
  • 서버 의 주요 코드 는 다음 과 같다
    if r.Method == "POST" {
        r.ParseMultipartForm(32 << 20)
        log.Println(r.Form)
        //    
        //todo
        w.Write([]byte("    "))
    }
    
  • 좋은 웹페이지 즐겨찾기