Class for spawning WSGI applications.
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
# 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.
Generated with the Darkfish Rdoc Generator 1.1.6.