我有一个用 Node.js 编写的 websocket 服务器。从命令行执行以下指令时,将成功启动 websocket 服务器:
nohup "/root/.nvm/versions/node/v8.11.1/bin/node" "/var/www/bm-server/bm-server" 1337 > "/var/www/bm-server/logs.txt" 2>&1 &
我可以看到服务器正在运行,因为pgrep -x "bm-server"
显示了 PID。
我知道端口已打开并正在侦听,因为# netstat -an | grep ":1337"
会产生:
tcp6 0 0 :::1337 :::* LISTEN
我知道该端口可以访问,因为telnet myhost 1337
从另一台机器成功连接。
我的网络应用程序可以按预期连接并使用服务器。
问题是我想通过 PHP 启动该程序:
exec('nohup "/root/.nvm/versions/node/v8.11.1/bin/node" "/var/www/bm-server/bm-server" 1337 > "/var/www/bm-server/logs.txt" 2>&1 &', $stdout, $exitcode);
从 PHP 运行该命令时,它会通过与上述相同的所有测试,但从浏览器连接时除外。我可以很好地使用 telnet 连接,但是当我尝试从浏览器连接时,我得到
failed: Error in connection establishment: net::ERR_CONNECTION_CLOSED
这和PHP执行代码的环境有关系。但我无法弄清楚脚本中的内容可能会受到什么影响。
这是服务器的源,如果重要的话。
PHP用户(www-data)启动服务器有什么问题?顺便说一句,我还授予 www-data 权限,可以在没有密码的情况下运行 sudo ,并尝试使用 sudo ,但这并没有什么区别。