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

yesmeck · 发布于 2012年8月23日 · 最后由 zhaohaijun 回复于 2014年10月30日 · 15052 次阅读
865

系统是 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
共收到 17 条回复
243
Saito · #1 · 2012年8月23日

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

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

user root admin;
865
yesmeck · #2 · 2012年8月23日

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

96
bhuztez · #3 · 2012年8月23日

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

865
yesmeck · #4 · 2012年8月23日

#3楼 @bhuztez 请赐教。

243
Saito · #5 · 2012年8月23日

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

96
bhuztez · #6 · 2012年8月23日

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

243
Saito · #7 · 2012年8月23日

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

都是粗暴解决.

243
Saito · #8 · 2012年8月23日

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

96
bhuztez · #9 · 2012年8月23日

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

865
yesmeck · #10 · 2012年8月23日

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

96
bhuztez · #11 · 2012年8月23日

#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直接拒绝掉。

865
yesmeck · #12 · 2012年8月23日

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

243
Saito · #13 · 2012年8月23日

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

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

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

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

96
bhuztez · #14 · 2012年8月23日

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

865
yesmeck · #15 · 2012年8月23日

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

96
bhuztez · #16 · 2012年8月24日

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

96
zhaohaijun · #17 · 2014年10月30日

怎么解决啊

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