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).
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
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