class Unicorn::Worker
This class and its members can be considered a stable interface and will not change in a backwards-incompatible fashion between releases of unicorn. Knowledge of this class is generally not not needed for most users of unicorn.
Some users may want to access it in the before_fork/after_fork hooks. See the Unicorn::Configurator RDoc for examples.
Public Instance Methods
In most cases, you should be using the Unicorn::Configurator#user directive instead. This method should only be used if you need fine-grained control of exactly when you want to change permissions in your after_fork or after_worker_ready hooks, or if you want to use the chroot support.
Changes the worker process to the specified user
and
group
, and chroots to the current working directory if
chroot
is set. This is only intended to be called from within
the worker process from the after_fork
hook. This should be
called in the after_fork
hook after any privileged functions
need to be run (e.g. to set per-worker CPU affinity, niceness, etc)
Any and all errors raised within this method will be propagated directly
back to the caller (usually the after_fork
hook. These errors
commonly include ArgumentError for specifying an invalid user/group and
Errno::EPERM for insufficient privileges.
chroot support is only available in unicorn 5.3.0+ user and group switching appeared in unicorn 0.94.0 (2009-11-05)
# File lib/unicorn/worker.rb, line 131 def user(user, group = nil, chroot = false) # we do not protect the caller, checking Process.euid == 0 is # insufficient because modern systems have fine-grained # capabilities. Let the caller handle any and all errors. uid = Etc.getpwnam(user).uid gid = Etc.getgrnam(group).gid if group Unicorn::Util.chown_logs(uid, gid) if gid && Process.egid != gid Process.initgroups(user, gid) Process::GID.change_privilege(gid) end if chroot chroot = Dir.pwd if chroot == true Dir.chroot(chroot) Dir.chdir('/') end Process.euid != uid and Process::UID.change_privilege(uid) @switched = true end