Node.js 502节点中存在坏网关+;Heroku上的nginx代理设置
我使用node+nginx设置在Heroku上提供静态文件。虽然静态资产得到了正确的服务,但尝试通过节点提供内容会导致Node.js 502节点中存在坏网关+;Heroku上的nginx代理设置,node.js,heroku,nginx,Node.js,Heroku,Nginx,我使用node+nginx设置在Heroku上提供静态文件。虽然静态资产得到了正确的服务,但尝试通过节点提供内容会导致502坏网关。节点本身工作正常,nginx也可以。问题是,当这两个需要一起工作时,我想这是因为我没有正确配置nginx上游设置。 这是我的nginx配置: worker_processes 1; error_log /app/nginx/logs/error.log; daemon
502坏网关
。节点本身工作正常,nginx也可以。问题是,当这两个需要一起工作时,我想这是因为我没有正确配置nginx上游
设置。
这是我的nginx配置:
worker_processes 1;
error_log /app/nginx/logs/error.log;
daemon off;
events {
worker_connections 1024;
}
http {
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
upstream node_conf {
server 127.0.0.1:<%= ENV['PORT'] %>;
keepalive 64;
}
server {
listen <%= ENV['PORT'] %>;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://node_conf;
}
location ~* ^.+\.(jpg|gif|png|ico|css|js|html|htm)$ {
root /app;
access_log off;
expires max;
}
location /static {
root /app;
index index.html index.htm;
}
}
}
我的节点服务器:
var app = require( 'express ')()
app.get( '/', function(req, res) { res.send( 'This is from Node.' ) })
app.listen( process.env.PORT )
我在/static
中还有一个示例html文件,用于测试nginx是否工作:
<html>This is from nginx.</html>
这是来自nginx的。
在这个配置中,appname.herokuapp.com
应该显示“这是来自节点的”。但是我得到的是502
appname.herokuapp.com/static
显示“这是来自nginx的”,因此nginx和静态内容没有问题
我在nginxserver
设置中尝试了上游
的所有值组合,但没有一个有效我还可以尝试向节点发出nginx代理请求吗?
以下是我的Heroku
Procfile
,以备不时之需:web:bin/start\u nginx
我对Heroku并不太熟悉,而且对nginx还很陌生,但我要试一试:在我看来,nginx配置好像是说nginx和node.js应用程序使用同一个端口()
您需要的是Nginx侦听传入的连接(通常是端口80),并将其转发到node.js应用程序。以下是Nginx配置示例:
# the IP(s) on which your node server is running. I chose port 4000.
upstream xxx.xxx.xxx.xxx { #Your IP adress as seen from the internet
server 127.0.0.1:4000; #Your local node.js process
}
# the nginx server instance
server {
listen 0.0.0.0:80; #Have Nginx listen for all incoming connections on port 80
server_name my-site;
access_log /var/log/nginx/my-site.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://xxx.xxx.xxx.xxx/; #Your IP adress as seen from the internet
proxy_redirect off;
}
}
这个配置在我的起居室中托管的Web服务器上为我工作。祝你好运 提供了让nginx和Node.js从我不久前创建的项目中协同工作的信息。还包括一个示例nginx.conf
总而言之,基本上您只是使用Node创建套接字,然后将nginx设置为向上游输送这些套接字。当我想运行多个节点进程并让nginx站在前面时,我通常会使用它
它还包括在开箱即用的情况下使用socket.io,因此您可以使用它们来查看如何配置您的节点实例。我已尝试将端口80用于nginx,但Heroku拒绝许可。以下是我从您的配置中得到的信息:
nginx:[emerg]bind()到0.0.0.0:80失败(13:权限被拒绝)
Ok,正如我所说,很遗憾,我没有使用Heroku的任何经验,但您似乎需要使用nginx。如果您将nginx设置为监听127.0.0.1:,并将node.js进程保持在我发布的配置中的端口4000上,这是否有效?我厌倦了处理Heroku的BS系统(我联系了他们的支持人员,他们自己也不知道),并迁移到Digital Ocean上的一个droplet。但如果我稍后再回到Heroku,我会尝试一下。
# the IP(s) on which your node server is running. I chose port 4000.
upstream xxx.xxx.xxx.xxx { #Your IP adress as seen from the internet
server 127.0.0.1:4000; #Your local node.js process
}
# the nginx server instance
server {
listen 0.0.0.0:80; #Have Nginx listen for all incoming connections on port 80
server_name my-site;
access_log /var/log/nginx/my-site.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://xxx.xxx.xxx.xxx/; #Your IP adress as seen from the internet
proxy_redirect off;
}
}