nodejs 80端口监听失败及NODE_PATH不起作用的问题

nodejs做web服务器,打开80时报错:

Error: listen EACCES 0.0.0.0:80

80端口监听失败,是因为1024以下的端口需要root权限,需要sudo或su之后执行。但这又带来了NODE_PATH无效、权限等其他问题。权限问题通过chmod可解决。

NODE_PATH无效,会导致通过-g全局安装的模块引用不了。需要在profile中配置:

export NODE_PATH="/usr/local/lib/node_modules"

profile有几个:

在/etc/profile配置的,可以对任意用户登陆有效,但sudo执行时无效(解决方法在后面)。

在~/.bash_profile中配置的,只对当前用户有效。

在/var/root/.bash_profile配置的,对su之后对root用户有效。

用node-inspector调试nodejs加载模块过程,如下:

当前用户执行nodejs(1024以上的端口),require时会扫描这些目录:

/apps/server/node_modules

/apps/node_modules

/node_modules

/usr/local/lib/node_modules

/Users/hz/.node_modules

/Users/hz/.node_libraries

/usr/local/lib/node

su之后执行nodejs,require时会扫描这些目录:

/apps/server/node_modules

/apps/node_modules

/node_modules

/usr/local/lib/node_modules

/var/root/.node_modules

/var/root/.node_libraries

/usr/local/lib/node

sudo执行nodejs,require时会扫描这些目录:

/apps/server/node_modules

/apps/node_modules

/node_modules

/Users/hz/.node_modules

/Users/hz/.node_libraries

/usr/local/lib/node

没有扫描/usr/local/lib/node_modules这个目录,原因是NODE_PATH变量没起作用。

后来发现修改/private/etc/sudoers文件,把

Defaults env_reset

改为

Defaults !env_reset

可以解决这个问题。