passenger 4.0.23 → 4.0.24
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- data.tar.gz.asc +7 -7
- data/NEWS +17 -0
- data/bin/passenger-config +3 -0
- data/bin/passenger-install-apache2-module +1 -1
- data/bin/passenger-install-nginx-module +1 -1
- data/build/integration_tests.rb +5 -3
- data/debian.template/control.template +6 -4
- data/doc/Users guide Apache.idmap.txt +9 -5
- data/doc/Users guide Apache.txt +38 -3
- data/doc/Users guide Nginx.idmap.txt +58 -54
- data/doc/Users guide Nginx.txt +126 -63
- data/doc/Users guide Standalone.idmap.txt +19 -15
- data/doc/Users guide Standalone.txt +92 -0
- data/doc/users_guide_snippets/environment_variables.txt +11 -0
- data/doc/users_guide_snippets/installation.txt +8 -8
- data/doc/users_guide_snippets/troubleshooting/default.txt +12 -4
- data/ext/apache2/Configuration.cpp +0 -10
- data/ext/apache2/Configuration.hpp +0 -3
- data/ext/apache2/ConfigurationCommands.cpp +18 -0
- data/ext/apache2/ConfigurationFields.hpp +12 -6
- data/ext/apache2/ConfigurationFields.hpp.erb +10 -5
- data/ext/apache2/ConfigurationSetters.cpp +27 -0
- data/ext/apache2/CreateDirConfig.cpp +3 -0
- data/ext/apache2/Hooks.cpp +15 -74
- data/ext/apache2/MergeDirConfig.cpp +21 -0
- data/ext/apache2/SetHeaders.cpp +8 -0
- data/ext/common/ApplicationPool2/Group.h +1 -1
- data/ext/common/ApplicationPool2/Implementation.cpp +22 -5
- data/ext/common/ApplicationPool2/Options.h +10 -1
- data/ext/common/ApplicationPool2/Pool.h +4 -0
- data/ext/common/Constants.h +4 -2
- data/ext/common/agents/HelperAgent/RequestHandler.h +1 -0
- data/ext/nginx/CacheLocationConfig.c +20 -0
- data/ext/nginx/ConfigurationCommands.c +10 -0
- data/ext/nginx/ConfigurationFields.h +2 -0
- data/ext/nginx/CreateLocationConfig.c +5 -0
- data/ext/nginx/MergeLocationConfig.c +6 -0
- data/ext/nginx/config +14 -14
- data/lib/phusion_passenger.rb +1 -1
- data/lib/phusion_passenger/apache2/config_options.rb +23 -0
- data/lib/phusion_passenger/constants.rb +3 -1
- data/lib/phusion_passenger/nginx/config_options.rb +4 -0
- data/lib/phusion_passenger/platform_info/operating_system.rb +2 -0
- data/lib/phusion_passenger/platform_info/ruby.rb +24 -0
- data/lib/phusion_passenger/standalone/app_finder.rb +65 -25
- data/lib/phusion_passenger/standalone/command.rb +1 -1
- data/lib/phusion_passenger/standalone/start_command.rb +6 -5
- data/resources/templates/installer_common/run_installer_as_root.txt.erb +4 -1
- data/resources/templates/standalone/config.erb +1 -1
- data/test/cxx/ApplicationPool2/PoolTest.cpp +18 -0
- metadata +13 -5
- metadata.gz.asc +7 -7
- checksums.yaml +0 -15
- checksums.yaml.gz.asc +0 -12
data/lib/phusion_passenger.rb
CHANGED
@@ -30,7 +30,7 @@ module PhusionPassenger
|
|
30
30
|
|
31
31
|
PACKAGE_NAME = 'passenger'
|
32
32
|
# Run 'rake ext/common/Constants.h' after changing this number.
|
33
|
-
VERSION_STRING = '4.0.
|
33
|
+
VERSION_STRING = '4.0.24'
|
34
34
|
|
35
35
|
PREFERRED_NGINX_VERSION = '1.4.3'
|
36
36
|
NGINX_SHA256_CHECKSUM = 'ae123885c923a6c3f5bab0a8b7296ef21c4fdf6087834667ebbc16338177de84'
|
@@ -42,6 +42,12 @@
|
|
42
42
|
# * min_value - If `type` is :integer, then this specifies the minimum
|
43
43
|
# allowed value. When nil (the default), there is no minimum.
|
44
44
|
# * desc - A description for this configuration option. Required.
|
45
|
+
# * header - The name of the corresponding CGI header. By default CGI header
|
46
|
+
# generation code is automatically generated, using the configuration
|
47
|
+
# option's name in uppercase as the CGI header name.
|
48
|
+
# Setting this to nil will disable auto-generation of CGI header
|
49
|
+
# generation code. You are then responsible for writing CGI header
|
50
|
+
# passing code yourself in Hooks.cpp.
|
45
51
|
|
46
52
|
APACHE2_DIRECTORY_CONFIGURATION_OPTIONS = [
|
47
53
|
{
|
@@ -50,6 +56,16 @@ APACHE2_DIRECTORY_CONFIGURATION_OPTIONS = [
|
|
50
56
|
:desc => "The Ruby interpreter to use.",
|
51
57
|
:header_expression => "config->ruby ? config->ruby : serverConfig.defaultRuby"
|
52
58
|
},
|
59
|
+
{
|
60
|
+
:name => "PassengerPython",
|
61
|
+
:type => :string,
|
62
|
+
:desc => "The Python interpreter to use."
|
63
|
+
},
|
64
|
+
{
|
65
|
+
:name => "PassengerNodejs",
|
66
|
+
:type => :string,
|
67
|
+
:desc => "The Node.js command to use."
|
68
|
+
},
|
53
69
|
{
|
54
70
|
:name => "PassengerMinInstances",
|
55
71
|
:type => :integer,
|
@@ -69,6 +85,13 @@ APACHE2_DIRECTORY_CONFIGURATION_OPTIONS = [
|
|
69
85
|
:context => ["ACCESS_CONF", "RSRC_CONF"],
|
70
86
|
:desc => "The group that Ruby applications must run as."
|
71
87
|
},
|
88
|
+
{
|
89
|
+
:name => "PassengerErrorOverride",
|
90
|
+
:type => :flag,
|
91
|
+
:context => ["OR_ALL"],
|
92
|
+
:desc => "Allow Apache to handle error response.",
|
93
|
+
:header => nil
|
94
|
+
},
|
72
95
|
{
|
73
96
|
:name => "PassengerMaxRequests",
|
74
97
|
:type => :integer,
|
@@ -37,6 +37,7 @@ module PhusionPassenger
|
|
37
37
|
DEFAULT_LOG_LEVEL = 0
|
38
38
|
DEFAULT_RUBY = "ruby"
|
39
39
|
DEFAULT_PYTHON = "python"
|
40
|
+
DEFAULT_NODEJS = "node"
|
40
41
|
DEFAULT_MAX_POOL_SIZE = 6
|
41
42
|
DEFAULT_POOL_IDLE_TIME = 300
|
42
43
|
DEFAULT_START_TIMEOUT = 90_000
|
@@ -80,7 +81,8 @@ module PhusionPassenger
|
|
80
81
|
"--without-http_scgi_module " <<
|
81
82
|
"--without-http_uwsgi_module " <<
|
82
83
|
"--with-http_gzip_static_module " <<
|
83
|
-
"--with-http_stub_status_module"
|
84
|
+
"--with-http_stub_status_module " <<
|
85
|
+
"--with-http_ssl_module"
|
84
86
|
end
|
85
87
|
|
86
88
|
SharedConstants.constants.each do |name|
|
@@ -22,6 +22,7 @@
|
|
22
22
|
# THE SOFTWARE.
|
23
23
|
|
24
24
|
require 'rbconfig'
|
25
|
+
require 'etc'
|
25
26
|
require 'phusion_passenger/platform_info'
|
26
27
|
require 'phusion_passenger/platform_info/operating_system'
|
27
28
|
|
@@ -323,6 +324,29 @@ module PlatformInfo
|
|
323
324
|
return "sudo"
|
324
325
|
end
|
325
326
|
end
|
327
|
+
|
328
|
+
# Returns a `sudo` or `rvmsudo` command that spawns a shell, depending
|
329
|
+
# on whether the current Ruby interpreter is managed by RVM.
|
330
|
+
def self.ruby_sudo_shell_command(args = nil)
|
331
|
+
if in_rvm?
|
332
|
+
shell = ENV['SHELL'].to_s
|
333
|
+
if shell.empty?
|
334
|
+
begin
|
335
|
+
user = Etc.getpwuid(0)
|
336
|
+
rescue ArgumentError
|
337
|
+
user = nil
|
338
|
+
end
|
339
|
+
shell = user.shell if user
|
340
|
+
shell = "bash" if !shell || shell.empty?
|
341
|
+
end
|
342
|
+
result = "rvmsudo "
|
343
|
+
result << "#{args} " if args
|
344
|
+
result << shell
|
345
|
+
return result
|
346
|
+
else
|
347
|
+
return "sudo -s #{args}".strip
|
348
|
+
end
|
349
|
+
end
|
326
350
|
|
327
351
|
# Locates a Ruby tool command, e.g. 'gem', 'rake', 'bundle', etc. Instead of
|
328
352
|
# naively looking in $PATH, this function uses a variety of search heuristics
|
@@ -25,7 +25,6 @@ require 'phusion_passenger/utils/file_system_watcher'
|
|
25
25
|
module PhusionPassenger
|
26
26
|
module Standalone
|
27
27
|
|
28
|
-
# Security note: can run arbitrary ruby code by evaluating passenger.conf
|
29
28
|
class AppFinder
|
30
29
|
attr_accessor :dirs
|
31
30
|
attr_reader :apps
|
@@ -34,42 +33,44 @@ class AppFinder
|
|
34
33
|
return File.exist?("#{dir}/config.ru") ||
|
35
34
|
File.exist?("#{dir}/config/environment.rb") ||
|
36
35
|
File.exist?("#{dir}/passenger_wsgi.py") ||
|
37
|
-
File.exist?("#{dir}/
|
36
|
+
File.exist?("#{dir}/app.js") ||
|
37
|
+
File.exist?("#{dir}/.meteor")
|
38
38
|
end
|
39
39
|
|
40
40
|
def initialize(dirs, options = {})
|
41
41
|
@dirs = dirs
|
42
|
-
@options = options
|
42
|
+
@options = options.dup
|
43
|
+
end
|
44
|
+
|
45
|
+
def global_options
|
46
|
+
return @options
|
43
47
|
end
|
44
48
|
|
45
49
|
def scan
|
46
50
|
apps = []
|
47
51
|
watchlist = []
|
48
52
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
61
|
-
apps.map! do |app|
|
62
|
-
config_filename = File.join(app[:root], "passenger.conf")
|
53
|
+
if single_mode?
|
54
|
+
app_root = find_app_root
|
55
|
+
apps << {
|
56
|
+
:server_names => ["_"],
|
57
|
+
:root => app_root
|
58
|
+
}
|
59
|
+
watchlist << app_root
|
60
|
+
watchlist << "#{app_root}/config" if File.exist?("#{app_root}/config")
|
61
|
+
watchlist << "#{app_root}/passenger-standalone.json" if File.exist?("#{app_root}/passenger-standalone.json")
|
62
|
+
|
63
|
+
config_filename = File.join(app_root, "passenger-standalone.json")
|
63
64
|
if File.exist?(config_filename)
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
65
|
+
global_options = load_config_file!(:global_config, config_filename)
|
66
|
+
@options.merge!(global_options)
|
67
|
+
end
|
68
|
+
|
69
|
+
apps.map! do |app|
|
69
70
|
@options.merge(app)
|
70
71
|
end
|
71
72
|
end
|
72
|
-
|
73
|
+
|
73
74
|
@apps = apps
|
74
75
|
@watchlist = watchlist
|
75
76
|
return apps
|
@@ -112,10 +113,21 @@ class AppFinder
|
|
112
113
|
ensure
|
113
114
|
watcher.close if watcher
|
114
115
|
end
|
116
|
+
|
117
|
+
def single_mode?
|
118
|
+
return true
|
119
|
+
end
|
120
|
+
|
121
|
+
def multi_mode?
|
122
|
+
return !single_mode?
|
123
|
+
end
|
115
124
|
|
116
125
|
##################
|
117
126
|
|
118
127
|
private
|
128
|
+
class ConfigLoadError < StandardError
|
129
|
+
end
|
130
|
+
|
119
131
|
def find_app_root
|
120
132
|
if @dirs.empty?
|
121
133
|
return File.expand_path(".")
|
@@ -124,9 +136,37 @@ private
|
|
124
136
|
end
|
125
137
|
end
|
126
138
|
|
139
|
+
def load_config_file!(context, filename)
|
140
|
+
require 'phusion_passenger/utils/json' if !defined?(PhusionPassenger::Utils::JSON)
|
141
|
+
begin
|
142
|
+
data = File.open(filename, "r:utf-8") do |f|
|
143
|
+
f.read
|
144
|
+
end
|
145
|
+
rescue SystemCallError => e
|
146
|
+
raise ConfigLoadError, "cannot load config file #{filename} (#{e})"
|
147
|
+
end
|
148
|
+
|
149
|
+
begin
|
150
|
+
config = PhusionPassenger::Utils::JSON.parse(data)
|
151
|
+
rescue => e
|
152
|
+
raise ConfigLoadError, "cannot parse config file #{filename} (#{e})"
|
153
|
+
end
|
154
|
+
if !config.is_a?(Hash)
|
155
|
+
raise ConfigLoadError, "cannot parse config file #{filename} (it does not contain an object)"
|
156
|
+
end
|
157
|
+
|
158
|
+
result = {}
|
159
|
+
config.each_pair do |key, val|
|
160
|
+
result[key.to_sym] = val
|
161
|
+
end
|
162
|
+
return result
|
163
|
+
end
|
164
|
+
|
127
165
|
def load_config_file(context, filename)
|
128
|
-
|
129
|
-
|
166
|
+
return load_config_file!(context, filename)
|
167
|
+
rescue ConfigLoadError => e
|
168
|
+
STDERR.puts "*** Warning: #{e.message}"
|
169
|
+
return {}
|
130
170
|
end
|
131
171
|
|
132
172
|
def looks_like_app_directory?(dir)
|
@@ -32,7 +32,7 @@ class Command
|
|
32
32
|
DEFAULT_OPTIONS = {
|
33
33
|
:address => '0.0.0.0',
|
34
34
|
:port => 3000,
|
35
|
-
:
|
35
|
+
:environment => ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development',
|
36
36
|
:max_pool_size => 6,
|
37
37
|
:min_instances => 1,
|
38
38
|
:spawn_method => Kernel.respond_to?(:fork) ? 'smart' : 'direct',
|
@@ -58,10 +58,11 @@ class StartCommand < Command
|
|
58
58
|
@options[:nginx_version])
|
59
59
|
ensure_runtime_installed
|
60
60
|
exit if @options[:runtime_check_only]
|
61
|
-
determine_various_resource_locations
|
62
61
|
require_app_finder
|
63
62
|
@app_finder = AppFinder.new(@args, @options)
|
64
63
|
@apps = @app_finder.scan
|
64
|
+
@options = @app_finder.global_options
|
65
|
+
determine_various_resource_locations
|
65
66
|
@plugin.call_hook(:found_apps, @apps)
|
66
67
|
|
67
68
|
extra_controller_options = {}
|
@@ -141,8 +142,8 @@ private
|
|
141
142
|
|
142
143
|
opts.separator ""
|
143
144
|
opts.on("-e", "--environment ENV", String,
|
144
|
-
wrap_desc("Framework environment (default: #{@options[:
|
145
|
-
@options[:
|
145
|
+
wrap_desc("Framework environment (default: #{@options[:environment]})")) do |value|
|
146
|
+
@options[:environment] = value
|
146
147
|
end
|
147
148
|
opts.on("-R", "--rackup FILE", String,
|
148
149
|
wrap_desc("If Rack application detected, run this rackup file")) do |value|
|
@@ -486,7 +487,7 @@ private
|
|
486
487
|
puts "=============== Phusion Passenger Standalone web server started ==============="
|
487
488
|
puts "PID file: #{@options[:pid_file]}"
|
488
489
|
puts "Log file: #{@options[:log_file]}"
|
489
|
-
puts "Environment: #{@options[:
|
490
|
+
puts "Environment: #{@options[:environment]}"
|
490
491
|
puts "Accessible via: #{listen_url}"
|
491
492
|
|
492
493
|
puts
|
@@ -563,7 +564,7 @@ private
|
|
563
564
|
def watch_log_files_in_background
|
564
565
|
@apps.each do |app|
|
565
566
|
thread = Thread.new do
|
566
|
-
watch_log_file("#{app[:root]}/log/#{@options[:
|
567
|
+
watch_log_file("#{app[:root]}/log/#{@options[:environment]}.log")
|
567
568
|
end
|
568
569
|
@threads << thread
|
569
570
|
@interruptable_threads << thread
|
@@ -7,4 +7,7 @@ This installer must be able to write to the following directory:
|
|
7
7
|
But it can't do that, because you're running the installer as <b><%= `whoami`.strip %></b>.
|
8
8
|
Please re-run this installer using <%= @sudo %>:
|
9
9
|
|
10
|
-
<b
|
10
|
+
<b>export ORIG_PATH="$PATH"
|
11
|
+
<%= @sudo_s_e %>
|
12
|
+
export PATH="$ORIG_PATH"
|
13
|
+
<%= @ruby %> <%= @installer %></b>
|
@@ -92,7 +92,7 @@ http {
|
|
92
92
|
root '<%= app[:root] %>/public';
|
93
93
|
passenger_app_root '<%= app[:root] %>';
|
94
94
|
passenger_enabled on;
|
95
|
-
|
95
|
+
passenger_app_env <%= app[:environment] %>;
|
96
96
|
passenger_spawn_method <%= app[:spawn_method] %>;
|
97
97
|
<% if app[:concurrency_model] != DEFAULT_CONCURRENCY_MODEL %>passenger_concurrency_model <%= app[:concurrency_model] %>;<% end %>
|
98
98
|
<% if app[:thread_count] != DEFAULT_THREAD_COUNT %>passenger_thread_count <%= app[:thread_count] %>;<% end %>
|
@@ -1704,6 +1704,24 @@ namespace tut {
|
|
1704
1704
|
);
|
1705
1705
|
}
|
1706
1706
|
|
1707
|
+
TEST_METHOD(78) {
|
1708
|
+
// Test restarting while a previous restart was already being finalized.
|
1709
|
+
// The previous finalization should abort.
|
1710
|
+
Options options = createOptions();
|
1711
|
+
initPoolDebugging();
|
1712
|
+
debug->spawning = false;
|
1713
|
+
pool->get(options, &ticket);
|
1714
|
+
|
1715
|
+
ensure_equals(pool->restartSuperGroupsByAppRoot(options.appRoot), 1u);
|
1716
|
+
debug->debugger->recv("About to end restarting");
|
1717
|
+
ensure_equals(pool->restartSuperGroupsByAppRoot(options.appRoot), 1u);
|
1718
|
+
debug->debugger->recv("About to end restarting");
|
1719
|
+
debug->messages->send("Finish restarting");
|
1720
|
+
debug->messages->send("Finish restarting");
|
1721
|
+
debug->debugger->recv("Restarting done");
|
1722
|
+
debug->debugger->recv("Restarting aborted");
|
1723
|
+
}
|
1724
|
+
|
1707
1725
|
// TODO: Persistent connections.
|
1708
1726
|
// TODO: If one closes the session before it has reached EOF, and process's maximum concurrency
|
1709
1727
|
// has already been reached, then the pool should ping the process so that it can detect
|
metadata
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: passenger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.24
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Phusion - http://www.phusion.nl/
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
12
|
+
date: 2013-11-14 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: rake
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
19
|
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
@@ -20,6 +22,7 @@ dependencies:
|
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
27
|
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
@@ -27,6 +30,7 @@ dependencies:
|
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: daemon_controller
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
35
|
- - ! '>='
|
32
36
|
- !ruby/object:Gem::Version
|
@@ -34,6 +38,7 @@ dependencies:
|
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
43
|
- - ! '>='
|
39
44
|
- !ruby/object:Gem::Version
|
@@ -41,6 +46,7 @@ dependencies:
|
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: rack
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
51
|
- - ! '>='
|
46
52
|
- !ruby/object:Gem::Version
|
@@ -48,6 +54,7 @@ dependencies:
|
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
59
|
- - ! '>='
|
53
60
|
- !ruby/object:Gem::Version
|
@@ -3010,26 +3017,27 @@ files:
|
|
3010
3017
|
- test/stub/wsgi/tmp/.gitignore
|
3011
3018
|
homepage: https://www.phusionpassenger.com/
|
3012
3019
|
licenses: []
|
3013
|
-
metadata: {}
|
3014
3020
|
post_install_message:
|
3015
3021
|
rdoc_options: []
|
3016
3022
|
require_paths:
|
3017
3023
|
- lib
|
3018
3024
|
required_ruby_version: !ruby/object:Gem::Requirement
|
3025
|
+
none: false
|
3019
3026
|
requirements:
|
3020
3027
|
- - ! '>='
|
3021
3028
|
- !ruby/object:Gem::Version
|
3022
3029
|
version: '0'
|
3023
3030
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
3031
|
+
none: false
|
3024
3032
|
requirements:
|
3025
3033
|
- - ! '>='
|
3026
3034
|
- !ruby/object:Gem::Version
|
3027
3035
|
version: '0'
|
3028
3036
|
requirements: []
|
3029
3037
|
rubyforge_project: passenger
|
3030
|
-
rubygems_version:
|
3038
|
+
rubygems_version: 1.8.23
|
3031
3039
|
signing_key:
|
3032
|
-
specification_version:
|
3040
|
+
specification_version: 3
|
3033
3041
|
summary: A fast and robust web server and application server for Ruby, Python and
|
3034
3042
|
Node.js
|
3035
3043
|
test_files: []
|