Nginx로 git-http-backend를 설정하려고 하는데 24시간 동안 시간을 낭비하고 모든 내용을 읽은 후에 이 구성이 작동해야 한다고 생각했지만 작동하지 않습니다.
server {
listen 80;
server_name mydevserver;
access_log /var/log/nginx/dev.access.log;
error_log /var/log/nginx/dev.error.log;
location / {
root /var/repos;
}
location ~ /git(/.*) {
gzip off;
root /usr/lib/git-core;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
include /etc/nginx/fastcgi_params2;
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
fastcgi_param DOCUMENT_ROOT /usr/lib/git-core/;
fastcgi_param SCRIPT_NAME git-http-backend;
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param GIT_PROJECT_ROOT /var/repos;
fastcgi_param PATH_INFO $1;
#fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}
}
/etc/nginx/fastcgi_params2의 내용
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param REMOTE_USER $remote_user;
# required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
하지만 구성이 작동하지 않는 것 같습니다
$ git clone http://mydevserver/git/myprojectname/
Cloning into myprojectname...
warning: remote HEAD refers to nonexistent ref, unable to checkout.
존재하지 않는 프로젝트를 요청해도 같은 답변을 받을 수 있습니다.
$ git clone http://mydevserver/git/thisprojectdoesntexist/
Cloning into thisprojectdoesntexist...
warning: remote HEAD refers to nonexistent ref, unable to checkout.
루트를 /usr/lib로 변경하면 403 오류가 발생하고 이는 nginx 오류 로그에 보고됩니다.
2011/11/23 15:52:46 [error] 5224#0: *55 FastCGI sent in stderr: "Cannot get script
name, is DOCUMENT_ROOT and SCRIPT_NAME set and is the script executable?" while
reading response header from upstream, client: 198.168.0.4, server: mydevserver,
request: "GET /git/myprojectname/info/refs HTTP/1.1", upstream:
"fastcgi://unix:/var/run/fcgiwrap.socket:", host: "mydevserver"
내 주요 문제는 이 구성의 올바른 루트 값입니다. 어쩌면 권한 문제가 있을 수도 있습니다.
노트:
/var/repos/는 www-data가 소유하며 비트 git bare repos 폴더를 포함합니다.
이 모든 것은 ssh를 사용하면 완벽하게 작동합니다.
브라우저를 사용하여 이동하면http://mydevserver/git/myproject/info/refsgit-http-backend에서 나에게 명령을 보내달라고 요청하면 응답됩니다.
/var/run/fcgiwrap.socket에는 777 권한이 있습니다.
답변1
아래로 이동 fastcgi_pass
; 최신 라인이어야합니다.
먼저 매개변수를 설정한 다음에만 매개변수를 설정해야 합니다. fastcgi_pass
그렇지 않으면 환경이 설정되지 않습니다.
fastcgi_pass unix:/var/run/fcgiwrap.socket;
답변2
구성 파일에서 두 줄 사이의 순서를 변경해 보세요.
include /etc/nginx/fastcgi_params2;
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
답변3
이는 아마도 debian squeeze(1.0-1+squeeze1)에 있는 fcgiwrap 버전의 버그일 것입니다. 보다http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=698071
fcgiwrap 1.0.3-3(debian 테스트에서 발견)으로 업그레이드하면 문제가 해결되었습니다. 다음은 제가 사용한 구성입니다("루트"를 정의할 필요가 없었습니다).
server {
listen 80;
server_name mydevserver;
access_log /var/log/nginx/dev.access.log;
error_log /var/log/nginx/dev.error.log;
location ~ /git(/.*) {
gzip off;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
include /etc/nginx/fastcgi_params2;
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param GIT_PROJECT_ROOT /var/repos;
fastcgi_param PATH_INFO $1;
}
}