因業務需求,需要把內網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)禁用代理服務器緩存:
3)設置更長的超時時間
1)將代理服務器緩存設置更大,可以直接緩存整個文件,跟上面的解決一樣
2)禁用代理服務器緩存:
proxy_redirect default;
proxy_buffering off;
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; } }