It's the way the application is packaged. On most *nix the default setup is a non privileged user can't listen on a port < 1024 and web servers use 80 and 443.
Linux 2.2+, Solaris 10+ and FreeBSD's all allow non root users to listen on ports lower than 1024 though, just not by default. Most have accepted the use of root
so it remains in use.
Other than access to bind to the privileged port you need to make sure the user running nginx has access to all the files it needs. You probably don't need to go as far as this but just set correct permission on files/directories. You also need to check that startup scripts don't do anything sneaky like ulimit
changes (like mysql always seems to).
setcap
and getcap
let you change or view the cap_net_bind_service
capability for an executable. This will be in effect for anyone who executes the binary.
setcap cap_net_bind_service=+ep /usr/sbin/nginx
SELinux provides the ability to configure and control capabilities at a user level.
Freebsd system settings
The reserved port settings are global to the system
sysctl net.inet.ip.portrange.reservedhigh=0
sysctl net.inet.ip.portrange.reservedlow=0
Solaris provides fine grained control of privileges at the user level. These are the privileges for apache but they are likely to work for nginx as well.
/usr/sbin/usermod -K defaultpriv=basic,proc_exec,proc_fork,net_privaddr nginx