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


因業務需求,需要把內網gitlab倉庫的地址對外網訪問,在gitlab前端配置了一個nginx代理服務器,來實現需求,可以在git clone的時候報error: RPC failed錯誤

[root@Server_yd]# git clone  http://username:password@gitlab.linzhongfengniao.com/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;
        }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM