passenger 4.0.60 → 5.0.0.beta1

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.

Files changed (1301) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +5 -0
  5. data/.travis.yml +3 -2
  6. data/CHANGELOG +31 -53
  7. data/CONTRIBUTING.md +4 -4
  8. data/CONTRIBUTORS +0 -1
  9. data/Gemfile +18 -0
  10. data/Gemfile.lock +41 -0
  11. data/Rakefile +16 -0
  12. data/bin/passenger +2 -2
  13. data/bin/passenger-install-apache2-module +12 -12
  14. data/bin/passenger-install-nginx-module +9 -14
  15. data/bin/passenger-status +125 -87
  16. data/build/agents.rb +112 -140
  17. data/build/apache2.rb +4 -9
  18. data/build/basics.rb +5 -3
  19. data/build/common_library.rb +1 -0
  20. data/build/cxx_tests.rb +69 -47
  21. data/build/debian.rb +4 -2
  22. data/build/documentation.rb +1 -0
  23. data/build/integration_tests.rb +28 -43
  24. data/build/misc.rb +0 -18
  25. data/build/nginx.rb +2 -6
  26. data/build/packaging.rb +33 -22
  27. data/build/preprocessor.rb +2 -4
  28. data/build/ruby_tests.rb +7 -26
  29. data/build/test_basics.rb +24 -25
  30. data/debian.template/control.template +2 -2
  31. data/debian.template/locations.ini.template +2 -3
  32. data/debian.template/passenger.install.template +2 -2
  33. data/debian.template/rules.template +1 -1
  34. data/dev/ci/run_jenkins.sh +0 -1
  35. data/dev/ci/run_rpm_tests.sh +3 -0
  36. data/dev/ci/run_travis.sh +63 -17
  37. data/dev/copy_boost_headers +22 -6
  38. data/dev/ruby_server.rb +244 -0
  39. data/dev/vagrant/provision.sh +3 -1
  40. data/doc/DebuggingAndStressTesting.md +3 -3
  41. data/doc/Design and Architecture.txt +5 -6
  42. data/doc/Packaging.txt.md +35 -6
  43. data/doc/ServerOptimizationGuide.txt.md +339 -0
  44. data/doc/Users guide Apache.idmap.txt +177 -187
  45. data/doc/Users guide Apache.txt +143 -219
  46. data/doc/Users guide Nginx.idmap.txt +166 -166
  47. data/doc/Users guide Nginx.txt +265 -223
  48. data/doc/Users guide Standalone.txt +3 -3
  49. data/doc/templates/markdown.html.erb +37 -6
  50. data/doc/users_guide_snippets/environment_variables.txt +1 -1
  51. data/doc/users_guide_snippets/support_information.txt +1 -1
  52. data/doc/users_guide_snippets/tips.txt +2 -2
  53. data/ext/apache2/Configuration.cpp +23 -81
  54. data/ext/apache2/Configuration.hpp +18 -92
  55. data/ext/apache2/ConfigurationCommands.cpp +64 -15
  56. data/ext/apache2/ConfigurationCommands.cpp.erb +8 -4
  57. data/ext/apache2/ConfigurationFields.hpp +12 -0
  58. data/ext/apache2/ConfigurationSetters.cpp +73 -1
  59. data/ext/apache2/ConfigurationSetters.cpp.erb +3 -2
  60. data/ext/apache2/CreateDirConfig.cpp +6 -0
  61. data/ext/apache2/DirectoryMapper.h +11 -6
  62. data/ext/apache2/Hooks.cpp +291 -408
  63. data/ext/apache2/MergeDirConfig.cpp +42 -0
  64. data/ext/apache2/SetHeaders.cpp +61 -16
  65. data/ext/apache2/SetHeaders.cpp.erb +9 -7
  66. data/ext/boost/container/allocator_traits.hpp +400 -0
  67. data/ext/boost/container/deque.hpp +2012 -0
  68. data/ext/boost/container/detail/adaptive_node_pool_impl.hpp +874 -0
  69. data/ext/boost/container/detail/advanced_insert_int.hpp +369 -0
  70. data/ext/boost/container/detail/algorithms.hpp +84 -0
  71. data/ext/boost/container/detail/allocation_type.hpp +54 -0
  72. data/ext/boost/container/detail/allocator_version_traits.hpp +163 -0
  73. data/ext/boost/container/detail/config_begin.hpp +49 -0
  74. data/ext/boost/container/detail/config_end.hpp +17 -0
  75. data/ext/boost/container/detail/destroyers.hpp +365 -0
  76. data/ext/boost/container/detail/flat_tree.hpp +1055 -0
  77. data/ext/boost/container/detail/function_detector.hpp +88 -0
  78. data/ext/boost/container/detail/iterators.hpp +611 -0
  79. data/ext/boost/container/detail/math_functions.hpp +113 -0
  80. data/ext/boost/container/detail/memory_util.hpp +83 -0
  81. data/ext/boost/container/detail/mpl.hpp +160 -0
  82. data/ext/boost/container/detail/multiallocation_chain.hpp +286 -0
  83. data/ext/boost/container/detail/node_alloc_holder.hpp +386 -0
  84. data/ext/boost/container/detail/node_pool_impl.hpp +365 -0
  85. data/ext/boost/container/detail/pair.hpp +354 -0
  86. data/ext/boost/container/detail/pool_common.hpp +52 -0
  87. data/ext/boost/container/detail/preprocessor.hpp +232 -0
  88. data/ext/boost/container/detail/transform_iterator.hpp +176 -0
  89. data/ext/boost/container/detail/tree.hpp +1134 -0
  90. data/ext/boost/container/detail/type_traits.hpp +210 -0
  91. data/ext/boost/container/detail/utilities.hpp +1141 -0
  92. data/ext/boost/container/detail/value_init.hpp +45 -0
  93. data/ext/boost/container/detail/variadic_templates_tools.hpp +153 -0
  94. data/ext/boost/container/detail/version_type.hpp +92 -0
  95. data/ext/boost/container/detail/workaround.hpp +44 -0
  96. data/ext/boost/container/flat_map.hpp +1674 -0
  97. data/ext/boost/container/flat_set.hpp +1408 -0
  98. data/ext/boost/container/list.hpp +1475 -0
  99. data/ext/boost/container/map.hpp +1508 -0
  100. data/ext/boost/container/scoped_allocator.hpp +1503 -0
  101. data/ext/boost/container/scoped_allocator_fwd.hpp +83 -0
  102. data/ext/boost/container/set.hpp +1280 -0
  103. data/ext/boost/container/slist.hpp +1706 -0
  104. data/ext/boost/container/stable_vector.hpp +1869 -0
  105. data/ext/boost/container/static_vector.hpp +1053 -0
  106. data/ext/boost/container/string.hpp +2856 -0
  107. data/ext/boost/container/throw_exception.hpp +110 -0
  108. data/ext/boost/container/vector.hpp +2671 -0
  109. data/ext/boost/detail/is_xxx.hpp +61 -0
  110. data/ext/boost/intrusive/any_hook.hpp +344 -0
  111. data/ext/boost/intrusive/avl_set.hpp +2528 -0
  112. data/ext/boost/intrusive/avl_set_hook.hpp +297 -0
  113. data/ext/boost/intrusive/avltree.hpp +1786 -0
  114. data/ext/boost/intrusive/avltree_algorithms.hpp +968 -0
  115. data/ext/boost/intrusive/bs_set_hook.hpp +296 -0
  116. data/ext/boost/intrusive/circular_list_algorithms.hpp +413 -0
  117. data/ext/boost/intrusive/circular_slist_algorithms.hpp +404 -0
  118. data/ext/boost/intrusive/derivation_value_traits.hpp +70 -0
  119. data/ext/boost/intrusive/detail/any_node_and_algorithms.hpp +297 -0
  120. data/ext/boost/intrusive/detail/assert.hpp +41 -0
  121. data/ext/boost/intrusive/detail/avltree_node.hpp +197 -0
  122. data/ext/boost/intrusive/detail/clear_on_destructor_base.hpp +36 -0
  123. data/ext/boost/intrusive/detail/common_slist_algorithms.hpp +102 -0
  124. data/ext/boost/intrusive/detail/config_begin.hpp +52 -0
  125. data/ext/boost/intrusive/detail/config_end.hpp +15 -0
  126. data/ext/boost/intrusive/detail/ebo_functor_holder.hpp +95 -0
  127. data/ext/boost/intrusive/detail/function_detector.hpp +88 -0
  128. data/ext/boost/intrusive/detail/generic_hook.hpp +209 -0
  129. data/ext/boost/intrusive/detail/has_member_function_callable_with.hpp +357 -0
  130. data/ext/boost/intrusive/detail/hashtable_node.hpp +249 -0
  131. data/ext/boost/intrusive/detail/is_stateful_value_traits.hpp +77 -0
  132. data/ext/boost/intrusive/detail/list_node.hpp +196 -0
  133. data/ext/boost/intrusive/detail/memory_util.hpp +288 -0
  134. data/ext/boost/intrusive/detail/mpl.hpp +383 -0
  135. data/ext/boost/intrusive/detail/parent_from_member.hpp +97 -0
  136. data/ext/boost/intrusive/detail/preprocessor.hpp +52 -0
  137. data/ext/boost/intrusive/detail/rbtree_node.hpp +201 -0
  138. data/ext/boost/intrusive/detail/slist_node.hpp +166 -0
  139. data/ext/boost/intrusive/detail/transform_iterator.hpp +173 -0
  140. data/ext/boost/intrusive/detail/tree_algorithms.hpp +1742 -0
  141. data/ext/boost/intrusive/detail/tree_node.hpp +199 -0
  142. data/ext/boost/intrusive/detail/utilities.hpp +858 -0
  143. data/ext/boost/intrusive/detail/workaround.hpp +22 -0
  144. data/ext/boost/intrusive/hashtable.hpp +3110 -0
  145. data/ext/boost/intrusive/intrusive_fwd.hpp +542 -0
  146. data/ext/boost/intrusive/linear_slist_algorithms.hpp +327 -0
  147. data/ext/boost/intrusive/link_mode.hpp +46 -0
  148. data/ext/boost/intrusive/list.hpp +1525 -0
  149. data/ext/boost/intrusive/list_hook.hpp +290 -0
  150. data/ext/boost/intrusive/member_value_traits.hpp +70 -0
  151. data/ext/boost/intrusive/options.hpp +810 -0
  152. data/ext/boost/intrusive/parent_from_member.hpp +42 -0
  153. data/ext/boost/intrusive/pointer_plus_bits.hpp +86 -0
  154. data/ext/boost/intrusive/pointer_traits.hpp +265 -0
  155. data/ext/boost/intrusive/priority_compare.hpp +39 -0
  156. data/ext/boost/intrusive/rbtree.hpp +1785 -0
  157. data/ext/boost/intrusive/rbtree_algorithms.hpp +934 -0
  158. data/ext/boost/intrusive/set.hpp +2554 -0
  159. data/ext/boost/intrusive/set_hook.hpp +300 -0
  160. data/ext/boost/intrusive/sg_set.hpp +2601 -0
  161. data/ext/boost/intrusive/sgtree.hpp +2009 -0
  162. data/ext/boost/intrusive/sgtree_algorithms.hpp +807 -0
  163. data/ext/boost/intrusive/slist.hpp +2219 -0
  164. data/ext/boost/intrusive/slist_hook.hpp +294 -0
  165. data/ext/boost/intrusive/splay_set.hpp +2575 -0
  166. data/ext/boost/intrusive/splay_set_hook.hpp +292 -0
  167. data/ext/boost/intrusive/splaytree.hpp +1784 -0
  168. data/ext/boost/intrusive/splaytree_algorithms.hpp +1008 -0
  169. data/ext/boost/intrusive/treap.hpp +1882 -0
  170. data/ext/boost/intrusive/treap_algorithms.hpp +919 -0
  171. data/ext/boost/intrusive/treap_set.hpp +2751 -0
  172. data/ext/boost/intrusive/trivial_value_traits.hpp +46 -0
  173. data/ext/boost/intrusive/unordered_set.hpp +2115 -0
  174. data/ext/boost/intrusive/unordered_set_hook.hpp +434 -0
  175. data/ext/boost/intrusive_ptr.hpp +18 -0
  176. data/ext/boost/math/common_factor_ct.hpp +180 -0
  177. data/ext/boost/math_fwd.hpp +108 -0
  178. data/ext/boost/move/detail/move_helpers.hpp +175 -0
  179. data/ext/boost/parameter.hpp +21 -0
  180. data/ext/boost/parameter/aux_/arg_list.hpp +459 -0
  181. data/ext/boost/parameter/aux_/cast.hpp +143 -0
  182. data/ext/boost/parameter/aux_/default.hpp +69 -0
  183. data/ext/boost/parameter/aux_/is_maybe.hpp +26 -0
  184. data/ext/boost/parameter/aux_/maybe.hpp +120 -0
  185. data/ext/boost/parameter/aux_/overloads.hpp +88 -0
  186. data/ext/boost/parameter/aux_/parameter_requirements.hpp +25 -0
  187. data/ext/boost/parameter/aux_/parenthesized_type.hpp +119 -0
  188. data/ext/boost/parameter/aux_/preprocessor/flatten.hpp +115 -0
  189. data/ext/boost/parameter/aux_/preprocessor/for_each.hpp +103 -0
  190. data/ext/boost/parameter/aux_/python/invoker.hpp +132 -0
  191. data/ext/boost/parameter/aux_/python/invoker_iterate.hpp +93 -0
  192. data/ext/boost/parameter/aux_/result_of0.hpp +36 -0
  193. data/ext/boost/parameter/aux_/set.hpp +67 -0
  194. data/ext/boost/parameter/aux_/tag.hpp +38 -0
  195. data/ext/boost/parameter/aux_/tagged_argument.hpp +188 -0
  196. data/ext/boost/parameter/aux_/template_keyword.hpp +47 -0
  197. data/ext/boost/parameter/aux_/unwrap_cv_reference.hpp +97 -0
  198. data/ext/boost/parameter/aux_/void.hpp +29 -0
  199. data/ext/boost/parameter/aux_/yesno.hpp +26 -0
  200. data/ext/boost/parameter/binding.hpp +106 -0
  201. data/ext/boost/parameter/config.hpp +14 -0
  202. data/ext/boost/parameter/keyword.hpp +152 -0
  203. data/ext/boost/parameter/macros.hpp +99 -0
  204. data/ext/boost/parameter/match.hpp +55 -0
  205. data/ext/boost/parameter/name.hpp +156 -0
  206. data/ext/boost/parameter/parameters.hpp +931 -0
  207. data/ext/boost/parameter/preprocessor.hpp +1178 -0
  208. data/ext/boost/parameter/python.hpp +735 -0
  209. data/ext/boost/parameter/value_type.hpp +108 -0
  210. data/ext/boost/pool/detail/for.m4 +107 -0
  211. data/ext/boost/pool/detail/guard.hpp +69 -0
  212. data/ext/boost/pool/detail/mutex.hpp +42 -0
  213. data/ext/boost/pool/detail/pool_construct.bat +24 -0
  214. data/ext/boost/pool/detail/pool_construct.ipp +852 -0
  215. data/ext/boost/pool/detail/pool_construct.m4 +84 -0
  216. data/ext/boost/pool/detail/pool_construct.sh +12 -0
  217. data/ext/boost/pool/detail/pool_construct_simple.bat +25 -0
  218. data/ext/boost/pool/detail/pool_construct_simple.ipp +43 -0
  219. data/ext/boost/pool/detail/pool_construct_simple.m4 +72 -0
  220. data/ext/boost/pool/detail/pool_construct_simple.sh +12 -0
  221. data/ext/boost/pool/object_pool.hpp +287 -0
  222. data/ext/boost/pool/pool.hpp +1024 -0
  223. data/ext/boost/pool/pool_alloc.hpp +488 -0
  224. data/ext/boost/pool/poolfwd.hpp +82 -0
  225. data/ext/boost/pool/simple_segregated_storage.hpp +377 -0
  226. data/ext/boost/pool/singleton_pool.hpp +251 -0
  227. data/ext/boost/preprocessor/arithmetic.hpp +25 -0
  228. data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
  229. data/ext/boost/preprocessor/arithmetic/div.hpp +39 -0
  230. data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
  231. data/ext/boost/preprocessor/arithmetic/mul.hpp +53 -0
  232. data/ext/boost/preprocessor/array.hpp +32 -0
  233. data/ext/boost/preprocessor/array/enum.hpp +33 -0
  234. data/ext/boost/preprocessor/array/insert.hpp +55 -0
  235. data/ext/boost/preprocessor/array/pop_back.hpp +37 -0
  236. data/ext/boost/preprocessor/array/pop_front.hpp +38 -0
  237. data/ext/boost/preprocessor/array/push_back.hpp +33 -0
  238. data/ext/boost/preprocessor/array/push_front.hpp +33 -0
  239. data/ext/boost/preprocessor/array/remove.hpp +54 -0
  240. data/ext/boost/preprocessor/array/replace.hpp +49 -0
  241. data/ext/boost/preprocessor/array/reverse.hpp +29 -0
  242. data/ext/boost/preprocessor/array/to_list.hpp +33 -0
  243. data/ext/boost/preprocessor/array/to_seq.hpp +33 -0
  244. data/ext/boost/preprocessor/array/to_tuple.hpp +22 -0
  245. data/ext/boost/preprocessor/assert_msg.hpp +17 -0
  246. data/ext/boost/preprocessor/comma.hpp +17 -0
  247. data/ext/boost/preprocessor/comparison.hpp +24 -0
  248. data/ext/boost/preprocessor/comparison/equal.hpp +34 -0
  249. data/ext/boost/preprocessor/comparison/greater.hpp +38 -0
  250. data/ext/boost/preprocessor/comparison/greater_equal.hpp +38 -0
  251. data/ext/boost/preprocessor/comparison/less.hpp +46 -0
  252. data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
  253. data/ext/boost/preprocessor/comparison/not_equal.hpp +814 -0
  254. data/ext/boost/preprocessor/config/limits.hpp +30 -0
  255. data/ext/boost/preprocessor/control.hpp +22 -0
  256. data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
  257. data/ext/boost/preprocessor/control/detail/dmc/while.hpp +536 -0
  258. data/ext/boost/preprocessor/control/detail/edg/while.hpp +534 -0
  259. data/ext/boost/preprocessor/control/detail/msvc/while.hpp +277 -0
  260. data/ext/boost/preprocessor/control/expr_if.hpp +30 -0
  261. data/ext/boost/preprocessor/debug.hpp +18 -0
  262. data/ext/boost/preprocessor/debug/assert.hpp +44 -0
  263. data/ext/boost/preprocessor/debug/line.hpp +35 -0
  264. data/ext/boost/preprocessor/detail/dmc/auto_rec.hpp +286 -0
  265. data/ext/boost/preprocessor/detail/is_nullary.hpp +30 -0
  266. data/ext/boost/preprocessor/detail/is_unary.hpp +30 -0
  267. data/ext/boost/preprocessor/detail/null.hpp +17 -0
  268. data/ext/boost/preprocessor/detail/split.hpp +35 -0
  269. data/ext/boost/preprocessor/enum_params_with_defaults.hpp +17 -0
  270. data/ext/boost/preprocessor/enum_shifted.hpp +17 -0
  271. data/ext/boost/preprocessor/expand.hpp +17 -0
  272. data/ext/boost/preprocessor/expr_if.hpp +17 -0
  273. data/ext/boost/preprocessor/facilities.hpp +23 -0
  274. data/ext/boost/preprocessor/facilities/apply.hpp +34 -0
  275. data/ext/boost/preprocessor/facilities/expand.hpp +28 -0
  276. data/ext/boost/preprocessor/facilities/is_1.hpp +23 -0
  277. data/ext/boost/preprocessor/facilities/is_empty.hpp +43 -0
  278. data/ext/boost/preprocessor/facilities/is_empty_or_1.hpp +30 -0
  279. data/ext/boost/preprocessor/for.hpp +17 -0
  280. data/ext/boost/preprocessor/if.hpp +17 -0
  281. data/ext/boost/preprocessor/iteration.hpp +19 -0
  282. data/ext/boost/preprocessor/iteration/detail/bounds/lower3.hpp +99 -0
  283. data/ext/boost/preprocessor/iteration/detail/bounds/lower4.hpp +99 -0
  284. data/ext/boost/preprocessor/iteration/detail/bounds/lower5.hpp +99 -0
  285. data/ext/boost/preprocessor/iteration/detail/bounds/upper3.hpp +99 -0
  286. data/ext/boost/preprocessor/iteration/detail/bounds/upper4.hpp +99 -0
  287. data/ext/boost/preprocessor/iteration/detail/bounds/upper5.hpp +99 -0
  288. data/ext/boost/preprocessor/iteration/detail/finish.hpp +99 -0
  289. data/ext/boost/preprocessor/iteration/detail/iter/forward3.hpp +1338 -0
  290. data/ext/boost/preprocessor/iteration/detail/iter/forward4.hpp +1338 -0
  291. data/ext/boost/preprocessor/iteration/detail/iter/forward5.hpp +1338 -0
  292. data/ext/boost/preprocessor/iteration/detail/iter/reverse2.hpp +1296 -0
  293. data/ext/boost/preprocessor/iteration/detail/iter/reverse3.hpp +1296 -0
  294. data/ext/boost/preprocessor/iteration/detail/iter/reverse4.hpp +1296 -0
  295. data/ext/boost/preprocessor/iteration/detail/iter/reverse5.hpp +1296 -0
  296. data/ext/boost/preprocessor/iteration/detail/local.hpp +812 -0
  297. data/ext/boost/preprocessor/iteration/detail/rlocal.hpp +782 -0
  298. data/ext/boost/preprocessor/iteration/detail/self.hpp +21 -0
  299. data/ext/boost/preprocessor/iteration/detail/start.hpp +99 -0
  300. data/ext/boost/preprocessor/iteration/local.hpp +26 -0
  301. data/ext/boost/preprocessor/iteration/self.hpp +19 -0
  302. data/ext/boost/preprocessor/library.hpp +36 -0
  303. data/ext/boost/preprocessor/limits.hpp +17 -0
  304. data/ext/boost/preprocessor/list.hpp +37 -0
  305. data/ext/boost/preprocessor/list/at.hpp +39 -0
  306. data/ext/boost/preprocessor/list/cat.hpp +42 -0
  307. data/ext/boost/preprocessor/list/detail/dmc/fold_left.hpp +279 -0
  308. data/ext/boost/preprocessor/list/detail/edg/fold_left.hpp +536 -0
  309. data/ext/boost/preprocessor/list/detail/edg/fold_right.hpp +794 -0
  310. data/ext/boost/preprocessor/list/enum.hpp +41 -0
  311. data/ext/boost/preprocessor/list/filter.hpp +54 -0
  312. data/ext/boost/preprocessor/list/first_n.hpp +58 -0
  313. data/ext/boost/preprocessor/list/for_each.hpp +49 -0
  314. data/ext/boost/preprocessor/list/for_each_product.hpp +141 -0
  315. data/ext/boost/preprocessor/list/rest_n.hpp +55 -0
  316. data/ext/boost/preprocessor/list/size.hpp +58 -0
  317. data/ext/boost/preprocessor/list/to_array.hpp +123 -0
  318. data/ext/boost/preprocessor/list/to_seq.hpp +32 -0
  319. data/ext/boost/preprocessor/list/to_tuple.hpp +38 -0
  320. data/ext/boost/preprocessor/logical.hpp +29 -0
  321. data/ext/boost/preprocessor/logical/bitnor.hpp +38 -0
  322. data/ext/boost/preprocessor/logical/bitor.hpp +38 -0
  323. data/ext/boost/preprocessor/logical/bitxor.hpp +38 -0
  324. data/ext/boost/preprocessor/logical/nor.hpp +30 -0
  325. data/ext/boost/preprocessor/logical/not.hpp +30 -0
  326. data/ext/boost/preprocessor/logical/or.hpp +30 -0
  327. data/ext/boost/preprocessor/logical/xor.hpp +30 -0
  328. data/ext/boost/preprocessor/max.hpp +17 -0
  329. data/ext/boost/preprocessor/min.hpp +17 -0
  330. data/ext/boost/preprocessor/punctuation.hpp +20 -0
  331. data/ext/boost/preprocessor/punctuation/paren_if.hpp +38 -0
  332. data/ext/boost/preprocessor/repeat_3rd.hpp +17 -0
  333. data/ext/boost/preprocessor/repeat_from_to.hpp +17 -0
  334. data/ext/boost/preprocessor/repeat_from_to_2nd.hpp +17 -0
  335. data/ext/boost/preprocessor/repeat_from_to_3rd.hpp +17 -0
  336. data/ext/boost/preprocessor/repetition.hpp +32 -0
  337. data/ext/boost/preprocessor/repetition/deduce_r.hpp +22 -0
  338. data/ext/boost/preprocessor/repetition/deduce_z.hpp +22 -0
  339. data/ext/boost/preprocessor/repetition/detail/dmc/for.hpp +536 -0
  340. data/ext/boost/preprocessor/repetition/detail/edg/for.hpp +534 -0
  341. data/ext/boost/preprocessor/repetition/detail/msvc/for.hpp +277 -0
  342. data/ext/boost/preprocessor/repetition/enum_params_with_defaults.hpp +24 -0
  343. data/ext/boost/preprocessor/repetition/enum_shifted.hpp +68 -0
  344. data/ext/boost/preprocessor/repetition/enum_shifted_binary_params.hpp +51 -0
  345. data/ext/boost/preprocessor/repetition/enum_trailing.hpp +63 -0
  346. data/ext/boost/preprocessor/repetition/enum_trailing_binary_params.hpp +53 -0
  347. data/ext/boost/preprocessor/selection.hpp +18 -0
  348. data/ext/boost/preprocessor/selection/max.hpp +39 -0
  349. data/ext/boost/preprocessor/selection/min.hpp +39 -0
  350. data/ext/boost/preprocessor/seq.hpp +43 -0
  351. data/ext/boost/preprocessor/seq/cat.hpp +49 -0
  352. data/ext/boost/preprocessor/seq/detail/binary_transform.hpp +40 -0
  353. data/ext/boost/preprocessor/seq/detail/split.hpp +284 -0
  354. data/ext/boost/preprocessor/seq/filter.hpp +54 -0
  355. data/ext/boost/preprocessor/seq/first_n.hpp +30 -0
  356. data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
  357. data/ext/boost/preprocessor/seq/fold_right.hpp +288 -0
  358. data/ext/boost/preprocessor/seq/for_each.hpp +60 -0
  359. data/ext/boost/preprocessor/seq/for_each_product.hpp +126 -0
  360. data/ext/boost/preprocessor/seq/insert.hpp +28 -0
  361. data/ext/boost/preprocessor/seq/pop_back.hpp +29 -0
  362. data/ext/boost/preprocessor/seq/pop_front.hpp +27 -0
  363. data/ext/boost/preprocessor/seq/push_back.hpp +19 -0
  364. data/ext/boost/preprocessor/seq/push_front.hpp +19 -0
  365. data/ext/boost/preprocessor/seq/remove.hpp +29 -0
  366. data/ext/boost/preprocessor/seq/replace.hpp +29 -0
  367. data/ext/boost/preprocessor/seq/rest_n.hpp +30 -0
  368. data/ext/boost/preprocessor/seq/reverse.hpp +39 -0
  369. data/ext/boost/preprocessor/seq/subseq.hpp +28 -0
  370. data/ext/boost/preprocessor/seq/to_array.hpp +28 -0
  371. data/ext/boost/preprocessor/seq/to_list.hpp +29 -0
  372. data/ext/boost/preprocessor/seq/to_tuple.hpp +27 -0
  373. data/ext/boost/preprocessor/seq/transform.hpp +48 -0
  374. data/ext/boost/preprocessor/slot.hpp +17 -0
  375. data/ext/boost/preprocessor/slot/counter.hpp +25 -0
  376. data/ext/boost/preprocessor/slot/detail/counter.hpp +269 -0
  377. data/ext/boost/preprocessor/slot/detail/slot1.hpp +267 -0
  378. data/ext/boost/preprocessor/slot/detail/slot2.hpp +267 -0
  379. data/ext/boost/preprocessor/slot/detail/slot3.hpp +267 -0
  380. data/ext/boost/preprocessor/slot/detail/slot4.hpp +267 -0
  381. data/ext/boost/preprocessor/slot/detail/slot5.hpp +267 -0
  382. data/ext/boost/preprocessor/tuple.hpp +28 -0
  383. data/ext/boost/preprocessor/tuple/enum.hpp +22 -0
  384. data/ext/boost/preprocessor/tuple/reverse.hpp +114 -0
  385. data/ext/boost/preprocessor/tuple/size.hpp +28 -0
  386. data/ext/boost/preprocessor/tuple/to_array.hpp +37 -0
  387. data/ext/boost/preprocessor/tuple/to_seq.hpp +114 -0
  388. data/ext/boost/preprocessor/variadic.hpp +23 -0
  389. data/ext/boost/preprocessor/variadic/to_array.hpp +32 -0
  390. data/ext/boost/preprocessor/variadic/to_list.hpp +25 -0
  391. data/ext/boost/preprocessor/variadic/to_seq.hpp +25 -0
  392. data/ext/boost/preprocessor/variadic/to_tuple.hpp +24 -0
  393. data/ext/boost/preprocessor/while.hpp +17 -0
  394. data/ext/boost/preprocessor/wstringize.hpp +29 -0
  395. data/ext/boost/smart_ptr/intrusive_ptr.hpp +324 -0
  396. data/ext/common/AccountsDatabase.h +3 -4
  397. data/ext/common/AgentsStarter.cpp +12 -15
  398. data/ext/common/AgentsStarter.h +54 -120
  399. data/ext/common/ApplicationPool2/AppTypes.cpp +12 -5
  400. data/ext/common/ApplicationPool2/AppTypes.h +21 -14
  401. data/ext/common/ApplicationPool2/Common.h +36 -19
  402. data/ext/common/ApplicationPool2/DirectSpawner.h +15 -16
  403. data/ext/common/ApplicationPool2/DummySpawner.h +9 -8
  404. data/ext/common/ApplicationPool2/ErrorRenderer.h +1 -1
  405. data/ext/common/ApplicationPool2/Group.h +304 -171
  406. data/ext/common/ApplicationPool2/Implementation.cpp +234 -125
  407. data/ext/common/ApplicationPool2/Options.h +50 -62
  408. data/ext/common/ApplicationPool2/Pool.h +285 -189
  409. data/ext/common/ApplicationPool2/Process.h +126 -115
  410. data/ext/common/ApplicationPool2/Session.h +70 -30
  411. data/ext/common/ApplicationPool2/SmartSpawner.h +19 -18
  412. data/ext/common/ApplicationPool2/Socket.h +57 -43
  413. data/ext/common/ApplicationPool2/SpawnObject.h +83 -0
  414. data/ext/common/ApplicationPool2/Spawner.h +59 -38
  415. data/ext/common/ApplicationPool2/SpawnerFactory.h +8 -14
  416. data/ext/common/ApplicationPool2/SuperGroup.h +69 -40
  417. data/ext/common/BackgroundEventLoop.cpp +48 -1
  418. data/ext/common/BackgroundEventLoop.h +3 -1
  419. data/ext/common/Constants.h +30 -8
  420. data/ext/common/DataStructures/HashedStaticString.h +103 -0
  421. data/ext/common/DataStructures/LString.h +396 -0
  422. data/ext/common/DataStructures/StringKeyTable.h +588 -0
  423. data/ext/common/EventedMessageServer.h +1 -0
  424. data/ext/common/FileDescriptor.h +5 -0
  425. data/ext/common/InstanceDirectory.h +240 -0
  426. data/ext/common/Logging.cpp +38 -13
  427. data/ext/common/Logging.h +53 -22
  428. data/ext/common/MemoryKit/mbuf.cpp +413 -0
  429. data/ext/common/MemoryKit/mbuf.h +266 -0
  430. data/ext/common/MemoryKit/palloc.cpp +337 -0
  431. data/ext/common/MemoryKit/palloc.h +121 -0
  432. data/ext/common/ResourceLocator.h +62 -6
  433. data/ext/common/SafeLibev.h +4 -4
  434. data/ext/common/ServerKit/AcceptLoadBalancer.h +275 -0
  435. data/ext/common/ServerKit/Channel.h +747 -0
  436. data/ext/common/ServerKit/Client.h +166 -0
  437. data/ext/common/ServerKit/ClientRef.h +130 -0
  438. data/ext/common/ServerKit/Context.h +129 -0
  439. data/ext/common/ServerKit/Errors.h +103 -0
  440. data/ext/common/ServerKit/FdSinkChannel.h +206 -0
  441. data/ext/common/ServerKit/FdSourceChannel.h +230 -0
  442. data/ext/common/ServerKit/FileBufferedChannel.h +1399 -0
  443. data/ext/common/ServerKit/FileBufferedFdSinkChannel.h +228 -0
  444. data/ext/common/ServerKit/HeaderTable.h +472 -0
  445. data/ext/common/ServerKit/Hooks.h +79 -0
  446. data/ext/common/ServerKit/HttpChunkedBodyParser.h +289 -0
  447. data/ext/common/ServerKit/HttpChunkedBodyParserState.h +70 -0
  448. data/ext/common/ServerKit/HttpClient.h +94 -0
  449. data/ext/common/ServerKit/HttpHeaderParser.h +477 -0
  450. data/ext/common/ServerKit/HttpHeaderParserState.h +60 -0
  451. data/ext/common/ServerKit/HttpRequest.h +276 -0
  452. data/ext/common/ServerKit/HttpRequestRef.h +130 -0
  453. data/ext/common/ServerKit/HttpServer.h +1152 -0
  454. data/ext/common/ServerKit/Implementation.cpp +47 -0
  455. data/ext/common/ServerKit/Server.h +1040 -0
  456. data/ext/common/ServerKit/http_parser.cpp +2259 -0
  457. data/ext/common/ServerKit/http_parser.h +330 -0
  458. data/ext/common/StaticString.h +8 -0
  459. data/ext/common/Utils.cpp +14 -12
  460. data/ext/common/Utils.h +9 -103
  461. data/ext/common/Utils/BufferedIO.h +1 -0
  462. data/ext/common/Utils/CachedFileStat.hpp +1 -7
  463. data/ext/common/Utils/DateParsing.h +379 -0
  464. data/ext/common/Utils/FileChangeChecker.h +3 -9
  465. data/ext/common/Utils/Hasher.cpp +52 -0
  466. data/ext/common/Utils/Hasher.h +58 -0
  467. data/ext/common/Utils/IOUtils.cpp +62 -62
  468. data/ext/common/Utils/JsonUtils.h +21 -0
  469. data/ext/common/Utils/OptionParsing.h +75 -0
  470. data/ext/common/Utils/StrIntUtils.cpp +112 -19
  471. data/ext/common/Utils/StrIntUtils.h +52 -12
  472. data/ext/common/Utils/StrIntUtilsNoStrictAliasing.cpp +174 -0
  473. data/ext/common/Utils/VariantMap.h +18 -7
  474. data/ext/common/Utils/modp_b64.cpp +290 -0
  475. data/ext/common/Utils/modp_b64.h +241 -0
  476. data/ext/common/Utils/modp_b64_data.h +479 -0
  477. data/ext/common/Utils/sysqueue.h +811 -0
  478. data/ext/common/agents/Base.cpp +71 -98
  479. data/ext/common/agents/Base.h +11 -3
  480. data/ext/common/agents/HelperAgent/AdminServer.h +690 -0
  481. data/ext/common/agents/HelperAgent/Main.cpp +899 -487
  482. data/ext/common/agents/HelperAgent/OptionParser.h +311 -0
  483. data/ext/common/agents/HelperAgent/RequestHandler.h +315 -2548
  484. data/ext/common/agents/HelperAgent/RequestHandler/AppResponse.h +225 -0
  485. data/ext/common/agents/HelperAgent/RequestHandler/BufferBody.cpp +93 -0
  486. data/ext/common/agents/HelperAgent/RequestHandler/CheckoutSession.cpp +346 -0
  487. data/ext/common/agents/HelperAgent/RequestHandler/Client.h +54 -0
  488. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +846 -0
  489. data/ext/common/agents/HelperAgent/RequestHandler/Hooks.cpp +231 -0
  490. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +434 -0
  491. data/ext/common/agents/HelperAgent/RequestHandler/Request.h +149 -0
  492. data/ext/common/agents/HelperAgent/RequestHandler/SendRequest.cpp +887 -0
  493. data/ext/common/agents/HelperAgent/RequestHandler/TurboCaching.h +293 -0
  494. data/ext/common/agents/HelperAgent/RequestHandler/Utils.cpp +301 -0
  495. data/ext/common/agents/HelperAgent/ResponseCache.h +624 -0
  496. data/ext/common/agents/HelperAgent/SystemMetricsTool.cpp +21 -23
  497. data/ext/common/agents/LoggingAgent/AdminServer.h +369 -0
  498. data/ext/common/agents/LoggingAgent/LoggingServer.h +1 -0
  499. data/ext/common/agents/LoggingAgent/Main.cpp +422 -215
  500. data/ext/common/agents/LoggingAgent/OptionParser.h +167 -0
  501. data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
  502. data/ext/common/agents/Main.cpp +107 -0
  503. data/ext/common/agents/SpawnPreparer/Main.cpp +207 -0
  504. data/ext/common/agents/TempDirToucher/Main.cpp +429 -0
  505. data/ext/common/agents/Watchdog/AdminServer.h +390 -0
  506. data/ext/common/agents/Watchdog/AgentWatcher.cpp +7 -5
  507. data/ext/common/agents/Watchdog/HelperAgentWatcher.cpp +18 -39
  508. data/ext/common/agents/Watchdog/InstanceDirToucher.cpp +116 -0
  509. data/ext/common/agents/Watchdog/LoggingAgentWatcher.cpp +13 -17
  510. data/ext/common/agents/Watchdog/Main.cpp +743 -202
  511. data/ext/libeio/eio.c +17 -0
  512. data/ext/libeio/eio.h +2 -0
  513. data/ext/nginx/CacheLocationConfig.c +177 -198
  514. data/ext/nginx/CacheLocationConfig.c.erb +35 -22
  515. data/ext/nginx/Configuration.c +402 -236
  516. data/ext/nginx/Configuration.h +12 -5
  517. data/ext/nginx/ConfigurationCommands.c +35 -15
  518. data/ext/nginx/ConfigurationCommands.c.erb +4 -4
  519. data/ext/nginx/ConfigurationFields.h +9 -5
  520. data/ext/nginx/ConfigurationFields.h.erb +3 -1
  521. data/ext/nginx/ContentHandler.c +393 -362
  522. data/ext/nginx/CreateLocationConfig.c +8 -4
  523. data/ext/nginx/CreateLocationConfig.c.erb +8 -3
  524. data/ext/nginx/MergeLocationConfig.c +36 -6
  525. data/ext/nginx/MergeLocationConfig.c.erb +42 -1
  526. data/ext/nginx/ngx_http_passenger_module.c +28 -15
  527. data/ext/oxt/detail/backtrace_disabled.hpp +2 -1
  528. data/ext/oxt/detail/backtrace_enabled.hpp +15 -2
  529. data/ext/oxt/implementation.cpp +92 -20
  530. data/ext/oxt/thread.hpp +5 -0
  531. data/ext/ruby/extconf.rb +3 -6
  532. data/ext/ruby/passenger_native_support.c +13 -40
  533. data/helper-scripts/download_binaries/extconf.rb +4 -4
  534. data/helper-scripts/meteor-loader.rb +12 -112
  535. data/helper-scripts/node-loader.js +3 -91
  536. data/helper-scripts/rack-loader.rb +13 -14
  537. data/helper-scripts/rack-preloader.rb +16 -17
  538. data/helper-scripts/wsgi-loader.py +11 -7
  539. data/lib/phusion_passenger.rb +100 -79
  540. data/lib/phusion_passenger/abstract_installer.rb +28 -3
  541. data/lib/phusion_passenger/admin_tools.rb +3 -3
  542. data/lib/phusion_passenger/admin_tools/instance.rb +207 -0
  543. data/lib/phusion_passenger/admin_tools/instance_registry.rb +98 -0
  544. data/lib/phusion_passenger/apache2/config_options.rb +72 -22
  545. data/lib/phusion_passenger/common_library.rb +79 -14
  546. data/lib/phusion_passenger/config/about_command.rb +17 -23
  547. data/lib/phusion_passenger/config/admin_command_command.rb +175 -0
  548. data/lib/phusion_passenger/config/agent_compiler.rb +170 -0
  549. data/lib/phusion_passenger/config/command.rb +1 -4
  550. data/lib/phusion_passenger/config/compile_agent_command.rb +102 -0
  551. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +112 -0
  552. data/lib/phusion_passenger/config/detach_process_command.rb +32 -10
  553. data/lib/phusion_passenger/config/download_agent_command.rb +285 -0
  554. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +281 -0
  555. data/lib/phusion_passenger/config/install_agent_command.rb +174 -0
  556. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +231 -0
  557. data/lib/phusion_passenger/config/installation_utils.rb +241 -0
  558. data/lib/phusion_passenger/config/list_instances_command.rb +13 -25
  559. data/lib/phusion_passenger/config/main.rb +43 -14
  560. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +337 -0
  561. data/lib/phusion_passenger/config/reopen_logs_command.rb +110 -0
  562. data/lib/phusion_passenger/config/restart_app_command.rb +61 -14
  563. data/lib/phusion_passenger/config/system_metrics_command.rb +2 -1
  564. data/lib/phusion_passenger/config/utils.rb +64 -39
  565. data/lib/phusion_passenger/config/validate_install_command.rb +2 -2
  566. data/lib/phusion_passenger/constants.rb +27 -6
  567. data/lib/phusion_passenger/debug_logging.rb +32 -15
  568. data/lib/phusion_passenger/loader_shared_helpers.rb +2 -5
  569. data/lib/phusion_passenger/message_client.rb +21 -22
  570. data/lib/phusion_passenger/native_support.rb +26 -31
  571. data/lib/phusion_passenger/nginx/config_options.rb +32 -19
  572. data/lib/phusion_passenger/packaging.rb +7 -3
  573. data/lib/phusion_passenger/platform_info/cxx_portability.rb +1 -2
  574. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +3 -4
  575. data/lib/phusion_passenger/platform_info/operating_system.rb +6 -6
  576. data/lib/phusion_passenger/preloader_shared_helpers.rb +2 -2
  577. data/lib/phusion_passenger/rack/out_of_band_gc.rb +2 -2
  578. data/lib/phusion_passenger/rack/thread_handler_extension.rb +168 -65
  579. data/lib/phusion_passenger/request_handler.rb +47 -82
  580. data/lib/phusion_passenger/request_handler/thread_handler.rb +46 -10
  581. data/lib/phusion_passenger/ruby_core_enhancements.rb +25 -77
  582. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +108 -0
  583. data/lib/phusion_passenger/standalone/app_finder.rb +39 -59
  584. data/lib/phusion_passenger/standalone/command.rb +27 -275
  585. data/lib/phusion_passenger/standalone/command2.rb +292 -0
  586. data/lib/phusion_passenger/standalone/config_utils.rb +87 -0
  587. data/lib/phusion_passenger/standalone/control_utils.rb +88 -0
  588. data/lib/phusion_passenger/standalone/main.rb +69 -71
  589. data/lib/phusion_passenger/standalone/start2_command.rb +799 -0
  590. data/lib/phusion_passenger/standalone/start_command.rb +406 -467
  591. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +167 -0
  592. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +165 -0
  593. data/lib/phusion_passenger/standalone/status_command.rb +64 -23
  594. data/lib/phusion_passenger/standalone/stop_command.rb +69 -32
  595. data/lib/phusion_passenger/standalone/version_command.rb +1 -5
  596. data/lib/phusion_passenger/utils.rb +0 -4
  597. data/lib/phusion_passenger/utils/json.rb +70 -4
  598. data/lib/phusion_passenger/utils/progress_bar.rb +56 -0
  599. data/lib/phusion_passenger/utils/tee_input.rb +3 -3
  600. data/lib/phusion_passenger/utils/unseekable_socket.rb +30 -0
  601. data/packaging/rpm/nginx_spec/nginx.spec.template +4 -3
  602. data/packaging/rpm/passenger_spec/passenger.spec.template +6 -10
  603. data/packaging/rpm/setup-system +2 -1
  604. data/resources/oss-binaries.phusionpassenger.com.crt +208 -0
  605. data/resources/templates/config/agent_compiler/confirm_enable_optimizations.txt.erb +5 -0
  606. data/resources/templates/config/installation_utils/cannot_create_user_support_binaries_dir.txt.erb +15 -0
  607. data/resources/templates/config/installation_utils/download_tool_missing.txt.erb +7 -0
  608. data/resources/templates/config/installation_utils/passenger_not_installed_as_root.txt.erb +12 -0
  609. data/resources/templates/config/installation_utils/support_binaries_dir_not_writable_despite_running_as_root.txt.erb +13 -0
  610. data/resources/templates/config/installation_utils/unexpected_filesystem_problem.txt.erb +16 -0
  611. data/{packaging/debian/debian_specs/passenger/patches/series → resources/templates/config/installation_utils/user_support_binaries_dir_not_writable.txt.erb} +0 -0
  612. data/resources/templates/nginx/nginx_module_sources_not_available.txt.erb +2 -2
  613. data/resources/templates/standalone/config.erb +14 -16
  614. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +1 -1
  615. data/test/.rspec +1 -0
  616. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +20 -17
  617. data/test/cxx/ApplicationPool2/OptionsTest.cpp +0 -14
  618. data/test/cxx/ApplicationPool2/PoolTest.cpp +113 -90
  619. data/test/cxx/ApplicationPool2/ProcessTest.cpp +18 -27
  620. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +51 -53
  621. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +55 -57
  622. data/test/cxx/BufferedIOTest.cpp +40 -40
  623. data/test/cxx/CxxTestMain.cpp +4 -22
  624. data/test/cxx/DataStructures/LStringTest.cpp +275 -0
  625. data/test/cxx/DataStructures/StringKeyTableTest.cpp +199 -0
  626. data/test/cxx/MemoryKit/MbufTest.cpp +213 -0
  627. data/test/cxx/MessageServerTest.cpp +62 -55
  628. data/test/cxx/RequestHandlerTest.cpp +26 -27
  629. data/test/cxx/ServerKit/ChannelTest.cpp +1467 -0
  630. data/test/cxx/ServerKit/FileBufferedChannelTest.cpp +817 -0
  631. data/test/cxx/ServerKit/HeaderTableTest.cpp +171 -0
  632. data/test/cxx/ServerKit/HttpServerTest.cpp +1503 -0
  633. data/test/cxx/ServerKit/ServerTest.cpp +408 -0
  634. data/test/cxx/TestSupport.cpp +51 -15
  635. data/test/cxx/TestSupport.h +31 -21
  636. data/test/cxx/UnionStationTest.cpp +121 -122
  637. data/test/cxx/UtilsTest.cpp +9 -33
  638. data/test/integration_tests/apache2_tests.rb +65 -27
  639. data/test/integration_tests/downloaded_binaries_tests.rb +30 -6
  640. data/test/integration_tests/native_packaging_spec.rb +32 -17
  641. data/test/integration_tests/nginx_tests.rb +28 -10
  642. data/test/integration_tests/shared/example_webapp_tests.rb +40 -27
  643. data/test/integration_tests/standalone_tests.rb +232 -169
  644. data/test/ruby/debug_logging_spec.rb +44 -40
  645. data/test/ruby/rails3.0/preloader_spec.rb +1 -1
  646. data/test/ruby/rails3.1/preloader_spec.rb +1 -1
  647. data/test/ruby/rails3.2/preloader_spec.rb +1 -1
  648. data/test/ruby/rails4.0/preloader_spec.rb +1 -1
  649. data/test/ruby/rails4.1/preloader_spec.rb +1 -1
  650. data/test/ruby/request_handler_spec.rb +62 -24
  651. data/test/ruby/shared/loader_sharedspec.rb +10 -9
  652. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +23 -22
  653. data/test/ruby/spec_helper.rb +2 -11
  654. data/test/ruby/standalone/runtime_installer_spec.rb +15 -13
  655. data/test/ruby/union_station_spec.rb +45 -40
  656. data/test/ruby/utils/tee_input_spec.rb +5 -5
  657. data/test/ruby/utils_spec.rb +3 -39
  658. data/test/stub/apache2/httpd.conf.erb +5 -2
  659. data/test/stub/nginx/nginx.conf.erb +3 -1
  660. data/test/support/apache2_controller.rb +25 -25
  661. data/test/support/nginx_controller.rb +14 -14
  662. data/test/support/test_helper.rb +74 -75
  663. metadata +439 -643
  664. metadata.gz.asc +7 -7
  665. data/ext/common/MultiLibeio.cpp +0 -204
  666. data/ext/common/MultiLibeio.h +0 -67
  667. data/ext/common/ServerInstanceDir.h +0 -402
  668. data/ext/common/Utils/Base64.cpp +0 -143
  669. data/ext/common/Utils/Base64.h +0 -83
  670. data/ext/common/Utils/HttpHeaderBufferer.h +0 -184
  671. data/ext/common/Utils/PriorityQueue.h +0 -54
  672. data/ext/common/Utils/StreamBoyerMooreHorspool.h +0 -512
  673. data/ext/common/Utils/fib.c +0 -699
  674. data/ext/common/Utils/fib.h +0 -101
  675. data/ext/common/Utils/fibpriv.h +0 -67
  676. data/ext/common/agents/EnvPrinter.c +0 -16
  677. data/ext/common/agents/HelperAgent/AgentOptions.h +0 -109
  678. data/ext/common/agents/HelperAgent/FileBackedPipe.h +0 -732
  679. data/ext/common/agents/HelperAgent/RequestHandler.cpp +0 -294
  680. data/ext/common/agents/HelperAgent/ScgiRequestParser.h +0 -457
  681. data/ext/common/agents/LoggingAgent/AdminController.h +0 -96
  682. data/ext/common/agents/SpawnPreparer.cpp +0 -206
  683. data/ext/common/agents/TempDirToucher.c +0 -383
  684. data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +0 -116
  685. data/helper-scripts/classic-rails-loader.rb +0 -166
  686. data/helper-scripts/classic-rails-preloader.rb +0 -193
  687. data/lib/phusion_passenger/admin_tools/server_instance.rb +0 -339
  688. data/lib/phusion_passenger/classic_rails/cgi_fixed.rb +0 -68
  689. data/lib/phusion_passenger/classic_rails/thread_handler_extension.rb +0 -40
  690. data/lib/phusion_passenger/platform_info/openssl.rb +0 -61
  691. data/lib/phusion_passenger/standalone/config_file.rb +0 -119
  692. data/lib/phusion_passenger/standalone/help_command.rb +0 -57
  693. data/lib/phusion_passenger/standalone/runtime_installer.rb +0 -712
  694. data/lib/phusion_passenger/standalone/runtime_locator.rb +0 -170
  695. data/lib/phusion_passenger/standalone/utils.rb +0 -58
  696. data/lib/phusion_passenger/utils/tmpdir.rb +0 -69
  697. data/packaging/debian/LICENSE.md +0 -19
  698. data/packaging/debian/README.md +0 -320
  699. data/packaging/debian/Vagrantfile +0 -25
  700. data/packaging/debian/build +0 -210
  701. data/packaging/debian/debian_specs/nginx/changelog +0 -1989
  702. data/packaging/debian/debian_specs/nginx/compat.erb +0 -5
  703. data/packaging/debian/debian_specs/nginx/conf/fastcgi.conf +0 -25
  704. data/packaging/debian/debian_specs/nginx/conf/fastcgi_params +0 -24
  705. data/packaging/debian/debian_specs/nginx/conf/koi-utf +0 -109
  706. data/packaging/debian/debian_specs/nginx/conf/koi-win +0 -103
  707. data/packaging/debian/debian_specs/nginx/conf/mime.types +0 -89
  708. data/packaging/debian/debian_specs/nginx/conf/nginx.conf.erb +0 -97
  709. data/packaging/debian/debian_specs/nginx/conf/proxy_params +0 -4
  710. data/packaging/debian/debian_specs/nginx/conf/scgi_params +0 -16
  711. data/packaging/debian/debian_specs/nginx/conf/sites-available/default.erb +0 -93
  712. data/packaging/debian/debian_specs/nginx/conf/snippets/fastcgi-php.conf +0 -13
  713. data/packaging/debian/debian_specs/nginx/conf/snippets/snakeoil.conf +0 -5
  714. data/packaging/debian/debian_specs/nginx/conf/uwsgi_params +0 -16
  715. data/packaging/debian/debian_specs/nginx/conf/win-utf +0 -125
  716. data/packaging/debian/debian_specs/nginx/control.erb +0 -226
  717. data/packaging/debian/debian_specs/nginx/copyright +0 -196
  718. data/packaging/debian/debian_specs/nginx/debian-full.lintian-overrides +0 -1
  719. data/packaging/debian/debian_specs/nginx/gbp.conf +0 -2
  720. data/packaging/debian/debian_specs/nginx/help/docs/fcgiwrap +0 -14
  721. data/packaging/debian/debian_specs/nginx/help/docs/php +0 -119
  722. data/packaging/debian/debian_specs/nginx/help/docs/support-irc +0 -28
  723. data/packaging/debian/debian_specs/nginx/help/docs/upstream +0 -51
  724. data/packaging/debian/debian_specs/nginx/help/examples/drupal +0 -114
  725. data/packaging/debian/debian_specs/nginx/help/examples/http +0 -59
  726. data/packaging/debian/debian_specs/nginx/help/examples/mail +0 -30
  727. data/packaging/debian/debian_specs/nginx/help/examples/mailman +0 -59
  728. data/packaging/debian/debian_specs/nginx/help/examples/nginx.conf +0 -34
  729. data/packaging/debian/debian_specs/nginx/help/examples/nginx_modsite +0 -162
  730. data/packaging/debian/debian_specs/nginx/help/examples/virtual_hosts +0 -155
  731. data/packaging/debian/debian_specs/nginx/help/examples/wordpress +0 -74
  732. data/packaging/debian/debian_specs/nginx/helpers.rb +0 -41
  733. data/packaging/debian/debian_specs/nginx/index-debian.html.in +0 -32
  734. data/packaging/debian/debian_specs/nginx/index-ubuntu.html.in +0 -32
  735. data/packaging/debian/debian_specs/nginx/index.html.erb +0 -10
  736. data/packaging/debian/debian_specs/nginx/modules/README.Modules-versions +0 -65
  737. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/README.markdown +0 -510
  738. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/config +0 -5
  739. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/doc/HttpHeadersMoreModule.wiki +0 -395
  740. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ddebug.h +0 -119
  741. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.c +0 -348
  742. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.h +0 -80
  743. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.c +0 -826
  744. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.h +0 -26
  745. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.c +0 -716
  746. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.h +0 -26
  747. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.c +0 -380
  748. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.h +0 -52
  749. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/util/build.sh +0 -32
  750. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/valgrind.suppress +0 -215
  751. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ChangeLog +0 -35
  752. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/LICENSE +0 -25
  753. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/README.md +0 -93
  754. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/config +0 -4
  755. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ngx_http_auth_pam_module.c +0 -462
  756. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/CHANGES +0 -66
  757. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/LICENSE +0 -26
  758. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/README.md +0 -171
  759. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/TODO.md +0 -7
  760. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/config +0 -21
  761. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/ngx_cache_purge_module.c +0 -1803
  762. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/README +0 -29
  763. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/config +0 -9
  764. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/ngx_http_dav_ext_module.c +0 -824
  765. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README +0 -139
  766. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README_AUTO_LIB +0 -395
  767. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/TODO +0 -1
  768. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/array +0 -10
  769. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/palloc +0 -8
  770. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/build +0 -597
  771. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_replacements +0 -5
  772. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_types +0 -12
  773. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_args +0 -22
  774. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_locs +0 -25
  775. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_macros +0 -35
  776. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/contexts +0 -22
  777. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/header_files +0 -3
  778. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/headers +0 -4
  779. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/module_dependencies +0 -5
  780. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/modules_optional +0 -15
  781. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/prefixes +0 -2
  782. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/array.h +0 -7
  783. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_cmd_basic.h +0 -43
  784. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_merge.h +0 -78
  785. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/palloc.h +0 -6
  786. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/text/autogen +0 -12
  787. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/config +0 -49
  788. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/action_macros +0 -63
  789. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/conf_cmds +0 -62
  790. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/modules/set_var +0 -124
  791. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/patches/more_logging_info +0 -48
  792. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/upstream/list +0 -45
  793. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/README +0 -12
  794. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/config +0 -4
  795. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/ngx_http_set_var_examples_module.c +0 -136
  796. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/ngx_auto_lib_core +0 -797
  797. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/CHANGES +0 -17
  798. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/LICENSE +0 -24
  799. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_array.h +0 -113
  800. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_basic.h +0 -2203
  801. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_extra.h +0 -5423
  802. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_merge.h +0 -227
  803. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.c +0 -72
  804. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.h +0 -98
  805. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_includes.h +0 -66
  806. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_palloc.h +0 -112
  807. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/auto_config +0 -16
  808. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/expose_rewrite_functions +0 -291
  809. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/rewrite_phase_handler +0 -19
  810. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/md5.h +0 -117
  811. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/murmurhash2.c +0 -77
  812. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/sha.h +0 -200
  813. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.c +0 -155
  814. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.h +0 -58
  815. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.c +0 -43
  816. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.h +0 -5
  817. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.c +0 -129
  818. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.h +0 -30
  819. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.c +0 -192
  820. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.h +0 -21
  821. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.c +0 -396
  822. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.h +0 -44
  823. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.c +0 -72
  824. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.h +0 -171
  825. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.c +0 -57
  826. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.h +0 -12
  827. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.c +0 -82
  828. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.h +0 -45
  829. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.c +0 -138
  830. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.h +0 -3
  831. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http_headers.h +0 -35
  832. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.c +0 -3
  833. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.h +0 -165
  834. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_parse.h +0 -67
  835. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.c +0 -583
  836. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.h +0 -22
  837. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.c +0 -20
  838. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.h +0 -12
  839. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.c +0 -215
  840. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.h +0 -7
  841. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.c +0 -103
  842. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.h +0 -26
  843. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.c +0 -602
  844. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.h +0 -44
  845. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.c +0 -434
  846. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.h +0 -37
  847. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string_util.h +0 -14
  848. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.c +0 -205
  849. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.h +0 -27
  850. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.c +0 -45
  851. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.h +0 -6
  852. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/LICENSE +0 -25
  853. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/README.markdown +0 -1850
  854. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/config +0 -5
  855. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/doc/HttpEchoModule.wiki +0 -1558
  856. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ddebug.h +0 -109
  857. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.c +0 -344
  858. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.h +0 -25
  859. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.c +0 -282
  860. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.h +0 -15
  861. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.c +0 -183
  862. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.h +0 -16
  863. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.c +0 -429
  864. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.h +0 -18
  865. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.c +0 -178
  866. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.h +0 -13
  867. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.c +0 -667
  868. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.h +0 -137
  869. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.c +0 -452
  870. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.h +0 -31
  871. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.c +0 -208
  872. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.h +0 -16
  873. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.c +0 -788
  874. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.h +0 -19
  875. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.c +0 -96
  876. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.h +0 -13
  877. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.c +0 -298
  878. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.h +0 -58
  879. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.c +0 -110
  880. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.h +0 -9
  881. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/build.sh +0 -45
  882. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/releng +0 -8
  883. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/wiki2pod.pl +0 -131
  884. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/valgrind.suppress +0 -38
  885. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/LICENCE +0 -24
  886. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/README +0 -206
  887. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/changelog.txt +0 -54
  888. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/config +0 -26
  889. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/protocol.txt +0 -191
  890. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.c +0 -59
  891. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.h +0 -73
  892. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.c +0 -783
  893. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.h +0 -31
  894. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module_setup.c +0 -361
  895. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_types.h +0 -120
  896. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.c +0 -1180
  897. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.h +0 -1
  898. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.c +0 -146
  899. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.h +0 -5
  900. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_store.h +0 -51
  901. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.c +0 -178
  902. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.h +0 -5
  903. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.c +0 -246
  904. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.h +0 -9
  905. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/Changes +0 -51
  906. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/README.markdown +0 -6954
  907. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/config +0 -363
  908. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/doc/HttpLuaModule.wiki +0 -5898
  909. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/dtrace/ngx_lua_provider.d +0 -61
  910. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/Makefile +0 -3
  911. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/lib/RecvUntil.pm +0 -138
  912. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/t/sanity.t +0 -140
  913. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/api/ngx_http_lua_api.h +0 -52
  914. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ddebug.h +0 -82
  915. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.c +0 -377
  916. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.h +0 -22
  917. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_api.c +0 -77
  918. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.c +0 -537
  919. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.h +0 -20
  920. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.c +0 -632
  921. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.h +0 -31
  922. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.c +0 -296
  923. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.h +0 -24
  924. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.c +0 -175
  925. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.h +0 -20
  926. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.c +0 -887
  927. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.h +0 -22
  928. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_common.h +0 -478
  929. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.c +0 -67
  930. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.h +0 -19
  931. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.c +0 -148
  932. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.h +0 -20
  933. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.c +0 -369
  934. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.h +0 -26
  935. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.c +0 -483
  936. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.h +0 -20
  937. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.c +0 -379
  938. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.h +0 -23
  939. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.c +0 -216
  940. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.h +0 -23
  941. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.c +0 -1081
  942. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.h +0 -56
  943. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.c +0 -58
  944. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.h +0 -33
  945. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.c +0 -302
  946. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.h +0 -29
  947. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.c +0 -1370
  948. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.h +0 -22
  949. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.c +0 -782
  950. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.h +0 -22
  951. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.c +0 -625
  952. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.h +0 -23
  953. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.c +0 -42
  954. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.h +0 -23
  955. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.c +0 -320
  956. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.h +0 -25
  957. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.c +0 -300
  958. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.h +0 -20
  959. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.c +0 -227
  960. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.h +0 -22
  961. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.c +0 -252
  962. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.h +0 -20
  963. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_module.c +0 -924
  964. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.c +0 -184
  965. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.h +0 -21
  966. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.c +0 -794
  967. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.h +0 -28
  968. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.c +0 -106
  969. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.h +0 -23
  970. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.c +0 -94
  971. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.h +0 -13
  972. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_probe.h +0 -85
  973. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.c +0 -2468
  974. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.h +0 -22
  975. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.c +0 -1169
  976. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.h +0 -20
  977. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.c +0 -252
  978. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.h +0 -19
  979. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.c +0 -351
  980. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.h +0 -22
  981. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.c +0 -538
  982. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.h +0 -86
  983. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.c +0 -216
  984. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.h +0 -15
  985. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.c +0 -1844
  986. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.h +0 -52
  987. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.c +0 -191
  988. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.h +0 -20
  989. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.c +0 -5314
  990. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.h +0 -156
  991. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.c +0 -1624
  992. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.h +0 -56
  993. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.c +0 -704
  994. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.h +0 -20
  995. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.c +0 -1741
  996. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.h +0 -46
  997. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.c +0 -278
  998. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.h +0 -21
  999. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.c +0 -661
  1000. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.h +0 -20
  1001. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.c +0 -110
  1002. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.h +0 -20
  1003. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.c +0 -283
  1004. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.h +0 -36
  1005. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.c +0 -3972
  1006. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.h +0 -423
  1007. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.c +0 -499
  1008. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.h +0 -20
  1009. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.c +0 -64
  1010. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.h +0 -17
  1011. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/tapset/ngx_lua.stp +0 -5
  1012. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build.sh +0 -39
  1013. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build2.sh +0 -55
  1014. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/fix-comments +0 -27
  1015. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/gdbinit +0 -415
  1016. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/ngx-links +0 -62
  1017. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/reindex +0 -64
  1018. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/releng +0 -8
  1019. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/retab +0 -8
  1020. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/revim +0 -102
  1021. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/run_test.sh +0 -10
  1022. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/update-readme.sh +0 -4
  1023. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/valgrind.suppress +0 -144
  1024. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/CHANGES +0 -107
  1025. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/LICENSE +0 -25
  1026. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/Makefile +0 -8
  1027. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/README +0 -329
  1028. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/config +0 -3
  1029. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/ngx_http_uploadprogress_module.c +0 -1774
  1030. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/README +0 -53
  1031. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/config +0 -3
  1032. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/ngx_http_upstream_fair_module.c +0 -1356
  1033. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/CHANGELOG.md +0 -37
  1034. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/HACKING.md +0 -24
  1035. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/LICENSE +0 -20
  1036. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/README.rst +0 -182
  1037. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/config +0 -8
  1038. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/nginx-0.6-support.patch +0 -23
  1039. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/ngx_http_fancyindex_module.c +0 -1305
  1040. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.awk +0 -52
  1041. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.h +0 -103
  1042. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.html +0 -102
  1043. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/CHANGES +0 -37
  1044. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/README +0 -141
  1045. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/config +0 -3
  1046. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.google_code_home_page.wiki +0 -120
  1047. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.html +0 -199
  1048. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.wiki +0 -123
  1049. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/ngx_http_subs_filter_module.c +0 -1298
  1050. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/README +0 -275
  1051. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/AutoInstall.pm +0 -820
  1052. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install.pm +0 -470
  1053. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/AutoInstall.pm +0 -82
  1054. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Base.pm +0 -83
  1055. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Can.pm +0 -81
  1056. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Fetch.pm +0 -93
  1057. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Include.pm +0 -34
  1058. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Makefile.pm +0 -415
  1059. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Metadata.pm +0 -716
  1060. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/TestBase.pm +0 -29
  1061. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Win32.pm +0 -64
  1062. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/WriteAll.pm +0 -63
  1063. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Spiffy.pm +0 -539
  1064. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base.pm +0 -682
  1065. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base/Filter.pm +0 -341
  1066. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder.pm +0 -1413
  1067. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder/Module.pm +0 -81
  1068. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/More.pm +0 -735
  1069. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx.pm +0 -315
  1070. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/LWP.pm +0 -524
  1071. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Socket.pm +0 -1749
  1072. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Util.pm +0 -874
  1073. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs.t +0 -136
  1074. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_capture.t +0 -32
  1075. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_fix_string.t +0 -32
  1076. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_regex.t +0 -108
  1077. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_types.t +0 -59
  1078. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/test.sh +0 -5
  1079. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/update-readme.sh +0 -7
  1080. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2google_code_homepage.pl +0 -29
  1081. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2pod.pl +0 -129
  1082. data/packaging/debian/debian_specs/nginx/nginx-common.NEWS +0 -135
  1083. data/packaging/debian/debian_specs/nginx/nginx-common.README.Debian +0 -45
  1084. data/packaging/debian/debian_specs/nginx/nginx-common.dirs.erb +0 -32
  1085. data/packaging/debian/debian_specs/nginx/nginx-common.install +0 -3
  1086. data/packaging/debian/debian_specs/nginx/nginx-common.lintian-overrides +0 -2
  1087. data/packaging/debian/debian_specs/nginx/nginx-common.manpages +0 -1
  1088. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.default +0 -10
  1089. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.init.erb +0 -214
  1090. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.logrotate +0 -18
  1091. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.service.erb +0 -37
  1092. data/packaging/debian/debian_specs/nginx/nginx-common.postinst.erb +0 -66
  1093. data/packaging/debian/debian_specs/nginx/nginx-common.postrm.erb +0 -46
  1094. data/packaging/debian/debian_specs/nginx/nginx-common.preinst +0 -47
  1095. data/packaging/debian/debian_specs/nginx/nginx-common.prerm.erb +0 -28
  1096. data/packaging/debian/debian_specs/nginx/nginx-doc.docs +0 -2
  1097. data/packaging/debian/debian_specs/nginx/nginx-doc.examples +0 -1
  1098. data/packaging/debian/debian_specs/nginx/nginx-extras.install.erb +0 -17
  1099. data/packaging/debian/debian_specs/nginx/nginx-extras.lintian-overrides +0 -1
  1100. data/packaging/debian/debian_specs/nginx/nginx-extras.postinst.erb +0 -44
  1101. data/packaging/debian/debian_specs/nginx/nginx-extras.prerm +0 -22
  1102. data/packaging/debian/debian_specs/nginx/nginx.1 +0 -47
  1103. data/packaging/debian/debian_specs/nginx/patches/perl-use-dpkg-buildflags.patch +0 -23
  1104. data/packaging/debian/debian_specs/nginx/patches/series +0 -1
  1105. data/packaging/debian/debian_specs/nginx/rules.erb +0 -185
  1106. data/packaging/debian/debian_specs/nginx/source/format +0 -1
  1107. data/packaging/debian/debian_specs/nginx/tests/control +0 -4
  1108. data/packaging/debian/debian_specs/nginx/ufw/nginx +0 -14
  1109. data/packaging/debian/debian_specs/nginx/upstream/signing-key.asc +0 -34
  1110. data/packaging/debian/debian_specs/nginx/watch +0 -3
  1111. data/packaging/debian/debian_specs/passenger/README.Debian +0 -12
  1112. data/packaging/debian/debian_specs/passenger/changelog +0 -316
  1113. data/packaging/debian/debian_specs/passenger/compat +0 -1
  1114. data/packaging/debian/debian_specs/passenger/control.erb +0 -123
  1115. data/packaging/debian/debian_specs/passenger/copyright +0 -385
  1116. data/packaging/debian/debian_specs/passenger/helpers.rb +0 -24
  1117. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.install +0 -3
  1118. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.postinst +0 -36
  1119. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.prerm +0 -15
  1120. data/packaging/debian/debian_specs/passenger/locations.ini.erb +0 -14
  1121. data/packaging/debian/debian_specs/passenger/passenger-dev.install.erb +0 -3
  1122. data/packaging/debian/debian_specs/passenger/passenger-doc.install.erb +0 -2
  1123. data/packaging/debian/debian_specs/passenger/passenger.conf +0 -6
  1124. data/packaging/debian/debian_specs/passenger/passenger.docs +0 -4
  1125. data/packaging/debian/debian_specs/passenger/passenger.install.erb +0 -16
  1126. data/packaging/debian/debian_specs/passenger/passenger.load +0 -3
  1127. data/packaging/debian/debian_specs/passenger/passenger.manpages +0 -3
  1128. data/packaging/debian/debian_specs/passenger/passenger_free_ruby.c +0 -29
  1129. data/packaging/debian/debian_specs/passenger/passenger_ruby_utils.c +0 -54
  1130. data/packaging/debian/debian_specs/passenger/passenger_system_ruby.c.erb +0 -37
  1131. data/packaging/debian/debian_specs/passenger/rules.erb +0 -84
  1132. data/packaging/debian/debian_specs/passenger/source/format +0 -1
  1133. data/packaging/debian/debian_specs/passenger_enterprise/README.Debian +0 -12
  1134. data/packaging/debian/debian_specs/passenger_enterprise/changelog +0 -316
  1135. data/packaging/debian/debian_specs/passenger_enterprise/compat +0 -1
  1136. data/packaging/debian/debian_specs/passenger_enterprise/control.erb +0 -123
  1137. data/packaging/debian/debian_specs/passenger_enterprise/copyright +0 -385
  1138. data/packaging/debian/debian_specs/passenger_enterprise/helpers.rb +0 -2
  1139. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.install +0 -3
  1140. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.postinst +0 -36
  1141. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.prerm +0 -15
  1142. data/packaging/debian/debian_specs/passenger_enterprise/locations.ini.erb +0 -14
  1143. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-dev.install.erb +0 -3
  1144. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-doc.install.erb +0 -2
  1145. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.docs +0 -4
  1146. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.install.erb +0 -14
  1147. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.manpages +0 -3
  1148. data/packaging/debian/debian_specs/passenger_enterprise/passenger.conf +0 -6
  1149. data/packaging/debian/debian_specs/passenger_enterprise/passenger.load +0 -3
  1150. data/packaging/debian/debian_specs/passenger_enterprise/passenger_free_ruby.c.erb +0 -1
  1151. data/packaging/debian/debian_specs/passenger_enterprise/passenger_ruby_utils.c.erb +0 -1
  1152. data/packaging/debian/debian_specs/passenger_enterprise/passenger_system_ruby.c.erb +0 -1
  1153. data/packaging/debian/debian_specs/passenger_enterprise/patches/series +0 -0
  1154. data/packaging/debian/debian_specs/passenger_enterprise/rules.erb +0 -84
  1155. data/packaging/debian/debian_specs/passenger_enterprise/source/format +0 -1
  1156. data/packaging/debian/docker_images/Makefile +0 -38
  1157. data/packaging/debian/docker_images/buildbox/CONTAINER_VERSION.txt +0 -0
  1158. data/packaging/debian/docker_images/buildbox/Dockerfile +0 -3
  1159. data/packaging/debian/docker_images/buildbox/Gemfile +0 -9
  1160. data/packaging/debian/docker_images/buildbox/Gemfile.lock +0 -42
  1161. data/packaging/debian/docker_images/buildbox/install.sh +0 -85
  1162. data/packaging/debian/docker_images/buildbox/pbuilderrc +0 -4
  1163. data/packaging/debian/docker_images/buildbox/sudoers.conf +0 -6
  1164. data/packaging/debian/docker_images/setup-buildbox-docker-image +0 -7
  1165. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-6 +0 -7
  1166. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-7 +0 -7
  1167. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-8 +0 -7
  1168. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-12.04 +0 -7
  1169. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-14.04 +0 -7
  1170. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.04 +0 -7
  1171. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.10 +0 -7
  1172. data/packaging/debian/docker_images/testbox-debian-6/Dockerfile +0 -3
  1173. data/packaging/debian/docker_images/testbox-debian-6/Gemfile +0 -2
  1174. data/packaging/debian/docker_images/testbox-debian-6/Gemfile.lock +0 -23
  1175. data/packaging/debian/docker_images/testbox-debian-6/argparse.py +0 -2374
  1176. data/packaging/debian/docker_images/testbox-debian-6/install.sh +0 -78
  1177. data/packaging/debian/docker_images/testbox-debian-7/Dockerfile +0 -3
  1178. data/packaging/debian/docker_images/testbox-debian-7/Gemfile +0 -2
  1179. data/packaging/debian/docker_images/testbox-debian-7/Gemfile.lock +0 -23
  1180. data/packaging/debian/docker_images/testbox-debian-7/install.sh +0 -71
  1181. data/packaging/debian/docker_images/testbox-debian-8/Dockerfile +0 -3
  1182. data/packaging/debian/docker_images/testbox-debian-8/Gemfile +0 -2
  1183. data/packaging/debian/docker_images/testbox-debian-8/Gemfile.lock +0 -23
  1184. data/packaging/debian/docker_images/testbox-debian-8/install.sh +0 -70
  1185. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Dockerfile +0 -3
  1186. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile +0 -2
  1187. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile.lock +0 -23
  1188. data/packaging/debian/docker_images/testbox-ubuntu-12.04/install.sh +0 -69
  1189. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Dockerfile +0 -3
  1190. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile +0 -2
  1191. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile.lock +0 -23
  1192. data/packaging/debian/docker_images/testbox-ubuntu-14.04/install.sh +0 -69
  1193. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Dockerfile +0 -3
  1194. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile +0 -2
  1195. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile.lock +0 -23
  1196. data/packaging/debian/docker_images/testbox-ubuntu-15.04/install.sh +0 -69
  1197. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Dockerfile +0 -3
  1198. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile +0 -2
  1199. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile.lock +0 -23
  1200. data/packaging/debian/docker_images/testbox-ubuntu-15.10/install.sh +0 -69
  1201. data/packaging/debian/internal/build/Rakefile +0 -235
  1202. data/packaging/debian/internal/build/build-passenger-orig-tarball.sh +0 -76
  1203. data/packaging/debian/internal/build/build-source-package.rb +0 -121
  1204. data/packaging/debian/internal/build/download-nginx-orig-tarball.sh +0 -17
  1205. data/packaging/debian/internal/build/rakefile_support.rb +0 -96
  1206. data/packaging/debian/internal/build/setup-environment-essentials.sh +0 -15
  1207. data/packaging/debian/internal/build/setup-environment.sh +0 -29
  1208. data/packaging/debian/internal/lib/distro_info.rb +0 -82
  1209. data/packaging/debian/internal/lib/distro_info.sh +0 -303
  1210. data/packaging/debian/internal/lib/distro_info.sh.erb +0 -65
  1211. data/packaging/debian/internal/lib/library.sh +0 -83
  1212. data/packaging/debian/internal/lib/preprocessor.rb +0 -173
  1213. data/packaging/debian/internal/lib/tracking.rb +0 -95
  1214. data/packaging/debian/internal/lib/tracking_category.rb +0 -45
  1215. data/packaging/debian/internal/lib/tracking_database.rb +0 -132
  1216. data/packaging/debian/internal/lib/tracking_task.rb +0 -148
  1217. data/packaging/debian/internal/lib/utils.rb +0 -78
  1218. data/packaging/debian/internal/publish/Rakefile +0 -97
  1219. data/packaging/debian/internal/publish/oss-binaries.phusionpassenger.com-fingerprint.txt +0 -1
  1220. data/packaging/debian/internal/publish/packagecloud_fingerprint.txt +0 -1
  1221. data/packaging/debian/internal/publish/passenger_website_fingerprint.txt +0 -1
  1222. data/packaging/debian/internal/publish/preinit.sh +0 -7
  1223. data/packaging/debian/internal/publish/rakefile_support.rb +0 -183
  1224. data/packaging/debian/internal/scripts/gpg_noninteractive/gpg +0 -11
  1225. data/packaging/debian/internal/scripts/initccache.sh +0 -35
  1226. data/packaging/debian/internal/scripts/inituidgid.sh +0 -19
  1227. data/packaging/debian/internal/scripts/my_init +0 -340
  1228. data/packaging/debian/internal/scripts/pin_certificates +0 -34
  1229. data/packaging/debian/internal/scripts/regen_distro_info_script.sh +0 -3
  1230. data/packaging/debian/internal/scripts/setup-vagrant.sh +0 -12
  1231. data/packaging/debian/internal/scripts/setuser +0 -31
  1232. data/packaging/debian/internal/shell/initpbuilder.sh +0 -3
  1233. data/packaging/debian/internal/shell/preinit.sh +0 -28
  1234. data/packaging/debian/internal/shell/sudoers.conf +0 -1
  1235. data/packaging/debian/internal/test/apache/apache-24.conf +0 -5
  1236. data/packaging/debian/internal/test/apache/apache-pre-24.conf +0 -4
  1237. data/packaging/debian/internal/test/apache/vhost.conf +0 -17
  1238. data/packaging/debian/internal/test/misc/config.json +0 -15
  1239. data/packaging/debian/internal/test/misc/hosts.conf +0 -4
  1240. data/packaging/debian/internal/test/misc/init.sh +0 -25
  1241. data/packaging/debian/internal/test/misc/nodejs_test_app.js +0 -6
  1242. data/packaging/debian/internal/test/misc/python_test_app.py +0 -3
  1243. data/packaging/debian/internal/test/misc/ruby_test_app.rb +0 -5
  1244. data/packaging/debian/internal/test/misc/test_support.rb +0 -61
  1245. data/packaging/debian/internal/test/nginx/vhost.conf +0 -23
  1246. data/packaging/debian/internal/test/system_web_server_test.rb +0 -126
  1247. data/packaging/debian/internal/test/test.sh +0 -141
  1248. data/packaging/debian/jenkins/publish/clear_caches.rb +0 -48
  1249. data/packaging/debian/jenkins/publish/publish.sh +0 -69
  1250. data/packaging/debian/jenkins/test/test.sh +0 -63
  1251. data/packaging/debian/passenger_apt_automation.sublime-project +0 -14
  1252. data/packaging/debian/publish +0 -172
  1253. data/packaging/debian/shell +0 -116
  1254. data/packaging/debian/test +0 -142
  1255. data/packaging/rpm/passenger_spec/rubygem-passenger-4.0.18-gcc47-include-sys_types.patch +0 -45
  1256. data/test/cxx/Base64Test.cpp +0 -50
  1257. data/test/cxx/FileBackedPipeTest.cpp +0 -626
  1258. data/test/cxx/HttpHeaderBuffererTest.cpp +0 -257
  1259. data/test/cxx/ScgiRequestParserTest.cpp +0 -423
  1260. data/test/cxx/ServerInstanceDirTest.cpp +0 -175
  1261. data/test/ruby/admin_tools_spec.rb +0 -360
  1262. data/test/ruby/classic_rails/loader_spec.rb +0 -46
  1263. data/test/ruby/classic_rails/preloader_spec.rb +0 -52
  1264. data/test/ruby/standalone/runtime_locator_spec.rb +0 -214
  1265. data/test/stub/rails2.3/Rakefile +0 -10
  1266. data/test/stub/rails2.3/app/controllers/application_controller.rb +0 -10
  1267. data/test/stub/rails2.3/app/controllers/bar_controller_1.rb +0 -5
  1268. data/test/stub/rails2.3/app/controllers/bar_controller_2.rb +0 -5
  1269. data/test/stub/rails2.3/app/controllers/foo_controller.rb +0 -21
  1270. data/test/stub/rails2.3/app/helpers/application_helper.rb +0 -3
  1271. data/test/stub/rails2.3/app/helpers/bar_helper.rb +0 -2
  1272. data/test/stub/rails2.3/app/helpers/foo_helper.rb +0 -2
  1273. data/test/stub/rails2.3/config/boot.rb +0 -110
  1274. data/test/stub/rails2.3/config/database.yml +0 -19
  1275. data/test/stub/rails2.3/config/environment.rb +0 -62
  1276. data/test/stub/rails2.3/config/environments/development.rb +0 -17
  1277. data/test/stub/rails2.3/config/environments/production.rb +0 -18
  1278. data/test/stub/rails2.3/config/environments/staging.rb +0 -18
  1279. data/test/stub/rails2.3/config/initializers/inflections.rb +0 -10
  1280. data/test/stub/rails2.3/config/initializers/mime_types.rb +0 -5
  1281. data/test/stub/rails2.3/config/routes.rb +0 -35
  1282. data/test/stub/rails2.3/log/.gitignore +0 -1
  1283. data/test/stub/rails2.3/public/.gitignore +0 -1
  1284. data/test/stub/rails2.3/script/about +0 -3
  1285. data/test/stub/rails2.3/script/console +0 -3
  1286. data/test/stub/rails2.3/script/dbconsole +0 -3
  1287. data/test/stub/rails2.3/script/destroy +0 -3
  1288. data/test/stub/rails2.3/script/generate +0 -3
  1289. data/test/stub/rails2.3/script/performance/benchmarker +0 -3
  1290. data/test/stub/rails2.3/script/performance/profiler +0 -3
  1291. data/test/stub/rails2.3/script/performance/request +0 -3
  1292. data/test/stub/rails2.3/script/plugin +0 -3
  1293. data/test/stub/rails2.3/script/process/inspector +0 -3
  1294. data/test/stub/rails2.3/script/process/reaper +0 -3
  1295. data/test/stub/rails2.3/script/process/spawner +0 -3
  1296. data/test/stub/rails2.3/script/runner +0 -3
  1297. data/test/stub/rails2.3/script/server +0 -3
  1298. data/test/stub/rails2.3/tmp/cache/.gitignore +0 -1
  1299. data/test/stub/rails2.3/tmp/pids/.gitignore +0 -1
  1300. data/test/stub/rails2.3/tmp/sessions/.gitignore +0 -1
  1301. data/test/stub/rails2.3/tmp/sockets/.gitignore +0 -1
@@ -23,6 +23,15 @@
23
23
  * THE SOFTWARE.
24
24
  */
25
25
 
26
+ #ifndef _GNU_SOURCE
27
+ #define _GNU_SOURCE
28
+ #endif
29
+ #ifdef __linux__
30
+ #define SUPPORTS_PER_THREAD_CPU_AFFINITY
31
+ #include <sched.h>
32
+ #include <pthread.h>
33
+ #endif
34
+
26
35
  #include <sys/types.h>
27
36
  #include <sys/socket.h>
28
37
  #include <sys/stat.h>
@@ -33,43 +42,45 @@
33
42
  #include <stdlib.h>
34
43
  #include <unistd.h>
35
44
  #include <limits.h>
45
+ #include <fcntl.h>
36
46
  #include <pwd.h>
37
47
  #include <grp.h>
38
48
 
39
49
  #include <set>
40
50
  #include <vector>
41
51
  #include <string>
52
+ #include <algorithm>
42
53
  #include <iostream>
43
54
  #include <sstream>
44
55
 
45
56
  #include <boost/thread.hpp>
46
57
  #include <boost/shared_ptr.hpp>
47
58
  #include <boost/make_shared.hpp>
59
+ #include <boost/atomic.hpp>
48
60
  #include <oxt/thread.hpp>
49
61
  #include <oxt/system_calls.hpp>
50
62
 
51
63
  #include <ev++.h>
52
64
 
65
+ #include <agents/HelperAgent/OptionParser.h>
53
66
  #include <agents/HelperAgent/RequestHandler.h>
54
- #include <agents/HelperAgent/RequestHandler.cpp>
55
- #include <agents/HelperAgent/AgentOptions.h>
56
- #include <agents/HelperAgent/SystemMetricsTool.cpp>
57
-
67
+ #include <agents/HelperAgent/AdminServer.h>
58
68
  #include <agents/Base.h>
59
69
  #include <Constants.h>
70
+ #include <ServerKit/Server.h>
71
+ #include <ServerKit/AcceptLoadBalancer.h>
60
72
  #include <ApplicationPool2/Pool.h>
61
73
  #include <MessageServer.h>
62
74
  #include <MessageReadersWriters.h>
63
75
  #include <FileDescriptor.h>
64
76
  #include <ResourceLocator.h>
65
77
  #include <BackgroundEventLoop.cpp>
66
- #include <ServerInstanceDir.h>
67
78
  #include <UnionStation/Core.h>
68
79
  #include <Exceptions.h>
69
- #include <MultiLibeio.cpp>
70
80
  #include <Utils.h>
71
81
  #include <Utils/Timer.h>
72
82
  #include <Utils/IOUtils.h>
83
+ #include <Utils/json.h>
73
84
  #include <Utils/MessageIO.h>
74
85
  #include <Utils/VariantMap.h>
75
86
 
@@ -79,584 +90,985 @@ using namespace Passenger;
79
90
  using namespace Passenger::ApplicationPool2;
80
91
 
81
92
 
82
- class RemoteController: public MessageServer::Handler {
83
- private:
84
- struct SpecificContext: public MessageServer::ClientContext {
85
- };
93
+ /***** Structures, constants, global variables and forward declarations *****/
86
94
 
87
- typedef MessageServer::CommonClientContext CommonClientContext;
95
+ namespace Passenger {
96
+ namespace ServerAgent {
97
+ struct ThreadWorkingObjects {
98
+ BackgroundEventLoop *bgloop;
99
+ ServerKit::Context *serverKitContext;
100
+ RequestHandler *requestHandler;
88
101
 
89
- boost::shared_ptr<RequestHandler> requestHandler;
90
- PoolPtr pool;
102
+ ThreadWorkingObjects()
103
+ : bgloop(NULL),
104
+ serverKitContext(NULL),
105
+ requestHandler(NULL)
106
+ { }
107
+ };
91
108
 
109
+ struct AdminWorkingObjects {
110
+ BackgroundEventLoop *bgloop;
111
+ ServerKit::Context *serverKitContext;
112
+ AdminServer *adminServer;
92
113
 
93
- /*********************************************
94
- * Message handler methods
95
- *********************************************/
114
+ AdminWorkingObjects()
115
+ : bgloop(NULL),
116
+ serverKitContext(NULL),
117
+ adminServer(NULL)
118
+ { }
119
+ };
96
120
 
97
- void processDetachProcess(CommonClientContext &commonContext, SpecificContext *specificContext,
98
- const vector<string> &args)
99
- {
100
- TRACE_POINT();
101
- commonContext.requireRights(Account::DETACH);
102
- if (pool->detachProcess((pid_t) atoi(args[1]))) {
103
- writeArrayMessage(commonContext.fd, "true", NULL);
104
- } else {
105
- writeArrayMessage(commonContext.fd, "false", NULL);
121
+ struct WorkingObjects {
122
+ int serverFds[SERVER_KIT_MAX_SERVER_ENDPOINTS];
123
+ int adminServerFds[SERVER_KIT_MAX_SERVER_ENDPOINTS];
124
+ string password;
125
+ vector<ServerAgent::AdminServer::Authorization> adminAuthorizations;
126
+
127
+ ResourceLocator resourceLocator;
128
+ RandomGeneratorPtr randomGenerator;
129
+ UnionStation::CorePtr unionStationCore;
130
+ SpawnerConfigPtr spawnerConfig;
131
+ SpawnerFactoryPtr spawnerFactory;
132
+ PoolPtr appPool;
133
+
134
+ ServerKit::AcceptLoadBalancer<RequestHandler> loadBalancer;
135
+ vector<ThreadWorkingObjects> threadWorkingObjects;
136
+ struct ev_signal sigintWatcher;
137
+ struct ev_signal sigtermWatcher;
138
+ struct ev_signal sigquitWatcher;
139
+
140
+ AdminWorkingObjects adminWorkingObjects;
141
+
142
+ EventFd exitEvent;
143
+ EventFd allClientsDisconnectedEvent;
144
+ unsigned int terminationCount;
145
+ boost::atomic<unsigned int> shutdownCounter;
146
+ oxt::thread *prestarterThread;
147
+
148
+ WorkingObjects()
149
+ : terminationCount(0),
150
+ shutdownCounter(0)
151
+ {
152
+ for (unsigned int i = 0; i < SERVER_KIT_MAX_SERVER_ENDPOINTS; i++) {
153
+ serverFds[i] = -1;
154
+ adminServerFds[i] = -1;
155
+ }
106
156
  }
107
- }
157
+ };
158
+ } // namespace ServerAgent
159
+ } // namespace Passenger
108
160
 
109
- void processDetachProcessByKey(CommonClientContext &commonContext, SpecificContext *specificContext,
110
- const vector<string> &args)
111
- {
112
- TRACE_POINT();
113
- commonContext.requireRights(Account::DETACH);
114
- // TODO: implement this
115
- writeArrayMessage(commonContext.fd, "false", NULL);
116
- }
161
+ using namespace Passenger::ServerAgent;
117
162
 
118
- bool processInspect(CommonClientContext &commonContext, SpecificContext *specificContext,
119
- const vector<string> &args)
120
- {
121
- TRACE_POINT();
122
- commonContext.requireRights(Account::INSPECT_BASIC_INFO);
123
- if ((args.size() - 1) % 2 != 0) {
124
- return false;
125
- }
163
+ static VariantMap *agentsOptions;
164
+ static WorkingObjects *workingObjects;
126
165
 
127
- VariantMap options = argsToOptions(args);
128
- writeScalarMessage(commonContext.fd, pool->inspect(Pool::InspectOptions(options)));
129
- return true;
130
- }
131
166
 
132
- void processToXml(CommonClientContext &commonContext, SpecificContext *specificContext,
133
- const vector<string> &args)
134
- {
135
- TRACE_POINT();
136
- commonContext.requireRights(Account::INSPECT_BASIC_INFO);
137
- bool includeSensitiveInfo =
138
- commonContext.account->hasRights(Account::INSPECT_SENSITIVE_INFO) &&
139
- args[1] == "true";
140
- writeScalarMessage(commonContext.fd, pool->toXml(includeSensitiveInfo));
141
- }
167
+ /***** Server stuff *****/
142
168
 
143
- void processBacktraces(CommonClientContext &commonContext, SpecificContext *specificContext,
144
- const vector<string> &args)
145
- {
146
- TRACE_POINT();
147
- commonContext.requireRights(Account::INSPECT_BACKTRACES);
148
- writeScalarMessage(commonContext.fd, oxt::thread::all_backtraces());
149
- }
169
+ static void waitForExitEvent();
170
+ static void cleanup();
171
+ static void deletePidFile();
172
+ static void abortLongRunningConnections(const ApplicationPool2::ProcessPtr &process);
173
+ static void requestHandlerShutdownFinished(RequestHandler *server);
174
+ static void adminServerShutdownFinished(ServerAgent::AdminServer *server);
175
+ static void printInfoInThread();
150
176
 
151
- void processRestartAppGroup(CommonClientContext &commonContext, SpecificContext *specificContext,
152
- const vector<string> &args)
153
- {
154
- TRACE_POINT();
155
- commonContext.requireRights(Account::RESTART);
156
- VariantMap options = argsToOptions(args, 2);
157
- RestartMethod method = RM_DEFAULT;
158
- if (options.get("method", false) == "blocking") {
159
- method = RM_BLOCKING;
160
- } else if (options.get("method", false) == "rolling") {
161
- method = RM_ROLLING;
162
- }
163
- bool result = pool->restartGroupByName(args[1], method);
164
- writeArrayMessage(commonContext.fd, result ? "true" : "false", NULL);
177
+ static void
178
+ parseAndAddAdminAuthorization(const string &description) {
179
+ TRACE_POINT();
180
+ WorkingObjects *wo = workingObjects;
181
+ ServerAgent::AdminServer::Authorization auth;
182
+ vector<string> args;
183
+
184
+ split(description, ':', args);
185
+
186
+ if (args.size() == 2) {
187
+ auth.level = ServerAgent::AdminServer::FULL;
188
+ auth.username = args[0];
189
+ auth.password = strip(readAll(args[1]));
190
+ } else if (args.size() == 3) {
191
+ auth.level = ServerAgent::AdminServer::parseLevel(args[0]);
192
+ auth.username = args[1];
193
+ auth.password = strip(readAll(args[2]));
194
+ } else {
195
+ P_BUG("Too many elements in authorization description");
165
196
  }
166
197
 
167
- void processRequests(CommonClientContext &commonContext, SpecificContext *specificContext,
168
- const vector<string> &args)
169
- {
170
- TRACE_POINT();
171
- stringstream stream;
172
- commonContext.requireRights(Account::INSPECT_REQUESTS);
173
- requestHandler->inspect(stream);
174
- writeScalarMessage(commonContext.fd, stream.str());
198
+ wo->adminAuthorizations.push_back(auth);
199
+ }
200
+
201
+ static void
202
+ initializePrivilegedWorkingObjects() {
203
+ TRACE_POINT();
204
+ const VariantMap &options = *agentsOptions;
205
+ WorkingObjects *wo = workingObjects = new WorkingObjects();
206
+
207
+ wo->prestarterThread = NULL;
208
+
209
+ wo->password = options.get("server_password", false);
210
+ if (wo->password == "-") {
211
+ wo->password.clear();
212
+ } else if (wo->password.empty() && options.has("server_password_file")) {
213
+ wo->password = strip(readAll(options.get("server_password_file")));
175
214
  }
176
215
 
177
- public:
178
- RemoteController(const boost::shared_ptr<RequestHandler> &requestHandler, const PoolPtr &pool) {
179
- this->requestHandler = requestHandler;
180
- this->pool = pool;
216
+ vector<string> authorizations = options.getStrSet("server_authorizations",
217
+ false);
218
+ string description;
219
+
220
+ UPDATE_TRACE_POINT();
221
+ foreach (description, authorizations) {
222
+ parseAndAddAdminAuthorization(description);
181
223
  }
224
+ }
225
+
226
+ static void
227
+ initializeSingleAppMode() {
228
+ TRACE_POINT();
229
+ VariantMap &options = *agentsOptions;
182
230
 
183
- virtual MessageServer::ClientContextPtr newClient(CommonClientContext &commonContext) {
184
- return boost::make_shared<SpecificContext>();
231
+ if (options.getBool("multi_app")) {
232
+ P_NOTICE(AGENT_EXE " server running in multi-application mode.");
233
+ return;
185
234
  }
186
235
 
187
- virtual bool processMessage(CommonClientContext &commonContext,
188
- MessageServer::ClientContextPtr &_specificContext,
189
- const vector<string> &args)
190
- {
191
- SpecificContext *specificContext = (SpecificContext *) _specificContext.get();
192
- try {
193
- if (isCommand(args, "detach_process", 1)) {
194
- processDetachProcess(commonContext, specificContext, args);
195
- } else if (isCommand(args, "detach_process_by_key", 1)) {
196
- processDetachProcessByKey(commonContext, specificContext, args);
197
- } else if (args[0] == "inspect") {
198
- return processInspect(commonContext, specificContext, args);
199
- } else if (isCommand(args, "toXml", 1)) {
200
- processToXml(commonContext, specificContext, args);
201
- } else if (isCommand(args, "backtraces", 0)) {
202
- processBacktraces(commonContext, specificContext, args);
203
- } else if (isCommand(args, "restart_app_group", 1, 99)) {
204
- processRestartAppGroup(commonContext, specificContext, args);
205
- } else if (isCommand(args, "requests", 0)) {
206
- processRequests(commonContext, specificContext, args);
207
- } else {
208
- return false;
209
- }
210
- } catch (const SecurityException &) {
211
- /* Client does not have enough rights to perform a certain action.
212
- * It has already been notified of this; ignore exception and move on.
213
- */
236
+ if (!options.has("app_type")) {
237
+ P_DEBUG("Autodetecting application type...");
238
+ AppTypeDetector detector(NULL, 0);
239
+ PassengerAppType appType = detector.checkAppRoot(options.get("app_root"));
240
+ if (appType == PAT_NONE || appType == PAT_ERROR) {
241
+ fprintf(stderr, "ERROR: unable to autodetect what kind of application "
242
+ "lives in %s. Please specify information about the app using "
243
+ "--app-type and --startup-file, or specify a correct location to "
244
+ "the application you want to serve.\n"
245
+ "Type '" AGENT_EXE " server --help' for more information.\n",
246
+ options.get("app_root").c_str());
247
+ exit(1);
214
248
  }
215
- return true;
249
+
250
+ options.set("app_type", getAppTypeName(appType));
251
+ options.set("startup_file", getAppTypeStartupFile(appType));
216
252
  }
217
- };
218
253
 
219
- class ExitHandler: public MessageServer::Handler {
220
- private:
221
- EventFd &exitEvent;
254
+ P_NOTICE(AGENT_EXE " server running in single-application mode.");
255
+ P_NOTICE("Serving app : " << options.get("app_root"));
256
+ P_NOTICE("App type : " << options.get("app_type"));
257
+ P_NOTICE("App startup file: " << options.get("startup_file"));
258
+ }
222
259
 
223
- public:
224
- ExitHandler(EventFd &_exitEvent)
225
- : exitEvent(_exitEvent)
226
- { }
260
+ static void
261
+ makeFileWorldReadableAndWritable(const string &path) {
262
+ int ret;
227
263
 
228
- virtual bool processMessage(MessageServer::CommonClientContext &commonContext,
229
- MessageServer::ClientContextPtr &handlerSpecificContext,
230
- const vector<string> &args)
231
- {
232
- if (args[0] == "exit") {
233
- TRACE_POINT();
234
- commonContext.requireRights(Account::EXIT);
235
- UPDATE_TRACE_POINT();
236
- exitEvent.notify();
237
- UPDATE_TRACE_POINT();
238
- writeArrayMessage(commonContext.fd, "exit command received", NULL);
239
- return true;
240
- } else {
241
- return false;
264
+ do {
265
+ ret = chmod(path.c_str(), parseModeString("u=rw,g=rw,o=rw"));
266
+ } while (ret == -1 && errno == EINTR);
267
+ }
268
+
269
+ static void
270
+ startListening() {
271
+ TRACE_POINT();
272
+ WorkingObjects *wo = workingObjects;
273
+ vector<string> addresses = agentsOptions->getStrSet("server_addresses");
274
+ vector<string> adminAddresses = agentsOptions->getStrSet("server_admin_addresses", false);
275
+
276
+ for (unsigned int i = 0; i < addresses.size(); i++) {
277
+ wo->serverFds[i] = createServer(addresses[i]);
278
+ if (getSocketAddressType(addresses[i]) == SAT_UNIX) {
279
+ makeFileWorldReadableAndWritable(parseUnixSocketAddress(addresses[i]));
242
280
  }
243
281
  }
244
- };
245
-
246
- /**
247
- * A representation of the Server responsible for handling Client instances.
248
- *
249
- * @see Client
250
- */
251
- class Server {
252
- private:
253
- static const int MESSAGE_SERVER_THREAD_STACK_SIZE = 128 * 1024;
254
- static const int EVENT_LOOP_THREAD_STACK_SIZE = 256 * 1024;
255
-
256
- FileDescriptor feedbackFd;
257
- const AgentOptions &options;
258
-
259
- BackgroundEventLoop poolLoop;
260
- BackgroundEventLoop requestLoop;
261
-
262
- FileDescriptor requestSocket;
263
- ServerInstanceDir serverInstanceDir;
264
- ServerInstanceDir::GenerationPtr generation;
265
- UnionStation::CorePtr unionStationCore;
266
- RandomGeneratorPtr randomGenerator;
267
- SpawnerConfigPtr spawnerConfig;
268
- SpawnerFactoryPtr spawnerFactory;
269
- PoolPtr pool;
270
- ev::sig sigquitWatcher;
271
- AccountsDatabasePtr accountsDatabase;
272
- MessageServerPtr messageServer;
273
- ResourceLocator resourceLocator;
274
- boost::shared_ptr<RequestHandler> requestHandler;
275
- boost::shared_ptr<oxt::thread> prestarterThread;
276
- boost::shared_ptr<oxt::thread> messageServerThread;
277
- boost::shared_ptr<oxt::thread> eventLoopThread;
278
- EventFd exitEvent;
279
-
280
- /**
281
- * Starts listening for client connections on this server's request socket.
282
- *
283
- * @throws SystemException Something went wrong while trying to create and bind to the Unix socket.
284
- * @throws RuntimeException Something went wrong.
285
- */
286
- void startListening() {
287
- this_thread::disable_syscall_interruption dsi;
288
- requestSocket = createUnixServer(getRequestSocketFilename().c_str());
289
-
290
- int ret, e;
291
- do {
292
- ret = chmod(getRequestSocketFilename().c_str(), S_ISVTX |
293
- S_IRUSR | S_IWUSR | S_IXUSR |
294
- S_IRGRP | S_IWGRP | S_IXGRP |
295
- S_IROTH | S_IWOTH | S_IXOTH);
296
- } while (ret == -1 && errno == EINTR);
297
-
298
- setNonBlocking(requestSocket);
299
-
300
- if (!options.requestSocketLink.empty()) {
301
- struct stat buf;
302
-
303
- // If this is a symlink then we'll want to check the file the symlink
304
- // points to, so we use stat() instead of lstat().
305
- ret = syscalls::stat(options.requestSocketLink.c_str(), &buf);
306
- if (ret == 0 || (ret == -1 && errno == ENOENT)) {
307
- if (ret == -1 || buf.st_mode & S_IFSOCK) {
308
- if (syscalls::unlink(options.requestSocketLink.c_str()) == -1) {
309
- e = errno;
310
- throw FileSystemException("Cannot delete existing socket file '" +
311
- options.requestSocketLink + "'", e, options.requestSocketLink);
312
- }
313
- } else {
314
- throw RuntimeException("File '" + options.requestSocketLink +
315
- "' already exists and is not a Unix domain socket");
316
- }
317
- } else if (ret == -1 && errno != ENOENT) {
318
- e = errno;
319
- throw FileSystemException("Cannot stat() file '" + options.requestSocketLink + "'",
320
- e,
321
- options.requestSocketLink);
322
- }
323
-
324
- do {
325
- ret = symlink(getRequestSocketFilename().c_str(),
326
- options.requestSocketLink.c_str());
327
- } while (ret == -1 && errno == EINTR);
328
- if (ret == -1) {
329
- e = errno;
330
- throw FileSystemException("Cannot create a symlink '" +
331
- options.requestSocketLink +
332
- "' to '" + getRequestSocketFilename() + "'",
333
- e,
334
- options.requestSocketLink);
335
- }
282
+ for (unsigned int i = 0; i < adminAddresses.size(); i++) {
283
+ wo->adminServerFds[i] = createServer(adminAddresses[i]);
284
+ if (getSocketAddressType(adminAddresses[i]) == SAT_UNIX) {
285
+ makeFileWorldReadableAndWritable(parseUnixSocketAddress(adminAddresses[i]));
336
286
  }
337
287
  }
288
+ }
338
289
 
339
- /**
340
- * Lowers this process's privilege to that of <em>username</em> and <em>groupname</em>.
341
- */
342
- void lowerPrivilege(const string &username, const string &groupname) {
343
- struct passwd *userEntry;
344
- gid_t gid;
345
- int e;
346
-
347
- userEntry = getpwnam(username.c_str());
348
- if (userEntry == NULL) {
349
- throw NonExistentUserException(string("Unable to lower Passenger "
350
- "HelperAgent's privilege to that of user '") + username +
351
- "': user does not exist.");
352
- }
353
- gid = lookupGid(groupname);
354
- if (gid == (gid_t) -1) {
355
- throw NonExistentGroupException(string("Unable to lower Passenger "
356
- "HelperAgent's privilege to that of user '") + username +
357
- "': user does not exist.");
358
- }
290
+ static void
291
+ createPidFile() {
292
+ TRACE_POINT();
293
+ string pidFile = agentsOptions->get("server_pid_file", false);
294
+ if (!pidFile.empty()) {
295
+ char pidStr[32];
359
296
 
360
- if (initgroups(username.c_str(), userEntry->pw_gid) != 0) {
361
- e = errno;
362
- throw SystemException(string("Unable to lower Passenger HelperAgent's "
363
- "privilege to that of user '") + username +
364
- "': cannot set supplementary groups for this user", e);
365
- }
366
- if (setgid(gid) != 0) {
367
- e = errno;
368
- throw SystemException(string("Unable to lower Passenger HelperAgent's "
369
- "privilege to that of user '") + username +
370
- "': cannot set group ID", e);
371
- }
372
- if (setuid(userEntry->pw_uid) != 0) {
373
- e = errno;
374
- throw SystemException(string("Unable to lower Passenger HelperAgent's "
375
- "privilege to that of user '") + username +
376
- "': cannot set user ID", e);
297
+ snprintf(pidStr, sizeof(pidStr), "%lld", (long long) getpid());
298
+
299
+ int fd = syscalls::open(pidFile.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0644);
300
+ if (fd == -1) {
301
+ int e = errno;
302
+ throw FileSystemException("Cannot create PID file " + pidFile, e, pidFile);
377
303
  }
378
304
 
379
- setenv("HOME", userEntry->pw_dir, 1);
305
+ UPDATE_TRACE_POINT();
306
+ writeExact(fd, pidStr, strlen(pidStr));
307
+ syscalls::close(fd);
380
308
  }
309
+ }
381
310
 
382
- void onSigquit(ev::sig &signal, int revents) {
383
- requestHandler->inspect(cerr);
384
- cerr.flush();
385
- cerr << "\n" << pool->inspect();
386
- cerr.flush();
387
- cerr << "\n" << oxt::thread::all_backtraces();
311
+ static void
312
+ lowerPrivilege() {
313
+ TRACE_POINT();
314
+ }
315
+
316
+ static void
317
+ printInfo(EV_P_ struct ev_signal *watcher, int revents) {
318
+ oxt::thread(printInfoInThread, "Information printer");
319
+ }
320
+
321
+ static void
322
+ inspectRequestHandlerStateAsJson(RequestHandler *rh, string *result) {
323
+ *result = rh->inspectStateAsJson().toStyledString();
324
+ }
325
+
326
+ static void
327
+ inspectRequestHandlerConfigAsJson(RequestHandler *rh, string *result) {
328
+ *result = rh->getConfigAsJson().toStyledString();
329
+ }
330
+
331
+ static void
332
+ getMbufStats(struct MemoryKit::mbuf_pool *input, struct MemoryKit::mbuf_pool *result) {
333
+ *result = *input;
334
+ }
335
+
336
+ static void
337
+ printInfoInThread() {
338
+ TRACE_POINT();
339
+ WorkingObjects *wo = workingObjects;
340
+ unsigned int i;
341
+
342
+ cerr << "### Backtraces\n";
343
+ cerr << "\n" << oxt::thread::all_backtraces();
344
+ cerr << "\n";
345
+ cerr.flush();
346
+
347
+ for (i = 0; i < wo->threadWorkingObjects.size(); i++) {
348
+ ThreadWorkingObjects *two = &wo->threadWorkingObjects[i];
349
+ string json;
350
+
351
+ cerr << "### Request handler state (thread " << (i + 1) << ")\n";
352
+ two->bgloop->safe->runSync(boost::bind(inspectRequestHandlerStateAsJson,
353
+ two->requestHandler, &json));
354
+ cerr << json;
355
+ cerr << "\n";
388
356
  cerr.flush();
389
357
  }
390
358
 
391
- void installDiagnosticsDumper() {
392
- ::installDiagnosticsDumper(dumpDiagnosticsOnCrash, this);
393
- }
359
+ for (i = 0; i < wo->threadWorkingObjects.size(); i++) {
360
+ ThreadWorkingObjects *two = &wo->threadWorkingObjects[i];
361
+ string json;
394
362
 
395
- void uninstallDiagnosticsDumper() {
396
- ::installDiagnosticsDumper(NULL, NULL);
363
+ cerr << "### Request handler config (thread " << (i + 1) << ")\n";
364
+ two->bgloop->safe->runSync(boost::bind(inspectRequestHandlerConfigAsJson,
365
+ two->requestHandler, &json));
366
+ cerr << json;
367
+ cerr << "\n";
368
+ cerr.flush();
397
369
  }
398
370
 
399
- static void dumpDiagnosticsOnCrash(void *userData) {
400
- Server *self = (Server *) userData;
371
+ struct MemoryKit::mbuf_pool stats;
372
+ cerr << "### mbuf stats\n\n";
373
+ wo->threadWorkingObjects[0].bgloop->safe->runSync(boost::bind(getMbufStats,
374
+ &wo->threadWorkingObjects[0].serverKitContext->mbuf_pool,
375
+ &stats));
376
+ cerr << "nfree_mbuf_blockq : " << stats.nfree_mbuf_blockq << "\n";
377
+ cerr << "nactive_mbuf_blockq : " << stats.nactive_mbuf_blockq << "\n";
378
+ cerr << "mbuf_block_chunk_size: " << stats.mbuf_block_chunk_size << "\n";
379
+ cerr << "\n";
380
+ cerr.flush();
381
+
382
+ cerr << "### Pool state\n";
383
+ cerr << "\n" << wo->appPool->inspect();
384
+ cerr << "\n";
385
+ cerr.flush();
386
+ }
387
+
388
+ static void
389
+ dumpDiagnosticsOnCrash(void *userData) {
390
+ WorkingObjects *wo = workingObjects;
391
+ unsigned int i;
392
+
393
+ cerr << "### Backtraces\n";
394
+ cerr << oxt::thread::all_backtraces();
395
+ cerr.flush();
401
396
 
402
- cerr << "### Request handler state\n";
403
- self->requestHandler->inspect(cerr);
397
+ for (i = 0; i < wo->threadWorkingObjects.size(); i++) {
398
+ ThreadWorkingObjects *two = &wo->threadWorkingObjects[i];
399
+ cerr << "### Request handler state (thread " << (i + 1) << ")\n";
400
+ cerr << two->requestHandler->inspectStateAsJson();
404
401
  cerr << "\n";
405
402
  cerr.flush();
403
+ }
406
404
 
407
- cerr << "### Pool state (simple)\n";
408
- // Do not lock, the crash may occur within the pool.
409
- Pool::InspectOptions options;
410
- options.verbose = true;
411
- cerr << self->pool->inspect(options, false);
405
+ for (i = 0; i < wo->threadWorkingObjects.size(); i++) {
406
+ ThreadWorkingObjects *two = &wo->threadWorkingObjects[i];
407
+ cerr << "### Request handler config (thread " << (i + 1) << ")\n";
408
+ cerr << two->requestHandler->getConfigAsJson();
412
409
  cerr << "\n";
413
410
  cerr.flush();
411
+ }
414
412
 
415
- cerr << "### Pool state (XML)\n";
416
- cerr << self->pool->toXml(true, false);
417
- cerr << "\n\n";
418
- cerr.flush();
413
+ cerr << "### Pool state (simple)\n";
414
+ // Do not lock, the crash may occur within the pool.
415
+ Pool::InspectOptions options;
416
+ options.verbose = true;
417
+ cerr << wo->appPool->inspect(options, false);
418
+ cerr << "\n";
419
+ cerr.flush();
420
+
421
+ cerr << "### mbuf stats\n\n";
422
+ cerr << "nfree_mbuf_blockq : " <<
423
+ wo->threadWorkingObjects[0].serverKitContext->mbuf_pool.nfree_mbuf_blockq << "\n";
424
+ cerr << "nactive_mbuf_blockq: " <<
425
+ wo->threadWorkingObjects[0].serverKitContext->mbuf_pool.nactive_mbuf_blockq << "\n";
426
+ cerr << "mbuf_block_chunk_size: " <<
427
+ wo->threadWorkingObjects[0].serverKitContext->mbuf_pool.mbuf_block_chunk_size << "\n";
428
+ cerr << "\n";
429
+ cerr.flush();
430
+
431
+ cerr << "### Pool state (XML)\n";
432
+ cerr << wo->appPool->toXml(true, false);
433
+ cerr << "\n\n";
434
+ cerr.flush();
435
+ }
419
436
 
420
- cerr << "### Backtraces\n";
421
- cerr << oxt::thread::all_backtraces();
422
- cerr.flush();
437
+ static void
438
+ onTerminationSignal(EV_P_ struct ev_signal *watcher, int revents) {
439
+ WorkingObjects *wo = workingObjects;
440
+
441
+ // Start output after '^C'
442
+ printf("\n");
443
+
444
+ wo->terminationCount++;
445
+ if (wo->terminationCount < 3) {
446
+ P_NOTICE("Signal received. Gracefully shutting down... (send signal " <<
447
+ (3 - wo->terminationCount) << " more time(s) to force shutdown)");
448
+ workingObjects->exitEvent.notify();
449
+ } else {
450
+ P_NOTICE("Signal received. Forcing shutdown.");
451
+ _exit(2);
423
452
  }
453
+ }
424
454
 
425
- public:
426
- Server(FileDescriptor feedbackFd, const AgentOptions &_options)
427
- : options(_options),
428
- requestLoop(true),
429
- serverInstanceDir(_options.serverInstanceDir, false),
430
- resourceLocator(options.passengerRoot)
455
+ static void
456
+ initializeNonPrivilegedWorkingObjects() {
457
+ TRACE_POINT();
458
+ VariantMap &options = *agentsOptions;
459
+ WorkingObjects *wo = workingObjects;
460
+
461
+ if (options.get("server_software").find(SERVER_TOKEN_NAME) == string::npos
462
+ && options.get("server_software").find(FLYING_PASSENGER_NAME) == string::npos)
431
463
  {
432
- TRACE_POINT();
433
- this->feedbackFd = feedbackFd;
464
+ options.set("server_software", options.get("server_software") +
465
+ (" " SERVER_TOKEN_NAME "/" PASSENGER_VERSION));
466
+ }
467
+ setenv("SERVER_SOFTWARE", options.get("server_software").c_str(), 1);
468
+ options.set("data_buffer_dir", absolutizePath(options.get("data_buffer_dir")));
469
+
470
+ vector<string> addresses = options.getStrSet("server_addresses");
471
+ vector<string> adminAddresses = options.getStrSet("server_admin_addresses", false);
434
472
 
473
+ wo->resourceLocator = ResourceLocator(options.get("passenger_root"));
474
+
475
+ wo->randomGenerator = boost::make_shared<RandomGenerator>();
476
+ // Check whether /dev/urandom is actually random.
477
+ // https://code.google.com/p/phusion-passenger/issues/detail?id=516
478
+ if (wo->randomGenerator->generateByteString(16) == wo->randomGenerator->generateByteString(16)) {
479
+ throw RuntimeException("Your random number device, /dev/urandom, appears to be broken. "
480
+ "It doesn't seem to be returning random data. Please fix this.");
481
+ }
482
+
483
+ UPDATE_TRACE_POINT();
484
+ if (options.has("logging_agent_address")) {
485
+ wo->unionStationCore = boost::make_shared<UnionStation::Core>(
486
+ options.get("logging_agent_address"),
487
+ "logging",
488
+ options.get("logging_agent_password"));
489
+ }
490
+
491
+ UPDATE_TRACE_POINT();
492
+ wo->spawnerConfig = boost::make_shared<SpawnerConfig>();
493
+ wo->spawnerConfig->resourceLocator = &wo->resourceLocator;
494
+ wo->spawnerConfig->agentsOptions = agentsOptions;
495
+ wo->spawnerConfig->randomGenerator = wo->randomGenerator;
496
+ wo->spawnerConfig->instanceDir = options.get("instance_dir", false);
497
+ if (!wo->spawnerConfig->instanceDir.empty()) {
498
+ wo->spawnerConfig->instanceDir = absolutizePath(wo->spawnerConfig->instanceDir);
499
+ }
500
+ wo->spawnerConfig->finalize();
501
+
502
+ UPDATE_TRACE_POINT();
503
+ wo->spawnerFactory = boost::make_shared<SpawnerFactory>(wo->spawnerConfig);
504
+ wo->appPool = boost::make_shared<Pool>(wo->spawnerFactory, agentsOptions);
505
+ wo->appPool->initialize();
506
+ wo->appPool->setMax(options.getInt("max_pool_size"));
507
+ wo->appPool->setMaxIdleTime(options.getInt("pool_idle_time") * 1000000);
508
+ wo->appPool->enableSelfChecking(options.getBool("selfchecks"));
509
+ wo->appPool->abortLongRunningConnectionsCallback = abortLongRunningConnections;
510
+
511
+ UPDATE_TRACE_POINT();
512
+ unsigned int nthreads = options.getInt("server_threads");
513
+ BackgroundEventLoop *firstLoop = NULL; // Avoid compiler warning
514
+ wo->threadWorkingObjects.reserve(nthreads);
515
+ for (unsigned int i = 0; i < nthreads; i++) {
435
516
  UPDATE_TRACE_POINT();
436
- generation = serverInstanceDir.getGeneration(options.generationNumber);
437
- startListening();
438
- accountsDatabase = boost::make_shared<AccountsDatabase>();
439
- accountsDatabase->add("_passenger-status", options.adminToolStatusPassword, false,
440
- Account::INSPECT_BASIC_INFO | Account::INSPECT_SENSITIVE_INFO |
441
- Account::INSPECT_BACKTRACES | Account::INSPECT_REQUESTS |
442
- Account::DETACH | Account::RESTART);
443
- accountsDatabase->add("_web_server", options.exitPassword, false, Account::EXIT);
444
- messageServer = boost::make_shared<MessageServer>(
445
- parseUnixSocketAddress(options.adminSocketAddress), accountsDatabase);
446
-
447
- createFile(generation->getPath() + "/helper_agent.pid",
448
- toString(getpid()), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
449
-
450
- if (geteuid() == 0 && !options.userSwitching) {
451
- lowerPrivilege(options.defaultUser, options.defaultGroup);
517
+ ThreadWorkingObjects two;
518
+
519
+ if (i == 0) {
520
+ two.bgloop = firstLoop = new BackgroundEventLoop(true, true);
521
+ } else {
522
+ two.bgloop = new BackgroundEventLoop(true, false);
452
523
  }
453
524
 
454
525
  UPDATE_TRACE_POINT();
455
- randomGenerator = boost::make_shared<RandomGenerator>();
456
- // Check whether /dev/urandom is actually random.
457
- // https://code.google.com/p/phusion-passenger/issues/detail?id=516
458
- if (randomGenerator->generateByteString(16) == randomGenerator->generateByteString(16)) {
459
- throw RuntimeException("Your random number device, /dev/urandom, appears to be broken. "
460
- "It doesn't seem to be returning random data. Please fix this.");
461
- }
526
+ two.serverKitContext = new ServerKit::Context(two.bgloop->safe);
527
+ two.serverKitContext->secureModePassword = wo->password;
528
+ two.serverKitContext->defaultFileBufferedChannelConfig.bufferDir =
529
+ options.get("data_buffer_dir");
462
530
 
463
531
  UPDATE_TRACE_POINT();
464
- unionStationCore = boost::make_shared<UnionStation::Core>(options.loggingAgentAddress,
465
- "logging", options.loggingAgentPassword);
466
- spawnerConfig = boost::make_shared<SpawnerConfig>(resourceLocator, unionStationCore,
467
- randomGenerator, &options);
468
- spawnerFactory = boost::make_shared<SpawnerFactory>(generation, spawnerConfig);
469
- pool = boost::make_shared<Pool>(spawnerFactory, &options);
470
- pool->initialize();
471
- pool->setMax(options.maxPoolSize);
472
- pool->setMaxIdleTime(options.poolIdleTime * 1000000);
473
-
474
- requestHandler = boost::make_shared<RequestHandler>(requestLoop.safe,
475
- requestSocket, pool, options);
476
-
477
- messageServer->addHandler(boost::make_shared<RemoteController>(requestHandler, pool));
478
- messageServer->addHandler(ptr(new ExitHandler(exitEvent)));
479
-
480
- sigquitWatcher.set(requestLoop.loop);
481
- sigquitWatcher.set(SIGQUIT);
482
- sigquitWatcher.set<Server, &Server::onSigquit>(this);
483
- sigquitWatcher.start();
532
+ two.requestHandler = new RequestHandler(two.serverKitContext, agentsOptions, i + 1);
533
+ two.requestHandler->minSpareClients = 128;
534
+ two.requestHandler->clientFreelistLimit = 1024;
535
+ two.requestHandler->resourceLocator = &wo->resourceLocator;
536
+ two.requestHandler->appPool = wo->appPool;
537
+ two.requestHandler->unionStationCore = wo->unionStationCore;
538
+ two.requestHandler->shutdownFinishCallback = requestHandlerShutdownFinished;
539
+ two.requestHandler->initialize();
540
+ wo->shutdownCounter.fetch_add(1, boost::memory_order_relaxed);
541
+
542
+ wo->threadWorkingObjects.push_back(two);
543
+ }
484
544
 
545
+ UPDATE_TRACE_POINT();
546
+ ev_signal_init(&wo->sigquitWatcher, printInfo, SIGQUIT);
547
+ ev_signal_start(firstLoop->loop, &wo->sigquitWatcher);
548
+ ev_signal_init(&wo->sigintWatcher, onTerminationSignal, SIGINT);
549
+ ev_signal_start(firstLoop->loop, &wo->sigintWatcher);
550
+ ev_signal_init(&wo->sigtermWatcher, onTerminationSignal, SIGTERM);
551
+ ev_signal_start(firstLoop->loop, &wo->sigtermWatcher);
552
+
553
+ UPDATE_TRACE_POINT();
554
+ if (!adminAddresses.empty()) {
485
555
  UPDATE_TRACE_POINT();
486
- writeArrayMessage(feedbackFd,
487
- "initialized",
488
- getRequestSocketFilename().c_str(),
489
- messageServer->getSocketFilename().c_str(),
490
- NULL);
556
+ AdminWorkingObjects *awo = &wo->adminWorkingObjects;
557
+
558
+ awo->bgloop = new BackgroundEventLoop(true, false);
559
+ awo->serverKitContext = new ServerKit::Context(awo->bgloop->safe);
560
+ awo->serverKitContext->secureModePassword = wo->password;
561
+ // Configure a large threshold so that it uses libeio as little as possible.
562
+ // libeio runs on the RequestHandler's first thread, and if there's a
563
+ // problem there we don't want it to affect the admin server.
564
+ awo->serverKitContext->defaultFileBufferedChannelConfig.threshold = 1024 * 1024;
565
+ awo->serverKitContext->defaultFileBufferedChannelConfig.bufferDir =
566
+ options.get("data_buffer_dir");
491
567
 
492
- boost::function<void ()> func = boost::bind(prestartWebApps,
493
- resourceLocator,
494
- options.defaultRubyCommand,
495
- options.prestartUrls
496
- );
497
- prestarterThread = ptr(new oxt::thread(
498
- boost::bind(runAndPrintExceptions, func, true)
499
- ));
500
- }
501
-
502
- ~Server() {
503
- TRACE_POINT();
504
- this_thread::disable_syscall_interruption dsi;
505
- this_thread::disable_interruption di;
506
-
507
- P_DEBUG("Shutting down helper agent...");
508
- prestarterThread->interrupt_and_join();
509
- if (messageServerThread != NULL) {
510
- messageServerThread->interrupt_and_join();
568
+ UPDATE_TRACE_POINT();
569
+ awo->adminServer = new ServerAgent::AdminServer(awo->serverKitContext);
570
+ awo->adminServer->requestHandlers.reserve(wo->threadWorkingObjects.size());
571
+ for (unsigned int i = 0; i < wo->threadWorkingObjects.size(); i++) {
572
+ awo->adminServer->requestHandlers.push_back(
573
+ wo->threadWorkingObjects[i].requestHandler);
574
+ }
575
+ awo->adminServer->appPool = wo->appPool;
576
+ awo->adminServer->exitEvent = &wo->exitEvent;
577
+ awo->adminServer->shutdownFinishCallback = adminServerShutdownFinished;
578
+ awo->adminServer->authorizations = wo->adminAuthorizations;
579
+
580
+ wo->shutdownCounter.fetch_add(1, boost::memory_order_relaxed);
581
+ }
582
+
583
+ UPDATE_TRACE_POINT();
584
+ /* We do not delete Unix domain socket files at shutdown because
585
+ * that can cause a race condition if the user tries to start another
586
+ * server with the same addresses at the same time. The new server
587
+ * would then delete the socket and replace it with its own,
588
+ * while the old server would delete the file yet again shortly after.
589
+ * This is especially noticeable on systems that heavily swap.
590
+ */
591
+ for (unsigned int i = 0; i < addresses.size(); i++) {
592
+ if (nthreads == 1) {
593
+ ThreadWorkingObjects *two = &wo->threadWorkingObjects[0];
594
+ two->requestHandler->listen(wo->serverFds[i]);
595
+ } else {
596
+ wo->loadBalancer.listen(wo->serverFds[i]);
597
+ }
598
+ }
599
+ for (unsigned int i = 0; i < nthreads; i++) {
600
+ ThreadWorkingObjects *two = &wo->threadWorkingObjects[i];
601
+ two->requestHandler->createSpareClients();
602
+ }
603
+ if (nthreads > 1) {
604
+ wo->loadBalancer.servers.reserve(nthreads);
605
+ for (unsigned int i = 0; i < nthreads; i++) {
606
+ ThreadWorkingObjects *two = &wo->threadWorkingObjects[i];
607
+ wo->loadBalancer.servers.push_back(two->requestHandler);
511
608
  }
609
+ }
610
+ for (unsigned int i = 0; i < adminAddresses.size(); i++) {
611
+ wo->adminWorkingObjects.adminServer->listen(wo->adminServerFds[i]);
612
+ }
613
+ }
512
614
 
513
- messageServer.reset();
514
- P_DEBUG("Destroying application pool...");
515
- pool->destroy();
516
- uninstallDiagnosticsDumper();
517
- pool.reset();
518
- poolLoop.stop();
519
- requestLoop.stop();
520
- requestHandler.reset();
521
-
522
- if (!options.requestSocketLink.empty()) {
523
- char path[PATH_MAX + 1];
524
- ssize_t ret;
525
- bool shouldUnlink;
526
-
527
- ret = readlink(options.requestSocketLink.c_str(), path, PATH_MAX);
528
- if (ret != -1) {
529
- path[ret] = '\0';
530
- // Only unlink if a new Flying Passenger instance hasn't overwritten the
531
- // symlink.
532
- // https://code.google.com/p/phusion-passenger/issues/detail?id=939
533
- shouldUnlink = getRequestSocketFilename() == path;
534
- } else {
535
- shouldUnlink = true;
615
+ static void
616
+ prestartWebApps() {
617
+ TRACE_POINT();
618
+ VariantMap &options = *agentsOptions;
619
+ WorkingObjects *wo = workingObjects;
620
+
621
+ boost::function<void ()> func = boost::bind(prestartWebApps,
622
+ wo->resourceLocator,
623
+ options.get("default_ruby"),
624
+ options.getStrSet("prestart_urls", false)
625
+ );
626
+ wo->prestarterThread = new oxt::thread(
627
+ boost::bind(runAndPrintExceptions, func, true)
628
+ );
629
+ }
630
+
631
+ static void
632
+ reportInitializationInfo() {
633
+ TRACE_POINT();
634
+ if (feedbackFdAvailable()) {
635
+ P_NOTICE(AGENT_EXE " server online, PID " << getpid());
636
+ writeArrayMessage(FEEDBACK_FD,
637
+ "initialized",
638
+ NULL);
639
+ } else {
640
+ vector<string> addresses = agentsOptions->getStrSet("server_addresses");
641
+ vector<string> adminAddresses = agentsOptions->getStrSet("server_admin_addresses", false);
642
+ string address;
643
+
644
+ P_NOTICE(AGENT_EXE " server online, PID " << getpid() <<
645
+ ", listening on " << addresses.size() << " socket(s):");
646
+ foreach (address, addresses) {
647
+ if (startsWith(address, "tcp://")) {
648
+ address.erase(0, sizeof("tcp://") - 1);
649
+ address.insert(0, "http://");
650
+ address.append("/");
536
651
  }
652
+ P_NOTICE(" * " << address);
653
+ }
537
654
 
538
- if (shouldUnlink) {
539
- syscalls::unlink(options.requestSocketLink.c_str());
655
+ if (!adminAddresses.empty()) {
656
+ P_NOTICE("Admin server listening on " << adminAddresses.size() << " socket(s):");
657
+ foreach (address, adminAddresses) {
658
+ if (startsWith(address, "tcp://")) {
659
+ address.erase(0, sizeof("tcp://") - 1);
660
+ address.insert(0, "http://");
661
+ address.append("/");
662
+ }
663
+ P_NOTICE(" * " << address);
540
664
  }
541
665
  }
666
+ }
667
+ }
668
+
669
+ static void
670
+ mainLoop() {
671
+ TRACE_POINT();
672
+ WorkingObjects *wo = workingObjects;
673
+ #ifdef SUPPORTS_PER_THREAD_CPU_AFFINITY
674
+ unsigned int maxCpus = boost::thread::hardware_concurrency();
675
+ bool cpuAffine = agentsOptions->getBool("server_cpu_affine")
676
+ && maxCpus <= CPU_SETSIZE;
677
+ #endif
678
+
679
+ installDiagnosticsDumper(dumpDiagnosticsOnCrash, NULL);
680
+ for (unsigned int i = 0; i < wo->threadWorkingObjects.size(); i++) {
681
+ ThreadWorkingObjects *two = &wo->threadWorkingObjects[i];
682
+ two->bgloop->start("Main event loop: thread " + toString(i + 1), 0);
683
+ #ifdef SUPPORTS_PER_THREAD_CPU_AFFINITY
684
+ if (cpuAffine) {
685
+ cpu_set_t cpus;
686
+ int result;
687
+
688
+ CPU_ZERO(&cpus);
689
+ CPU_SET(i % maxCpus, &cpus);
690
+ P_DEBUG("Setting CPU affinity of server thread " << (i + 1)
691
+ << " to CPU " << (i % maxCpus + 1));
692
+ result = pthread_setaffinity_np(two->bgloop->getNativeHandle(),
693
+ maxCpus, &cpus);
694
+ if (result != 0) {
695
+ P_WARN("Cannot set CPU affinity on server thread " << (i + 1)
696
+ << ": " << strerror(result) << " (errno=" << result << ")");
697
+ }
698
+ }
699
+ #endif
700
+ }
701
+ if (wo->adminWorkingObjects.adminServer != NULL) {
702
+ wo->adminWorkingObjects.bgloop->start("Admin event loop", 0);
703
+ }
704
+ if (wo->threadWorkingObjects.size() > 1) {
705
+ wo->loadBalancer.start();
706
+ }
707
+ waitForExitEvent();
708
+ }
709
+
710
+ static void
711
+ abortLongRunningConnectionsOnRequestHandler(RequestHandler *requestHandler,
712
+ string gupid)
713
+ {
714
+ requestHandler->disconnectLongRunningConnections(gupid);
715
+ }
716
+
717
+ static void
718
+ abortLongRunningConnections(const ApplicationPool2::ProcessPtr &process) {
719
+ // We are inside the ApplicationPool lock. Be very careful here.
720
+ WorkingObjects *wo = workingObjects;
721
+ P_NOTICE("Disconnecting long-running connections for process " <<
722
+ process->pid << ", application " << process->getGroup()->name);
723
+ for (unsigned int i = 0; i < wo->threadWorkingObjects.size(); i++) {
724
+ wo->threadWorkingObjects[i].bgloop->safe->runLater(
725
+ boost::bind(abortLongRunningConnectionsOnRequestHandler,
726
+ wo->threadWorkingObjects[i].requestHandler,
727
+ string(process->gupid, process->gupidSize)));
728
+ }
729
+ }
730
+
731
+ static void
732
+ shutdownRequestHandler(ThreadWorkingObjects *two) {
733
+ two->requestHandler->shutdown();
734
+ }
542
735
 
543
- P_TRACE(2, "All threads have been shut down.");
736
+ static void
737
+ shutdownAdminServer() {
738
+ workingObjects->adminWorkingObjects.adminServer->shutdown();
739
+ }
740
+
741
+ static void
742
+ serverShutdownFinished() {
743
+ unsigned int i = workingObjects->shutdownCounter.fetch_sub(1, boost::memory_order_release);
744
+ if (i == 1) {
745
+ boost::atomic_thread_fence(boost::memory_order_acquire);
746
+ workingObjects->allClientsDisconnectedEvent.notify();
544
747
  }
748
+ }
545
749
 
546
- void mainLoop() {
547
- TRACE_POINT();
548
- boost::function<void ()> func;
750
+ static void
751
+ requestHandlerShutdownFinished(RequestHandler *server) {
752
+ serverShutdownFinished();
753
+ }
549
754
 
550
- func = boost::bind(&MessageServer::mainLoop, messageServer.get());
551
- messageServerThread = ptr(new oxt::thread(
552
- boost::bind(runAndPrintExceptions, func, true),
553
- "MessageServer thread", MESSAGE_SERVER_THREAD_STACK_SIZE
554
- ));
755
+ static void
756
+ adminServerShutdownFinished(ServerAgent::AdminServer *server) {
757
+ serverShutdownFinished();
758
+ }
555
759
 
556
- poolLoop.start("Pool event loop", 0);
557
- requestLoop.start("Request event loop", 0);
760
+ /* Wait until the watchdog closes the feedback fd (meaning it
761
+ * was killed) or until we receive an exit message.
762
+ */
763
+ static void
764
+ waitForExitEvent() {
765
+ this_thread::disable_syscall_interruption dsi;
766
+ WorkingObjects *wo = workingObjects;
767
+ fd_set fds;
768
+ int largestFd = -1;
769
+
770
+ FD_ZERO(&fds);
771
+ if (feedbackFdAvailable()) {
772
+ FD_SET(FEEDBACK_FD, &fds);
773
+ largestFd = std::max(largestFd, FEEDBACK_FD);
774
+ }
775
+ FD_SET(wo->exitEvent.fd(), &fds);
776
+ largestFd = std::max(largestFd, wo->exitEvent.fd());
558
777
 
778
+ TRACE_POINT();
779
+ if (syscalls::select(largestFd + 1, &fds, NULL, NULL, NULL) == -1) {
780
+ int e = errno;
781
+ installDiagnosticsDumper(NULL, NULL);
782
+ throw SystemException("select() failed", e);
783
+ }
559
784
 
560
- /* Wait until the watchdog closes the feedback fd (meaning it
561
- * was killed) or until we receive an exit message.
785
+ if (FD_ISSET(FEEDBACK_FD, &fds)) {
786
+ UPDATE_TRACE_POINT();
787
+ /* If the watchdog has been killed then we'll kill all descendant
788
+ * processes and exit. There's no point in keeping the server agent
789
+ * running because we can't detect when the web server exits,
790
+ * and because this server agent doesn't own the instance
791
+ * directory. As soon as passenger-status is run, the instance
792
+ * directory will be cleaned up, making the server inaccessible.
562
793
  */
563
- this_thread::disable_syscall_interruption dsi;
564
- fd_set fds;
565
- int largestFd;
794
+ P_WARN("Watchdog seems to be killed; forcing shutdown of all subprocesses");
795
+ // We send a SIGTERM first to allow processes to gracefully shut down.
796
+ syscalls::killpg(getpgrp(), SIGTERM);
797
+ usleep(500000);
798
+ syscalls::killpg(getpgrp(), SIGKILL);
799
+ _exit(2); // In case killpg() fails.
800
+ } else {
801
+ UPDATE_TRACE_POINT();
802
+ /* We received an exit command. */
803
+ P_NOTICE("Received command to shutdown gracefully. "
804
+ "Waiting until all clients have disconnected...");
805
+ wo->appPool->prepareForShutdown();
806
+
807
+ for (unsigned i = 0; i < wo->threadWorkingObjects.size(); i++) {
808
+ ThreadWorkingObjects *two = &wo->threadWorkingObjects[i];
809
+ two->bgloop->safe->runLater(boost::bind(shutdownRequestHandler, two));
810
+ }
811
+ if (wo->threadWorkingObjects.size() > 1) {
812
+ wo->loadBalancer.shutdown();
813
+ }
814
+ if (wo->adminWorkingObjects.adminServer != NULL) {
815
+ wo->adminWorkingObjects.bgloop->safe->runLater(shutdownAdminServer);
816
+ }
566
817
 
567
- FD_ZERO(&fds);
568
- FD_SET(feedbackFd, &fds);
569
- FD_SET(exitEvent.fd(), &fds);
570
- largestFd = (feedbackFd > exitEvent.fd()) ? (int) feedbackFd : exitEvent.fd();
571
818
  UPDATE_TRACE_POINT();
572
- installDiagnosticsDumper();
573
- if (syscalls::select(largestFd + 1, &fds, NULL, NULL, NULL) == -1) {
819
+ FD_ZERO(&fds);
820
+ FD_SET(wo->allClientsDisconnectedEvent.fd(), &fds);
821
+ if (syscalls::select(wo->allClientsDisconnectedEvent.fd() + 1,
822
+ &fds, NULL, NULL, NULL) == -1)
823
+ {
574
824
  int e = errno;
575
- uninstallDiagnosticsDumper();
825
+ installDiagnosticsDumper(NULL, NULL);
576
826
  throw SystemException("select() failed", e);
577
827
  }
578
828
 
579
- if (FD_ISSET(feedbackFd, &fds)) {
580
- /* If the watchdog has been killed then we'll kill all descendant
581
- * processes and exit. There's no point in keeping this helper
582
- * server running because we can't detect when the web server exits,
583
- * and because this helper agent doesn't own the server instance
584
- * directory. As soon as passenger-status is run, the server
585
- * instance directory will be cleaned up, making this helper agent
586
- * inaccessible.
587
- */
588
- P_DEBUG("Watchdog seems to be killed; forcing shutdown of all subprocesses");
589
- // We send a SIGTERM first to allow processes to gracefully shut down.
590
- syscalls::killpg(getpgrp(), SIGTERM);
591
- usleep(500000);
592
- syscalls::killpg(getpgrp(), SIGKILL);
593
- _exit(2); // In case killpg() fails.
594
- } else {
595
- /* We received an exit command. We want to exit 5 seconds after
596
- * all clients have disconnected have become inactive.
597
- */
598
- P_DEBUG("Received command to exit gracefully. "
599
- "Waiting until 5 seconds after all clients have disconnected...");
600
- pool->prepareForShutdown();
601
- requestHandler->resetInactivityTime();
602
- while (requestHandler->inactivityTime() < 5000) {
603
- syscalls::usleep(250000);
604
- }
605
- P_DEBUG("It's now 5 seconds after all clients have disconnected. "
606
- "Proceeding with graceful exit.");
607
- }
608
- }
609
-
610
- string getRequestSocketFilename() const {
611
- return options.requestSocketFilename;
829
+ P_INFO("All clients have now disconnected. Proceeding with graceful shutdown");
612
830
  }
613
- };
831
+ }
614
832
 
615
- /**
616
- * Initializes and starts the helper agent that is responsible for handling communication
617
- * between Nginx and the backend Rails processes.
618
- *
619
- * @see Server
620
- * @see Client
621
- */
622
- int
623
- main(int argc, char *argv[]) {
833
+ static void
834
+ cleanup() {
624
835
  TRACE_POINT();
625
-
626
- if (argc > 1 && strcmp(argv[1], "system-metrics") == 0) {
627
- return SystemMetricsTool::main(argc, argv);
836
+ WorkingObjects *wo = workingObjects;
837
+
838
+ P_DEBUG("Shutting down " AGENT_EXE " server...");
839
+ wo->appPool->destroy();
840
+ installDiagnosticsDumper(NULL, NULL);
841
+ for (unsigned i = 0; i < wo->threadWorkingObjects.size(); i++) {
842
+ ThreadWorkingObjects *two = &wo->threadWorkingObjects[i];
843
+ two->bgloop->stop();
628
844
  }
629
-
630
- AgentOptionsPtr options;
631
- try {
632
- options = boost::make_shared<AgentOptions>(
633
- initializeAgent(argc, argv, "PassengerHelperAgent"));
634
- } catch (const VariantMap::MissingKeyException &e) {
635
- fprintf(stderr, "Option required: %s\n", e.getKey().c_str());
636
- return 1;
845
+ if (wo->adminWorkingObjects.adminServer != NULL) {
846
+ wo->adminWorkingObjects.bgloop->stop();
847
+ }
848
+ wo->appPool.reset();
849
+ for (unsigned i = 0; i < wo->threadWorkingObjects.size(); i++) {
850
+ ThreadWorkingObjects *two = &wo->threadWorkingObjects[i];
851
+ delete two->requestHandler;
852
+ }
853
+ if (wo->prestarterThread != NULL) {
854
+ wo->prestarterThread->interrupt_and_join();
855
+ delete wo->prestarterThread;
637
856
  }
638
- if (options->testBinary) {
639
- printf("PASS\n");
640
- exit(0);
857
+ for (unsigned int i = 0; i < SERVER_KIT_MAX_SERVER_ENDPOINTS; i++) {
858
+ if (wo->serverFds[i] != -1) {
859
+ close(wo->serverFds[i]);
860
+ }
861
+ if (wo->adminServerFds[i] != -1) {
862
+ close(wo->adminServerFds[i]);
863
+ }
641
864
  }
865
+ deletePidFile();
866
+ P_NOTICE(AGENT_EXE " server shutdown finished");
867
+ }
868
+
869
+ static void
870
+ deletePidFile() {
871
+ TRACE_POINT();
872
+ string pidFile = agentsOptions->get("server_pid_file", false);
873
+ if (!pidFile.empty()) {
874
+ syscalls::unlink(pidFile.c_str());
875
+ }
876
+ }
642
877
 
643
- P_DEBUG("Starting PassengerHelperAgent...");
644
- MultiLibeio::init();
878
+ static int
879
+ runServer() {
880
+ TRACE_POINT();
881
+ P_NOTICE("Starting " AGENT_EXE " server...");
645
882
 
646
883
  try {
647
884
  UPDATE_TRACE_POINT();
648
- Server server(FileDescriptor(FEEDBACK_FD), *options);
649
- P_WARN("PassengerHelperAgent online, listening at unix:" <<
650
- server.getRequestSocketFilename());
885
+ initializePrivilegedWorkingObjects();
886
+ initializeSingleAppMode();
887
+ startListening();
888
+ createPidFile();
889
+ lowerPrivilege();
890
+ initializeNonPrivilegedWorkingObjects();
891
+ prestartWebApps();
892
+
893
+ UPDATE_TRACE_POINT();
894
+ reportInitializationInfo();
895
+ mainLoop();
651
896
 
652
897
  UPDATE_TRACE_POINT();
653
- server.mainLoop();
898
+ cleanup();
654
899
  } catch (const tracable_exception &e) {
655
- P_ERROR("*** ERROR: " << e.what() << "\n" << e.backtrace());
900
+ P_CRITICAL("ERROR: " << e.what() << "\n" << e.backtrace());
901
+ deletePidFile();
656
902
  return 1;
657
903
  }
658
904
 
659
- MultiLibeio::shutdown();
660
- P_TRACE(2, "Helper agent exiting with code 0.");
661
905
  return 0;
662
906
  }
907
+
908
+
909
+ /***** Entry point and command line argument parsing *****/
910
+
911
+ static void
912
+ parseOptions(int argc, const char *argv[], VariantMap &options) {
913
+ OptionParser p(serverUsage);
914
+ int i = 2;
915
+
916
+ while (i < argc) {
917
+ if (parseServerOption(argc, argv, i, options)) {
918
+ continue;
919
+ } else if (p.isFlag(argv[i], 'h', "--help")) {
920
+ serverUsage();
921
+ exit(0);
922
+ } else {
923
+ fprintf(stderr, "ERROR: unrecognized argument %s. Please type "
924
+ "'%s server --help' for usage.\n", argv[i], argv[0]);
925
+ exit(1);
926
+ }
927
+ }
928
+ }
929
+
930
+ static void
931
+ preinitialize(VariantMap &options) {
932
+ // Set log_level here so that initializeAgent() calls setLogLevel()
933
+ // and setLogFile() with the right value.
934
+ if (options.has("server_log_level")) {
935
+ options.setInt("log_level", options.getInt("server_log_level"));
936
+ }
937
+ if (options.has("server_log_file")) {
938
+ options.set("debug_log_file", options.get("server_log_file"));
939
+ }
940
+ }
941
+
942
+ static void
943
+ setAgentsOptionsDefaults() {
944
+ VariantMap &options = *agentsOptions;
945
+ set<string> defaultAddress;
946
+ defaultAddress.insert(DEFAULT_HTTP_SERVER_LISTEN_ADDRESS);
947
+
948
+ options.setDefaultStrSet("server_addresses", defaultAddress);
949
+ options.setDefaultBool("multi_app", false);
950
+ options.setDefault("environment", DEFAULT_APP_ENV);
951
+ options.setDefault("spawn_method", DEFAULT_SPAWN_METHOD);
952
+ options.setDefaultBool("load_shell_envvars", false);
953
+ options.setDefault("concurrency_model", DEFAULT_CONCURRENCY_MODEL);
954
+ options.setDefaultInt("app_thread_count", DEFAULT_APP_THREAD_COUNT);
955
+ options.setDefaultInt("max_pool_size", DEFAULT_MAX_POOL_SIZE);
956
+ options.setDefaultInt("pool_idle_time", DEFAULT_POOL_IDLE_TIME);
957
+ options.setDefaultInt("min_instances", 1);
958
+ options.setDefaultInt("stat_throttle_rate", DEFAULT_STAT_THROTTLE_RATE);
959
+ options.setDefault("server_software", SERVER_TOKEN_NAME "/" PASSENGER_VERSION);
960
+ options.setDefaultBool("show_version_in_header", true);
961
+ options.setDefaultBool("turbocaching", true);
962
+ options.setDefault("data_buffer_dir", getSystemTempDir());
963
+ options.setDefaultBool("selfchecks", false);
964
+ options.setDefaultBool("server_graceful_exit", true);
965
+ options.setDefaultInt("server_threads", boost::thread::hardware_concurrency());
966
+ options.setDefaultBool("server_cpu_affine", false);
967
+ options.setDefault("friendly_error_pages", "auto");
968
+ options.setDefaultBool("rolling_restarts", false);
969
+
970
+ string firstAddress = options.getStrSet("server_addresses")[0];
971
+ if (getSocketAddressType(firstAddress) == SAT_TCP) {
972
+ string host;
973
+ unsigned short port;
974
+
975
+ parseTcpSocketAddress(firstAddress, host, port);
976
+ options.setDefault("default_server_name", host);
977
+ options.setDefaultInt("default_server_port", port);
978
+ } else {
979
+ options.setDefault("default_server_name", "localhost");
980
+ options.setDefaultInt("default_server_port", 80);
981
+ }
982
+
983
+ options.setDefault("default_ruby", DEFAULT_RUBY);
984
+ if (!options.getBool("multi_app") && !options.has("app_root")) {
985
+ char *pwd = getcwd(NULL, 0);
986
+ options.set("app_root", pwd);
987
+ free(pwd);
988
+ }
989
+ }
990
+
991
+ static void
992
+ sanityCheckOptions() {
993
+ VariantMap &options = *agentsOptions;
994
+ bool ok = true;
995
+
996
+ if (!options.has("passenger_root")) {
997
+ fprintf(stderr, "ERROR: please set the --passenger-root argument.\n");
998
+ ok = false;
999
+ }
1000
+ if (options.getBool("multi_app") && options.has("app_root")) {
1001
+ fprintf(stderr, "ERROR: you may not specify an application directory "
1002
+ "when in multi-app mode.\n");
1003
+ ok = false;
1004
+ }
1005
+ if (!options.getBool("multi_app") && options.has("app_type")) {
1006
+ PassengerAppType appType = getAppType(options.get("app_type"));
1007
+ if (appType == PAT_NONE || appType == PAT_ERROR) {
1008
+ fprintf(stderr, "ERROR: '%s' is not a valid applicaion type. Supported app types are:",
1009
+ options.get("app_type").c_str());
1010
+ const AppTypeDefinition *definition = &appTypeDefinitions[0];
1011
+ while (definition->type != PAT_NONE) {
1012
+ fprintf(stderr, " %s", definition->name);
1013
+ definition++;
1014
+ }
1015
+ fprintf(stderr, "\n");
1016
+ ok = false;
1017
+ }
1018
+
1019
+ if (!options.has("startup_file")) {
1020
+ fprintf(stderr, "ERROR: if you've passed --app-type, then you must also pass --startup-file.\n");
1021
+ ok = false;
1022
+ }
1023
+ }
1024
+ if (options.get("concurrency_model") != "process" && options.get("concurrency_model") != "thread") {
1025
+ fprintf(stderr, "ERROR: '%s' is not a valid concurrency model. Supported concurrency "
1026
+ "models are: process, thread.\n",
1027
+ options.get("concurrency_model").c_str());
1028
+ ok = false;
1029
+ } else if (options.get("concurrency_model") != "process") {
1030
+ #ifndef PASSENGER_IS_ENTERPRISE
1031
+ fprintf(stderr, "ERROR: the '%s' concurrency model is only supported in "
1032
+ PROGRAM_NAME " Enterprise.\nYou are currently using the open source "
1033
+ PROGRAM_NAME ". Buy " PROGRAM_NAME " Enterprise here: https://www.phusionpassenger.com/enterprise\n",
1034
+ options.get("concurrency_model").c_str());
1035
+ ok = false;
1036
+ #endif
1037
+ }
1038
+ if (options.getInt("app_thread_count") < 1) {
1039
+ fprintf(stderr, "ERROR: the value passed to --app-thread-count must be at least 1.\n");
1040
+ ok = false;
1041
+ } else if (options.getInt("app_thread_count") > 1) {
1042
+ #ifndef PASSENGER_IS_ENTERPRISE
1043
+ fprintf(stderr, "ERROR: the --app-thread-count option is only supported in "
1044
+ PROGRAM_NAME " Enterprise.\nYou are currently using the open source "
1045
+ PROGRAM_NAME ". Buy " PROGRAM_NAME " Enterprise here: https://www.phusionpassenger.com/enterprise\n");
1046
+ ok = false;
1047
+ #endif
1048
+ }
1049
+ if (RequestHandler::parseBenchmarkMode(options.get("benchmark_mode", false))
1050
+ == RequestHandler::BM_UNKNOWN)
1051
+ {
1052
+ fprintf(stderr, "ERROR: '%s' is not a valid mode for --benchmark.\n",
1053
+ options.get("benchmark_mode", false).c_str());
1054
+ ok = false;
1055
+ }
1056
+ if (options.getInt("server_threads") < 1) {
1057
+ fprintf(stderr, "ERROR: you may only specify for --threads a number greater than or equal to 1.\n");
1058
+ ok = false;
1059
+ }
1060
+
1061
+ if (!ok) {
1062
+ exit(1);
1063
+ }
1064
+ }
1065
+
1066
+ int
1067
+ serverMain(int argc, char *argv[]) {
1068
+ agentsOptions = new VariantMap();
1069
+ *agentsOptions = initializeAgent(argc, &argv, AGENT_EXE " server", parseOptions,
1070
+ preinitialize, 2);
1071
+ setAgentsOptionsDefaults();
1072
+ sanityCheckOptions();
1073
+ return runServer();
1074
+ }