Parent

Included Modules

Class Index [+]

Quicksearch

PhusionPassenger::WSGI::ApplicationSpawner

Class for spawning WSGI applications.

Constants

REQUEST_HANDLER

Public Class Methods

spawn_application(*args) click to toggle source
    # File lib/phusion_passenger/wsgi/application_spawner.rb, line 36
36:         def self.spawn_application(*args)
37:                 @@instance ||= ApplicationSpawner.new
38:                 @@instance.spawn_application(*args)
39:         end

Public Instance Methods

spawn_application(app_root, lower_privilege = true, lowest_user = "nobody", environment = "production") click to toggle source

Spawn an instance of the given WSGI application. When successful, an Application object will be returned, which represents the spawned application.

Raises:

  • AppInitError: The WSGI application raised an exception or called exit() during startup.

  • SystemCallError, IOError, SocketError: Something went wrong.

    # File lib/phusion_passenger/wsgi/application_spawner.rb, line 49
49:         def spawn_application(app_root, lower_privilege = true, lowest_user = "nobody", environment = "production")
50:                 a, b = UNIXSocket.pair
51:                 pid = safe_fork(self.class.to_s, true) do
52:                         a.close
53:                         
54:                         file_descriptors_to_leave_open = [0, 1, 2, b.fileno]
55:                         NativeSupport.close_all_file_descriptors(file_descriptors_to_leave_open)
56:                         close_all_io_objects_for_fds(file_descriptors_to_leave_open)
57:                         
58:                         run(MessageChannel.new(b), app_root, lower_privilege, lowest_user, environment)
59:                 end
60:                 b.close
61:                 Process.waitpid(pid) rescue nil
62:                 
63:                 channel = MessageChannel.new(a)
64:                 pid, socket_name, socket_type = channel.read
65:                 if pid.nil?
66:                         raise IOError, "Connection closed"
67:                 end
68:                 owner_pipe = channel.recv_io
69:                 return Application.new(@app_root, pid, socket_name,
70:                         socket_type, owner_pipe)
71:         end

Private Instance Methods

run(channel, app_root, lower_privilege, lowest_user, environment) click to toggle source
     # File lib/phusion_passenger/wsgi/application_spawner.rb, line 74
 74:         def run(channel, app_root, lower_privilege, lowest_user, environment)
 75:                 $0 = "WSGI: #{app_root}"
 76:                 ENV['WSGI_ENV'] = environment
 77:                 Dir.chdir(app_root)
 78:                 if lower_privilege
 79:                         lower_privilege('passenger_wsgi.py', lowest_user)
 80:                 end
 81:                 
 82:                 socket_file = "#{passenger_tmpdir}/backends/wsgi_backend.#{Process.pid}.#{rand 10000000}"
 83:                 server = UNIXServer.new(socket_file)
 84:                 begin
 85:                         reader, writer = IO.pipe
 86:                         channel.write(Process.pid, socket_file, "unix")
 87:                         channel.send_io(writer)
 88:                         writer.close
 89:                         channel.close
 90:                         
 91:                         NativeSupport.close_all_file_descriptors([0, 1, 2, server.fileno,
 92:                                 reader.fileno])
 93:                         exec(REQUEST_HANDLER, socket_file, server.fileno.to_s,
 94:                                 reader.fileno.to_s)
 95:                 rescue
 96:                         server.close
 97:                         File.unlink(socket_file)
 98:                         raise
 99:                 end
100:         end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.