passenger 6.0.12 → 6.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +37 -1
  3. data/bin/passenger-install-nginx-module +1 -1
  4. data/dev/copy_boost_headers +30 -15
  5. data/resources/mime.types +1 -0
  6. data/resources/templates/standalone/server.erb +1 -0
  7. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +1 -0
  8. data/src/agent/Core/ApplicationPool/Options.h +5 -0
  9. data/src/agent/Core/Config.h +1 -1
  10. data/src/agent/Core/Controller/Config.h +5 -2
  11. data/src/agent/Core/Controller/InitRequest.cpp +2 -0
  12. data/src/agent/Core/OptionParser.h +4 -0
  13. data/src/agent/Core/SpawningKit/Config/AutoGeneratedCode.h +7 -0
  14. data/src/agent/Core/SpawningKit/Config.h +13 -0
  15. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +4 -0
  16. data/src/agent/Core/SpawningKit/Spawner.h +1 -0
  17. data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +4 -0
  18. data/src/agent/Watchdog/Config.h +1 -1
  19. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +5 -0
  20. data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp +5 -0
  21. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +18 -0
  22. data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp +3 -0
  23. data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp +3 -0
  24. data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp +11 -0
  25. data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp +7 -0
  26. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +17 -0
  27. data/src/apache2_module/Hooks.cpp +1 -0
  28. data/src/cxx_supportlib/Constants.h +1 -1
  29. data/src/cxx_supportlib/vendor-modified/boost/align/align.hpp +19 -0
  30. data/src/cxx_supportlib/vendor-modified/boost/align/alignment_of.hpp +54 -0
  31. data/src/cxx_supportlib/vendor-modified/boost/align/alignment_of_forward.hpp +20 -0
  32. data/src/cxx_supportlib/vendor-modified/boost/align/detail/align_cxx11.hpp +21 -0
  33. data/src/cxx_supportlib/vendor-modified/boost/align/detail/aligned_alloc.hpp +52 -0
  34. data/src/cxx_supportlib/vendor-modified/boost/align/detail/alignment_of.hpp +31 -0
  35. data/src/cxx_supportlib/vendor-modified/boost/align/detail/alignment_of_cxx11.hpp +23 -0
  36. data/src/cxx_supportlib/vendor-modified/boost/align/detail/element_type.hpp +91 -0
  37. data/src/cxx_supportlib/vendor-modified/boost/align/detail/integral_constant.hpp +53 -0
  38. data/src/cxx_supportlib/vendor-modified/boost/align/detail/min_size.hpp +26 -0
  39. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +8 -0
  40. data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c +6 -0
  41. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +12 -0
  42. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +5 -0
  43. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +18 -0
  44. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +13 -0
  45. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +3 -0
  46. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +4 -0
  47. data/src/nginx_module/ngx_http_passenger_module.c +1 -0
  48. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/common.js +50 -29
  49. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/config/cli-config.js +20 -20
  50. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/config/npm-config.js +11 -11
  51. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/config/syslog-config.js +3 -3
  52. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/config.js +8 -2
  53. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/container.js +2 -1
  54. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/logger.js +174 -146
  55. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/console.js +4 -2
  56. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/file.js +15 -5
  57. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/http.js +14 -4
  58. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports.js +26 -24
  59. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston.js +5 -5
  60. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/async/package.json +4 -13
  61. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/colors/package.json +19 -33
  62. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/cycle/package.json +11 -29
  63. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/eyes/package.json +12 -40
  64. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/isstream/package.json +3 -12
  65. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/stack-trace/lib/stack-trace.js +49 -24
  66. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/stack-trace/package.json +4 -16
  67. data/src/nodejs_supportlib/vendor-copy/winston/package.json +11 -55
  68. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +6 -0
  69. data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +6 -0
  70. data/src/ruby_supportlib/phusion_passenger/platform_info/linux.rb +2 -1
  71. data/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb +18 -18
  72. data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +7 -1
  73. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +1 -0
  74. data/src/ruby_supportlib/phusion_passenger.rb +5 -5
  75. metadata +12 -7
  76. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/daily-rotate-file.js +0 -601
  77. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/webhook.js +0 -146
  78. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/pkginfo/LICENSE +0 -19
  79. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/pkginfo/lib/pkginfo.js +0 -136
  80. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/pkginfo/package.json +0 -56
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 536d56479491f031585ad9f7a050a49978a965be
4
- data.tar.gz: 2074da45c50faf1754c190f448c8fd89bd1e0bfe
3
+ metadata.gz: 24a18af9e7b3ec92ce88aa64fd7d62242691972a
4
+ data.tar.gz: b3b72d0daa134635ea11f3cab5745f7a491dd102
5
5
  SHA512:
6
- metadata.gz: a9c3b77e7ccf78b9018135ac0501a864c3bb2f695df9c5d3aa8510aa75fc04440ed4aaf6c9db3876fa8512965436ac5e3959dadb0905f4ca375f5830dd8c0091
7
- data.tar.gz: 5e64ae1f36a459ab8661849c2c48af6fabe5a91ccb88485ecde138323686393557dde2399bfee4c2aa45e121e5cf12bb9c6f59b09e774d393b20db7803b8411c
6
+ metadata.gz: 42bd44f99c71b20f121f91197ae7e407993fef8a15935659907f98399d10deb5c97dac9acb8f9cb253cb42b1304a140769a67c08a22e7f9fe1cda5e9cb06e3f0
7
+ data.tar.gz: 923ab59ac46d2d6f96f265fa79628a8f68186c2e8055bbb451cbcf9f593f5f58cb1cfaf1c4aef8950a8356a8c2b95a0821f957211ca5d003b262e33b1c813453
data/CHANGELOG CHANGED
@@ -1,4 +1,40 @@
1
- Release 6.0.12 (Not yet released)
1
+ Release 6.0.13 (Not yet released)
2
+ -------------
3
+ * Add WASM mime type, Closes GH-2398.
4
+ * Fix compilation on FreeBSD 13. Closes GH-2402.
5
+ * [Ruby] Fixes app process crash when ECONNRESET received.
6
+ * Fix automated fetching of pcre source for installer scripts.
7
+ * Bump preferred nginx 1.20.1 → 1.20.2.
8
+ * [Ruby] Add option to preload bundler. Closes GH-2409.
9
+
10
+ - Apache: PassengerPreloadBundler
11
+ - Nginx: passenger_preload_bundler
12
+ - Standalone: --preload_bundler
13
+
14
+ * [Node] Suppresses the winston circular dependency warning.
15
+ * [RPMs] EL8 RPMs are now built on Rocky linux, and should be compatible with Alma, Rocky, CentOS, and RHEL.
16
+ * Updated various library versions used in precompiled binaries (used for e.g. gem installs):
17
+
18
+ - ccache 4.4.2 → 4.6
19
+ - cmake 3.21.4 → 3.22.3
20
+ - curl 7.79.1 → 7.82.0
21
+ - git 2.33.1 → 2.35.1
22
+ - gnupg 2.3.3 → 2.3.4
23
+ - libgpg_error 1.42 → 1.44
24
+ - ntbtls 0.2.0 → 0.3.0
25
+ - openssl 1.1.1l → 1.1.1n
26
+ - rubygems 3.2.30 → 3.3.9
27
+ - zstd 1.5.0 → 1.5.2
28
+ - ruby
29
+ - dropped 2.4.10
30
+ - dropped 2.5.9
31
+ - 2.6.8 → 2.6.9
32
+ - 2.7.4 → 2.7.5
33
+ - 3.0.2 → 3.0.3
34
+ - added 3.1.1
35
+
36
+
37
+ Release 6.0.12
2
38
  -------------
3
39
  * [Debian] Fix compilation on 32 bit arm. Contributed by Antonio Terceiro.
4
40
  * [Debian] Add Bullseye Debian packages.
@@ -268,7 +268,7 @@ private
268
268
  new_screen
269
269
  puts "<banner>PCRE (required by Nginx) not installed, downloading it...</banner>"
270
270
 
271
- url = "https://ftp.pcre.org/pub/pcre/pcre-#{PREFERRED_PCRE_VERSION}.tar.gz"
271
+ url = "https://sourceforge.net/projects/pcre/files/pcre/#{PREFERRED_PCRE_VERSION}/pcre-#{PREFERRED_PCRE_VERSION}.tar.gz/download"
272
272
  dirname = "pcre-#{PREFERRED_PCRE_VERSION}"
273
273
  tarball = "#{@working_dir}/pcre.tar.gz"
274
274
 
@@ -102,16 +102,31 @@ PROGRAM_SOURCE = %q{
102
102
  #include <boost/date_time/posix_time/posix_time.hpp>
103
103
  #include <boost/foreach.hpp>
104
104
  #include <boost/unordered_map.hpp>
105
- #include <boost/cregex.hpp>
106
105
  #include <boost/regex.hpp>
107
106
  #include <boost/pool/object_pool.hpp>
108
107
  #include <boost/move/core.hpp>
109
108
  #include <boost/move/utility.hpp>
110
109
  #include <boost/atomic.hpp>
111
110
  #include <boost/typeof/typeof.hpp>
112
- #include <boost/asio.hpp>
113
- #include <boost/pointer_cast.hpp>
114
111
  #include <boost/circular_buffer.hpp>
112
+ #include <boost/config.hpp>
113
+ #include <boost/container/small_vector.hpp>
114
+ #include <boost/core/noncopyable.hpp>
115
+ #include <boost/cstdint.hpp>
116
+ #include <boost/current_function.hpp>
117
+ #include <boost/date_time/posix_time/posix_time_types.hpp>
118
+ #include <boost/move/move.hpp>
119
+ #include <boost/predef.h>
120
+ #include <boost/ref.hpp>
121
+ #include <boost/scoped_array.hpp>
122
+ #include <boost/scoped_ptr.hpp>
123
+ #include <boost/static_assert.hpp>
124
+ #include <boost/thread/mutex.hpp>
125
+ #include <boost/thread/tss.hpp>
126
+ // Included despite not used in Passenger
127
+ #include <boost/cregex.hpp>
128
+ #include <boost/pointer_cast.hpp>
129
+ #include <boost/asio.hpp>
115
130
  }
116
131
 
117
132
  require 'fileutils'
@@ -189,19 +204,19 @@ end
189
204
  def copy_dependencies(cflags)
190
205
  done = false
191
206
  while !done
192
- compiler_output = `c++ test.cpp -c -I. -I.. #{cflags} 2>&1`
207
+ compiler_output = `c++ test.cpp -c -I. -I.. #{cflags.join(" ")} 2>&1`
193
208
  File.unlink('test.o') if File.exist?('test.o')
194
209
  missing_headers = compiler_output.
195
- split("\n").
196
- grep(/(error: .*: No such file|fatal error: '.*' file not found)/).
197
- map do |line|
198
- if line =~ /error: (.*): No such file/
199
- file = $1
200
- elsif line =~ /fatal error: '(.*)' file not found/
201
- file = $1
202
- else
203
- abort "Bug"
204
- end
210
+ split("\n").
211
+ grep(/(error: .*: No such file|fatal error: '.*' file not found)/).
212
+ map do |line|
213
+ if line =~ /error: (.*): No such file/
214
+ file = $1
215
+ elsif line =~ /fatal error: '(.*)' file not found/
216
+ file = $1
217
+ else
218
+ abort "Bug"
219
+ end
205
220
  if file =~ /^boost\//
206
221
  file
207
222
  else
@@ -246,7 +261,7 @@ def start
246
261
  "-std=c++0x",
247
262
  "-std=gnu++0x",
248
263
  ""
249
- ].each do |flags|
264
+ ].product(["-m32","-m64",""]).each do |flags|
250
265
  copy_dependencies(flags)
251
266
  end
252
267
  ensure
data/resources/mime.types CHANGED
@@ -6,6 +6,7 @@ types {
6
6
  image/gif gif;
7
7
  image/jpeg jpeg jpg;
8
8
  application/x-javascript js;
9
+ application/wasm wasm;
9
10
  application/atom+xml atom;
10
11
  application/rss+xml rss;
11
12
  text/cache-manifest manifest appcache;
@@ -52,6 +52,7 @@ passenger_enabled on;
52
52
  <%= nginx_option(app, :vary_turbocache_by_cookie) %>
53
53
  <%= nginx_option(app, :meteor_app_settings) %>
54
54
  <%= nginx_option(app, :load_shell_envvars) %>
55
+ <%= nginx_option(app, :preload_bundler) %>
55
56
  <%= nginx_option(app, :app_file_descriptor_ulimit) %>
56
57
  <%= nginx_option(app, :friendly_error_pages) %>
57
58
  <%= nginx_option(app, :abort_websockets_on_process_shutdown) %>
@@ -255,6 +255,7 @@ Group::inspectConfigInAdminPanelFormat(Json::Value &result) const {
255
255
  result["user_switching"] = VAL(options.userSwitching); // TODO: default value depends on integration mode and euid
256
256
  result["file_descriptor_ulimit"] = VAL(options.fileDescriptorUlimit, 0u);
257
257
  result["load_shell_envvars"] = VAL(options.loadShellEnvvars); // TODO: default value depends on integration mode
258
+ result["preload_bundler"] = VAL(options.preloadBundler);
258
259
  result["max_request_queue_size"] = VAL(options.maxRequestQueueSize,
259
260
  (Json::UInt) DEFAULT_MAX_REQUEST_QUEUE_SIZE);
260
261
  result["max_requests"] = VAL((Json::UInt) options.maxRequests, 0u);
@@ -312,6 +312,10 @@ public:
312
312
  */
313
313
  bool loadShellEnvvars;
314
314
 
315
+ /** Whether to tell Ruby to load bundler during spawning.
316
+ */
317
+ bool preloadBundler;
318
+
315
319
  bool userSwitching;
316
320
 
317
321
  /**
@@ -460,6 +464,7 @@ public:
460
464
  forceMaxConcurrentRequestsPerProcess(-1),
461
465
  debugger(false),
462
466
  loadShellEnvvars(true),
467
+ preloadBundler(false),
463
468
  userSwitching(true),
464
469
  raiseInternalError(false),
465
470
 
@@ -164,7 +164,7 @@ using namespace std;
164
164
  * security_update_checker_interval unsigned integer - default(86400)
165
165
  * security_update_checker_proxy_url string - -
166
166
  * security_update_checker_url string - default("https://securitycheck.phusionpassenger.com/v1/check.json")
167
- * server_software string - default("Phusion_Passenger/6.0.12")
167
+ * server_software string - default("Phusion_Passenger/6.0.13")
168
168
  * show_version_in_header boolean - default(true)
169
169
  * single_app_mode_app_root string - default,read_only
170
170
  * single_app_mode_app_start_command string - read_only
@@ -115,7 +115,7 @@ parseControllerBenchmarkMode(const StaticString &mode) {
115
115
  * multi_app boolean - default(true),read_only
116
116
  * request_freelist_limit unsigned integer - default(1024)
117
117
  * response_buffer_high_watermark unsigned integer - default(134217728)
118
- * server_software string - default("Phusion_Passenger/6.0.12")
118
+ * server_software string - default("Phusion_Passenger/6.0.13")
119
119
  * show_version_in_header boolean - default(true)
120
120
  * start_reading_after_accept boolean - default(true)
121
121
  * stat_throttle_rate unsigned integer - default(10)
@@ -165,6 +165,7 @@ private:
165
165
  add("default_spawn_method", STRING_TYPE, OPTIONAL, DEFAULT_SPAWN_METHOD);
166
166
  add("default_bind_address", STRING_TYPE, OPTIONAL, DEFAULT_BIND_ADDRESS);
167
167
  add("default_load_shell_envvars", BOOL_TYPE, OPTIONAL, false);
168
+ add("default_preload_bundler", BOOL_TYPE, OPTIONAL, false);
168
169
  add("default_meteor_app_settings", STRING_TYPE, OPTIONAL);
169
170
  add("default_app_file_descriptor_ulimit", UINT_TYPE, OPTIONAL);
170
171
  add("default_min_instances", UINT_TYPE, OPTIONAL, 1);
@@ -440,6 +441,7 @@ public:
440
441
  bool showVersionInHeader: 1;
441
442
  bool defaultAbortWebsocketsOnProcessShutdown;
442
443
  bool defaultLoadShellEnvvars;
444
+ bool defaultPreloadBundler;
443
445
 
444
446
  /*******************/
445
447
  /*******************/
@@ -473,7 +475,8 @@ public:
473
475
  defaultForceMaxConcurrentRequestsPerProcess(config["default_force_max_concurrent_requests_per_process"].asInt()),
474
476
  showVersionInHeader(config["show_version_in_header"].asBool()),
475
477
  defaultAbortWebsocketsOnProcessShutdown(config["default_abort_websockets_on_process_shutdown"].asBool()),
476
- defaultLoadShellEnvvars(config["default_load_shell_envvars"].asBool())
478
+ defaultLoadShellEnvvars(config["default_load_shell_envvars"].asBool()),
479
+ defaultPreloadBundler(config["default_preload_bundler"].asBool())
477
480
 
478
481
  /*******************/
479
482
  { }
@@ -202,6 +202,7 @@ Controller::fillPoolOptionsFromConfigCaches(Options &options,
202
202
  options.spawnMethod = requestConfig->defaultSpawnMethod;
203
203
  options.bindAddress = requestConfig->defaultBindAddress;
204
204
  options.loadShellEnvvars = requestConfig->defaultLoadShellEnvvars;
205
+ options.preloadBundler = requestConfig->defaultPreloadBundler;
205
206
  options.statThrottleRate = mainConfig.statThrottleRate;
206
207
  options.maxRequests = requestConfig->defaultMaxRequests;
207
208
  options.stickySessionsCookieAttributes = requestConfig->defaultStickySessionsCookieAttributes;
@@ -378,6 +379,7 @@ Controller::createNewPoolOptions(Client *client, Request *req,
378
379
  fillPoolOption(req, options.restartDir, "!~PASSENGER_RESTART_DIR");
379
380
  fillPoolOption(req, options.startupFile, "!~PASSENGER_STARTUP_FILE");
380
381
  fillPoolOption(req, options.loadShellEnvvars, "!~PASSENGER_LOAD_SHELL_ENVVARS");
382
+ fillPoolOption(req, options.preloadBundler, "!~PASSENGER_PRELOAD_BUNDLER");
381
383
  fillPoolOption(req, options.fileDescriptorUlimit, "!~PASSENGER_APP_FILE_DESCRIPTOR_ULIMIT");
382
384
  fillPoolOption(req, options.raiseInternalError, "!~PASSENGER_RAISE_INTERNAL_ERROR");
383
385
  fillPoolOption(req, options.lveMinUid, "!~PASSENGER_LVE_MIN_UID");
@@ -115,6 +115,7 @@ coreUsage() {
115
115
  printf(" --spawn-method NAME Spawn method to use. Can either be 'smart' or\n");
116
116
  printf(" 'direct'. Default: %s\n", DEFAULT_SPAWN_METHOD);
117
117
  printf(" --load-shell-envvars Load shell startup files before loading application\n");
118
+ printf(" --preload-bundler Tell Ruby to load bundler gem before loading application\n");
118
119
  printf(" --concurrency-model The concurrency model to use for the app, either\n");
119
120
  printf(" 'process' or 'thread' (Enterprise only).\n");
120
121
  printf(" Default: " DEFAULT_CONCURRENCY_MODEL "\n");
@@ -332,6 +333,9 @@ parseCoreOption(int argc, const char *argv[], int &i, Json::Value &updates) {
332
333
  } else if (p.isFlag(argv[i], '\0', "--load-shell-envvars")) {
333
334
  updates["default_load_shell_envvars"] = true;
334
335
  i++;
336
+ } else if (p.isFlag(argv[i], '\0', "--preload-bundler")) {
337
+ updates["default_preload_bundler"] = true;
338
+ i++;
335
339
  } else if (p.isFlag(argv[i], '\0', "--multi-app")) {
336
340
  updates["multi_app"] = true;
337
341
  i++;
@@ -258,6 +258,7 @@ Passenger::SpawningKit::Config::validate(vector<StaticString> &errors) const {
258
258
  * startsUsingWrapper
259
259
  * wrapperSuppliedByThirdParty
260
260
  * findFreePort
261
+ * preloadBundler
261
262
  * loadShellEnvvars
262
263
  * debugWorkDir
263
264
  * processTitle
@@ -287,6 +288,9 @@ Passenger::SpawningKit::Config::getConfidentialFieldsToPassToApp() const {
287
288
  if (!config.genericApp && config.startsUsingWrapper) {
288
289
  doc["wrapper_supplied_by_third_party"] = wrapperSuppliedByThirdParty;
289
290
  }
291
+ if (config.appType == "ruby") {
292
+ doc["preload_bundler"] = preloadBundler;
293
+ }
290
294
  doc["load_shell_envvars"] = loadShellEnvvars;
291
295
  doc["start_command"] = startCommand.toString();
292
296
  if (!config.genericApp && config.startsUsingWrapper) {
@@ -341,6 +345,9 @@ Passenger::SpawningKit::Config::getNonConfidentialFieldsToPassToApp() const {
341
345
  if (!config.genericApp && config.startsUsingWrapper) {
342
346
  doc["wrapper_supplied_by_third_party"] = wrapperSuppliedByThirdParty;
343
347
  }
348
+ if (config.appType == "ruby") {
349
+ doc["preload_bundler"] = preloadBundler;
350
+ }
344
351
  doc["load_shell_envvars"] = loadShellEnvvars;
345
352
  doc["start_command"] = startCommand.toString();
346
353
  if (!config.genericApp && config.startsUsingWrapper) {
@@ -156,6 +156,18 @@ public:
156
156
  */
157
157
  bool findFreePort: 1;
158
158
 
159
+ /**
160
+ * Whether Passenger should tell Ruby to preload bundler,
161
+ * this is to help deal with multiple versions of gems
162
+ * being installed, which is due to updates of default gems.
163
+ *
164
+ * @hinted_parseable
165
+ * @pass_during_handshake
166
+ * @only_meaningful_if config.appType == "ruby"
167
+ * @non_confidential
168
+ */
169
+ bool preloadBundler: 1;
170
+
159
171
  /**
160
172
  * Whether to load environment variables set in shell startup
161
173
  * files (e.g. ~/.bashrc) during spawning.
@@ -371,6 +383,7 @@ public:
371
383
  startsUsingWrapper(false),
372
384
  wrapperSuppliedByThirdParty(false),
373
385
  findFreePort(false),
386
+ preloadBundler(false),
374
387
  loadShellEnvvars(false),
375
388
  debugWorkDir(false),
376
389
  appEnv(P_STATIC_STRING(DEFAULT_APP_ENV)),
@@ -249,6 +249,10 @@ private:
249
249
  args["integration_mode"] = context->integrationMode;
250
250
  args["gupid"] = session.result.gupid;
251
251
  args["UNIX_PATH_MAX"] = (Json::UInt64) sizeof(addr.sun_path) - 1;
252
+
253
+ if (config->preloadBundler) {
254
+ args["preload_bundler"] = config->preloadBundler;
255
+ }
252
256
  if (config->genericApp || config->findFreePort) {
253
257
  args["expected_start_port"] = session.expectedStartPort;
254
258
  }
@@ -114,6 +114,7 @@ protected:
114
114
  config->logLevel = options.logLevel;
115
115
  config->wrapperSuppliedByThirdParty = false;
116
116
  config->findFreePort = false;
117
+ config->preloadBundler = options.preloadBundler;
117
118
  config->loadShellEnvvars = options.loadShellEnvvars;
118
119
  config->startupFile = options.getStartupFile(*context->wrapperRegistry);
119
120
  config->appType = options.appType;
@@ -702,6 +702,10 @@ setDefaultEnvvars(const Json::Value &args) {
702
702
  setenv("PORT", toString(args["expected_start_port"].asInt()).c_str(), 1);
703
703
  }
704
704
 
705
+ if (args.isMember("preload_bundler") && args["preload_bundler"].asBool()) {
706
+ setenv("RUBYOPT", "-r bundler/setup", 1);
707
+ }
708
+
705
709
  if (args["base_uri"].asString() != "/") {
706
710
  setenv("RAILS_RELATIVE_URL_ROOT", args["base_uri"].asCString(), 1);
707
711
  setenv("RACK_BASE_URI", args["base_uri"].asCString(), 1);
@@ -153,7 +153,7 @@ using namespace std;
153
153
  * security_update_checker_interval unsigned integer - default(86400)
154
154
  * security_update_checker_proxy_url string - -
155
155
  * security_update_checker_url string - default("https://securitycheck.phusionpassenger.com/v1/check.json")
156
- * server_software string - default("Phusion_Passenger/6.0.12")
156
+ * server_software string - default("Phusion_Passenger/6.0.13")
157
157
  * setsid boolean - default(false)
158
158
  * show_version_in_header boolean - default(true)
159
159
  * single_app_mode_app_root string - default,read_only
@@ -337,6 +337,11 @@ extern "C" const command_rec passenger_commands[] = {
337
337
  NULL,
338
338
  RSRC_CONF,
339
339
  "Prestart the given web applications during startup."),
340
+ AP_INIT_FLAG("PassengerPreloadBundler",
341
+ (FlagFunc) cmd_passenger_preload_bundler,
342
+ NULL,
343
+ RSRC_CONF | ACCESS_CONF,
344
+ "Whether to tell Ruby to load the bundler gem before running the application."),
340
345
  AP_INIT_TAKE1("PassengerPython",
341
346
  (Take1Func) cmd_passenger_python,
342
347
  NULL,
@@ -234,6 +234,11 @@ ConfigManifestGenerator::autoGenerated_setAppConfigDefaults() {
234
234
  "PassengerNodejs",
235
235
  DEFAULT_NODEJS);
236
236
 
237
+ addOptionsContainerStaticDefaultBool(
238
+ defaultAppConfigContainer,
239
+ "PassengerPreloadBundler",
240
+ false);
241
+
237
242
  addOptionsContainerStaticDefaultStr(
238
243
  defaultAppConfigContainer,
239
244
  "PassengerPython",
@@ -729,6 +729,24 @@ cmd_passenger_pre_start(cmd_parms *cmd, void *pcfg, const char *arg) {
729
729
  return NULL;
730
730
  }
731
731
 
732
+ static const char *
733
+ cmd_passenger_preload_bundler(cmd_parms *cmd, void *pcfg, const char *arg) {
734
+ const char *err = ap_check_cmd_context(cmd, NOT_IN_FILES);
735
+ if (err != NULL) {
736
+ return err;
737
+ }
738
+
739
+ DirConfig *config = (DirConfig *) pcfg;
740
+ config->mPreloadBundlerSourceFile = cmd->directive->filename;
741
+ config->mPreloadBundlerSourceLine = cmd->directive->line_num;
742
+ config->mPreloadBundlerExplicitlySet = true;
743
+ config->mPreloadBundler =
744
+ (arg != NULL) ?
745
+ ENABLED :
746
+ DISABLED;
747
+ return NULL;
748
+ }
749
+
732
750
  static const char *
733
751
  cmd_passenger_python(cmd_parms *cmd, void *pcfg, const char *arg) {
734
752
  const char *err = ap_check_cmd_context(cmd, NOT_IN_FILES);
@@ -101,6 +101,7 @@ createDirConfig_autoGenerated(DirConfig *config) {
101
101
  /*
102
102
  * config->mNodejs: default initialized
103
103
  */
104
+ config->mPreloadBundler = Apache2Module::UNSET;
104
105
  /*
105
106
  * config->mPython: default initialized
106
107
  */
@@ -154,6 +155,7 @@ createDirConfig_autoGenerated(DirConfig *config) {
154
155
  config->mMinInstancesSourceLine = 0;
155
156
  config->mMonitorLogFileSourceLine = 0;
156
157
  config->mNodejsSourceLine = 0;
158
+ config->mPreloadBundlerSourceLine = 0;
157
159
  config->mPythonSourceLine = 0;
158
160
  config->mRestartDirSourceLine = 0;
159
161
  config->mRubySourceLine = 0;
@@ -191,6 +193,7 @@ createDirConfig_autoGenerated(DirConfig *config) {
191
193
  config->mMinInstancesExplicitlySet = false;
192
194
  config->mMonitorLogFileExplicitlySet = false;
193
195
  config->mNodejsExplicitlySet = false;
196
+ config->mPreloadBundlerExplicitlySet = false;
194
197
  config->mPythonExplicitlySet = false;
195
198
  config->mRestartDirExplicitlySet = false;
196
199
  config->mRubyExplicitlySet = false;
@@ -97,6 +97,9 @@ constructRequestHeaders_autoGenerated(request_rec *r, DirConfig *config, std::st
97
97
  addHeader(result, StaticString("!~PASSENGER_NODEJS",
98
98
  sizeof("!~PASSENGER_NODEJS") - 1),
99
99
  config->mNodejs);
100
+ addHeader(result, StaticString("!~PASSENGER_PRELOAD_BUNDLER",
101
+ sizeof("!~PASSENGER_PRELOAD_BUNDLER") - 1),
102
+ config->mPreloadBundler);
100
103
  addHeader(result, StaticString("!~PASSENGER_PYTHON",
101
104
  sizeof("!~PASSENGER_PYTHON") - 1),
102
105
  config->mPython);
@@ -361,6 +361,17 @@ ConfigManifestGenerator::autoGenerated_generateConfigManifestForDirConfig(server
361
361
  pdconf->mNodejs.data(),
362
362
  pdconf->mNodejs.data() + pdconf->mNodejs.size());
363
363
  }
364
+ if (pdconf->mPreloadBundlerExplicitlySet) {
365
+ findOrCreateAppAndLocOptionsContainers(serverRec, csconf, cdconf,
366
+ pdconf, context, &appOptionsContainer, &locOptionsContainer);
367
+ Json::Value &optionContainer = findOrCreateOptionContainer(*appOptionsContainer,
368
+ "PassengerPreloadBundler",
369
+ sizeof("PassengerPreloadBundler") - 1);
370
+ Json::Value &hierarchyMember = addOptionContainerHierarchyMember(optionContainer,
371
+ pdconf->mPreloadBundlerSourceFile,
372
+ pdconf->mPreloadBundlerSourceLine);
373
+ hierarchyMember["value"] = pdconf->mPreloadBundler == Apache2Module::ENABLED;
374
+ }
364
375
  if (pdconf->mPythonExplicitlySet) {
365
376
  findOrCreateAppAndLocOptionsContainers(serverRec, csconf, cdconf,
366
377
  pdconf, context, &appOptionsContainer, &locOptionsContainer);
@@ -152,6 +152,10 @@ mergeDirConfig_autoGenerated(DirConfig *config, DirConfig *base, DirConfig *add)
152
152
  (!add->mNodejs.empty())
153
153
  ? add->mNodejs
154
154
  : base->mNodejs;
155
+ config->mPreloadBundler =
156
+ (add->mPreloadBundler != Apache2Module::UNSET)
157
+ ? add->mPreloadBundler
158
+ : base->mPreloadBundler;
155
159
  config->mPython =
156
160
  (!add->mPython.empty())
157
161
  ? add->mPython
@@ -219,6 +223,7 @@ mergeDirConfig_autoGenerated(DirConfig *config, DirConfig *base, DirConfig *add)
219
223
  config->mMinInstancesSourceFile = add->mMinInstancesSourceFile;
220
224
  config->mMonitorLogFileSourceFile = add->mMonitorLogFileSourceFile;
221
225
  config->mNodejsSourceFile = add->mNodejsSourceFile;
226
+ config->mPreloadBundlerSourceFile = add->mPreloadBundlerSourceFile;
222
227
  config->mPythonSourceFile = add->mPythonSourceFile;
223
228
  config->mRestartDirSourceFile = add->mRestartDirSourceFile;
224
229
  config->mRubySourceFile = add->mRubySourceFile;
@@ -256,6 +261,7 @@ mergeDirConfig_autoGenerated(DirConfig *config, DirConfig *base, DirConfig *add)
256
261
  config->mMinInstancesSourceLine = add->mMinInstancesSourceLine;
257
262
  config->mMonitorLogFileSourceLine = add->mMonitorLogFileSourceLine;
258
263
  config->mNodejsSourceLine = add->mNodejsSourceLine;
264
+ config->mPreloadBundlerSourceLine = add->mPreloadBundlerSourceLine;
259
265
  config->mPythonSourceLine = add->mPythonSourceLine;
260
266
  config->mRestartDirSourceLine = add->mRestartDirSourceLine;
261
267
  config->mRubySourceLine = add->mRubySourceLine;
@@ -293,6 +299,7 @@ mergeDirConfig_autoGenerated(DirConfig *config, DirConfig *base, DirConfig *add)
293
299
  config->mMinInstancesExplicitlySet = add->mMinInstancesExplicitlySet;
294
300
  config->mMonitorLogFileExplicitlySet = add->mMonitorLogFileExplicitlySet;
295
301
  config->mNodejsExplicitlySet = add->mNodejsExplicitlySet;
302
+ config->mPreloadBundlerExplicitlySet = add->mPreloadBundlerExplicitlySet;
296
303
  config->mPythonExplicitlySet = add->mPythonExplicitlySet;
297
304
  config->mRestartDirExplicitlySet = add->mRestartDirExplicitlySet;
298
305
  config->mRubyExplicitlySet = add->mRubyExplicitlySet;
@@ -96,6 +96,11 @@ struct AutoGeneratedDirConfig {
96
96
  */
97
97
  Threeway mLoadShellEnvvars;
98
98
 
99
+ /*
100
+ * Whether to tell Ruby to load the bundler gem before running the application.
101
+ */
102
+ Threeway mPreloadBundler;
103
+
99
104
  /*
100
105
  * Whether to enable sticky sessions.
101
106
  */
@@ -245,6 +250,7 @@ struct AutoGeneratedDirConfig {
245
250
  StaticString mFriendlyErrorPagesSourceFile;
246
251
  StaticString mHighPerformanceSourceFile;
247
252
  StaticString mLoadShellEnvvarsSourceFile;
253
+ StaticString mPreloadBundlerSourceFile;
248
254
  StaticString mStickySessionsSourceFile;
249
255
  StaticString mForceMaxConcurrentRequestsPerProcessSourceFile;
250
256
  StaticString mLveMinUidSourceFile;
@@ -282,6 +288,7 @@ struct AutoGeneratedDirConfig {
282
288
  unsigned int mFriendlyErrorPagesSourceLine;
283
289
  unsigned int mHighPerformanceSourceLine;
284
290
  unsigned int mLoadShellEnvvarsSourceLine;
291
+ unsigned int mPreloadBundlerSourceLine;
285
292
  unsigned int mStickySessionsSourceLine;
286
293
  unsigned int mForceMaxConcurrentRequestsPerProcessSourceLine;
287
294
  unsigned int mLveMinUidSourceLine;
@@ -319,6 +326,7 @@ struct AutoGeneratedDirConfig {
319
326
  bool mFriendlyErrorPagesExplicitlySet: 1;
320
327
  bool mHighPerformanceExplicitlySet: 1;
321
328
  bool mLoadShellEnvvarsExplicitlySet: 1;
329
+ bool mPreloadBundlerExplicitlySet: 1;
322
330
  bool mStickySessionsExplicitlySet: 1;
323
331
  bool mForceMaxConcurrentRequestsPerProcessExplicitlySet: 1;
324
332
  bool mLveMinUidExplicitlySet: 1;
@@ -417,6 +425,15 @@ struct AutoGeneratedDirConfig {
417
425
  }
418
426
  }
419
427
 
428
+ bool
429
+ getPreloadBundler() const {
430
+ if (mPreloadBundler == Apache2Module::UNSET) {
431
+ return false;
432
+ } else {
433
+ return mPreloadBundler == Apache2Module::ENABLED;
434
+ }
435
+ }
436
+
420
437
  bool
421
438
  getStickySessions() const {
422
439
  if (mStickySessions == Apache2Module::UNSET) {
@@ -1333,6 +1333,7 @@ public:
1333
1333
  config["server_software"] = webServerDesc;
1334
1334
  config["multi_app"] = true;
1335
1335
  config["default_load_shell_envvars"] = true;
1336
+ config["default_preload_bundler"] = false;
1336
1337
  config["config_manifest"] = serverConfig.manifest;
1337
1338
  config["file_descriptor_log_target"] = nonEmptyString(serverConfig.fileDescriptorLogFile);
1338
1339
  config["controller_socket_backlog"] = serverConfig.socketBacklog;
@@ -83,7 +83,7 @@
83
83
  #define PASSENGER_API_VERSION_MAJOR 0
84
84
  #define PASSENGER_API_VERSION_MINOR 3
85
85
  #define PASSENGER_DEFAULT_USER "nobody"
86
- #define PASSENGER_VERSION "6.0.12"
86
+ #define PASSENGER_VERSION "6.0.13"
87
87
  #define POOL_HELPER_THREAD_STACK_SIZE 262144
88
88
  #define PROCESS_SHUTDOWN_TIMEOUT 60
89
89
  #define PROCESS_SHUTDOWN_TIMEOUT_DISPLAY "1 minute"
@@ -0,0 +1,19 @@
1
+ /*
2
+ Copyright 2014-2015 Glen Joseph Fernandes
3
+ (glenjofe@gmail.com)
4
+
5
+ Distributed under the Boost Software License, Version 1.0.
6
+ (http://www.boost.org/LICENSE_1_0.txt)
7
+ */
8
+ #ifndef BOOST_ALIGN_ALIGN_HPP
9
+ #define BOOST_ALIGN_ALIGN_HPP
10
+
11
+ #include <boost/config.hpp>
12
+
13
+ #if !defined(BOOST_NO_CXX11_STD_ALIGN) && !defined(BOOST_LIBSTDCXX_VERSION)
14
+ #include <boost/align/detail/align_cxx11.hpp>
15
+ #else
16
+ #include <boost/align/detail/align.hpp>
17
+ #endif
18
+
19
+ #endif