Git 通过 Nginx 代理为 Git 实验室服务器克隆不工作
Git clone through Nginx proxy for Gitlab server is not working
我的 Nginx 服务器充当 Gitlab 服务器的代理,问题是当我尝试“**git clone git@gitlab.example.com:username/project.git**
”时我无法克隆项目 [它不是从 Nginx 服务器到 Gitlab 服务器的隧道]
当我使用 Gitlab 服务器的 IP 地址更新本地系统的 /etc/hosts 文件时,它无需密码即可正常克隆 [我已经使用 Gitlab 上的 SSH Public 密钥更新了我的配置文件]。
所以我得出结论,我必须使用可以通过 Nginx 服务器将 SSH 通信从任何客户端系统隧道传输到 Gitlab 服务器的规则来更新我的 Nginx 配置。
通过如下更改尝试此 Link 上的代码:
upstream gitlab {
server 192.168.61.102:22;
}
server {
listen 22;
server_name gitlab.example.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://gitlab;
}
}
但它不起作用。如果有人帮助我调整规则以使其生效,那就太好了。
注意:上面代码中192.168.61.102是我的gitlab服务器的IP地址,我的Nginx服务器是192.168.61.101
Nginx 代理用于 http 请求。
通过 SSH 克隆时,您没有使用 http。
您需要做的是在您的路由器上使用端口转发或在您的服务器上使用 iptables。
首先,您需要停止让 Nginx 监听端口 22。Nginx 不处理 SSH 转发,您的防火墙可以。
如果您使用的是 iptables,那么这些规则将通过您的 Nginx 主机将所有请求转发到您的 Gitlab 主机。
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-destination [GITLAB-IP]:22
sudo iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 22 -j SNAT --to-source [NGINX-IP]
您可能需要更改这些命令中的 eth0
以适合您的服务器设置。
然后您需要通过编辑 /etc/sysctl.conf
文件并取消注释此行来启用数据包转发:
net.ipv4.ip_forward=1
然后使用此命令重新加载您刚刚更改的配置:
sudo sysctl -p
最后,这些 iptables 规则在默认情况下不是永久性的,当您重新启动服务器时将被删除。使它们持久化的最简单方法是使用 iptables-persistent
包。你像这样安装那个包:
sudo apt-get install iptables-persistent
安装后,您可以随时使用这些命令 save/restore iptables 规则:
sudo invoke-rc.d iptables-persistent save
sudo invoke-rc.d iptables-persistent reload
如果您使用的是 Ubuntu 16.04 或更高版本,那么这些命令是
sudo netfilter-persistent save
sudo netfilter-persistent reload
在规则生效并测试它们之后,您需要 运行 保存命令。然后,当您的服务器重新启动时,您保存的规则将自动加载。
我的 Nginx 服务器充当 Gitlab 服务器的代理,问题是当我尝试“**git clone git@gitlab.example.com:username/project.git**
”时我无法克隆项目 [它不是从 Nginx 服务器到 Gitlab 服务器的隧道]
当我使用 Gitlab 服务器的 IP 地址更新本地系统的 /etc/hosts 文件时,它无需密码即可正常克隆 [我已经使用 Gitlab 上的 SSH Public 密钥更新了我的配置文件]。
所以我得出结论,我必须使用可以通过 Nginx 服务器将 SSH 通信从任何客户端系统隧道传输到 Gitlab 服务器的规则来更新我的 Nginx 配置。
通过如下更改尝试此 Link 上的代码:
upstream gitlab {
server 192.168.61.102:22;
}
server {
listen 22;
server_name gitlab.example.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://gitlab;
}
}
但它不起作用。如果有人帮助我调整规则以使其生效,那就太好了。
注意:上面代码中192.168.61.102是我的gitlab服务器的IP地址,我的Nginx服务器是192.168.61.101
Nginx 代理用于 http 请求。
通过 SSH 克隆时,您没有使用 http。
您需要做的是在您的路由器上使用端口转发或在您的服务器上使用 iptables。
首先,您需要停止让 Nginx 监听端口 22。Nginx 不处理 SSH 转发,您的防火墙可以。
如果您使用的是 iptables,那么这些规则将通过您的 Nginx 主机将所有请求转发到您的 Gitlab 主机。
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-destination [GITLAB-IP]:22
sudo iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 22 -j SNAT --to-source [NGINX-IP]
您可能需要更改这些命令中的 eth0
以适合您的服务器设置。
然后您需要通过编辑 /etc/sysctl.conf
文件并取消注释此行来启用数据包转发:
net.ipv4.ip_forward=1
然后使用此命令重新加载您刚刚更改的配置:
sudo sysctl -p
最后,这些 iptables 规则在默认情况下不是永久性的,当您重新启动服务器时将被删除。使它们持久化的最简单方法是使用 iptables-persistent
包。你像这样安装那个包:
sudo apt-get install iptables-persistent
安装后,您可以随时使用这些命令 save/restore iptables 规则:
sudo invoke-rc.d iptables-persistent save
sudo invoke-rc.d iptables-persistent reload
如果您使用的是 Ubuntu 16.04 或更高版本,那么这些命令是
sudo netfilter-persistent save
sudo netfilter-persistent reload
在规则生效并测试它们之后,您需要 运行 保存命令。然后,当您的服务器重新启动时,您保存的规则将自动加载。