我们正在尝试在几个开发主机上运行 Apache/PHP 和 Node.js。理想情况下,针对本地端口运行的节点服务的简单 ProxyPass 应该可以工作,但出于某种原因,我需要提供本地网络 IP,localhost 出现 503 错误。
$ cat nodeproxy.conf
<Directory /public/np1/site>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<VirtualHost *:80>
ServerName np1.local.zaptech.org
DocumentRoot /public/np1/site
ProxyRequests on
# ProxyPass /np1/ http://localhost:1337/ <- doesn't work, 503 error
# ProxyPass /np1/ http://127.0.0.1:1337/ <- doesn't work, 503 error
ProxyPass /np1/ http://10.10.10.76:1337/
</VirtualHost>
$ cat sysd
[Unit]
Description=Node.js Example Server
[Service]
ExecStart=/bin/node /home/rickatech/node/example.js
Restart=always
RestartSec=10 # Restart service after 10 seconds if node service crashes
StandardOutput=syslog # Output to syslog
StandardError=syslog # Output to syslog
SyslogIdentifier=nodejs-ricktest
User=rickatech
Environment=NODE_ENV=production PORT=1337
[Install]
WantedBy=multi-user.target
答案1
简单的答案是,在端口 1337 上运行的服务仅绑定到主 IP 地址而不是本地主机,您可以使用 netstat、lsof 或类似程序来查找。
我不了解 node.js,但我确信快速搜索就会找到帖子告诉你如何让 node.js绑定到本地主机(如果不是)。
需要注意的是,你应该始终在 ProxyPass(和 ProxyPassReverse)指令中匹配尾部斜杠。例如
ProxyPass /np1/ http://localhost:1337/ 或者 ProxyPass /np1 http://localhost:1337
代替
ProxyPass /np1 http://10.10.10.76:1337/ 或者 代理密码 /np1/ http://10.10.10.76:1337
通常情况下,除非有特殊原因,否则应该在两者上都加上斜杠。
答案2
啊,这个兔子洞有点深……
$ cat 示例.js
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Hello World\n');
}).listen(1337, "10.10.10.76"); // change this to 127.0.0.1 !
端口在 javascript 中,不确定 sysd 为什么需要 PORT 指令。