passenger 5.0.0.beta3 → 5.0.0.rc1
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.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.editorconfig +11 -5
- data/CHANGELOG +38 -0
- data/CONTRIBUTING.md +1 -4
- data/Gemfile +0 -1
- data/Gemfile.lock +0 -2
- data/Rakefile +33 -33
- data/bin/passenger +1 -1
- data/bin/passenger-config +1 -1
- data/bin/passenger-install-apache2-module +800 -800
- data/bin/passenger-install-nginx-module +592 -592
- data/bin/passenger-memory-stats +127 -127
- data/bin/passenger-status +216 -216
- data/build/agents.rb +127 -127
- data/build/apache2.rb +87 -87
- data/build/basics.rb +60 -60
- data/build/common_library.rb +165 -165
- data/build/cplusplus_support.rb +51 -51
- data/build/cxx_tests.rb +268 -268
- data/build/debian.rb +143 -143
- data/build/documentation.rb +58 -58
- data/build/integration_tests.rb +81 -81
- data/build/misc.rb +132 -132
- data/build/nginx.rb +20 -20
- data/build/node_tests.rb +7 -7
- data/build/oxt_tests.rb +14 -14
- data/build/packaging.rb +570 -570
- data/build/preprocessor.rb +260 -260
- data/build/rake_extensions.rb +71 -71
- data/build/ruby_extension.rb +29 -29
- data/build/ruby_tests.rb +6 -6
- data/build/test_basics.rb +37 -37
- data/debian.template/control.template +3 -5
- data/dev/copy_boost_headers +134 -134
- data/dev/install_scripts_bootstrap_code.rb +25 -25
- data/dev/list_tests +20 -20
- data/dev/ruby_server.rb +223 -223
- data/dev/runner +18 -18
- data/doc/ServerOptimizationGuide.txt.md +55 -2
- data/doc/Users guide Nginx.txt +0 -26
- data/doc/Users guide Standalone.txt +5 -1
- data/doc/users_guide_snippets/tips.txt +9 -0
- data/ext/common/ApplicationPool2/Group.h +23 -11
- data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
- data/ext/common/ApplicationPool2/Pool.h +22 -17
- data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
- data/ext/common/ApplicationPool2/Spawner.h +1 -1
- data/ext/common/Constants.h +1 -1
- data/ext/common/agents/Base.cpp +35 -20
- data/ext/common/agents/HelperAgent/Main.cpp +8 -1
- data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
- data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
- data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
- data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
- data/ext/common/agents/Main.cpp +1 -1
- data/ext/common/agents/Watchdog/Main.cpp +54 -19
- data/ext/nginx/Configuration.c +7 -0
- data/ext/nginx/ContentHandler.c +9 -1
- data/helper-scripts/backtrace-sanitizer.rb +106 -87
- data/helper-scripts/crash-watch.rb +32 -0
- data/helper-scripts/download_binaries/extconf.rb +38 -38
- data/helper-scripts/meteor-loader.rb +107 -107
- data/helper-scripts/prespawn +101 -101
- data/helper-scripts/rack-loader.rb +96 -96
- data/helper-scripts/rack-preloader.rb +137 -137
- data/lib/phusion_passenger.rb +292 -292
- data/lib/phusion_passenger/abstract_installer.rb +438 -438
- data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
- data/lib/phusion_passenger/admin_tools.rb +20 -20
- data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
- data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
- data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
- data/lib/phusion_passenger/apache2/config_options.rb +182 -182
- data/lib/phusion_passenger/common_library.rb +479 -485
- data/lib/phusion_passenger/config/about_command.rb +161 -161
- data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
- data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
- data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
- data/lib/phusion_passenger/config/command.rb +25 -25
- data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
- data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
- data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
- data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
- data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
- data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
- data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
- data/lib/phusion_passenger/config/installation_utils.rb +204 -204
- data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
- data/lib/phusion_passenger/config/main.rb +152 -152
- data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
- data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
- data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
- data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
- data/lib/phusion_passenger/config/utils.rb +95 -95
- data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
- data/lib/phusion_passenger/console_text_template.rb +25 -25
- data/lib/phusion_passenger/constants.rb +90 -90
- data/lib/phusion_passenger/debug_logging.rb +106 -106
- data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
- data/lib/phusion_passenger/message_channel.rb +312 -312
- data/lib/phusion_passenger/message_client.rb +176 -176
- data/lib/phusion_passenger/native_support.rb +369 -369
- data/lib/phusion_passenger/nginx/config_options.rb +297 -297
- data/lib/phusion_passenger/packaging.rb +131 -131
- data/lib/phusion_passenger/platform_info.rb +360 -360
- data/lib/phusion_passenger/platform_info/apache.rb +767 -767
- data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
- data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
- data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
- data/lib/phusion_passenger/platform_info/curl.rb +32 -32
- data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
- data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
- data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
- data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
- data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
- data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
- data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
- data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
- data/lib/phusion_passenger/platform_info/linux.rb +55 -55
- data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
- data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
- data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
- data/lib/phusion_passenger/plugin.rb +66 -66
- data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
- data/lib/phusion_passenger/public_api.rb +191 -191
- data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
- data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
- data/lib/phusion_passenger/request_handler.rb +567 -577
- data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
- data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
- data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
- data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
- data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
- data/lib/phusion_passenger/standalone/command.rb +44 -40
- data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
- data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
- data/lib/phusion_passenger/standalone/main.rb +73 -73
- data/lib/phusion_passenger/standalone/start_command.rb +697 -685
- data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
- data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
- data/lib/phusion_passenger/standalone/status_command.rb +64 -64
- data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
- data/lib/phusion_passenger/standalone/version_command.rb +9 -9
- data/lib/phusion_passenger/union_station/connection.rb +32 -32
- data/lib/phusion_passenger/union_station/core.rb +251 -251
- data/lib/phusion_passenger/union_station/transaction.rb +126 -126
- data/lib/phusion_passenger/utils.rb +199 -167
- data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
- data/lib/phusion_passenger/utils/download.rb +196 -196
- data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
- data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
- data/lib/phusion_passenger/utils/lock.rb +31 -31
- data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
- data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
- data/lib/phusion_passenger/utils/shellwords.rb +20 -20
- data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
- data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
- data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
- data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
- data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
- data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
- data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
- data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
- data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
- data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
- data/passenger.gemspec +0 -1
- data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
- data/resources/templates/standalone/config.erb +19 -15
- data/test/integration_tests/apache2_tests.rb +566 -566
- data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
- data/test/integration_tests/native_packaging_spec.rb +296 -296
- data/test/integration_tests/nginx_tests.rb +393 -393
- data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
- data/test/integration_tests/source_packaging_test.rb +138 -138
- data/test/integration_tests/spec_helper.rb +5 -5
- data/test/integration_tests/standalone_tests.rb +367 -367
- data/test/ruby/debug_logging_spec.rb +133 -133
- data/test/ruby/message_channel_spec.rb +186 -186
- data/test/ruby/rack/loader_spec.rb +28 -28
- data/test/ruby/rack/preloader_spec.rb +34 -34
- data/test/ruby/rails3.0/loader_spec.rb +12 -12
- data/test/ruby/rails3.0/preloader_spec.rb +18 -18
- data/test/ruby/rails3.1/loader_spec.rb +12 -12
- data/test/ruby/rails3.1/preloader_spec.rb +18 -18
- data/test/ruby/rails3.2/loader_spec.rb +12 -12
- data/test/ruby/rails3.2/preloader_spec.rb +18 -18
- data/test/ruby/rails4.0/loader_spec.rb +12 -12
- data/test/ruby/rails4.0/preloader_spec.rb +18 -18
- data/test/ruby/rails4.1/loader_spec.rb +12 -12
- data/test/ruby/rails4.1/preloader_spec.rb +18 -18
- data/test/ruby/request_handler_spec.rb +730 -730
- data/test/ruby/shared/loader_sharedspec.rb +224 -224
- data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
- data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
- data/test/ruby/spec_helper.rb +65 -65
- data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
- data/test/ruby/union_station_spec.rb +276 -276
- data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
- data/test/ruby/utils/hosts_file_parser.rb +248 -248
- data/test/ruby/utils/tee_input_spec.rb +215 -215
- data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
- data/test/ruby/utils_spec.rb +21 -21
- data/test/stub/rack/config.ru +87 -87
- data/test/stub/rack/library.rb +8 -8
- data/test/stub/rack/start.rb +30 -30
- data/test/support/apache2_controller.rb +191 -191
- data/test/support/nginx_controller.rb +90 -99
- data/test/support/placebo-preloader.rb +57 -57
- data/test/support/test_helper.rb +435 -435
- metadata +11 -21
- metadata.gz.asc +7 -7
- data/lib/phusion_passenger/standalone/command2.rb +0 -292
- data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
- data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
- data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
- data/resources/templates/standalone/run_installer_as_root.txt.erb +0 -8
@@ -1,5 +1,6 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
# Phusion Passenger - https://www.phusionpassenger.com/
|
2
|
-
# Copyright (c) 2014 Phusion
|
3
|
+
# Copyright (c) 2014-2015 Phusion
|
3
4
|
#
|
4
5
|
# "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
5
6
|
#
|
@@ -25,160 +26,197 @@ require 'etc'
|
|
25
26
|
PhusionPassenger.require_passenger_lib 'constants'
|
26
27
|
PhusionPassenger.require_passenger_lib 'standalone/control_utils'
|
27
28
|
PhusionPassenger.require_passenger_lib 'utils/shellwords'
|
29
|
+
PhusionPassenger.require_passenger_lib 'utils/json'
|
28
30
|
|
29
31
|
module PhusionPassenger
|
30
|
-
module Standalone
|
31
|
-
class StartCommand
|
32
|
-
|
33
|
-
module BuiltinEngine
|
34
|
-
private
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
end
|
181
|
-
|
182
|
-
|
183
|
-
|
32
|
+
module Standalone
|
33
|
+
class StartCommand
|
34
|
+
|
35
|
+
module BuiltinEngine
|
36
|
+
private
|
37
|
+
def start_engine_real
|
38
|
+
Standalone::ControlUtils.require_daemon_controller
|
39
|
+
@engine = DaemonController.new(build_daemon_controller_options)
|
40
|
+
start_engine_no_create
|
41
|
+
end
|
42
|
+
|
43
|
+
def wait_until_engine_has_exited
|
44
|
+
lock = DaemonController::LockFile.new(read_watchdog_lock_file_path!)
|
45
|
+
lock.shared_lock do
|
46
|
+
# Do nothing
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def start_engine_no_create
|
52
|
+
begin
|
53
|
+
@engine.start
|
54
|
+
rescue DaemonController::AlreadyStarted
|
55
|
+
begin
|
56
|
+
pid = @engine.pid
|
57
|
+
rescue SystemCallError, IOError
|
58
|
+
pid = nil
|
59
|
+
end
|
60
|
+
if pid
|
61
|
+
abort "#{PROGRAM_NAME} Standalone is already running on PID #{pid}."
|
62
|
+
else
|
63
|
+
abort "#{PROGRAM_NAME} Standalone is already running."
|
64
|
+
end
|
65
|
+
rescue DaemonController::StartError => e
|
66
|
+
abort "Could not start the server engine:\n#{e}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def build_daemon_controller_options
|
71
|
+
if @options[:socket_file]
|
72
|
+
ping_spec = [:unix, @options[:socket_file]]
|
73
|
+
else
|
74
|
+
ping_spec = [:tcp, @options[:address], @options[:port]]
|
75
|
+
end
|
76
|
+
|
77
|
+
command = ""
|
78
|
+
|
79
|
+
if !@options[:envvars].empty?
|
80
|
+
command = "env "
|
81
|
+
@options[:envvars].each_pair do |name, value|
|
82
|
+
command << "#{Shellwords.escape name}=#{Shellwords.escape value} "
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
command << "#{@agent_exe} watchdog";
|
87
|
+
command << " --passenger-root #{Shellwords.escape PhusionPassenger.install_spec}"
|
88
|
+
command << " --daemonize"
|
89
|
+
command << " --no-user-switching"
|
90
|
+
command << " --no-delete-pid-file"
|
91
|
+
command << " --cleanup-pidfile #{Shellwords.escape @working_dir}/temp_dir_toucher.pid"
|
92
|
+
if should_wait_until_engine_has_exited?
|
93
|
+
command << " --report-file #{Shellwords.escape @working_dir}/report.json"
|
94
|
+
end
|
95
|
+
add_param(command, :user, "--user")
|
96
|
+
add_param(command, :log_file, "--log-file")
|
97
|
+
add_param(command, :pid_file, "--pid-file")
|
98
|
+
add_param(command, :instance_registry_dir, "--instance-registry-dir")
|
99
|
+
add_param(command, :data_buffer_dir, "--data-buffer-dir")
|
100
|
+
add_param(command, :log_level, "--log-level")
|
101
|
+
@options[:ctls].each do |ctl|
|
102
|
+
command << " --ctl #{Shellwords.escape ctl}"
|
103
|
+
end
|
104
|
+
if @options[:user]
|
105
|
+
command << " --default-user #{Shellwords.escape @options[:user]}"
|
106
|
+
else
|
107
|
+
user = Etc.getpwuid(Process.uid).name
|
108
|
+
begin
|
109
|
+
group = Etc.getgrgid(Process.gid)
|
110
|
+
rescue ArgumentError
|
111
|
+
# Do nothing. On Heroku, it's normal that the group
|
112
|
+
# database is broken.
|
113
|
+
else
|
114
|
+
command << " --default-group #{Shellwords.escape group.name}"
|
115
|
+
end
|
116
|
+
command << " --default-user #{Shellwords.escape user}"
|
117
|
+
end
|
118
|
+
|
119
|
+
command << " --BS"
|
120
|
+
command << " --listen #{listen_address}"
|
121
|
+
command << " --no-graceful-exit"
|
122
|
+
add_param(command, :environment, "--environment")
|
123
|
+
add_param(command, :app_type, "--app-type")
|
124
|
+
add_param(command, :startup_file, "--startup-file")
|
125
|
+
add_param(command, :spawn_method, "--spawn-method")
|
126
|
+
add_param(command, :restart_dir, "--restart-dir")
|
127
|
+
if @options.has_key?(:friendly_error_pages)
|
128
|
+
if @options[:friendly_error_pages]
|
129
|
+
command << " --force-friendly-error-pages"
|
130
|
+
else
|
131
|
+
command << " --disable-friendly-error-pages"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
if @options[:turbocaching] == false
|
135
|
+
command << " --disable-turbocaching"
|
136
|
+
end
|
137
|
+
add_flag_param(command, :load_shell_envvars, "--load-shell-envvars")
|
138
|
+
add_param(command, :max_pool_size, "--max-pool-size")
|
139
|
+
add_param(command, :min_instances, "--min-instances")
|
140
|
+
add_enterprise_param(command, :concurrency_model, "--concurrency-model")
|
141
|
+
add_enterprise_param(command, :thread_count, "--app-thread-count")
|
142
|
+
add_enterprise_flag_param(command, :rolling_restarts, "--rolling-restarts")
|
143
|
+
add_enterprise_flag_param(command, :resist_deployment_errors, "--resist-deployment-errors")
|
144
|
+
add_enterprise_flag_param(command, :debugger, "--debugger")
|
145
|
+
add_flag_param(command, :sticky_sessions, "--sticky-sessions")
|
146
|
+
add_param(command, :vary_turbocache_by_cookie, "--vary-turbocache-by-cookie")
|
147
|
+
add_param(command, :sticky_sessions_cookie_name, "--sticky-sessions-cookie-name")
|
148
|
+
add_param(command, :union_station_gateway_address, "--union-station-gateway-address")
|
149
|
+
add_param(command, :union_station_gateway_port, "--union-station-gateway-port")
|
150
|
+
add_param(command, :union_station_key, "--union-station-key")
|
151
|
+
|
152
|
+
command << " #{Shellwords.escape(@apps[0][:root])}"
|
153
|
+
|
154
|
+
return {
|
155
|
+
:identifier => "#{AGENT_EXE} watchdog",
|
156
|
+
:start_command => command,
|
157
|
+
:ping_command => ping_spec,
|
158
|
+
:pid_file => @options[:pid_file],
|
159
|
+
:log_file => @options[:log_file],
|
160
|
+
:timeout => 25
|
161
|
+
}
|
162
|
+
end
|
163
|
+
|
164
|
+
def listen_address(options = @options, for_ping_port = false)
|
165
|
+
if options[:socket_file]
|
166
|
+
return "unix:" + File.absolute_path_no_resolve(options[:socket_file])
|
167
|
+
else
|
168
|
+
return "tcp://" + compose_ip_and_port(options[:address], options[:port])
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def add_param(command, option_name, param_name)
|
173
|
+
if value = @options[option_name]
|
174
|
+
command << " #{param_name} #{Shellwords.escape value.to_s}"
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def add_flag_param(command, option_name, param_name)
|
179
|
+
if value = @options[option_name]
|
180
|
+
command << " #{param_name}"
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def add_enterprise_param(command, option_name, param_name)
|
185
|
+
if value = @options[option_name]
|
186
|
+
abort "The '#{option_name}' feature is only available in #{PROGRAM_NAME} " +
|
187
|
+
"Enterprise. You are currently running the open source #{PROGRAM_NAME}. " +
|
188
|
+
"Please learn more about and/or buy #{PROGRAM_NAME} Enterprise at " +
|
189
|
+
"https://www.phusionpassenger.com/enterprise"
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def add_enterprise_flag_param(command, option_name, param_name)
|
194
|
+
if value = @options[option_name]
|
195
|
+
abort "The '#{option_name}' feature is only available in #{PROGRAM_NAME} " +
|
196
|
+
"Enterprise. You are currently running the open source #{PROGRAM_NAME}. " +
|
197
|
+
"Please learn more about and/or buy #{PROGRAM_NAME} Enterprise at " +
|
198
|
+
"https://www.phusionpassenger.com/enterprise"
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
def report_file_path
|
203
|
+
@report_file_path ||= "#{@working_dir}/report.json"
|
204
|
+
end
|
205
|
+
|
206
|
+
def read_watchdog_lock_file_path!
|
207
|
+
@watchdog_lock_file_path ||= begin
|
208
|
+
report = File.open(report_file_path, "r:utf-8") do |f|
|
209
|
+
Utils::JSON.parse(f.read)
|
210
|
+
end
|
211
|
+
# The report file may contain sensitive information, so delete it.
|
212
|
+
File.unlink(report_file_path)
|
213
|
+
report["instance_dir"] + "/lock"
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
#####################
|
218
|
+
end # module BuiltinEngine
|
219
|
+
|
220
|
+
end # module StartCommand
|
221
|
+
end # module Standalone
|
184
222
|
end # module PhusionPassenger
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Phusion Passenger - https://www.phusionpassenger.com/
|
2
|
-
# Copyright (c) 2010-
|
2
|
+
# Copyright (c) 2010-2015 Phusion
|
3
3
|
#
|
4
4
|
# "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
5
5
|
#
|
@@ -30,136 +30,165 @@ PhusionPassenger.require_passenger_lib 'utils/tmpio'
|
|
30
30
|
PhusionPassenger.require_passenger_lib 'utils/shellwords'
|
31
31
|
|
32
32
|
module PhusionPassenger
|
33
|
-
module Standalone
|
34
|
-
class StartCommand
|
35
|
-
|
36
|
-
module NginxEngine
|
37
|
-
private
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
end
|
162
|
-
|
163
|
-
|
164
|
-
|
33
|
+
module Standalone
|
34
|
+
class StartCommand
|
35
|
+
|
36
|
+
module NginxEngine
|
37
|
+
private
|
38
|
+
def start_engine_real
|
39
|
+
Standalone::ControlUtils.require_daemon_controller
|
40
|
+
@engine = DaemonController.new(build_daemon_controller_options)
|
41
|
+
write_nginx_config_file(nginx_config_path)
|
42
|
+
|
43
|
+
begin
|
44
|
+
@engine.start
|
45
|
+
rescue DaemonController::AlreadyStarted
|
46
|
+
begin
|
47
|
+
pid = @engine.pid
|
48
|
+
rescue SystemCallError, IOError
|
49
|
+
pid = nil
|
50
|
+
end
|
51
|
+
if pid
|
52
|
+
abort "#{PROGRAM_NAME} Standalone is already running on PID #{pid}."
|
53
|
+
else
|
54
|
+
abort "#{PROGRAM_NAME} Standalone is already running."
|
55
|
+
end
|
56
|
+
rescue DaemonController::StartError => e
|
57
|
+
abort "Could not start the Nginx engine:\n#{e}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def wait_until_engine_has_exited
|
62
|
+
# Since the engine is not our child process (it daemonizes)
|
63
|
+
# we cannot use Process.waitpid to wait for it. A busy-sleep-loop with
|
64
|
+
# Process.kill(0, pid) isn't very efficient. Instead we do this:
|
65
|
+
#
|
66
|
+
# Connect to the engine's server and wait until it disconnects the socket
|
67
|
+
# because of timeout. Keep doing this until we can no longer connect.
|
68
|
+
while true
|
69
|
+
if @options[:socket_file]
|
70
|
+
socket = UNIXSocket.new(@options[:socket_file])
|
71
|
+
else
|
72
|
+
socket = TCPSocket.new(@options[:address], @options[:port])
|
73
|
+
end
|
74
|
+
begin
|
75
|
+
begin
|
76
|
+
socket.read
|
77
|
+
rescue SystemCallError, IOError, SocketError
|
78
|
+
end
|
79
|
+
ensure
|
80
|
+
begin
|
81
|
+
socket.close
|
82
|
+
rescue SystemCallError, IOError, SocketError
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
rescue Errno::ECONNREFUSED, Errno::ECONNRESET
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
def build_daemon_controller_options
|
91
|
+
if @options[:socket_file]
|
92
|
+
ping_spec = [:unix, @options[:socket_file]]
|
93
|
+
else
|
94
|
+
ping_spec = [:tcp, @options[:address], @options[:port]]
|
95
|
+
end
|
96
|
+
return {
|
97
|
+
:identifier => 'Nginx',
|
98
|
+
:start_command => "#{@nginx_binary} " +
|
99
|
+
"-c #{Shellwords.escape nginx_config_path} " +
|
100
|
+
"-p #{Shellwords.escape @working_dir}",
|
101
|
+
:ping_command => ping_spec,
|
102
|
+
:pid_file => @options[:pid_file],
|
103
|
+
:log_file => @options[:log_file],
|
104
|
+
:timeout => 25
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
def nginx_config_path
|
109
|
+
return "#{@working_dir}/nginx.conf"
|
110
|
+
end
|
111
|
+
|
112
|
+
def write_nginx_config_file(path)
|
113
|
+
File.open(path, 'w') do |f|
|
114
|
+
f.chmod(0644)
|
115
|
+
erb = ERB.new(File.read(nginx_config_template_filename), nil, "-")
|
116
|
+
erb.filename = nginx_config_template_filename
|
117
|
+
current_user = Etc.getpwuid(Process.uid).name
|
118
|
+
|
119
|
+
# The template requires some helper methods which are defined in start_command.rb.
|
120
|
+
output = erb.result(binding)
|
121
|
+
f.write(output)
|
122
|
+
puts output if debugging?
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def nginx_config_template_filename
|
127
|
+
if @options[:nginx_config_template]
|
128
|
+
return @options[:nginx_config_template]
|
129
|
+
else
|
130
|
+
return File.join(PhusionPassenger.resources_dir,
|
131
|
+
"templates", "standalone", "config.erb")
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def debugging?
|
136
|
+
return ENV['PASSENGER_DEBUG'] && !ENV['PASSENGER_DEBUG'].empty?
|
137
|
+
end
|
138
|
+
|
139
|
+
#### Config file template helpers ####
|
140
|
+
|
141
|
+
def nginx_listen_address(options = @options)
|
142
|
+
if options[:socket_file]
|
143
|
+
return "unix:" + File.absolute_path_no_resolve(options[:socket_file])
|
144
|
+
else
|
145
|
+
return compose_ip_and_port(options[:address], options[:port])
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def nginx_listen_address_with_ssl_port(options = @options)
|
150
|
+
if options[:socket_file]
|
151
|
+
return "unix:" + File.absolute_path_no_resolve(options[:socket_file])
|
152
|
+
else
|
153
|
+
return compose_ip_and_port(options[:address], options[:ssl_port])
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def default_group_for(username)
|
158
|
+
user = Etc.getpwnam(username)
|
159
|
+
group = Etc.getgrgid(user.gid)
|
160
|
+
return group.name
|
161
|
+
end
|
162
|
+
|
163
|
+
def nginx_option(nginx_config_name, option_name)
|
164
|
+
if @options[option_name]
|
165
|
+
return "#{nginx_config_name} #{@options[option_name]};"
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def default_group_for(username)
|
170
|
+
user = Etc.getpwnam(username)
|
171
|
+
group = Etc.getgrgid(user.gid)
|
172
|
+
return group.name
|
173
|
+
end
|
174
|
+
|
175
|
+
def boolean_config_value(val)
|
176
|
+
return val ? "on" : "off"
|
177
|
+
end
|
178
|
+
|
179
|
+
def serialize_strset(*items)
|
180
|
+
if "".respond_to?(:force_encoding)
|
181
|
+
items = items.map { |x| x.force_encoding('binary') }
|
182
|
+
null = "\0".force_encoding('binary')
|
183
|
+
else
|
184
|
+
null = "\0"
|
185
|
+
end
|
186
|
+
return [items.join(null)].pack('m*').gsub("\n", "").strip
|
187
|
+
end
|
188
|
+
|
189
|
+
#####################
|
190
|
+
end # module NginxEngine
|
191
|
+
|
192
|
+
end # module StartCommand
|
193
|
+
end # module Standalone
|
165
194
|
end # module PhusionPassenger
|