我正在使用this buildpack在Heroku上使用节点+ nginx设置提供静态文件。在正确提供静态资产的同时,尝试通过节点提供内容会产生502 Bad Gateway
。节点本身工作正常,nginx也是如此。问题是当两者需要一起工作时,我猜是因为我没有正确配置nginx upstream
设置。
这是我的nginx conf:
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;
}
}
}
我的_static.cfg
:
SERVER_TYPE="nginx"
BUILD_WEB_ASSETS="true"
我的节点服务器:
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>
使用此配置,appname.herokuapp.com
应显示“This is from Node”。但我获得了502
。
appname.herokuapp.com/static
显示“这是来自nginx”,因此nginx和静态内容没有问题。
我在nginx upstream
设置中尝试了server
的每个值组合,但没有一个有效。 我还可以尝试向节点发出nginx代理请求吗?
这是我的Heroku Procfile
以防万一:web: bin/start_nginx
答案 0 :(得分:0)
我对Heroku并不熟悉,对Nginx也不太熟悉,但我会试一试:对我而言,看起来Nginx-config说Nginx和node.js应用程序正在使用相同的端口(&lt;%= ENV ['PORT']%&gt;)。
你想要的是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;
}
}
这个配置在我在客厅里托管的网络服务器上工作。祝你好运!
答案 1 :(得分:0)
Here's a README提供信息,让nginx和Node.js从我之前创建的项目中一起工作。还包括一个示例nginx.conf。
作为概述,基本上你只是用Node创建套接字然后设置nginx来管道那些上游。当我想运行多个Node进程并让nginx站在它前面时,我经常使用它。
它还包括开箱即用的socket.io,因此您可以使用它们来查看如何配置您的Node实例。