Blob Blame History Raw
diff -Npru passenger-orig/ext/apache2/Configuration.cpp passenger-wc/ext/apache2/Configuration.cpp
--- passenger-orig/ext/apache2/Configuration.cpp	2012-03-05 17:33:31.162658085 -0800
+++ passenger-wc/ext/apache2/Configuration.cpp	2012-03-05 17:38:37.164628243 -0800
@@ -272,6 +272,7 @@ passenger_config_merge_dir(apr_pool_t *p
 
 DEFINE_SERVER_STR_CONFIG_SETTER(cmd_passenger_root, root)
 DEFINE_SERVER_STR_CONFIG_SETTER(cmd_passenger_ruby, ruby)
+DEFINE_SERVER_STR_CONFIG_SETTER(cmd_passenger_spawn_ipaddress, spawnIPAddress)
 DEFINE_SERVER_INT_CONFIG_SETTER(cmd_passenger_log_level, logLevel, unsigned int, 0)
 DEFINE_SERVER_STR_CONFIG_SETTER(cmd_passenger_debug_log_file, debugLogFile)
 DEFINE_SERVER_INT_CONFIG_SETTER(cmd_passenger_max_pool_size, maxPoolSize, unsigned int, 1)
@@ -474,6 +475,11 @@ const command_rec passenger_commands[] =
 		NULL,
 		RSRC_CONF,
 		"The Ruby interpreter to use."),
+	AP_INIT_TAKE1("PassengerSpawnIPAddress",
+		(Take1Func) cmd_passenger_spawn_ipaddress,
+		NULL,
+		RSRC_CONF,
+		"The IP address to bind to."),
 	AP_INIT_TAKE1("PassengerLogLevel",
 		(Take1Func) cmd_passenger_log_level,
 		NULL,
diff -Npru passenger-orig/ext/apache2/Configuration.hpp passenger-wc/ext/apache2/Configuration.hpp
--- passenger-orig/ext/apache2/Configuration.hpp	2012-03-05 17:33:31.162658085 -0800
+++ passenger-wc/ext/apache2/Configuration.hpp	2012-03-05 17:38:37.165628242 -0800
@@ -367,6 +367,9 @@ struct DirConfig {
 struct ServerConfig {
 	/** The filename of the Ruby interpreter to use. */
 	const char *ruby;
+
+	/** The IP Address to bind to. */
+	const char *spawnIPAddress;
 	
 	/** The Passenger root folder. */
 	const char *root;
@@ -416,6 +419,7 @@ struct ServerConfig {
 	
 	ServerConfig() {
 		ruby               = "ruby";
+		spawnIPAddress     = "127.0.0.1";
 		root               = NULL;
 		logLevel           = DEFAULT_LOG_LEVEL;
 		debugLogFile       = NULL;
diff -Npru passenger-orig/ext/apache2/HelperAgent.cpp passenger-wc/ext/apache2/HelperAgent.cpp
--- passenger-orig/ext/apache2/HelperAgent.cpp	2012-03-05 17:33:31.162658085 -0800
+++ passenger-wc/ext/apache2/HelperAgent.cpp	2012-03-05 17:38:37.165628242 -0800
@@ -245,7 +245,8 @@ public:
 			accountsDatabase, rubyCommand,
 			analyticsLogger,
 			options.getInt("log_level"),
-			options.get("debug_log_file", false)
+			options.get("debug_log_file", false),
+			options.get("spawn_ipaddress")
 		));
 		pool->setMax(maxPoolSize);
 		pool->setMaxPerApp(maxInstancesPerApp);
diff -Npru passenger-orig/ext/apache2/Hooks.cpp passenger-wc/ext/apache2/Hooks.cpp
--- passenger-orig/ext/apache2/Hooks.cpp	2012-03-05 17:33:31.162658085 -0800
+++ passenger-wc/ext/apache2/Hooks.cpp	2012-03-05 17:48:25.902486295 -0800
@@ -1401,7 +1401,8 @@ public:
 			serverConfig.unionStationGatewayCert,
 			serverConfig.unionStationProxyAddress,
 			serverConfig.unionStationProxyType,
-			serverConfig.prestartURLs);
+			serverConfig.prestartURLs,
+			serverConfig.spawnIPAddress);
 		
 		analyticsLogger = ptr(new AnalyticsLogger(agentsStarter.getLoggingSocketAddress(),
 			"logging", agentsStarter.getLoggingSocketPassword()));
diff -Npru passenger-orig/ext/common/AgentsStarter.cpp passenger-wc/ext/common/AgentsStarter.cpp
--- passenger-orig/ext/common/AgentsStarter.cpp	2012-03-05 17:33:31.192658083 -0800
+++ passenger-wc/ext/common/AgentsStarter.cpp	2012-03-05 17:38:37.168628242 -0800
@@ -64,6 +64,7 @@ agents_starter_start(AgentsStarter *as,
                      const char *unionStationProxyAddress,
                      const char *unionStationProxyType,
                      const char **prestartURLs, unsigned int prestartURLsCount,
+                     const char *spawnIPAddress,
                      const AfterForkCallback afterFork,
                      void *callbackArgument,
                      char **errorMessage)
@@ -96,6 +97,7 @@ agents_starter_start(AgentsStarter *as,
 			unionStationProxyAddress,
 			unionStationProxyType,
 			setOfprestartURLs,
+			spawnIPAddress,
 			afterForkFunctionObject);
 		return 1;
 	} catch (const Passenger::SystemException &e) {
diff -Npru passenger-orig/ext/common/AgentsStarter.h passenger-wc/ext/common/AgentsStarter.h
--- passenger-orig/ext/common/AgentsStarter.h	2012-03-05 17:33:31.189658083 -0800
+++ passenger-wc/ext/common/AgentsStarter.h	2012-03-05 17:38:37.168628242 -0800
@@ -64,6 +64,7 @@ int  agents_starter_start(AgentsStarter
                           const char *unionStationProxyAddress,
                           const char *unionStationProxyType,
                           const char **prestartURLs, unsigned int prestartURLsCount,
+                          const char *spawnIPAddress,
                           const AfterForkCallback afterFork,
                           void *callbackArgument,
                           char **errorMessage);
diff -Npru passenger-orig/ext/common/AgentsStarter.hpp passenger-wc/ext/common/AgentsStarter.hpp
--- passenger-orig/ext/common/AgentsStarter.hpp	2012-03-05 17:33:31.190658083 -0800
+++ passenger-wc/ext/common/AgentsStarter.hpp	2012-03-05 17:38:37.169628242 -0800
@@ -387,6 +387,7 @@ public:
 	           const string &unionStationProxyAddress,
 	           const string &unionStationProxyType,
 	           const set<string> &prestartURLs,
+	           const string &spawnIPAddress,
 	           const function<void ()> &afterFork = function<void ()>())
 	{
 		TRACE_POINT();
@@ -416,6 +417,7 @@ public:
 			.setGid ("web_server_worker_gid", webServerWorkerGid)
 			.set    ("passenger_root",  passengerRoot)
 			.set    ("ruby",            rubyCommand)
+			.set    ("spawn_ipaddress",  spawnIPAddress)
 			.setInt ("max_pool_size",   maxPoolSize)
 			.setInt ("max_instances_per_app",     maxInstancesPerApp)
 			.setInt ("pool_idle_time",            poolIdleTime)
diff -Npru passenger-orig/ext/common/ApplicationPool/Pool.h passenger-wc/ext/common/ApplicationPool/Pool.h
--- passenger-orig/ext/common/ApplicationPool/Pool.h	2012-03-05 17:33:31.189658083 -0800
+++ passenger-wc/ext/common/ApplicationPool/Pool.h	2012-03-05 17:38:37.169628242 -0800
@@ -1062,7 +1062,8 @@ public:
 	     const string &rubyCommand = "ruby",
 	     const AnalyticsLoggerPtr &analyticsLogger = AnalyticsLoggerPtr(),
 	     int logLevel = 0,
-	     const string &debugLogFile = ""
+	     const string &debugLogFile = "",
+	     const string &spawnIPAddress = "127.0.0.1"
 	) : data(new SharedData()),
 		cstat(DEFAULT_MAX_POOL_SIZE),
 		lock(data->lock),
@@ -1079,7 +1080,7 @@ public:
 		
 		this->spawnManager = ptr(new SpawnManager(spawnServerCommand, generation,
 			accountsDatabase, rubyCommand, analyticsLogger, logLevel,
-			debugLogFile));
+			debugLogFile, spawnIPAddress));
 		initialize(analyticsLogger);
 	}
 	
diff -Npru passenger-orig/ext/common/SpawnManager.h passenger-wc/ext/common/SpawnManager.h
--- passenger-orig/ext/common/SpawnManager.h	2012-03-05 17:33:31.189658083 -0800
+++ passenger-wc/ext/common/SpawnManager.h	2012-03-05 17:38:37.170628241 -0800
@@ -107,6 +107,7 @@ private:
 	ServerInstanceDir::GenerationPtr generation;
 	AccountsDatabasePtr accountsDatabase;
 	string rubyCommand;
+	string spawnIPAddress;
 	AnalyticsLoggerPtr analyticsLogger;
 	int logLevel;
 	string debugLogFile;
@@ -267,6 +268,7 @@ private:
 			}
 			writeExact(ownerSocket, toString(logLevel) + "\n");
 			writeExact(ownerSocket, debugLogFile + "\n");
+			writeExact(ownerSocket, spawnIPAddress + "\n");
 			
 			this->ownerSocket    = ownerSocket;
 			this->socketFilename = socketFilename;
@@ -547,13 +549,15 @@ public:
 	             const string &rubyCommand = "ruby",
 	             const AnalyticsLoggerPtr &analyticsLogger = AnalyticsLoggerPtr(),
 	             int logLevel = 0,
-	             const string &debugLogFile = ""
+	             const string &debugLogFile = "",
+	             const string &spawnIPAddress = "127.0.0.1"
 	) {
 		TRACE_POINT();
 		this->spawnServerCommand = spawnServerCommand;
 		this->generation  = generation;
 		this->accountsDatabase = accountsDatabase;
 		this->rubyCommand = rubyCommand;
+		this->spawnIPAddress = spawnIPAddress;
 		this->analyticsLogger = analyticsLogger;
 		this->logLevel = logLevel;
 		this->debugLogFile = debugLogFile;
diff -Npru passenger-orig/ext/common/Watchdog.cpp passenger-wc/ext/common/Watchdog.cpp
--- passenger-orig/ext/common/Watchdog.cpp	2012-03-05 17:33:31.189658083 -0800
+++ passenger-wc/ext/common/Watchdog.cpp	2012-03-05 17:38:37.170628241 -0800
@@ -75,6 +75,7 @@ static uid_t   webServerWorkerUid;
 static gid_t   webServerWorkerGid;
 static string  passengerRoot;
 static string  rubyCommand;
+static string  spawnIPAddress;
 static unsigned int maxPoolSize;
 static unsigned int maxInstancesPerApp;
 static unsigned int poolIdleTime;
@@ -592,7 +593,8 @@ protected:
 		options.set("request_socket_password", Base64::encode(requestSocketPassword)).
 			set("message_socket_password", Base64::encode(messageSocketPassword)).
 			set("logging_agent_address", loggingAgentAddress).
-			set("logging_agent_password", loggingAgentPassword);
+			set("logging_agent_password", loggingAgentPassword).
+			set("spawn_ipaddress", spawnIPAddress);
 		options.writeToFd(fd);
 	}
 	
@@ -978,6 +980,7 @@ main(int argc, char *argv[]) {
 	webServerWorkerGid = agentsOptions.getGid("web_server_worker_gid");
 	passengerRoot = agentsOptions.get("passenger_root");
 	rubyCommand   = agentsOptions.get("ruby");
+	spawnIPAddress   = agentsOptions.get("spawn_ipaddress");
 	maxPoolSize        = agentsOptions.getInt("max_pool_size");
 	maxInstancesPerApp = agentsOptions.getInt("max_instances_per_app");
 	poolIdleTime       = agentsOptions.getInt("pool_idle_time");
diff -Npru passenger-orig/ext/nginx/ngx_http_passenger_module.c passenger-wc/ext/nginx/ngx_http_passenger_module.c
--- passenger-orig/ext/nginx/ngx_http_passenger_module.c	2012-03-05 17:33:31.188658083 -0800
+++ passenger-wc/ext/nginx/ngx_http_passenger_module.c	2012-03-05 17:38:37.171628240 -0800
@@ -291,6 +291,7 @@ start_helper_server(ngx_cycle_t *cycle)
         union_station_proxy_address,
         union_station_proxy_type,
         (const char **) prestart_uris_ary, passenger_main_conf.prestart_uris->nelts,
+        "127.0.0.1",
         starting_helper_server_after_fork,
         cycle,
         &error_message);
diff -Npru passenger-orig/helper-scripts/passenger-spawn-server passenger-wc/helper-scripts/passenger-spawn-server
--- passenger-orig/helper-scripts/passenger-spawn-server	2012-03-05 17:33:31.193658083 -0800
+++ passenger-wc/helper-scripts/passenger-spawn-server	2012-03-05 17:38:37.171628240 -0800
@@ -47,6 +47,7 @@ begin
 		node_name = owner_socket.readline.strip
 		log_level = owner_socket.readline.to_i
 		debug_log_file = owner_socket.readline.strip
+		spawn_ipaddress = owner_socket.readline.strip
 	rescue EOFError
 		exit
 	end
@@ -93,6 +94,8 @@ begin
 			"node_name" => node_name
 		}
 	end
+
+	options["spawn_ipaddress"] = spawn_ipaddress
 	
 	require 'phusion_passenger/spawn_manager'
 	spawn_manager = PhusionPassenger::SpawnManager.new(options)
diff -Npru passenger-orig/lib/phusion_passenger/abstract_request_handler.rb passenger-wc/lib/phusion_passenger/abstract_request_handler.rb
--- passenger-orig/lib/phusion_passenger/abstract_request_handler.rb	2012-03-05 17:33:31.159658087 -0800
+++ passenger-wc/lib/phusion_passenger/abstract_request_handler.rb	2012-03-05 17:38:37.172628240 -0800
@@ -174,11 +174,11 @@ class AbstractRequestHandler
 			@main_socket_address, @main_socket = create_unix_socket_on_filesystem
 			@server_sockets[:main] = [@main_socket_address, 'unix', @main_socket]
 		else
-			@main_socket_address, @main_socket = create_tcp_socket
+			@main_socket_address, @main_socket = create_tcp_socket(options["spawn_ipaddress"])
 			@server_sockets[:main] = [@main_socket_address, 'tcp', @main_socket]
 		end
 		
-		@http_socket_address, @http_socket = create_tcp_socket
+		@http_socket_address, @http_socket = create_tcp_socket(options["spawn_ipaddress"])
 		@server_sockets[:http] = [@http_socket_address, 'tcp', @http_socket]
 		
 		@owner_pipe = owner_pipe
@@ -397,13 +397,14 @@ private
 		end
 	end
 	
-	def create_tcp_socket
+	def create_tcp_socket(spawn_ipaddr = nil)
 		# We use "127.0.0.1" as address in order to force
 		# TCPv4 instead of TCPv6.
-		socket = TCPServer.new('127.0.0.1', 0)
+		spawn_ipaddr ||= '127.0.0.1'
+		socket = TCPServer.new(spawn_ipaddr, 0)
 		socket.listen(BACKLOG_SIZE)
 		socket.close_on_exec!
-		socket_address = "127.0.0.1:#{socket.addr[1]}"
+		socket_address = "#{spawn_ipaddr}:#{socket.addr[1]}"
 		return [socket_address, socket]
 	end