我为我的盒子创建了一个 Vagrantfile 配置,其中包含这一行,将同步文件夹的权限设置为 777,以确保其完全可写:
dev.vm.synced_folder "apps/", "/httpd", :owner=> 'stella', :group=>'stella', :mount_options => ['dmode=777', 'fmode=777']
在我启动 CentOS 6.4 vagrant box 和 ssh 后,我可以确认:
$ ls -la /httpd
drwxrwxrwx. 1 stella stella 442 Nov 11 09:33 june
我可以把它放到我的 index.js 文件的顶部:
fs.writeFile("/httpd/june/test", "Hey there!", function(err) {
if(err) {
console.log(err);
} else {
console.log("The file was saved!");
}
});
当我运行node index.js
节点运行我的脚本并成功创建一个文件。这一切都是为了确认节点可以在我的项目的根路径中成功写入新文件。我还将我的程序移到同步文件夹之外,它运行完美。
我遇到的问题是创建套接字。我有几个备受瞩目的节点模块,预计它们会在我的项目的根路径中创建套接字,但是Error: Operation not permitted
每当 node.js 尝试创建套接字并且我的程序退出时,我都会收到错误消息。
我试图创建的套接字是:
- 127.0.0.1:3005
- 127.0.0.1:3006
除了这篇博客文章说 Node.js 不可能在共享/同步文件夹上创建套接字之外,我几乎在网上找不到任何关于此问题的信息。
我使用的节点模块是 cluster-master 和 zmq。cluster-master 一旦到达这一行就会关闭:https ://github.com/isaacs/cluster-master/blob/master/cluster-master.js#L119 。
当我尝试将我的服务器绑定到一个端口时,node-zmq 关闭(显然我不能发布两个以上的链接,所以我可以提供尽可能多的信息!):如果你可以通过谷歌找到 Justin Tulloss 的 zmq一旦服务器到达 lib/index.js 的第 218 行,即 Socket.prototype.bind 函数,服务器就会被强制关闭。
我认为这是权限问题的原因是,这两个模块在成功启动时都会将文件写入我的项目的根目录:ZMQ 用于套接字,Cluster-Master 用于 REPL,如果我将项目移动到 / var/www/june 我没有任何问题。我的程序启动,cluster-master 和 zmq 写入他们的文件,我可以通过端口通信没有问题。
我的问题只在于 Vagrant 同步文件夹。
我想我在问是否确实不可能以这种方式在共享文件夹中创建套接字。如果是这样,有什么我可以做的解决方法吗?
将我的应用程序保存在共享文件夹中是可取的,因为我和我的团队可以在运行或不运行 vm 的情况下处理文件,我可以在主机上使用 IDE 环境等。
更新: 在集群主控中,如果我更改源中的行:
var socket = path.resolve('cluster-master-socket')
至:
var socket = path.resolve('/tmp/cluster-master-socket')
cluster-master 不再导致我的服务器退出。但是,对于 ZMQ,我没有看到任何简单的解决方法。这实际上让我困惑到底是什么导致了错误,写入文件或打开套接字?