git clone的時候報error: RPC failed; result=18錯誤
阿新 • • 發佈:2018-11-19
因業務需求,需要把內網gitlab倉庫的地址對外網訪問,在gitlab前端配置了一個nginx代理伺服器,來實現需求,可以在git clone的時候報error: RPC failed錯誤
[[email protected]Server_yd]# git clone http://username:[email protected]/ElectronicAPI.git Initialized empty Git repository in /tmp/ElectronicVisaAPI/.git/ remote: Counting objects: 9332, done. remote: Compressing objects:100% (4898/4898), done. error: RPC failed; result=18, HTTP code = 200 Receiving objects: 1% (94/9332), 12.00 KiB | 10 KiB/s ^C
經查詢大致的意思就是內容過大,需要配置http.postBuffer,在伺服器端配置後,依然無效,使用沒有經過nginx代理端的地址測試正常。
git config --global http.postBuffer 524288000
由此判斷問題出現在了nginx代理伺服器,下載大檔案超時。
nginx代理前端使用者請求下載檔案, nginx代理會先從後端nginx拿到檔案並快取到本地,然後響應給客戶端,其中與proxy buffer相關的配置項如下:
proxy_buffer_size 512k; proxy_buffers 4 512k; proxy_busy_buffers_size 512k; proxy_temp_file_write_size 512k;
由此可知, buffer緩衝區最大可以緩衝2.5M的資料,然後就開始刷寫磁碟,如果磁碟無法寫入,資料丟失。這也是為什麼前端下載部分資料,即下載不動的原因。
原因分析: 1、代理伺服器報告:上游過早的關閉連線,好像問題出在被代理伺服器;而被代理伺服器則抱怨:上游伺服器超時。那麼一個很合理的推論是:代理伺服器很長時間沒向被代理伺服器請求資料,被代理伺服器認為代理伺服器已經掉線或完成任務,於是主動斷開連線,代理伺服器發現需要資料,再連線時,已經連線不上了。 2、正常的流程應該是:只要客戶端一直下載,“客戶機->代理伺服器->被代理伺服器”,這一連串的資料流不會中斷,也就不會出現超時。 3、出現超時只能有一種情況:代理伺服器快取了大檔案。 4、代理伺服器接到下載請求,向被代理伺服器請求資料,由於兩個伺服器之間網速快,所以代理伺服器請求速度要遠大於向客戶端傳送的速度,這就導致一下正常的代理方式:代理伺服器要快取資料。 5、但是兩個伺服器之間的速度實在是太快了,快取1G資料也就是分分鐘的事情,而客戶端需要慢慢下載,可能需要十幾、甚至幾十分鐘。代理伺服器和被代理伺服器這段時間內沒有什麼事可幹,與是兩端靜默的時間一長,超過了timeout的時間(一般是60s),被代理伺服器就認為代理伺服器掉線。 解決方案:1)將代理伺服器快取設定更大,可以直接快取整個檔案,跟上面的解決一樣
2)禁用代理伺服器快取:
proxy_redirect default; proxy_buffering off;3)設定更長的超時時間
proxy_send_timeout 90; #後端伺服器資料回傳時間(代理髮送超時) proxy_read_timeout 90; #連線成功後,後端伺服器響應時間(代理接收超時)
代理配置如下:
server { listen 80; server_name gitlab.linzhongfengniao.com; access_log /var/log/nginx/gitlab.linzhongfengniao.log main; set $web_url $host; if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot") { return 404; } location / { proxy_pass http://192.168.3.100; include /etc/nginx/conf.d/deny.conf; proxy_redirect default; proxy_buffering off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; set $domain default; } }