ryandotsmith / nginx-buildpack

Run NGINX in front of your app server on Heroku
457 stars 248 forks source link

proxy_pass to another heroku app #59

Open i8ramin opened 9 years ago

i8ramin commented 9 years ago

Hi, wondering if its possible to use this setup to proxy certain paths to another heroku app. For example, the following nginx.conf works locally, but fails when deployed to Heroku.

daemon off;
# Heroku dynos have at least 4 cores.
worker_processes <%= ENV['NGINX_WORKERS'] || 4 %>;

events {
  use epoll;
  accept_mutex on;
  worker_connections 1024;
}

http {
  gzip on;
  gzip_comp_level 3;
  gzip_min_length 150;
  gzip_proxied any;
  gzip_types text/plain text/css text/json text/javascript
    application/javascript application/x-javascript application/json
    application/rss+xml application/vnd.ms-fontobject application/x-font-ttf
    application/xml font/opentype image/svg+xml text/xml;

  server_tokens off;

  log_format l2met 'measure#nginx.service=$request_time request_id=$http_x_request_id';
  access_log logs/nginx/access.log l2met;
  error_log logs/nginx/error.log;

  include mime.types;
  default_type application/octet-stream;
  sendfile on;

  # Must read the body in 5 seconds.
  client_body_timeout 5;

  upstream app_server {
    server unix:/tmp/nginx.socket fail_timeout=0;
  }

  server {
    listen <%= ENV["PORT"] %>;
    server_name _;
    keepalive_timeout 5;

    root /app/public; # path to your app

    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_redirect off;
      proxy_pass http://app_server;
    }

    location /static/ {
      rewrite ^/static/?(.*)$ /$1 break;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://my-other-app.herokuapp.com;
    }
  }
}
arielperez82 commented 8 years ago

I was having the same issue. The problem is that nginx is automatically resolving http://my-other-app.herokuapp.com, so when you use $http_host, it's setting the entire list of IPs that this resolves to. I was able to solve this by explicitly setting the Host header to http://my-other-app.herokuapp.com. Hope that helps!

stephengardner commented 6 years ago

The above solution is not correct. It is very close.

You have to set the Host header to my-other-app.herokuapp.com Without the http://. Phew, that took me a while.

Use this: proxy_set_header Host my-other-app.herokuapp.com