LiteSpeed Technologies
Download Download     Blog Blog     Wiki Wiki     Forum Forum     Store     Contact Contact    

Go Back   LiteSpeed Support Forums > LiteSpeed Web Server > Feedback/Feature Requests > Ruby Rack adapter request

Reply
 
Thread Tools Display Modes
  #1  
Old 01-10-2008, 05:43 PM
zhesto zhesto is offline
Member
 
Join Date: Jun 2006
Posts: 11
Default Ruby Rack adapter request

Rack [ http://rack.rubyforge.org/ ] - provides an minimal interface between webservers supporting Ruby and Ruby frameworks. Almost all recently releazed ruby frameworks (Ramaze, Sinatra etc.) using it. Creating LSAPI adapter for it will enable all of them (and the new onces comming) to run on litespeed.

What need to be done:
1. Rack Litespeed handler - {rack_path}/lib/rack/handler/litespeed.rb - i tryed to patch the CGI handler with:
Code:
def self.run(app, options=nil)
        while LSAPI.accept != nil
          serve app
        end
      end
but for some reason it not worked.

2. {lsws}/fcgi-bin/RackRunner.rb , similar to the RailsRunner.rb one. It will call the Rack::Handler::Litespeed directly or via {project_home}/start.rb

3. EasyRackWithSuEXEC VH Template
Reply With Quote
  #2  
Old 01-10-2008, 06:58 PM
mistwang mistwang is offline
LiteSpeed Staff
 
Join Date: May 2003
Location: New Jersey
Posts: 7,583
have you added "require lsapi" ?
other changes need to be made are
rack.run_once=false

LSAPI uses hash to store ENV, so need to do env=ENV.to_hash, just env=ENV
Reply With Quote
  #3  
Old 01-10-2008, 08:14 PM
zhesto zhesto is offline
Member
 
Join Date: Jun 2006
Posts: 11
What i've done until now:

1. Handler modified:

Code:
require 'lsapi'

module Rack
  module Handler
    class Litespeed
      def self.run(app, options=nil)
        while LSAPI.accept != nil
          serve app
        end
      end

      def self.serve(app)
        env = ENV
        ...
                     "rack.run_once" => false,
2. Handler added to the {rack_path}/lib/rack.rb:
Code:
module Handler
    autoload :CGI, "rack/handler/cgi"
    autoload :Litespeed, "rack/handler/litespeed"
    ...
  end
3. External application created:
Code:
Name	 			rbLsapi
Address	 			uds://tmp/lshttpd/lsruby.sock
Notes	 			Not Set
Max Connections 		5	
Environment	
				LSAPI_MAX_REQUESTS=500
				LSAPI_CHILDREN=5
Initial Request Timeout (secs)	180
Retry Timeout (secs)		0
Persistent Connection		Not Set
Connection Keepalive Timeout	Not Set
Response Buffering		No
Auto Start			Yes
Command				$SERVER_ROOT/fcgi-bin/lsruby_runner.rb
Back Log			50
Instances			1
Run On Start Up			Not Set
Max Idle Time			Not Set
Priority	 		3
Memory Soft Limit (bytes)	250M
Memory Hard Limit (bytes)	300M
Process Soft Limit		200
Process Hard Limit		200
4. Ruby scripts bound to the rbLsapi:
Code:
rb	LiteSpeed API	[Server Level]: rbLsapi
5. Simple script in $SERVER_ROOT/DEFAULT/html/simple.rb:
Code:
require 'rubygems'
require 'rack'
require 'lsapi'

class HelloWorld
  def call(env)
    [ 200, # HTTP Response Code
      { "Content-Type"=>"text/plain" }, # HTTP Headers
      [ "Hello, World!" ] # Body
    ]
  end
end

# Instantiate your app
app = HelloWorld.new

Rack::Handler::Litespeed.run app
The result: 500 Internal Server Error

In the error.log:
Code:
2008-01-11 12:54:47.088 [INFO] [rbLsapi] add child process pid: 3094
2008-01-11 12:54:47.088 [INFO] [rbLsapi] pid list size: 1
2008-01-11 12:54:47.218 [NOTICE] [192.168.3.81:54602-0#Example] Premature end of response header.
2008-01-11 12:55:03.555 [WARN] [192.168.3.81:54604-0#Example] LSAPI Packet header is invalid,('S','t','a','t','u','s',':',' ')
2008-01-11 12:55:03.555 [INFO] [192.168.3.81:54604-0#Example] connection to [uds://tmp/lshttpd/lsruby.sock] on request #0, error: Input/output error!
2008-01-11 12:55:03.555 [INFO] [uds://tmp/lshttpd/lsruby.sock] Connection error: Input/output error, adjust maximum connections to 4!
Reply With Quote
  #4  
Old 01-10-2008, 08:37 PM
aemadrid aemadrid is offline
Senior Member
 
Join Date: Aug 2006
Posts: 57
There is already a rack handler in the repo. I should know because I submitted it. I'm including my code that I know it works. I only changed one line in rack.rb and created lsws.rb myself. I changed the .rb extensions to .txt to upload.

Hope this helps,


AEM
Attached Files
File Type: txt rack.txt (2.6 KB, 21 views)
File Type: txt lsws.txt (1.5 KB, 20 views)
Reply With Quote
  #5  
Old 01-10-2008, 08:54 PM
mistwang mistwang is offline
LiteSpeed Staff
 
Join Date: May 2003
Location: New Jersey
Posts: 7,583
Do not use lsruby_runner.rb, just run simple.rb directly by changing the command configuration, use a LSAPI context instead of *.rb script handler to invoke the app.

AEM's code should work.

And if you want to make your code works, I think you need a little more changes need to Hanlder::LiteSpeed,
All references to STDIN, STDOUT should be changed to use the object return by LSAPI.accept.
Reply With Quote
  #6  
Old 01-10-2008, 09:25 PM
zhesto zhesto is offline
Member
 
Join Date: Jun 2006
Posts: 11
Thanks a lot mistwang and aemadrid. Problem solved - i used the aemadrid code. Working + no need to reinvent the wheel . Just a small question (or maybe i need to repost it in the usual RoR forum, not here):

Need I to create different socket for every external application I started in that way (LSAPI Ext App + Context)?

Best regards and thanks again
Reply With Quote
  #7  
Old 01-11-2008, 07:34 AM
aemadrid aemadrid is offline
Senior Member
 
Join Date: Aug 2006
Posts: 57
Glad to help. Let me know if you find something to improve.

AEM
Reply With Quote
  #8  
Old 01-11-2008, 09:01 PM
mistwang mistwang is offline
LiteSpeed Staff
 
Join Date: May 2003
Location: New Jersey
Posts: 7,583
Quote:
Originally Posted by zhesto View Post
Need I to create different socket for every external application I started in that way (LSAPI Ext App + Context)?
Yes, that's correct. The same for each rails application behind the scene.

If you guys can make it into the official rack package, it will be great.
Reply With Quote
  #9  
Old 06-05-2008, 02:27 PM
ctran73 ctran73 is offline
New Member
 
Join Date: Jun 2008
Posts: 2
Would you mind re-post the instructions step-by-step? It's kind of hard to follow with all the threads going on

Quote:
Originally Posted by zhesto View Post
Rack [ http://rack.rubyforge.org/ ] - provides an minimal interface between webservers supporting Ruby and Ruby frameworks. Almost all recently releazed ruby frameworks (Ramaze, Sinatra etc.) using it. Creating LSAPI adapter for it will enable all of them (and the new onces comming) to run on litespeed.

What need to be done:
1. Rack Litespeed handler - {rack_path}/lib/rack/handler/litespeed.rb - i tryed to patch the CGI handler with:
Code:
def self.run(app, options=nil)
        while LSAPI.accept != nil
          serve app
        end
      end
but for some reason it not worked.

2. {lsws}/fcgi-bin/RackRunner.rb , similar to the RailsRunner.rb one. It will call the Rack::Handler::Litespeed directly or via {project_home}/start.rb

3. EasyRackWithSuEXEC VH Template
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -7. The time now is 10:28 AM.



- Archive - Top
© Copyright 2003-2011 LiteSpeed Technologies, Inc. All rights reserved. Privacy Policy.