部署 部署 GitLab 到最后配置 nginx 碰到权限问题

yesmeck · 2012年08月23日 · 最后由 zhaohaijun 回复于 2014年10月30日 · 23148 次阅读

系统是 Arch Linux,按照 https://wiki.archlinux.org/index.php/Gitlab 配下来前面都没什么问题。用 rails s 服务也能启动。但是后面配 nginx 和 unicorn 就有问题了。 日志显示是这样:

2012/08/23 20:29:22 [crit] 5586#0: *19 connect() to unix:/home/gitlab/gitlab/tmp/sockets/gitlab.socket failed (13: Permission denied) while connecting to upstream, client: 114.222.182.176, server: gitlab.yesmeck.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://unix:/home/gitlab/gitlab/tmp/sockets/gitlab.socket:/favicon.ico", host: "gitlab.host.com"

nginx 的进程

root      5585  0.0  0.1   7780   896 ?        Ss   20:18   0:00 nginx: master process nginx
http      5586  0.0  0.3   7912  1684 ?        S    20:18   0:00 nginx: worker process

unicorn 的进程

gitlab    5476  2.1 12.5 139096 64104 ?        Sl   20:17   0:20 unicorn_rails master -c config/unicorn.rb -E production -D                                               
gitlab    5495  0.0 11.6 139096 59516 ?        Sl   20:18   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D                                            
gitlab    5498  0.0 11.6 139096 59516 ?        Sl   20:18   0:00 unicorn_rails worker[1] -c config/unicorn.rb -E production -D

/home/gitlab/gitlab/tmp/sockets/gitlab.socket 的权限

srwxrwxrwx 1 gitlab gitlab 0 Aug 23 20:17 /home/gitlab/gitlab/tmp/sockets/gitlab.socket

nginx 的 worker 进程不是 root 启动的。所以没有权限访问 unicorn 的 gitlab 用户。

在 /etc/nginx/nginx.conf 文件顶上加上 user 声明,然后重启就好了。

user root admin;

#1 楼 @Saito 那有没有不用 root 的办法?

#2 楼 @yesmeck 明显可以的呀,明显不应该用 root 启动啊。

#2 楼 @yesmeck 可以啊。保证 nginx 的 worker 的用户能访问 gitlab 组下面的东西就好了。

#5 楼 @Saito 明显不该怎么配。根据 least privilege principle,nginx 只该能读到静态文件和读写 socket 文件。

#6 楼 @bhuztez 哦.. 这样。我以前都没注意过这个问题。

都是粗暴解决。

#4 楼 @yesmeck unicorn 暴露端口也是一种办法,就没有 socket 文件的问题了。

#8 楼 @Saito 暴露端口权限控制更麻烦了吧。

#8 楼 @Saito #9 楼 @bhuztez 好了,原来是 /home/gitlab 的权限只有 700,把 http 加到 gitlab 组,然后改了 /home/gitlab 的权限就好了。。

#4 楼 @yesmeck 两种办法,

一种是类似 supervisord[fcgi-program]的办法,supervisord 以 root 运行,supervisord 去创建 socket 文件,把 socket 文件的 owner 设置成 nginx,mode 设置成 0700。spawn 应用的进程,把 socket 从fd 0传进去。

http://supervisord.org/

另外一种是,应用自己起进程,socket 文件设置成 0777,accept 之后,用 getsockopt 拿到 client 的 uid,如果不是 nginx 直接拒绝掉。

= = 貌似因为 home 目录下的用户目录不能被其他用户访问而产生的权限问题碰到不只一次了。。。😰

#9 楼 @bhuztez 好吧,我在本地都是这么干的。

主要看你搭这个干嘛,本地玩还是一个正式应用。

感觉 meck 不是为公司搭的,应该也就是自用。所以各种方案就都行。

btw: 每次被 bhuztez 大大 吐槽都能学到新东西..我很受用..

#13 楼 @Saito 本地搭就用自己帐号跑个 nginx 就好了,何必折腾呢...

😰 是自用,不过是跑在 vps 上。

#15 楼 @yesmeck 别怕,我猜这里至少 2/3 的人基本的权限设置是不及格的。

怎么解决啊

需要 登录 后方可回复, 如果你还没有账号请 注册新账号