Coder Social home page Coder Social logo

passenger-ruby-heroku-demo's Introduction

Running a Ruby app on Heroku with Phusion Passenger

Phusion Passenger is an application server, designed to be fast, robust and lightweight. By combining Heroku with Phusion Passenger, you can boost the performance of your apps, utilize the available resources on your dynos much more efficiently and increase its stability.

Phusion Passenger for Heroku brings the power of Nginx to your dynos. Nginx is an extremely fast and lightweight web server that powers 10% of the Internet. All the cool guys are rapidly switching to Nginx. Phusion Passenger replaces Thin and Unicorn, and makes full use of Nginx to serve your Ruby apps faster and better.

Here's a list of the benefits that using Phusion Passenger will bring you:

  • Static asset acceleration through Nginx - Don't let your Ruby app serve static assets, let Nginx do it for you and offload your app for the really important tasks. Nginx will do a much better job.
  • Multiple worker processes - Instead of running only one worker on a dyno, Phusion Passenger runs multiple worker on a single dyno, thus utilizing its resources to its fullest and giving you more bang for the buck. This approach is similar to Unicorn's. But unlike Unicorn, Phusion Passenger dynamically scales the number of worker processes based on current traffic, thus freeing up resources when they're not necessary.
  • Memory optimizations - Phusion Passenger uses less memory than Thin and Unicorn. It also supports copy-on-write virtual memory in combination with code preloading, thus making your app use even less memory when run on Ruby 2.0.
  • Request/response buffering - The included Nginx buffers requests and responses, thus protecting your app against slow clients (e.g. mobile devices on mobile networks) and improving performance.
  • Out-of-band garbage collection - Ruby's garbage collector is slow, but why bother your visitors with long response times? Fix this by running garbage collection outside of the normal request-response cycle! This concept, first introduced by Unicorn, has been improved upon: Phusion Passenger ensures that only one request at the same time is running out-of-band garbage collection, thus eliminating all the problems Unicorn's out-of-band garbage collection has.
  • JRuby support - Unicorn's a better choice than Thin, but it doesn't support JRuby. Phusion Passenger does.

More information about Phusion Passenger:

What people say

Tweet about us too or follow us on Twitter.

Creating a new app

Clone this repository and push it to Heroku:

git clone https://github.com/phusion/passenger-ruby-heroku-demo.git
cd passenger-ruby-heroku-demo
heroku create
git push heroku master
heroku open

Your app is now powered by Phusion Passenger!

Switching an existing app to Phusion Passenger

Phusion Passenger is a drop-in replacement for Thin and Unicorn and very easy to install.

Open your app's Gemfile. Remove the following lines if they exist:

gem "unicorn"
gem "thin"
gem "puma"

Insert:

gem "passenger"

Open your app's Procfile, or create one if you don't already have one. Remove lines like this:

web: bundle exec ruby web.rb -p $PORT
web: bundle exec unicorn -p $PORT
web: bundle exec thin start -p $PORT
web: bundle exec puma -p $PORT

If you depend on Omniauth to authenticate with Facebook, G+, etc you must add the following lines to your config/application.rb:

config.autoload_paths += Dir["#{config.root}/lib"]
config.middleware.insert_before Rails::Rack::Logger, "HerokuNginxHeadersMiddleware"

Copy the lib/heroku_nginx_headers_middleware.rb to the lib directory in your Rails app.

Insert:

web: bundle exec passenger start -p $PORT --max-pool-size 3

Finally, bundle install, commit and deploy:

bundle install
git commit -a -m "Switch to Phusion Passenger"
git push heroku master

Congratulations, you're now running on Phusion Passenger!

Configuration

Any configuration is done by customizing the arguments passed to the passenger command. The most important ones are:

  • --max-pool-size - The maximum number of worker processes to run. The maximum number that you can run depends on the amount of memory your dyno has.
  • --min-instances - If you don't want the number of worker processes to scale dynamically, then use this option to set it to a value equal to --max-pool-size.
  • --spawn-method - By default, Phusion Passenger preloads your app and utilizes copy-on-write (the "smart" spawning method). You can disable this by setting this option to direct.
  • --no-friendly-error-pages - If your app fails to start, Phusion Passenger will tell you by showing a friendly error page in the browser. This option disables it.

Please refer to the configuration reference for more information.

Status service

Passenger provides the passenger-status command, which displays a status report that tells you what application processes are currently running, how much memory and CPU they use, how many requests are being handled, etc.

However, passenger-status doesn't work out-of-the-box on Heroku because Heroku does not allow SSH access to its servers. For this reason, we have created the Passenger Status Service for making Passenger status reports work.

Please visit https://status-service.phusionpassenger.com/ for more information.

Passenger Enterprise

You can also use Phusion Passenger Enterprise on Heroku, but with a caveat:

Here are the instructions for running Passenger Enterprise on Heroku:

  1. Add the Enterprise repo and gem to your Gemfile:

    source "https://download:#{your_download_key}@www.phusionpassenger.com/enterprise_gems"
    gem 'passenger-enterprise-server', '>= 5.0.22'
    

    'your_download_key' can be found in the Customer Area.

  2. Download the license key to your local workstation. Save it somewhere, e.g. to ~/passenger-enterprise-license.

  3. Transfer the contents of the license key to a Heroku environment variable:

    heroku config:set PASSENGER_ENTERPRISE_LICENSE_DATA="`cat  ~/passenger-enterprise-license`"
    
  4. Commit and push to Heroku:

    git commit -a -m "Use Phusion Passenger Enterprise"
    git push heroku master
    

Using Passenger open source in development, Enterprise in staging and production

It is possible to use Passenger open source in development, while using Passenger Enterprise in staging production. This works by creating a binstub bin/passenger which will start either Passenger open source or Passenger enterprise, depending on the value of the RAILS_ENV environment variable. Then the user must use the bin/passenger binstub instead of using the passenger command directly.

First, ensure that your Gemfile contains both 'passenger' and 'passenger-enterprise-server' but in different groups, like this:

source 'https://rubygems.org'
source "https://download:#{your_download_key}@www.phusionpassenger.com/enterprise_gems"

group :development do
  gem 'passenger', '>= 5.0.22'
end

group :staging, :production do
  gem 'passenger-enterprise-server', '>= 5.0.22'
end

Second, create a binstub bin/passenger. This binstub will start Passenger open source in development, Passenger Enterprise in staging and production. The binstub must contain:

#!/usr/bin/env ruby

require 'pathname'
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
  Pathname.new(__FILE__).realpath)

require 'rubygems'
require 'bundler/setup'

if ENV['RAILS_ENV'] == 'staging' || ENV['RAILS_ENV'] == 'production'
  gem_name = 'passenger-enterprise-server'
else
  gem_name = 'passenger'
end

bin_dir = Gem.loaded_specs[gem_name].bin_dir
load File.join(bin_dir, 'passenger')

Make it executable:

chmod +x bin/passenger

Third, modify your Procfile to use ./bin/passenger instead of passenger. Replace this...

web: bundle exec passenger start -p $PORT ...

...with this:

web: bundle exec ./bin/passenger start -p $PORT ...

Install the gem bundle and commit the result:

bundle install
git add Gemfile Gemfile.lock Procfile bin/passenger
git commit -a -m "Use Passenger Enterprise only in staging and production"

You can test the binstub locally as follows:

$ ./bin/passenger --version
Phusion Passenger 5.0.22
$ RAILS_ENV=production ./bin/passenger --version
Phusion Passenger Enterprise 5.0.22

Next steps

Please enjoy Phusion Passenger, a product by Phusion. :-)

passenger-ruby-heroku-demo's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

passenger-ruby-heroku-demo's Issues

Passenger Enterprise only in production

I have at least 3 staging servers and I would like to use Passenger Enterprise in production and the open source in staging.

Gemfile.rb

group  :production do
  gem 'passenger-enterprise-server'
end

group :staging do
  gem 'passenger'
end

But in the Procfile if I set thread-count I get an error. Is it possible to configure the Procfile to work with opensource and enterprise? Or to have a Procfile per environment?

web: bundle exec passenger start -p $PORT --max-pool-size $WEB_CONCURRENCY --min-instances $WEB_CONCURRENCY --concurrency-model thread --thread-count $MAX_THREADS

Setting http headers on static assets

I want to set some http headers on my static assets and am using some Rack middleware (on my Rails app) to do it. Therefore, I would like requests for some or all static assets to pass nginx and hit my rack middleware.

Is there a way to disable nginx from serving some/all static assets?
If not, is there a convenient way to configure nginx to set those headers on my static assets?

Sorry, haven't found a solution to this after googling / searching through google groups.

Possible to Support Other Passenger Configuration Options

How can other Passenger configuration options, such as PassengerMaxRequests, that are not available from the passenger binary be added to the Procfile? Running passenger start --help only seems to expose a few of the process management options. Thanks!

Many - H17 - Poorly formatted HTTP response: Heroku

Hi, I'm not sure if this issue of passenger, but some of the static resources on our site generate this error, and Heroku support says that Passenger returns 0 bytes for them sometimes. Why this may heppen, and what can I do with it?

somewhere in logs:
2014-02-14 16:58:20.807 373 <158>1 2014-02-14T16:58:20.712588+00:00 heroku router - - at=error code=H17 desc="Poorly formatted HTTP response" method=GET path=/assets/bg-hero-index-a1de25a804de7f490dcb2051578c21bc.jpg host=*********** request_id=1bf8cd05-74ac-4539-8306-9b164e26d859 fwd="162.212.40.1" dyno=web.1 connect=2ms service=3ms status=503 bytes=310

I assume client gets page without image...

--no-friendly-error-pages should be default

The "friendly error pages" expose sensitive information, specially environment variables, and should be off by default.

Alternatively, the README could be improved to mention exactly what kind of info will be included on such pages, specially in production.

URL generated use the wrong port

Rails application is thinking that the request is done to whichever port passenger is running, hence, request.url (both on Rack::Request & ActionDispatch::Request) & url_for only_path: false will use this port in generated url (e.g : http://example.com:4000/path)

The generated url should use the original port.

nginx processes are not cleaned up correctly in development

In development, nginx processes are not stopped when I Ctrl+C in foreman.

Here's relevant vars from my .env:

RAILS_ENV=development
RACK_ENV=development
PASSENGER_MAX_POOL_SIZE=3
PORT=8080

and Procfile:

web: bundle exec passenger start --no-friendly-error-pages -p $PORT --max-pool-size $PASSENGER_MAX_POOL_SIZE

This is what happens:

$ foreman start
12:29:57 web.1  | started with pid 4810
12:29:57 web.1  | =============== Phusion Passenger Standalone web server started ===============
12:29:57 web.1  | PID file: /Users/Csuhta/Projects/test/tmp/pids/passenger.8080.pid
12:29:57 web.1  | Log file: /Users/Csuhta/Projects/test/log/passenger.8080.log
12:29:57 web.1  | Environment: development
12:29:57 web.1  | Accessible via: http://0.0.0.0:8080/
12:29:57 web.1  | You can stop Phusion Passenger Standalone by pressing Ctrl-C.
12:29:57 web.1  | ===============================================================================
12:30:00 web.1  | [ 2013-09-07 12:30:00.3584 4837/0x1072f6000 Pool2/Spawner.h:738 ]: [App 4849 stdout]
...
^CSIGINT received
12:30:04 system | sending SIGTERM to all processes
SIGTERM received
12:30:04 web.1  | terminated by SIGTERM

$ foreman start
12:30:06 web.1  | started with pid 4947
12:30:06 web.1  | *** ERROR ***
12:30:06 web.1  | The address 0.0.0.0:8080 is already in use by another process, perhaps another
12:30:06 web.1  | Phusion Passenger Standalone instance.
12:30:06 web.1  | If you want to run this Phusion Passenger Standalone instance on another port,
12:30:06 web.1  | use the -p option, like this:
12:30:06 web.1  |   passenger start -p 8081
12:30:06 web.1  | exited with code 1
12:30:06 system | sending SIGTERM to all processes
SIGTERM received

There are two nginx processes still running after foreman exits that that I have to reap manually with Activity Monitor.app or kill.

I'm on OS X 10.8.4.

Running `passenger-status` on Heroku

On Cedar-14, heroku run passenger-status gives:

ERROR: Phusion Passenger doesn't seem to be running. If you are sure that it is running, then the causes of this problem could be:

1. You customized the instance registry directory using Apache's PassengerInstanceRegistryDir option, Nginx's passenger_instance_registry_dir option, or Phusion Passenger Standalone's --instance-registry-dir command line argument. If so, please set the environment variable PASSENGER_INSTANCE_REGISTRY_DIR to that directory and run passenger-status again.

2. The instance directory has been removed by an operating system background service. Please set a different instance registry directory using Apache's PassengerInstanceRegistryDir option, Nginx's passenger_instance_registry_dir option, or Phusion Passenger Standalone's --instance-registry-dir command line argument.

I assume it needs something for --instance-registry-dir but it would be nice to have it work out of the box. Any idea what to set that option to?

Passenger Enterprise defer_port_binding not consistent on Heroku

Hey guys,

Thanks for the great server.

We are running Passenger Enterprise with Rails 3.2 on Heroku. We have the defer_port_binding config to work around the problem of Heroku buffering requests too early. We recently started using a new config, memory_limit to restart heavy workers, and we noticed that upon new dyno boot ups, the old problem of early request buffering has come back partially, so some dynos would boot up normally, but some dyno would start accumulating requests in the queue and exhaust resources, then we'd restart that particular dyno.

I was wondering if these two configs affect each other, or if there are any other configs that we could use on Heroku to make boot ups more stable?

Using a configuration file

I’d like to be able to set the --max-pool-size based on the ENV variables for my app using Heroku’s WEB_CONCURRENCY variable. I’m wondering if there’s an equivalent for setting configuration dynamically via a config file. Something akin to config/puma.rb in Heroku’s instructions for setting up Puma.

The docs reference Passengerfile.json, but I’m not quite sure how that’d work with dynamic options — is there a way to do what I’m after?

Thanks!

Passenger downloading agents is too slow

Over the weekend, we had an issue. Heroku does a rolling restart on your dynos after they have been alive awhile. This means when they restart they have lost all the downloaded binaries that Passenger needed to start up.

We ran into the problem that the download time was taking longer than 60 seconds, which then caused Heroku to kill the dyno and restart it. And the loop occurred.

Here is what our logs looked like over the weekend:

2014-01-12T13:43:32.337903+00:00 heroku[web.5]: Starting process with command bundle exec passenger start -p 6090 --max-pool-size 2 --min-instances 2
2014-01-12T13:43:33.890641+00:00 app[web.5]: --> Downloading Phusion Passenger support binaries for your platform
2014-01-12T13:43:34.612303+00:00 app[web.5]: Checking whether the downloaded Watchdog binary is usable
2014-01-12T13:43:34.626897+00:00 app[web.5]: Checking whether the downloaded HelperAgent binary is usable
2014-01-12T13:43:34.639882+00:00 app[web.5]: Checking whether the downloaded LoggingAgent binary is usable
2014-01-12T13:43:34.656154+00:00 app[web.5]: All good
2014-01-12T13:43:34.771790+00:00 app[web.5]: --> Downloading web helper for your platform
2014-01-12T13:44:32.597957+00:00 heroku[web.5]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2014-01-12T13:44:32.598240+00:00 heroku[web.5]: Stopping process with SIGKILL
2014-01-12T13:44:33.779856+00:00 heroku[web.5]: Process exited with status 137

We are reverting back to our Unicorn setup, but if we can help resolve the issue.

How to pass nginx variable in request header?

Hey guys,

we're running Passenger enterprise 5.1.12, I want to pass a new header to the app, but the following isn't working:

server {
        passenger_set_header Country-Code $geoip_country_code;
}

How can I achieve this?

Thanks

WEB_CONCURRENCY support

This is a question more than an issue. Is it possible to use WEB_CONCURRENCY environment variable in Profile so I don't have to redeploy to adjust my max-pool-size? If so, what would that look like? Would this work?

web: bundle exec passenger start -p $PORT --max-pool-size $WEB_CONCURRENCY

min-instances and max-pool-size

Hi,
first of all, I'm slightly confused why the Procfile in this example differs slightly from your new deployment walkthrough - is there a reason for this?

Secondly, in your Optimization Guide you write that process spawning should be minimized by setting max-pool-size and min-instances to the same value. Isn't heroku the perfect place to follow this advice, because there will always only be 1 app on a server? If it is indeed like that, maybe it makes sense to either adjust this example repo, or add this advice to the README.

What do you think?

All the best,
Fabian

PCRE Header Not Found When Using Edge (b749690ee82d)

I'm using gem "passenger", github:"phusion/passenger" because of this fix.

I know that version is not a release version yet, but I wanted to let you know that that checked out version fails to find a PCRE header on Heroku during deploy and fails.

My Gemfile.lock reports revision b749690ee82d2c01a3bb0d59658972c7cad8f1e0.

This is the log:

heroku[web.1]: Starting process with command `bundle exec passenger start --no-friendly-error-pages -p 50466 --max-pool-size 5`
app[web.1]: Nginx core 1.4.2 isn't installed
app[web.1]:
app[web.1]: Phusion Passenger Standalone will automatically install it into:
app[web.1]:
app[web.1]:   /app/.passenger/standalone/4.0.17/nginx-1.4.2-x86_64-linux
app[web.1]:
app[web.1]: This will only be done once. Please sit back and relax while installation is
app[web.1]: in progress.
app[web.1]:
app[web.1]: Checking for basic prerequities...
app[web.1]:
app[web.1]:  * Checking for A download tool like 'wget' or 'curl'...
app[web.1]:       Found: yes
app[web.1]:       Location: /usr/bin/curl
app[web.1]:
app[web.1]: Checking for required software...
app[web.1]:
app[web.1]:  * Checking for GNU C compiler...
app[web.1]:       Found: yes
app[web.1]:       Location: /usr/bin/gcc
app[web.1]:  * Checking for GNU C++ compiler...
app[web.1]:       Found: yes
app[web.1]:       Location: /usr/bin/g++
app[web.1]:  * Checking for GNU make...
app[web.1]:       Found: yes
app[web.1]:       Location: /usr/bin/make
app[web.1]:  * Checking for OpenSSL support for Ruby...
app[web.1]:       Found: yes
app[web.1]:  * Checking for RubyGems...
app[web.1]:       Found: yes
app[web.1]:  * Checking for Rake (associated with /app/vendor/ruby-2.0.0/bin/ruby)...
app[web.1]:       Found: yes
app[web.1]:       Location: /app/vendor/ruby-2.0.0/bin/rake
app[web.1]:  * Checking for rack...
app[web.1]:       Found: yes
app[web.1]:  * Checking for Curl development headers with SSL support...
app[web.1]:       Found: yes
app[web.1]:       curl-config location: /usr/bin/curl-config
app[web.1]:       Header location: /usr/include/curl/curl.h
app[web.1]:       Version: libcurl 7.19.7
app[web.1]:       Usable: yes
app[web.1]:       Supports SSL: yes
app[web.1]:  * Checking for OpenSSL development headers...
app[web.1]:       Found: yes
app[web.1]:       Location: /usr/include/openssl/ssl.h
app[web.1]:  * Checking for Zlib development headers...
app[web.1]:       Found: yes
app[web.1]:       Location: /usr/include/zlib.h
app[web.1]:  * Checking for PCRE development headers...
app[web.1]:       Found: no
app[web.1]:  * Checking for daemon_controller >= 1.1.0...
app[web.1]:       Found: yes
app[web.1]:       Installed version: 1.1.5
app[web.1]:
app[web.1]: Some required software is not installed.
app[web.1]: But don't worry, this installer will tell you how to install them.
app[web.1]: Press Enter to continue, or Ctrl-C to abort.
app[web.1]: /app/vendor/bundle/ruby/2.0.0/bundler/gems/passenger-b749690ee82d/lib/phusion_passenger/abstract_installer.rb:296:in `readline': end of file reached (EOFError)
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bundler/gems/passenger-b749690ee82d/lib/phusion_passenger/abstract_installer.rb:296:in `wait'
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bundler/gems/passenger-b749690ee82d/lib/phusion_passenger/abstract_installer.rb:138:in `check_dependencies'
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bundler/gems/passenger-b749690ee82d/lib/phusion_passenger/standalone/runtime_installer.rb:194:in `download_or_compile_binaries'
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bundler/gems/passenger-b749690ee82d/lib/phusion_passenger/standalone/runtime_installer.rb:126:in `run_steps'
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bundler/gems/passenger-b749690ee82d/lib/phusion_passenger/abstract_installer.rb:68:in `run'
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bundler/gems/passenger-b749690ee82d/lib/phusion_passenger/standalone/start_command.rb:437:in `install_runtime'
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bundler/gems/passenger-b749690ee82d/lib/phusion_passenger/standalone/start_command.rb:453:in `ensure_runtime_installed'
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bundler/gems/passenger-b749690ee82d/lib/phusion_passenger/standalone/start_command.rb:58:in `run'
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bundler/gems/passenger-b749690ee82d/lib/phusion_passenger/standalone/main.rb:92:in `run_command'
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bundler/gems/passenger-b749690ee82d/lib/phusion_passenger/standalone/main.rb:62:in `run!'
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bundler/gems/passenger-b749690ee82d/lib/phusion_passenger/standalone/main.rb:39:in `run!'
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bundler/gems/passenger-b749690ee82d/bin/passenger:36:in `<top (required)>'
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bin/passenger:23:in `load'
app[web.1]:     from /app/vendor/bundle/ruby/2.0.0/bin/passenger:23:in `<main>'
heroku[web.1]: Process exited with status 1
heroku[router]: at=error code=H10 desc="App crashed" method=HEAD path=/ host=threespot-maestro.herokuapp.com fwd="50.18.57.7" dyno= connect= service= status=503 bytes=

Google Group link

In the 'Next Steps' section of the wiki the google group link seems to be broken.

Passenger timing out upon starting a new dyno.

Hey guys,

Thanks for all the great work. We are hosting a Rails app on Heroku with open source Passenger. When we boot up a new Dyno during peak time, the Passenger queue starts accumulating requests before the processes are ready to serve the requests, so we get too many timeout errors, and the queueing time on NewRelic spikes up. I think Heroku is routing requests to the new Dyno before Passenger is fully ready to process them. Any idea how to avoid this?

Thanks

Heroku STDOUT log

I have passenger and the rails_12factor gem in my Gemfile. After a day or so after being deployed on heroku, passenger stops outputting my logs to STDOUT, and therefore I lose all my logs. After I deploy, it's there. But after a while (a day or two), they stop showing up. Has anyone else seen this?

Encoded slashes don't work unless I switch to builtin engine

Hi

Trying to switch our application over after having some issues with Puma - ran into an issue though, requests with slashes encoded in them (e.g. /documents/akd%2Fd%2Fs ) get mangled by nginx - it converts the encoded slashes into actual slashes, which means that Rails gives a 404 since it can't find something matching that route.

If i use the --engine builtin option, I don't have this issue - but I saw in another issue that you don't recommend that configuration on Heroku?

Thanks
Jordan

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.