利用Nginx搭建Http訪問的Git伺服器

来源:http://www.cnblogs.com/fantesy84/archive/2017/02/17/6410984.html
-Advertisement-
Play Games

本文參考了http://www.cnblogs.com/wangxiaoqiangs/p/6179610.html, 自己操作中收穫一些錯誤心得.記下以備用. 一. 準備工作: 1. 下載nginx並安裝 推薦到nginx官方網站下載並安裝,有很詳細的教程. 參考資料: http://nginx.o ...


本文參考了http://www.cnblogs.com/wangxiaoqiangs/p/6179610.html, 自己操作中收穫一些錯誤心得.記下以備用.

一. 準備工作:

  1. 下載nginx並安裝

    推薦到nginx官方網站下載並安裝,有很詳細的教程. 參考資料: http://nginx.org/en/linux_packages.html

    (1). 編輯repo文件,這裡以64位的CentOS 7為示例:

      

> vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/x86_64/
gpgcheck=0
enabled=1

    (2). 保存退出後,使用yum安裝.可以選擇把動態模塊也安裝上,具體參見上述站點

> yum install nginx -y

 

  2. 下載git並安裝

    (1).不推薦使用yum安裝的git版本,過低了.到github下載最新的git源碼. 下載地址: https://github.com/git/git/releases

> yum -y remove git

> yum -y install perl cpio autoconf tk zlib-devel libcurl-devel openssl-devel expat-devel gettext-devel perl-ExtUtils-MakeMaker automake gcc

> cd /usr/local/src; wget https://github.com/git/git/archive/v2.11.1.tar.gz

> tar zxf v2.11.1.tar.gz && cd git-2.11.1

> autoconf && ./configure && make && make install

> git --version

    (2). 這個時候,git安裝好了,可以選擇較高的穩定版本.我用的時候2.11.1

 

  3. 下載spawn-fcgi, fcgi-devel, fcgiwrap並安裝

    (1). 安裝spawn-fcgi.github地址: https://github.com/lighttpd/spawn-fcgi

      這裡需要註意的是,如果你沒有安裝前面的automake和gcc,請這裡一定要把這些依賴安裝好.

> cd /usr/local/src;

> git clone https://github.com/lighttpd/spawn-fcgi.git

> cd spawn-fcgi && ./autogen.sh && ./configure && make && make install

    (2). 安裝fcgi-devel.

      安裝前,需要先安裝epel源,不然安裝不了fcgi-devel

> yum -y install epel-release

> yum -y install fcgi-devel

    (3). 安裝fcgiwrap. GitHub地址: https://github.com/gnosek/fcgiwrap

> cd /usr/local/src

> git clone https://github.com/gnosek/fcgiwrap.git

> cd fcgiwrap && autoreconf -i && ./configure && make && make install

      

二. 配置

  1. 添加Git的運行用戶, Git倉庫初始化

> useradd -r -s /sbin/nologin git

> mkdir -p /data/git && cd /data/git

> git init --bare repo.git && chown -R git.git /data/git

> cd repo.git && mv hooks/post-update.sample hooks/post-update

> git update-server-info

  2. 編寫fcgiwrap啟動腳本

> vi /etc/init.d/fcgiwrap

   腳本內容:

#! /bin/bash
### BEGIN INIT INFO
# Provides:          fcgiwrap
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Should-Start:
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: FastCGI wrapper
# Description:       Simple server for running CGI applications over FastCGI
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
SPAWN_FCGI="/usr/local/bin/spawn-fcgi"
DAEMON="/usr/local/sbin/fcgiwrap"
NAME="fcgiwrap"

PIDFILE="/var/run/$NAME.pid"

FCGI_SOCKET="/var/run/$NAME.socket"
FCGI_USER="git"
FCGI_GROUP="git"
FORK_NUM=15
SCRIPTNAME=/etc/init.d/$NAME

case "$1" in
    start)
        echo -n "Starting $NAME... "

        PID=`pidof $NAME`
        if [ ! -z "$PID" ]; then
            echo " $NAME already running"
            exit 1
        fi

        $SPAWN_FCGI -u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -P $PIDFILE -F $FORK_NUM -f $DAEMON

        if [ "$?" != 0 ]; then
            echo " failed"
            exit 1
        else
            echo " done"
        fi
    ;;

    stop)
        echo -n "Stoping $NAME... "

        PID=`pidof $NAME`
        if [ ! -z "$PID" ]; then
            kill `pidof $NAME`
            if [ "$?" != 0 ]; then
                echo " failed. re-quit"
                exit 1
            else
                rm -f $pid
                echo " done"
            fi
        else
            echo "$NAME is not running."
            exit 1
        fi
    ;;

    status)
        PID=`pidof $NAME`
        if [ ! -z "$PID" ]; then
            echo "$NAME (pid $PID) is running..."
        else
            echo "$NAME is stopped"
            exit 0
        fi
    ;;

    restart)
        $SCRIPTNAME stop
        sleep 1
        $SCRIPTNAME start
    ;;

    *)
        echo "Usage: $SCRIPTNAME {start|stop|restart|status}"
        exit 1
    ;;
esac

   註意其中"FCGI_USER"和"FCGI_GROUP"以及"FORK_NUM",分別為fastcgi運行的用戶,組以及進程數(進程數按需調整).需要與之後配置的nginx的worker用戶一樣.

   記得修改一下讀寫許可權以及設置腳本為開機啟動.然後我們啟動fastcgi

> chmod a+x /etc/init.d/fcgiwrap

> chkconfig --level 35 fcgiwrap on

> /etc/init.d/fcgiwrap start

  3. nginx配置. yum安裝的nginx已經預設配置了WebDAV模塊,所以不用麻煩了.如果發現沒有WebDAV模塊的功能,可以參考nginx的官方文檔中Dynamic Modules的說明: http://nginx.org/en/docs/ngx_core_module.html#load_module

    (1). 創建授權文件夾以及git的nginx設置文件

> mkdir -p /usr/local/nginx/config

> vi /etc/nginx/conf.d/git.conf

      內容如下:

server {
    listen      80;
    server_name gitServer;
    root /usr/local/share/gitweb;

    client_max_body_size 100m;

    auth_basic "Git User Authentication";
    auth_basic_user_file /usr/local/nginx/config/pass.db;

    location ~ ^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$ {
        root /data/git;
    }    
    
    location ~ /.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
        root          /data/git;
        fastcgi_pass  unix:/var/run/fcgiwrap.socket;
        fastcgi_connect_timeout 24h;
        fastcgi_read_timeout 24h;
        fastcgi_send_timeout 24h;
        fastcgi_param SCRIPT_FILENAME   /usr/local/libexec/git-core/git-http-backend;
        fastcgi_param PATH_INFO         $uri;
        fastcgi_param GIT_HTTP_EXPORT_ALL "";
        fastcgi_param GIT_PROJECT_ROOT  /data/git;
        fastcgi_param REMOTE_USER $remote_user;
        include fastcgi_params;
    }

    try_files $uri @gitweb;

    location @gitweb {
        fastcgi_pass  unix:/var/run/fcgiwrap.socket;
        fastcgi_param GITWEB_CONFIG    /etc/git/gitweb.conf;
        fastcgi_param SCRIPT_FILENAME  /usr/local/share/gitweb/gitweb.cgi;
        fastcgi_param PATH_INFO        $uri;
        include fastcgi_params;
    }
}

    (2). 修改/etc/nginx/nginx.conf中的worker進程所有者.

# 將此處的nginx用戶修改為git用戶,以保證能調用到fastcgi(需要和fcgiwrap腳本中的FCGI_USER保持一致)
user git; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }

  4. 安裝http-tools並添加認證用戶

> yum -y install httpd-tools

> cd /usr/local/nginx/config

> htpasswd -c pass.db guestUser

> git config --global color.ui true

> git config --global user.name 'git'

> git config --global user.email '[email protected]'

  5. 配置gitweb,首先要確定預設安裝的gitweb(採用源碼安裝git才會有)是否存在

> find /usr/local/share -name gitweb.cgi

> cd /usr/local/share/gitweb && ll /usr/local/share/gitweb

> vi /etc/git/gitweb.conf

    gitweb.conf的配置內容如下:

# path to git projects (<project>.git)
$projectroot = "/data/git";

# directory to use for temp files
$git_temp = "/tmp";

# target of the home link on top of all pages
$home_link = $my_uri || "/";

# html text to include at home page
$home_text = "indextext.html";

# file with project list; by default, simply scan the projectroot dir.
$projects_list = $projectroot;

# javascript code for gitweb
$javascript = "static/gitweb.js";

# stylesheet to use
$stylesheet = "static/gitweb.css";

# logo to use
$logo = "static/git-logo.png";

# the 'favicon'
$favicon = "static/git-favicon.png";

三. 啟動nginx,fastcgi

> nginx -t

> systemctl start nginx

> /etc/init.d/fcgiwrap start

四. 問題收集:

  1. 訪問http://hostname/repo.git出現502錯誤,nginx錯誤日誌中出現:connect() to unix:/var/run/fcgiwrap.socket failed (13: Permission denied) while connecting to upstream

    解決方法: 檢查selinux是否開啟,如果開啟,請關閉或者配置策略使其能被訪問.

  2. Can't locate CPAN.pm in @INC (@INC contains: /usr/local/lib/perl5 /usr/local/share/perl5 /usr/lib/perl5/vendorperl /usr/share/perl5/vendorperl /usr/lib/perl5 /usr/share/perl5 .) BEGIN failed--compilation aborted.

    解決方法: yum -y install perl-CPAN

  3. Can't locate CGI.pm in @INC (@INC contains: /usr/local/lib/perl5 /usr/local/share/perl5 /usr/lib/perl5/vendorperl /usr/share/perl5/vendorperl /usr/lib/perl5 /usr/share/perl5 .) BEGIN failed--compilation aborted.

    解決方法: yum -y install perl-CGI

  4. Can't locate Time/HiRes.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/share/gitweb/gitweb.cgi line 20.

    解決方法: yum -y install perl-Time-HiRes

五. Gitweb-theme 樣式

  如果覺得 gitweb 預設樣式不好看,可以拿該樣式替換

  

> cd /usr/local/src

> git clone https://github.com/kogakure/gitweb-theme.git

> cd gitweb-theme
# -t 指定 gitweb 根目錄,一路 y 即可
> ./setup -vi -t /usr/local/share/gitweb --install

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文將為您描述SQL Server會話KILL不掉,一直處於KILLED /ROLLBACK狀態情形淺析,教程操作方法: 今天遇到一個很奇怪的情況,發現一個會話異常,這個會話只是在執行一個簡單的存儲過程,裡面使用了鏈接伺服器(Linked Server)查詢另外一臺伺服器數據(存儲過程裡面沒有任何顯 ...
  • 資料庫事物隔離級別有四種,按照隔離性,由低到高依次是:1.Read Uncommitted 2.Read Committed 3.Repeatable Read 4.Serializable 按照併發性則順序相反。 √: 可能出現 ×: 不會出現 1.Read uncommitted 讀未提交,即在 ...
  • --創建外部表 CREATE EXTERNAL TABLE my_report( last_update string, col_a string) PARTITIONED BY ( par_dt string)ROW FORMAT DELIMITED FIELDS TERMINATED BY ', ...
  • 在cdh集成的solr cloud中,我們可以通過solr管理界面進行查詢,也可以通過java的api進行查詢,但查詢過程中,如果是時間類型的,可能會存在兩者在界面上看上去不一致的問題,兩者時間剛好相差本地的時區。 ...
  • 本文屬於《InfluxDB系列教程》文章系列,該系列共包括以下 16 部分: 系列詳情請看:《InfluxDB系列教程》 最近有很多朋友咨詢在新安裝了InfluxDB後,web頁面無法訪問,在此說下原因和解決方案。 一、問題原因 InfluxDB在0.13版本以後,就預設關閉了web管理頁面,而國內 ...
  • 前面很多篇不管CPU、記憶體、磁碟、語句等等等都提到了索引的重要,我想剛剛開始學資料庫的在校學生都知道索引對語句性能的重要性。但他們可能不知道,對語句的重要性就是對系統的重要性! 開篇小測驗 開篇小測驗 下麵這樣一個小SQL 你該怎麼樣添加最優索引 你是否一眼就能看出來呢? 答案將在文章中逐步揭曉~~ ...
  • 又自學,把SQL的一些常用語句複習了一遍。 整理如下: 1增 1.1【插入單行】insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性別,出生日期) values ('開心朋朋','男','1980/6/15') 1.2【將現有 ...
  • 在電腦上下載並安裝UltraISO軟體,如百度雲:http://pan.baidu.com/s/1hrGtvEG 打開UltraISO軟體,找到CentOS.iso的映像文件,點擊<啟用>,選擇<寫入硬碟映像...> 硬碟驅動器,選擇U盤,勾選<刻錄校驗>,確保數據完整寫到了U盤上去; 接下來選擇" ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...