ぱそくま ろご
Linux > Git > nginxでGit

nginxでGit

nginxでGit

nginxを使ってhttpもしくはhttps経由でGitを使うには「git-http-backend」というプログラムを使用します。 このプログラムをnginxで動かすにはFastCGI機能が必要になります。手順は以下のとおりです。

  1. nginxのインストール。
  2. FCGIWrapをインストール。
  3. nginxの設定ファイルにGitの設定をする。
  4. Gitのリポジトリを作成する。

nginxとFCGIWrapのインストール

nginx本体のインストールはこのサイトのnginxとは?をご覧ください。 また、FCGIWrapのインストールはnginxでFastCGIを使うの「nginxの設定」以外を実行してください。



nginxの設定ファイルにGitの設定をする

例:nginxのgit設定

server {
 .
 .
    #Gitからのリクエスト通りにlocationを設定
    location ~ ^/git/.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {

        #送信量を無制限に(いくつファイルが送られてくるのか不明なため。)
        client_max_body_size 0;

        #本来ディレクティブは上書きされると思いますが、上書きされない場合はこちらを有効にしてください。
#        fastcgi_param   SCRIPT_FILENAME     /usr/lib/git-core/git-http-backend;
        include        fastcgi.conf;

        #CGIにソケットを使用
        fastcgi_pass   unix:/run/fcgiwrap.socket;

        #http://xxxx/git/xxxxxxx.gitを/gitと/xxxxxxx.gitの部分に分ける
        fastcgi_split_path_info ^(/git)(/.*);

        #Gitを動作させるCGI。(このパラメタが上書きされない場合は、inlucde fastcgi.confの前で設定。)
        fastcgi_param   SCRIPT_FILENAME     /usr/lib/git-core/git-http-backend;

        fastcgi_param   GIT_PROJECT_ROOT   /var/git;
        fastcgi_param   GIT_HTTP_EXPORT_ALL "";

        #fastcgi_split_path_infoで分割したfastcgi_path_infoをPATH_INFOとして設定
        fastcgi_param   PATH_INFO       $fastcgi_path_info;
        fastcgi_param   REMOTE_USER     $remote_user;
   }

Gitのリポジトリを作成する

リポジトリは目的のディレクトリで「init」で作成すればOKです。今回は「/var/git」をGitのルートディレクトリとします。 その中に各プロジェクト用のディレクトリを作成します。今回は2つのプロジェクトを作成します。

/var/gitにdev1.gitとdev2.gitのリポジトリを作成

[paso ~]sudo mkdir /var/git
#1つめはdev1.git。
[paso ~]sudo git init --bare --shared=group /var/git/dev1.git
#2つめはdev2.git。
[paso ~]sudo git init --bare --shared=group /var/git/dev2.git
[paso ~]ls /var/git
dev1.git/  dev2.git/
#http経由でpush可能に。
[paso ~]sudo git config --file /var/git/dev1.git/config http.receivepack true
[paso ~]sudo git config --file /var/git/dev2.git/config http.receivepack true

/var/gitディレクトリはwebサーバー経由で読み書きするため、httpdの起動ユーザーに権限を与える必要があります。 なお、Debian系とredhat系はそれぞれユーザー名が違うので注意してください。

[paso ~]sudo chgrp -R www-data /var/git <-こっちはDebian系
または
[paso ~]sudo chgrp -R apache /var/git <-こっちはredhat系

これで、Gitをnginx経由でアクセスすることが可能です。 例えばdev1のリポジトリにアクセスしたい場合は「git clone http://localhost/git/dev1.git」となります。 詳細が知りたい場合は「GIT_CURL_VERBOSE=1 git clone http://localhost/git/dev1.git」とします。