1. 程式人生 > >git clone的時候報error: RPC failed; result=18錯誤

git clone的時候報error: RPC failed; result=18錯誤

因業務需求,需要把內網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;
        }
}