passenger 6.0.12 → 6.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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