gitサーバー への道

2020/04/25

テクノロジー

t f B! P L
eyecatch バージョン管理は、プログラムの保険という考えに、賛同する、ユゲタです。 「git」とかけまして、 「地震発生」と、ときます。 そのココロは・・・ じっと(git)することで、安心できます。

gitがnginxを通じてサーバーリポジトリを構築できるらしい

独自のPHPフレームワークを作っていた時に、composerの機能を持たせたく、github以外にも、自前のセキュアな環境でリポジトリを持っておきたいと考え、調べてみたら、どうやら、gitリポジトリをnginxを通してデータのcloneうやpush,pullができるという事を見つけました。 やり方は非常に簡単で、"fcgiwrap"というモジュールを通して行うだけなのだそうです。 とりあえず、dockerで構築して試してみることにします。 osは"ubuntu" 通常のwebサーバーと共存できるようにすることも重要な要素と考えておきます。

インストールへの道

インストールはいろいろなサイトに書かれているけど、あくまで、僕の環境での構築手順を書いておきます。 なお、webサーバーは構築済みとして、進めます。 apt-get install -y nginx fcgiwrap server { listen 80; index index.php index.html; server_name localhost 192.*; root /var/www/html; client_max_body_size 100M; client_body_in_file_only clean; client_body_buffer_size 100M; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/run/php/php7.2-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ \.git$ { root /var/www/html/git; include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/fcgiwrap.socket; fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend; fastcgi_param GIT_HTTP_EXPORT_ALL ""; fastcgi_param GIT_PROJECT_ROOT /var/www/html/git; fastcgi_param REMOTE_USER $remote_user; fastcgi_param PATH_INFO $uri; } } 下のgit-locationが追加になります。 念の為に、書かれているpathの存在を確認しておきましょう。 ※違っている場合は適宜変更してください。 他のサイトには、いろいろな書き方がされていますが、今回は、webサーバーの/git/*.gitという形でリポジトリが格納されているという環境になりますが、違っている場合は、それぞれの階層を書き換えてください。

ハマりの道

とにかく、cloneとpushを確認するだけで、3日も掛かってしまったのですが、どんなエラーが出ていたのかと言うと、 cloneをすると、404エラー、 pushをすると、405エラー、 こんな感じで、nginxのaccess.logには、以下のように書き込まれていました。 # cloneした時のエラー "GET /git/test.git/info/refs?service=git-receive-pack HTTP/1.1" 404 5 "-" "git/2.24.1 (Apple Git-126)" # pushした時のエラー "GET /git/test.git/info/refs?service=git-receive-pack HTTP/1.1" 200 0 "-" "git/2.24.1 (Apple Git-126)" "GET /git/test.git/HEAD HTTP/1.1" 200 23 "-" "git/2.24.1 (Apple Git-126)" "PROPFIND /git/test.git/ HTTP/1.1" 405 182 "-" "git/2.24.1 (Apple Git-126)" これで丸2日ほど経過するわけですが、PROPFINDというのは、nginxのモジュールが不足しているという風に書かれていたんですが、 代替モジュールであるfcgiwrapとうまく連結されていない事が原因であることが分かりました。

解決への道

pushした時の3行目のエラーは、モジュールエラーですが、nginxのgit振り分けがキチンと行われていない事が原因だったようで、以下のようにすることで、解決することができました。 location ~ ^/git/.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ { ... } そして、もうひとつ重要なポイントがあって、このままの状態では、サーバーに設置されているリポジトリからclone処理ができずに困っていたところ、 事前にそのリポジトリ内で以下のコマンドを実行しておく必要があったようです。 $ git update-server-info $ git config --file ./config http.receivepack true これで無事にcloneとpushをすることが確認できました。

参考

https://kokuzawa.github.io/blog/2018/10/31/nginx-and-git/ https://blogger.tempus.org/2010/01/git-http.html

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ