Wow, thanks for the rather detailed instructions. I will definitely try this out and report back (might be a couple of weeks, works busy).
This will probably be an interim solution for people to get used to ruby and eventually we might transition to a linux environment (still having discussions). Thanks again! On 17 September 2011 22:37, 2potatocakes <[email protected]> wrote: > Really sorry mate, was in a training course all this week. Tim, yeah > played a fair bit with JRuby, I like it a lot and I think the > deployment options are pretty sweet as well. Def take a look at it if > you can Arunan. If you want to stick with MRI though, there's much > better deployment options than going with IIS, kick your team in the > nuts mate.. > > Not sure if you still want this, but steer clear of that roriis link > you put up. Just as a rule of thumb, NEVER EVER install an exe that > attempts to patch your gems! > > Anywho, here's my notes, I put em together a while back so they apply > to a rails 2.3.5 app.. hope they help > > > ------------------------------------------------------------------------------- > IIS Deployment notes > > > This guide assumes you've already got IIS installed. > > My Env > IIS 5.1 > Ruby 1.8.6 > Gem 1.3.5 > Rails 2.3.5 > > There's 2 ways you can do this, you can either set up IIS to proxy to > a mongrel_service instance of your rails app or you can use fcgi to > serve up requests. This guide will explain the .fcgi method > > Rails expects pretty looking URL's to handle requests, but IIS > requires the path to your dispatch.fcgi file for it to be able to > serve up the request, so you need an equivalent of apache's > mod_rewrite module to step in and fix up the URL so that both are > happy. > > Here's how the requests need to come in for everything to work: > > User makes request to : > http://localhost/controller/action?var1=foo&var2=bar > Rewrite Mod changes to : > http://localhost/dispatch.fcgi?opnq=/controller/action?var1=foo&var2=bar > IIS accepts and serves up request to dispatch.fcgi > dispatch.fcgi spins up ruby instance of your app > Rails app receives and needs to change request back into original form > Rails turns request back into : > http://localhost/controller/action?var1=foo&var2=bar > > > 1. In your rails app make sure there is not a file in your public > directory named .htaccess <-- rename it to anything else, > apache.htaccess for example > > > 2. In your public directory there's probably already a dispatch.fcgi > file, if not create one. > > #{RAILS_ROOT}/public/dispatch.fcgi > > require File.dirname(__FILE__) + "/../config/environment" > require 'fcgi_handler' > > RailsFCGIHandler.process! > > > 3. Open a command prompt, cd into your rails app's public directory > and run: ruby dispatch.fcgi > If it outputs: unknown listenType (0) > That's good, that's what you want. If it spits out an error you'll > need to find out what's causing it and fix it. > > > 4. IIS 5 & 6 don't support fcgi by default so you have to install > support for the fcgi protocol for IIS, there's an update for the IIS7 > version on this page as well: > http://www.iis.net/download/fastcgi > > The fcgi installer will install a few files including the following 2: > > C:\WINDOWS\system32\inetsrv\fcgiext.ini > C:\WINDOWS\system32\inetsrv\fcgiext.dll > > > 5. Open fcgiext.ini in a text editor, scroll to the bottom and add the > following, replace the 'Arguments' and 'ExePath' paths with your own: > The 'MaxInstances' argument specifies the maximum amount of ruby > processes that can fire up to handle requests. > > #C:\WINDOWS\system32\inetsrv\fcgiext.ini > > [Types] > *:1=RUBY > fcgi:1=RUBY > > [RUBY] > ExePath=C:\ruby\bin\ruby.exe > Arguments=C:\path\to\rails_app\public\dispatch.fcgi > IgnoreDirectories=0 > IgnoreExistingFiles=1 > QueueLength=1000 > MaxInstances=4 > InstanceMaxRequests=200 > > > 6. Open up IIS, right click on "Default Web Site" and select > "Properties". > > Select the "Home Directory" tab and change the "Local Path" to point > to your rails app's public directory: > C:\path\to\rails_app\public > > Change the "Execute Permissions" option to "Scripts and Executables" > and apply the changes. The contents of your app's public directory > should be displayed in the IIS directory. > > > 7. If you've got IIS 5 (definitely) or IIS 6 (I think..), go to > http://www.helicontech.com/download-isapi_rewrite.htm download the > lite version for now cause it's free and install it. I think IIS7 > already has an equivalent of apache's mod_rewrite module or it allows > you to import the same conditions etc. so if you have IIS7 then don't > worry about this step > > > 8. Remove the read only permission from this file first and then open: > C:\Program Files\Helicon\ISAPI_Rewrite\httpd.ini and add the > following: > > RewriteRule ^$ index.html [QSA] > RewriteRule ^([^.]+)$ $1.html [QSA] > RewriteCond %{REQUEST_FILENAME} !-f > RewriteRule ([^.]+)$ /dispatch.fcgi?opnq=$1 > > save the file and re-apply the read-only permission to this file > The above is going to change your incoming requests into something IIS > will like. > > 9. Open IIS again, select "Properties" again, this time select the > "ISAPI Filters" tab. You should see 'isapi' listed. If you don't see > it, click add, name a filter 'isapi' and point the executable path to > C:\Program Files\Helicon\ISAPI_Rewrite\ISAPI_Rewrite.dll > > Click Apply. > > > 10. In IIS, Select the "Home Directory" tab again, click > "Configuration"... You need to add a mapping for files that have the > extension .fcgi and tell IIS to execute these files with the > fcgiext.dll that you installed in step 4. Click add.. then: > > executable path = C:\WINDOWS\system32\inetsrv\fcgiext.dll > extension = .fcgi > Verbs = ALL > > > 11. Open a command prompt and run: iisreset > This will reset IIS and reinitialise everything with all of the > changes above. > > Open IIS again, refresh and click on the play icon to start IIS. > > > 12. Open a browser and go to http://localhost > It'll take around 30 seconds to kick off the first time, but if > everything worked you should get some sort of rails error saying > there's a problem routing your request into dispatch.fcgi or something > like that. If you get some other type of error then double check > everything above again until you can get a rails error. > > > 13. Your routes won't work properly because of the way the requests > are now coming in from IIS. The following are examples of environment > variable values when these requests come in: > > Incoming from IIS to Rails App > Path Info : /dispatch.fcgi > Script Name : /dispatch.fcgi > Query String : opnq=/controller/action?var1=foo&var2=bar > Request_URI : /dispatch.fcgi?opnq=/controller/action? > var1=foo&var2=bar > Base URL : > > You need to patch ActionController's request method so that you can > transform the request into the following: > Path Info : /controller/action > Script Name : /dispatch.fcgi > Query String : var1=foo&var2=bar > Request_URI : /controller/action?var1=foo&var2=bar > Base URL : > > Go into your rails app and create a new file in your lib directory. > The following will patch ActionController's request method, catch the > incoming request and split the incoming vomit into something Rails can > understand. > > #{RAILS_ROOT}/lib/action_controller_request_ext.rb > > module ActionController > class Request > def request_uri > orig_uri = @env['REQUEST_URI'] > new_uri = orig_uri.to_s.gsub(/^.*opnq=/, '').to_s.gsub(/\/ > dispatch.fcgi/, '') > @env['REQUEST_URI'] = new_uri > @env['QUERY_STRING'] = ((new_uri.gsub(/^.*\?/, '') == "/") || (! > new_uri.match(/\?/))) ? "" : new_uri.gsub(/^.*\?/, '') > @env['PATH_INFO'] = new_uri.gsub(/\?.*$/, '') > new_uri > end > end > end > > You can either require this file within your environment.rb or require > it in your dispatch.fcgi if you want > > #{RAILS_ROOT}/public/dispatch.fcgi > > require File.dirname(__FILE__) + "/../config/environment" > require 'fcgi_handler' > require File.join(RAILS_ROOT, 'lib', 'action_controller_request_ext') > > RailsFCGIHandler.process! > > > 14. Open command prompt again and reset IIS again using: iisreset > > Check out your browser again http://localhost and you should see your > rails app running.. might take about 30 seconds to kick off the first > time. > > -- > You received this message because you are subscribed to the Google Groups > "Ruby or Rails Oceania" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/rails-oceania?hl=en. > > -- @askalot Website: http://arunanskanthan.com --- "Ariels in the sky. When you free small mind, you free your life..." -- You received this message because you are subscribed to the Google Groups "Ruby or Rails Oceania" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/rails-oceania?hl=en.
