Nginx+Git+Http(Smart)手动搭建自己的Git服务器

Nginx+Git+Http(Smart)手动搭建自己的Git服务器

1. 原材料

  1. Centos
  2. Nginx
  3. Git
  4. htpasswd
  5. fcgiwrap

2. 搭建步骤

  1. 安装Git
  2. 建立裸仓库
  3. 安装htpasswd
  4. 编译安装fcgiwrap
  5. Nginx建立虚拟主机, 确保外网(内网也可,确保使用Http协议)可访问
  6. 重新配置nginx, 具体内容参看下方
  7. 使用htpasswd创建密码用于鉴权
  8. 客户端测试, clone在执行完第5步时理论上已可行, push操作需要从6开始往下执行

3. 填坑指北

其实文章主旨是为了记录我的实验结果, 因为确实花费了很大一部分时间去研究这个东西,网上又很难找到相关的教程, Git 官网是有的, 但是介绍的是Apache的, 并没有介绍关于Nginx的, 毕竟服务器小白, 还做不到触类旁通.

背景介绍:

当前已有服务器Centos一个, 已安装Git, 平时为个人使用, 建立裸仓库后, 服务器上配置了本地客户端的公钥, 所以平常使用Git提交代码无感

但在一次多人开发项目时发现了问题, 额, 确实是账户鉴权的问题, 突然想起来Git有四种协议, 原来一般文章介绍的, 都是SSH协议, 这个其实个人开发是没问题的, 但是遇到多人开发时就很麻烦.不懂Linux的配置起来账户很麻烦不说, 还很容易出现其它问题, 然后就想到了Http协议

Git的Http协议又分为两种, 一种哑协议, 一种智能协议, 哑协议如上所属, 只需要你搭建一个虚拟主机, 指向git仓库根目录, 客户端直接

git clone http://HOST/project.git

就可以拉取了, 很方便的有没有, 如果ssh的话, 还必须要输入账号密码, 如果没有配置公钥的话, 甚至每次操作都需要输入…

但是这个哑协议不能 push

为了能实现正常推送代码, 就必须实现Smart Http, 至于区别和历史背景, 我就不在介绍了, 想必能翻到这个文章的已经看了很多类似文章了.

实操

上面总结的步骤, 其实关于所需软件的安装部分是不分先后顺序的, 难点在于配置

但, 实际上网上我能找到的关于此配置的文章已经有很多很多了, 所以配置也不算很难, 关键在于复制别人的操作到自己服务器上后遇到的各种未知问题, 此类问题, 我们一般称之为 踩坑

此处仅记录实现了Http拉取, 但无法实现推送后我所做过的各种尝试

htpasswd 用于鉴权登录

安装htpasswd为了实现简单的鉴权机制, 也就是说, 这个程序安装完后, 可以使用 htpasswd 命令创建账号用于使用Http协议的拉取和推送, 在nginx配置中可配置为需要鉴权, 使用http协议的初衷就是为了多人使用仓库啊, 这个必须要的

在找到的文档中, 均是直接提供了使用该命令创建账号的命令, 但是我试了才发现, 这个东西还要自己安装的呀, 并不是默认安装的东西!

安装命令网上很多, 就不写了, 创建账号的指令也有的,

htpasswd FILENAME username

里面的 FILENAME 自行替换为任意名称, 位置随意放, 但是你要记住它, 建议直接放在git根目录下方便查询

这个命令是根据记忆写的, 自行验证语法吧, 有很多可选参数, 详情可搜索查询

fcgiwrap

初看这个东西, 很懵逼, 以为教程是随意写的, 毕竟连Git官方文档上配置中都没有写这个, 但是后来试了无数遍之后, 发现一直不得行, 才觉得是不是应该试下是不是这个问题

后来查文档发现这个东西, 是为了直接执行cgi程序什么的blablablabla, apache是自带的, 但是我的服务器已经装过nginx了, 没道理再装个apache

正好, nginx就是那个不支持直接执行cgi什么的程序, 所以就要用到这个东西了

安装教程我找了很久, 只找到了编译安装的方式, 好在, 也不难
参考资料: centos 配置 nginx + fcgiwrap + git

按照上述文章操作完之后, 貌似那个路径下还是找不到fcgiwrap.socket 这个文件的, 如果没找到, 你就再看这篇文章, 里面有执行命令, 执行后, 会发现生成了, 具体是不是我哪里出错了, 我也不知道. 现在只想记录下来, 不想继续深究了.
参考资料: fcgiwrap 的简单使用

502错误

fcgiwrap没安装时, 但是nginx已经按照教程中进行了配置, 并且确认了路径没有问题, 此时不管是clone还是push都是502错误. 查了下wwwlogs也没看出来问题, 最后看了一篇文章, 说是有可能是因为socket文件的权限问题, 抱着死马当做活马医的态度, 我就找到了这个fcgiwrap.socket文件, 直接一顿操作, chown,chmod,
然后就试了下, ,它就通了… 文章写到现在我也不明白问题是咋回事, 总之在全部配置都确认无误时, 最后就是改了下这个文件的权限, 就OK了??? 文章也有说, 可能会在php-fpm重启时失效, 这个暂时没有测试.

一些其它问题
  1. 使用htpasswd创建了账号密码, nginx中配置了启用授权, 此时再次执行git操作时会提示输入账号密码,如果输错了, 如果你是windows系统, 记得到 凭据管理器-> Windows凭据 中找到这个git协议域名下的找到删除, 或者修改正确, 尽量排除在踩坑过程中解决问题出现的额外因素
  2. 起初, 在没有配置fcgiwrap时, Git提交代码报错, 无法授权之类的提示, 返回错误码22, 这个没去研究到底是为啥, 起初猜测是htpasswd的问题, 怀疑是否起了作用, 后来直接修改了密码文件的权限, 简单粗暴的先排除掉权限问题, 后来在配置了fcgiwrap后直接502了, 拉取都是502…这个问题当时就跳过没再继续了. 最终也没把密码文件权限改回去, 所以这个问题是否是真实愿意待定
  3. git-http-backend 文件路径, 多个教程中路径均不相同, 我当前环境是lnmp一键安装包, 路径就在/usr/libexec/git-core/git-http-backend 至于具体到个人, 费点心找一下吧, 也就是你能找到的文章中写的几个路径了吧应该
  4. 还有一些坑, 印象不够深刻, 或者是比较容易解决, 不再赘述

总结

  1. 一步一步来, 先保证可以使用http协议把项目clone到本地
  2. 再确保fcgiwrap和httpd是否安装, 基本可以确定是必装的.
  3. 最后是修改nginx配置,确保fcgiwrap已经运行, 确保配置中各项参数路径无误

其实到最后不明白对自己到底有什么用处, 使用gitee等或许也是更好的选择, 也可能正是这个原因, 所以网上找到的可适用的教程才少之又少, 就像之前写的文章来记录如何使安装git进行代码自动部署, 现在觉得, 使用gitee等托管网站可能也是更好更省心的选择,

不过捣鼓了这么久, 总要记录下来 , 也许碰到一个和我一样轴的人就是要自己实现的呢, 也算是给与一点点帮助, 少走点弯路吧.

后记

结合之前写的一篇文章, 配置git推送自动部署, 将原有脚本文件进行了更新, 并进行了不完整测试, 已经实现推送后自动部署, 放在这里留作记录

哦,对了, 昨天刚部署完, 服务器宕机了, 额,当然不是因为这个的配置原因, 是因为还有其它人在这个服务器上面开发测试… 阿里云上有个宕机自动重启,当时重启后, 试了竟然push失效了. 貌似clone也失效了?? 然后没两分钟, 服务器又挂了, 今早看了日志, 好像是有漏洞被人攻击导致的宕机. 昨晚手动后台重启了一下, 等了五六分钟也没见起来, 就先睡了, 今早发现已经好了, 而且, 这篇文章配置下来的操作, 竟然又恢复正常了!!! 总之当前是已经可以使用了, 再配合上下面这个脚本, 啊~ 巴适大概就是这个意思吧_

# 自动创建及同步处理脚本.sh
# 使用说明: ./autoGit.sh ProjectName

DOMAIN='http://你的域名' # HTTP协议配置的域名
WAN_IP='192.168.1.1' #服务器IP,用于生产git路径展示
WWW_USERNAME='www' # nginx实际操作用户
PRO_NAME=$1 #项目名称,执行脚本时传入
WEB_PATH='/www/wwwroot/' # WEB根目录
GIT_PATH='/www/gitstore/' # GIT裸仓库根目录
WEB_FULL_PATH=${WEB_PATH}${PRO_NAME}
echo "项目路径: ${WEB_FULL_PATH}"
GIT_FULL_PATH=${GIT_PATH}${PRO_NAME}.git
echo "Git路径: ${GIT_FULL_PATH}"
# 创建裸仓库,空仓库理论上来说最直接简单,但是远程提交时会出一系列问题,所以还是老老实实用裸的吧
git init --bare ${GIT_FULL_PATH}
# 修改钩子文件,在收到commit时同步代码
echo -e "git --work-tree=${WEB_FULL_PATH} checkout -f\nchown -R ${WWW_USERNAME}:${WWW_USERNAME} ${WEB_FULL_PATH}" > ${GIT_FULL_PATH}/hooks/post-receive
echo '钩子修改完成:'
cat ${GIT_FULL_PATH}/hooks/post-receive
echo "为钩子添加执行权限..."
chmod +x ${GIT_FULL_PATH}/hooks/post-receive # 为钩子添加执行权限
# 钩子完成了, 接下来要创建项目对应的WEB目录,并执行clone操作
echo "正在克隆项目..."
git clone ${GIT_FULL_PATH} ${WEB_FULL_PATH}
chown -R ${WWW_USERNAME}:${WWW_USERNAME} ${WEB_FULL_PATH} # 更改归属人为www
chown -R ${WWW_USERNAME}:${WWW_USERNAME} ${GIT_FULL_PATH} # 更改归属人为www
# 服务端Git配置完成, 此处的root为实际配置免密登录的账户名, 也就是配置完免密后可以免密登录服务器的账户名.
echo "仓库地址(SSH): root@${WAN_IP}:${GIT_FULL_PATH}"
# 使用HTTP协议需要自行配置
echo "仓库地址(HTTP): ${DOMAIN}/${PRO_NAME}.git"

你可能感兴趣的:(软件问题解决,杂学,git,smart,http,Nginx,fcgiwrap,自动部署)