ruby-on-rails – 使用Thin运行的Rails应用程序(Redmine)中的权限被拒绝

我正在尝试使用Thin和nginx作为反向代理运行Redmine.

我的/etc/thin2.1/redmine.yml:

---
pid: /var/run/thin/redmine.pid
group: redmine
wait: 30
timeout: 30
log: /var/log/thin/redmine.log
max_conns: 1024
require: []

environment: production
max_persistent_conns: 512
servers: 4
daemonize: true
user: redmine
socket: /var/run/thin/redmine.sock
chdir: /var/www/projects.mydomain.tld

当我使用我的网络浏览器访问该网站时,我得到了一个502 Bad Gateway.这是/var/log/thin/redmine.0.log的内容:

>> Writing PID to /var/run/thin/redmine.0.pid
>> Changing process privilege to redmine:redmine
>> Using rack adapter
>> Exiting!
/usr/lib/ruby/vendor_ruby/thin/daemonizing.rb:158:in `delete': Permission denied @ unlink_internal - /var/run/thin/redmine.0.pid (Errno::EACCES)
        from /usr/lib/ruby/vendor_ruby/thin/daemonizing.rb:158:in `remove_pid_file'
        from /usr/lib/ruby/vendor_ruby/thin/daemonizing.rb:59:in `block in daemonize'
/usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- bundler/setup (LoadError)
        from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /var/www/projects.mydomain.tld/config/boot.rb:4:in `<top (required)>'
        from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /var/www/projects.mydomain.tld/config/application.rb:1:in `<top (required)>'
        from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /var/www/projects.mydomain.tld/config/environment.rb:2:in `<top (required)>'
        from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /var/www/projects.mydomain.tld/config.ru:3:in `block in <main>'
        from /usr/lib/ruby/vendor_ruby/rack/builder.rb:55:in `instance_eval'
        from /usr/lib/ruby/vendor_ruby/rack/builder.rb:55:in `initialize'
        from /var/www/projects.mydomain.tld/config.ru:1:in `new'
        from /var/www/projects.mydomain.tld/config.ru:1:in `<main>'
        from /usr/lib/ruby/vendor_ruby/rack/adapter/loader.rb:36:in `eval'
        from /usr/lib/ruby/vendor_ruby/rack/adapter/loader.rb:36:in `load'
        from /usr/lib/ruby/vendor_ruby/rack/adapter/loader.rb:45:in `for'
        from /usr/lib/ruby/vendor_ruby/thin/controllers/controller.rb:169:in `load_adapter'
        from /usr/lib/ruby/vendor_ruby/thin/controllers/controller.rb:73:in `start'
        from /usr/lib/ruby/vendor_ruby/thin/runner.rb:185:in `run_command'
        from /usr/lib/ruby/vendor_ruby/thin/runner.rb:151:in `run!'
        from /usr/bin/thin:6:in `<main>'

我不明白是什么导致了这个错误. / var / run / thin /中的.pid文件归root所有.我试图给redmine和thin赋予所有权但是得到了相同的错误(这些文件在重新启动时重新创建).

我用rbenv安装了Ruby.我以root身份运行bundle install,这促使这样做会破坏此计算机上所有非root用户的应用程序.根据this answer这应该不是问题,应该吗?

编辑:如果我在/etc/thin2.1/redmine.yml中将用户和组设置为root,则权限被拒绝错误消失.我虽然它导致了另一个错误,但那个仍然存在.

解决方法:

对于unlink文件权限进程实际上需要一个权限来写入该文件的目录.

因此要么给予redmine写入/ var / run / thin /的权限,要么将pids和socket放在别处 – 通常在app的共享tmp中,rails甚至为这些创建dirs.

上一篇:小强的HTML5移动开发之路(1)——HTML介绍


下一篇:【Django】学习笔记