2013-07-07 92 views
3

我使用this buildpack在Heroku上使用節點+ nginx設置來提供靜態文件。在靜態資產正常服務的同時,嘗試通過節點投放內容的結果爲502 Bad Gateway。節點本身工作正常,nginx也是如此。問題是當兩者需要一起工作時,我想這是因爲我沒有配置好nginx upstream設置。 這是我的nginx conf:502 Heroku中的錯誤網關+ 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; 
     } 
    } 
} 

_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) 

我也有一個示例HTML文件中/static測試是否nginx的工作:

<html>This is from nginx.</html> 

使用此配置,appname.herokuapp.com應顯示「這是來自節點」。但是我得到了502

appname.herokuapp.com/static顯示「這是來自nginx」,因爲它應該,所以沒有nginx和靜態內容的問題。

我已經嘗試了nginx server設置中upstream的每個值的組合,但都沒有工作。 我還可以嘗試向節點發出nginx代理請求嗎?

這裏是我的Heroku Procfile的情況下,它可以幫助:web: bin/start_nginx

回答

0

我並不真正熟悉的Heroku,和漂亮的新Nginx的,但我給它一個鏡頭:對我來說,它看起來像Nginx- config表示Nginx和node.js應用程序使用相同的端口(<%= ENV ['PORT']%>)。

你想要的是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; 
} 
} 

這個配置文件正在我的網絡服務器上工作,我在我的客廳裏。祝你好運!

+0

我試過用nginx的端口80,但Heroku拒絕權限。這是我從你的配置中得到的:'nginx:[emerg] bind()to 0.0.0.0:80 failed(13:Permission denied)' – vjk2005

+0

好吧,就像我說的,不幸的是我沒有Heroku的使用經驗,似乎你需要爲Nginx使用<%= ENV ['PORT']%>。如果將nginx設置爲偵聽127.0.0.1:<%= ENV ['PORT']%>,並在端口4000上保留node.js進程,如同在我發佈的配置中一樣,它會工作嗎? – grenadejumper

+0

我厭倦了與Heroku的BS系統打交道(我聯繫了他們自己沒有線索的支持者),並將他們遷移到數字海洋上的水滴。但是如果我以後回到Heroku,我會給這個鏡頭一個鏡頭。 – vjk2005

0

Here's a README帶有信息讓nginx和Node.js通過我創建的項目一起工作。還包括一個例子nginx.conf。

作爲一個概述,基本上你只是用Node創建socket然後設置nginx來管這些上游。當我想運行多個Node進程並讓nginx站在它前面時,我通常會使用它。

它還包括開箱即用的socket.io,因此您可以使用它們來查看如何配置Node實例。