在 Debian 上运行的 GitLab(通常是 Omnibus 安装)可以通过 Nginx 限流 和 GitLab 自身配置 来实现限流。下面按常见场景说明。
GitLab Omnibus 自带 Nginx,限流主要在 Nginx 层做。
sudo vim /etc/gitlab/gitlab.rb
nginx['rate_limiting'] = {
'enabled' => true,
'limit_req_zone' => '$binary_remote_addr zone=one:10m rate=10r/s',
'limit_req' => 'zone=one burst=20 nodelay'
}
含义:
10r/s:每个 IP 每秒最多 10 个请求burst=20:允许突发 20 个请求nodelay:突发请求不延迟处理nginx['custom_gitlab_server_config'] = <<-EOS
location ~ ^/api/ {
limit_req zone=one burst=10 nodelay;
proxy_pass http://gitlab-workhorse;
}
EOS
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart nginx
/git/ 路径nginx['custom_gitlab_server_config'] = <<-EOS
location ~ ^/.*\.git/ {
limit_req zone=git burst=5 nodelay;
proxy_pass http://gitlab-workhorse;
}
EOS
nginx['rate_limiting'] = {
'enabled' => true,
'limit_req_zone' => '$binary_remote_addr zone=git:10m rate=5r/s'
}
gitlab_rails['rate_limiting'] = {
'enabled' => true,
'api_request_limit' => 100,
'api_request_limit_period' => 60
}
含义:每个用户每 60 秒最多 100 次 API 请求
gitlab_rails['rate_limiting'] = {
'enabled' => true,
'login_failed_attempts' => 5,
'login_lockout_period' => 300
}
sudo apt install fail2ban
sudo vim /etc/fail2ban/jail.local
[sshd]
enabled = true
maxretry = 5
bantime = 3600
sudo systemctl restart fail2ban
ab -n 100 -c 20 https://gitlab.example.com/
或看 Nginx 日志:
sudo tail -f /var/log/gitlab/nginx/gitlab_access.log
出现 503 或 limit_req 说明限流生效。
| 场景 | 推荐方式 |
|---|---|
| 防刷接口 | Nginx 限流 |
| 防暴力登录 | GitLab + fail2ban |
| 控制 Git 流量 | Nginx /git/ |
| 控制 API | GitLab rate_limiting |
如果你能说明:
我可以给你更精确的配置。