2013-07-19 33 views
8

Bạn đã quản lý thiết lập proxy nút nginx trên công việc Heroku chưa?Bạn đã quản lý thiết lập proxy nginx nút trên công việc Heroku chưa?

Bạn có thể, hãy cho tôi biết cách tổ chức cấu trúc thư mục của bạn và các tệp trong mỗi thư mục trước khi thực hiện "git push heroku master"? Bạn đã sử dụng buildpack nào?

Tôi nhận được thông báo "Đẩy bị từ chối, không có ứng dụng hỗ trợ Cedar nào được phát hiện" mỗi lần tôi làm "git push master master". Tôi đã đặt một tập tin "nginx.conf.erb" trong một thư mục "/ conf".

Cảm ơn bạn.

+0

Great câu hỏi. – Green

+0

Tôi đoán vì Heroku không cho phép bạn cài đặt proxy nginx vv Heroku cung cấp máy chủ web và bộ nhớ cache mà bạn có thể cung cấp dưới dạng tiện ích bổ sung. – stiebitzhofer

+0

Nếu bạn chỉ muốn có một proxy, thay cho nginx bạn có thể sử dụng substacks bouncy hoặc nodejitsus http proxy – jpillora

Trả lời

0

article này chứa hướng dẫn thiết lập nginx làm proxy trên Heroku, kết hợp với OpenResty, Lua và LuaRocks. node.js không được đề cập. Nó sử dụng số này buildpack. Đã không thử nó bản thân mình nhưng có vẻ như ai đó đã có nó làm việc.

8

Tôi đã sử dụng thiết lập Node.js + NGINX trên heroku cho nhiều dự án. Bằng cách này, bạn có thể xử lý nginx phục vụ các tệp tĩnh, bộ nhớ đệm, proxy đến các máy chủ khác và ủy quyền cho một số quy trình nút.

Sử dụng gói xây dựng đa buildpack (https://github.com/ddollar/heroku-buildpack-multi).
Nó cho phép bạn chỉ định tệp .buildpacks đề cập đến một số gói. Trong tệp .buildpacks của tôi, tôi sử dụng gói dựng sẵn Heroku Node mặc định và một ngã ba của bộ dựng hình nginx mà tôi đã xây dựng lại để bao gồm hỗ trợ SSL.

https://github.com/theoephraim/nginx-buildpack.git 
https://github.com/heroku/heroku-buildpack-nodejs.git 

Tập tin nginx buildpack sử dụng tệp nginx.conf.erb có thể tham chiếu đến ENV vars. Bạn phải nói cho nó để lắng nghe trên cổng theo quy định của Heroku trong biến môi trường được gọi là "PORT"

listen <%= ENV["PORT"] %>; 

Sau đó, bạn có máy chủ nút của bạn khởi động trên bất kỳ cổng bạn chọn, nói 5001, và trong cấu hình nginx của bạn, bạn có thể thiết lập một đường chuyền proxy để ứng dụng nút của bạn:

location/{ 
    proxy_pass  http://127.0.0.1:5001; 
} 

Note - procfile của bạn cần phải sử dụng một lệnh khởi nginx đặc biệt (một phần của buildpack nginx) mà sau đó gọi bất cứ điều gì khác mà bạn vượt qua nó. Trong trường hợp của tôi, tôi sử dụng mãi mãi để chạy ứng dụng nút của tôi:

web: bin/start-nginx ./node_modules/.bin/forever app.js 

Và trong tập tin nút chính của bạn, bạn phải tạo một tập tin khi nó đã bắt đầu lên thành công để báo hiệu cho buildpack nginx rằng nó nên bắt đầu nghe

fs.openSync('/tmp/app-initialized', 'w'); 

có một giải thích đầy đủ về cách sử dụng các buildpack nginx trong readme @https://github.com/theoephraim/nginx-buildpack

+1

Bạn có thể tạo một ứng dụng nút khác chạy trên cổng 5000 như thế nào? Từ những gì tôi đang trải qua, bạn chỉ có thể sử dụng một cổng và đó là cổng mặc định của ENV. Xin vui lòng cho tôi biết làm thế nào để làm điều này nếu đây không phải là trường hợp. Cảm ơn. –

+1

Bạn có thể bắt đầu một số "ứng dụng" chạy trên bất kỳ cổng nào bạn muốn. Điều quan trọng là Heroku sẽ chỉ vượt qua lưu lượng truy cập http thông qua trên một cổng duy nhất của lựa chọn của họ (được đặt là PORT env var). Vì vậy, nếu bạn muốn hiển thị nhiều ứng dụng cho web, bạn sẽ cần phải sử dụng proxy nginx đang lắng nghe trên cổng đó để chuyển lưu lượng truy cập thông qua các ứng dụng nút. – theozero

+0

Trên Heroku, bạn không thể chỉ định một cổng cụ thể trong kinh nghiệm của tôi cho tôi các công việc sau: thượng nguồn node_entry { \t máy chủ unix: /tmp/nginx.socket fail_timeout = 0; } máy chủ { \t nghe <% = ENV ['PORT']%>; \t server_name localhost; \t keepalive_timeout 5; \t vị trí/{ \t \t [cài đặt khác…] \t \t proxy_pass http: // node_entry; \t}} Sau đó, bạn có thể kết nối với: \t Server.listen (‘/ tmp/nginx.socket’); –

0

On Heroku, thiết lập này được sử dụng trong sản xuất của tôi thành công khi buildpack được cài đặt:

upstream node_entry { 
    server unix:/tmp/nginx.socket fail_timeout=0; 
} 
server { 
    listen <%= ENV['PORT'] %>; 
    server_name localhost; 
    keepalive_timeout 5; 
    location/{ 
     [other settings…] 
     proxy_pass http://node_entry; 
    } 
} 

Sau đó, trong app.js của bạn tập tin bạn có thể kết nối với:

Server.listen(‘/tmp/nginx.socket’); 
+0

đã không làm việc cho tôi. có 'buildpack = nginx tại = exit process = nginx' rồi' State đã thay đổi từ khi bắt đầu gặp lỗi'. – paradite

+0

@paradite Bạn có thể đăng mã nút của mình không? Nó sẽ hoạt động :-) –

+0

@ droid-zilla - bạn có phiền khi đăng kho lưu trữ git của mình nếu có thể không? Tôi muốn thiết lập một proxy ngược để proxy khách hàng của tôi gọi đến api mà là trên một heroku dyno/server/url khác nhau. Hoặc nếu bạn biết một ví dụ tôi có thể kiểm tra? Cảm ơn –

Các vấn đề liên quan