通过nginx/php-fpm exec调用NPM不会运行



我在自动播放脚本中有一个奇怪的问题。

基本上,这是PHP脚本,当通过HTTP触发时,将使用其他命令(例如npm installnpm run build)运行其他Shell脚本。除了从http nginx/php -fpm拨打的php脚本时,这一切都起作用 - 此情况NPM命令不运行。

我创建了一个简单的示例回购来说明问题:https://github.com/kasheftin/npm-bug

我们有test.php,只能运行test.sh shell命令:

<?php
  exec("/home/www/tests/npm-bug/test.sh > /home/www/tests/npm-bug/test.log");

我们有test.sh,只能运行 npm run test命令:

#!/bin/bash
cd /home/www/tests/npm-bug
npm run test

最后,我们有包含以下命令:

"scripts": {
  "test": "echo "Hello World!""
}

npm run test的结果看起来像:

> npm-bug@1.0.0 test /home/www/tests/npm-bug
> echo "Hello World!"
Hello World!

注意最后一行 - 这是package.json中echo命令的结果。在./test.sh命令的情况下,同样的结果出现。在运行php test.php命令后,我们在test.log中获得的同样。

但是,当我从http触发test.php时,我只会得到

> npm-bug@1.0.0 test /home/www/tests/npm-bug
> echo "Hello World!"

请注意,最后一个字符串不存在,NPM命令未运行。

我的nginx中也有此位置规则:

location = /npm-test {
  root /home/www/tests/npm-bug;
  rewrite ^(.*)$ /test.php break;
  include snippets/fastcgi-php.conf;
  fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

这一切似乎都非常引人注目,NGINX和PHP7.0-fpm就在开箱即用,对于CLI和FPM,PHP配置恰好相同。检查了两个具有不同环境的服务器。

这是一个有趣的问题。因此,当您使用

  exec("/home/www/tests/npm-bug/test.sh > /home/www/tests/npm-bug/test.log");

它掩盖了所有错误。您实际上应该像

那样做
  exec("/home/www/tests/npm-bug/test.sh > /home/www/tests/npm-bug/test.log 2>&1");

现在您会看到一个大错误

npm ERR! Linux 4.4.0-66-generic
npm ERR! argv "/usr/bin/nodejs" "/usr/bin/npm" "run" "test"
npm ERR! node v4.2.6
npm ERR! npm  v3.5.2
npm ERR! file sh
npm ERR! path sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn sh
npm ERR! npm-bug@1.0.0 test: `sh -c 'echo "Hello World!"'`
npm ERR! spawn sh ENOENT
npm ERR!
npm ERR! Failed at the npm-bug@1.0.0 test script 'sh -c 'echo "Hello World!"''.
npm ERR! Make sure you have the latest version of node.js and npm installed.

我花了一些时间来弄清楚原因。因此,我将env语句添加到shell文件

USER=vagrant
PWD=/var/www/html/npm-bug
SHLVL=1
HOME=/home/vagrant
OLDPWD=/home/vagrant/nginx/html/npm-bug
_=/usr/bin/env

您可以在没有路径变量的情况下看到。这是问题。我在shell脚本中添加了路径变量

export PATH=......

我走了我的终端在echo $PATH上显示的道路,现在它从FPM起作用

最新更新