passenger-jmazzi 2.2.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (912) hide show
  1. data/INSTALL +6 -0
  2. data/LICENSE +19 -0
  3. data/NEWS +270 -0
  4. data/README +45 -0
  5. data/Rakefile +918 -0
  6. data/benchmark/ApplicationPool.cpp +52 -0
  7. data/benchmark/accept_vs_socketpair_vs_named_pipes.rb +126 -0
  8. data/benchmark/dispatcher.rb +42 -0
  9. data/benchmark/overhead_of_password_checking.rb +81 -0
  10. data/benchmark/socket_connections_vs_persistent_pipe.rb +99 -0
  11. data/benchmark/unix_sockets_vs_pipes.rb +83 -0
  12. data/bin/passenger-config +46 -0
  13. data/bin/passenger-install-apache2-module +224 -0
  14. data/bin/passenger-install-nginx-module +474 -0
  15. data/bin/passenger-make-enterprisey +83 -0
  16. data/bin/passenger-memory-stats +301 -0
  17. data/bin/passenger-spawn-server +68 -0
  18. data/bin/passenger-status +125 -0
  19. data/bin/passenger-stress-test +344 -0
  20. data/debian/compat +1 -0
  21. data/debian/control +21 -0
  22. data/debian/postinst +24 -0
  23. data/debian/prerm +2 -0
  24. data/doc/ApplicationPool algorithm.txt +402 -0
  25. data/doc/Architectural overview.txt +334 -0
  26. data/doc/Doxyfile +241 -0
  27. data/doc/Security of user switching support.txt +197 -0
  28. data/doc/Users guide Apache.txt +1848 -0
  29. data/doc/Users guide Nginx.txt +769 -0
  30. data/doc/definitions.h +5 -0
  31. data/doc/images/by_sa.png +0 -0
  32. data/doc/images/conservative_spawning.png +0 -0
  33. data/doc/images/conservative_spawning.svg +248 -0
  34. data/doc/images/icons/README +5 -0
  35. data/doc/images/icons/callouts/1.png +0 -0
  36. data/doc/images/icons/callouts/10.png +0 -0
  37. data/doc/images/icons/callouts/11.png +0 -0
  38. data/doc/images/icons/callouts/12.png +0 -0
  39. data/doc/images/icons/callouts/13.png +0 -0
  40. data/doc/images/icons/callouts/14.png +0 -0
  41. data/doc/images/icons/callouts/15.png +0 -0
  42. data/doc/images/icons/callouts/2.png +0 -0
  43. data/doc/images/icons/callouts/3.png +0 -0
  44. data/doc/images/icons/callouts/4.png +0 -0
  45. data/doc/images/icons/callouts/5.png +0 -0
  46. data/doc/images/icons/callouts/6.png +0 -0
  47. data/doc/images/icons/callouts/7.png +0 -0
  48. data/doc/images/icons/callouts/8.png +0 -0
  49. data/doc/images/icons/callouts/9.png +0 -0
  50. data/doc/images/icons/caution.png +0 -0
  51. data/doc/images/icons/example.png +0 -0
  52. data/doc/images/icons/home.png +0 -0
  53. data/doc/images/icons/important.png +0 -0
  54. data/doc/images/icons/next.png +0 -0
  55. data/doc/images/icons/note.png +0 -0
  56. data/doc/images/icons/prev.png +0 -0
  57. data/doc/images/icons/tip.png +0 -0
  58. data/doc/images/icons/up.png +0 -0
  59. data/doc/images/icons/warning.png +0 -0
  60. data/doc/images/passenger_architecture.png +0 -0
  61. data/doc/images/passenger_architecture.svg +401 -0
  62. data/doc/images/phusion_banner.png +0 -0
  63. data/doc/images/smart-lv2.png +0 -0
  64. data/doc/images/smart-lv2.svg +320 -0
  65. data/doc/images/spawn_server_architecture.png +0 -0
  66. data/doc/images/spawn_server_architecture.svg +655 -0
  67. data/doc/images/typical_isolated_web_application.png +0 -0
  68. data/doc/images/typical_isolated_web_application.svg +213 -0
  69. data/doc/template/horo.rb +613 -0
  70. data/doc/users_guide_snippets/analysis_and_system_maintenance_tools.txt +144 -0
  71. data/doc/users_guide_snippets/appendix_a_about.txt +13 -0
  72. data/doc/users_guide_snippets/appendix_b_terminology.txt +63 -0
  73. data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +304 -0
  74. data/doc/users_guide_snippets/global_queueing_explained.txt +78 -0
  75. data/doc/users_guide_snippets/rackup_specifications.txt +71 -0
  76. data/doc/users_guide_snippets/rails_spawn_method.txt +48 -0
  77. data/doc/users_guide_snippets/tips.txt +173 -0
  78. data/ext/apache2/Bucket.cpp +190 -0
  79. data/ext/apache2/Bucket.h +87 -0
  80. data/ext/apache2/Configuration.cpp +798 -0
  81. data/ext/apache2/Configuration.h +405 -0
  82. data/ext/apache2/DirectoryMapper.h +296 -0
  83. data/ext/apache2/Hooks.cpp +1617 -0
  84. data/ext/apache2/Hooks.h +45 -0
  85. data/ext/apache2/LICENSE-CNRI.TXT +79 -0
  86. data/ext/apache2/mod_passenger.c +38 -0
  87. data/ext/boost/LICENSE.TXT +23 -0
  88. data/ext/boost/VERSION.TXT +1 -0
  89. data/ext/boost/algorithm/string/case_conv.hpp +176 -0
  90. data/ext/boost/algorithm/string/compare.hpp +199 -0
  91. data/ext/boost/algorithm/string/concept.hpp +83 -0
  92. data/ext/boost/algorithm/string/config.hpp +28 -0
  93. data/ext/boost/algorithm/string/constants.hpp +36 -0
  94. data/ext/boost/algorithm/string/detail/case_conv.hpp +112 -0
  95. data/ext/boost/algorithm/string/detail/find_format.hpp +193 -0
  96. data/ext/boost/algorithm/string/detail/find_format_all.hpp +263 -0
  97. data/ext/boost/algorithm/string/detail/find_format_store.hpp +71 -0
  98. data/ext/boost/algorithm/string/detail/finder.hpp +646 -0
  99. data/ext/boost/algorithm/string/detail/formatter.hpp +94 -0
  100. data/ext/boost/algorithm/string/detail/replace_storage.hpp +159 -0
  101. data/ext/boost/algorithm/string/detail/sequence.hpp +200 -0
  102. data/ext/boost/algorithm/string/detail/util.hpp +106 -0
  103. data/ext/boost/algorithm/string/erase.hpp +844 -0
  104. data/ext/boost/algorithm/string/find_format.hpp +269 -0
  105. data/ext/boost/algorithm/string/finder.hpp +270 -0
  106. data/ext/boost/algorithm/string/formatter.hpp +103 -0
  107. data/ext/boost/algorithm/string/replace.hpp +928 -0
  108. data/ext/boost/algorithm/string/sequence_traits.hpp +193 -0
  109. data/ext/boost/algorithm/string/yes_no_type.hpp +33 -0
  110. data/ext/boost/assert.hpp +50 -0
  111. data/ext/boost/bind.hpp +1689 -0
  112. data/ext/boost/bind/arg.hpp +62 -0
  113. data/ext/boost/bind/bind_cc.hpp +117 -0
  114. data/ext/boost/bind/bind_mf_cc.hpp +227 -0
  115. data/ext/boost/bind/bind_template.hpp +345 -0
  116. data/ext/boost/bind/mem_fn_cc.hpp +103 -0
  117. data/ext/boost/bind/mem_fn_template.hpp +1020 -0
  118. data/ext/boost/bind/placeholders.hpp +68 -0
  119. data/ext/boost/bind/storage.hpp +475 -0
  120. data/ext/boost/call_traits.hpp +24 -0
  121. data/ext/boost/checked_delete.hpp +69 -0
  122. data/ext/boost/concept/assert.hpp +46 -0
  123. data/ext/boost/concept/detail/concept_def.hpp +51 -0
  124. data/ext/boost/concept/detail/concept_undef.hpp +5 -0
  125. data/ext/boost/concept/detail/general.hpp +66 -0
  126. data/ext/boost/concept/detail/has_constraints.hpp +48 -0
  127. data/ext/boost/concept/usage.hpp +43 -0
  128. data/ext/boost/concept_check.hpp +988 -0
  129. data/ext/boost/config.hpp +70 -0
  130. data/ext/boost/config/abi/borland_prefix.hpp +27 -0
  131. data/ext/boost/config/abi/borland_suffix.hpp +12 -0
  132. data/ext/boost/config/abi/msvc_prefix.hpp +8 -0
  133. data/ext/boost/config/abi/msvc_suffix.hpp +8 -0
  134. data/ext/boost/config/abi_prefix.hpp +25 -0
  135. data/ext/boost/config/abi_suffix.hpp +26 -0
  136. data/ext/boost/config/auto_link.hpp +368 -0
  137. data/ext/boost/config/compiler/borland.hpp +209 -0
  138. data/ext/boost/config/compiler/comeau.hpp +59 -0
  139. data/ext/boost/config/compiler/common_edg.hpp +62 -0
  140. data/ext/boost/config/compiler/compaq_cxx.hpp +19 -0
  141. data/ext/boost/config/compiler/digitalmars.hpp +67 -0
  142. data/ext/boost/config/compiler/gcc.hpp +149 -0
  143. data/ext/boost/config/compiler/gcc_xml.hpp +30 -0
  144. data/ext/boost/config/compiler/greenhills.hpp +28 -0
  145. data/ext/boost/config/compiler/hp_acc.hpp +95 -0
  146. data/ext/boost/config/compiler/intel.hpp +162 -0
  147. data/ext/boost/config/compiler/kai.hpp +35 -0
  148. data/ext/boost/config/compiler/metrowerks.hpp +111 -0
  149. data/ext/boost/config/compiler/mpw.hpp +51 -0
  150. data/ext/boost/config/compiler/pgi.hpp +25 -0
  151. data/ext/boost/config/compiler/sgi_mipspro.hpp +28 -0
  152. data/ext/boost/config/compiler/sunpro_cc.hpp +98 -0
  153. data/ext/boost/config/compiler/vacpp.hpp +60 -0
  154. data/ext/boost/config/compiler/visualc.hpp +191 -0
  155. data/ext/boost/config/no_tr1/complex.hpp +28 -0
  156. data/ext/boost/config/no_tr1/functional.hpp +28 -0
  157. data/ext/boost/config/no_tr1/memory.hpp +28 -0
  158. data/ext/boost/config/no_tr1/utility.hpp +28 -0
  159. data/ext/boost/config/platform/aix.hpp +33 -0
  160. data/ext/boost/config/platform/amigaos.hpp +15 -0
  161. data/ext/boost/config/platform/beos.hpp +26 -0
  162. data/ext/boost/config/platform/bsd.hpp +73 -0
  163. data/ext/boost/config/platform/cygwin.hpp +51 -0
  164. data/ext/boost/config/platform/hpux.hpp +84 -0
  165. data/ext/boost/config/platform/irix.hpp +31 -0
  166. data/ext/boost/config/platform/linux.hpp +98 -0
  167. data/ext/boost/config/platform/macos.hpp +78 -0
  168. data/ext/boost/config/platform/qnxnto.hpp +31 -0
  169. data/ext/boost/config/platform/solaris.hpp +21 -0
  170. data/ext/boost/config/platform/win32.hpp +58 -0
  171. data/ext/boost/config/posix_features.hpp +95 -0
  172. data/ext/boost/config/requires_threads.hpp +92 -0
  173. data/ext/boost/config/select_compiler_config.hpp +115 -0
  174. data/ext/boost/config/select_platform_config.hpp +90 -0
  175. data/ext/boost/config/select_stdlib_config.hpp +68 -0
  176. data/ext/boost/config/stdlib/dinkumware.hpp +106 -0
  177. data/ext/boost/config/stdlib/libcomo.hpp +46 -0
  178. data/ext/boost/config/stdlib/libstdcpp3.hpp +73 -0
  179. data/ext/boost/config/stdlib/modena.hpp +30 -0
  180. data/ext/boost/config/stdlib/msl.hpp +59 -0
  181. data/ext/boost/config/stdlib/roguewave.hpp +153 -0
  182. data/ext/boost/config/stdlib/sgi.hpp +111 -0
  183. data/ext/boost/config/stdlib/stlport.hpp +201 -0
  184. data/ext/boost/config/stdlib/vacpp.hpp +18 -0
  185. data/ext/boost/config/suffix.hpp +566 -0
  186. data/ext/boost/config/user.hpp +124 -0
  187. data/ext/boost/cstdint.hpp +449 -0
  188. data/ext/boost/current_function.hpp +67 -0
  189. data/ext/boost/date_time/adjust_functors.hpp +178 -0
  190. data/ext/boost/date_time/c_time.hpp +91 -0
  191. data/ext/boost/date_time/compiler_config.hpp +149 -0
  192. data/ext/boost/date_time/constrained_value.hpp +98 -0
  193. data/ext/boost/date_time/date.hpp +197 -0
  194. data/ext/boost/date_time/date_clock_device.hpp +77 -0
  195. data/ext/boost/date_time/date_defs.hpp +26 -0
  196. data/ext/boost/date_time/date_duration.hpp +147 -0
  197. data/ext/boost/date_time/date_duration_types.hpp +269 -0
  198. data/ext/boost/date_time/date_facet.hpp +775 -0
  199. data/ext/boost/date_time/date_format_simple.hpp +159 -0
  200. data/ext/boost/date_time/date_formatting.hpp +127 -0
  201. data/ext/boost/date_time/date_formatting_limited.hpp +121 -0
  202. data/ext/boost/date_time/date_formatting_locales.hpp +233 -0
  203. data/ext/boost/date_time/date_generator_formatter.hpp +263 -0
  204. data/ext/boost/date_time/date_generator_parser.hpp +329 -0
  205. data/ext/boost/date_time/date_generators.hpp +509 -0
  206. data/ext/boost/date_time/date_iterator.hpp +101 -0
  207. data/ext/boost/date_time/date_names_put.hpp +320 -0
  208. data/ext/boost/date_time/date_parsing.hpp +299 -0
  209. data/ext/boost/date_time/dst_rules.hpp +391 -0
  210. data/ext/boost/date_time/filetime_functions.hpp +78 -0
  211. data/ext/boost/date_time/format_date_parser.hpp +731 -0
  212. data/ext/boost/date_time/gregorian/conversion.hpp +73 -0
  213. data/ext/boost/date_time/gregorian/formatters.hpp +162 -0
  214. data/ext/boost/date_time/gregorian/formatters_limited.hpp +81 -0
  215. data/ext/boost/date_time/gregorian/greg_calendar.hpp +47 -0
  216. data/ext/boost/date_time/gregorian/greg_date.hpp +135 -0
  217. data/ext/boost/date_time/gregorian/greg_day.hpp +57 -0
  218. data/ext/boost/date_time/gregorian/greg_day_of_year.hpp +38 -0
  219. data/ext/boost/date_time/gregorian/greg_duration.hpp +38 -0
  220. data/ext/boost/date_time/gregorian/greg_duration_types.hpp +34 -0
  221. data/ext/boost/date_time/gregorian/greg_month.hpp +105 -0
  222. data/ext/boost/date_time/gregorian/greg_weekday.hpp +66 -0
  223. data/ext/boost/date_time/gregorian/greg_year.hpp +53 -0
  224. data/ext/boost/date_time/gregorian/greg_ymd.hpp +33 -0
  225. data/ext/boost/date_time/gregorian/gregorian.hpp +38 -0
  226. data/ext/boost/date_time/gregorian/gregorian_io.hpp +777 -0
  227. data/ext/boost/date_time/gregorian/gregorian_types.hpp +109 -0
  228. data/ext/boost/date_time/gregorian/parsers.hpp +91 -0
  229. data/ext/boost/date_time/gregorian_calendar.hpp +70 -0
  230. data/ext/boost/date_time/gregorian_calendar.ipp +219 -0
  231. data/ext/boost/date_time/int_adapter.hpp +507 -0
  232. data/ext/boost/date_time/iso_format.hpp +303 -0
  233. data/ext/boost/date_time/locale_config.hpp +31 -0
  234. data/ext/boost/date_time/microsec_time_clock.hpp +205 -0
  235. data/ext/boost/date_time/parse_format_base.hpp +29 -0
  236. data/ext/boost/date_time/period.hpp +377 -0
  237. data/ext/boost/date_time/period_formatter.hpp +196 -0
  238. data/ext/boost/date_time/period_parser.hpp +196 -0
  239. data/ext/boost/date_time/posix_time/conversion.hpp +93 -0
  240. data/ext/boost/date_time/posix_time/date_duration_operators.hpp +114 -0
  241. data/ext/boost/date_time/posix_time/posix_time.hpp +39 -0
  242. data/ext/boost/date_time/posix_time/posix_time_config.hpp +178 -0
  243. data/ext/boost/date_time/posix_time/posix_time_duration.hpp +82 -0
  244. data/ext/boost/date_time/posix_time/posix_time_io.hpp +246 -0
  245. data/ext/boost/date_time/posix_time/posix_time_system.hpp +68 -0
  246. data/ext/boost/date_time/posix_time/posix_time_types.hpp +55 -0
  247. data/ext/boost/date_time/posix_time/ptime.hpp +65 -0
  248. data/ext/boost/date_time/posix_time/time_formatters.hpp +289 -0
  249. data/ext/boost/date_time/posix_time/time_parsers.hpp +44 -0
  250. data/ext/boost/date_time/posix_time/time_period.hpp +29 -0
  251. data/ext/boost/date_time/special_defs.hpp +25 -0
  252. data/ext/boost/date_time/special_values_formatter.hpp +96 -0
  253. data/ext/boost/date_time/special_values_parser.hpp +159 -0
  254. data/ext/boost/date_time/string_convert.hpp +33 -0
  255. data/ext/boost/date_time/string_parse_tree.hpp +278 -0
  256. data/ext/boost/date_time/strings_from_facet.hpp +123 -0
  257. data/ext/boost/date_time/time.hpp +190 -0
  258. data/ext/boost/date_time/time_clock.hpp +83 -0
  259. data/ext/boost/date_time/time_defs.hpp +33 -0
  260. data/ext/boost/date_time/time_duration.hpp +281 -0
  261. data/ext/boost/date_time/time_facet.hpp +1263 -0
  262. data/ext/boost/date_time/time_formatting_streams.hpp +119 -0
  263. data/ext/boost/date_time/time_iterator.hpp +52 -0
  264. data/ext/boost/date_time/time_parsing.hpp +321 -0
  265. data/ext/boost/date_time/time_resolution_traits.hpp +140 -0
  266. data/ext/boost/date_time/time_system_counted.hpp +254 -0
  267. data/ext/boost/date_time/time_system_split.hpp +213 -0
  268. data/ext/boost/date_time/wrapping_int.hpp +163 -0
  269. data/ext/boost/date_time/year_month_day.hpp +45 -0
  270. data/ext/boost/detail/atomic_count.hpp +124 -0
  271. data/ext/boost/detail/atomic_count_gcc.hpp +68 -0
  272. data/ext/boost/detail/atomic_count_gcc_x86.hpp +84 -0
  273. data/ext/boost/detail/atomic_count_pthreads.hpp +96 -0
  274. data/ext/boost/detail/atomic_count_solaris.hpp +59 -0
  275. data/ext/boost/detail/atomic_count_sync.hpp +57 -0
  276. data/ext/boost/detail/atomic_count_win32.hpp +63 -0
  277. data/ext/boost/detail/bad_weak_ptr.hpp +59 -0
  278. data/ext/boost/detail/call_traits.hpp +164 -0
  279. data/ext/boost/detail/endian.hpp +73 -0
  280. data/ext/boost/detail/indirect_traits.hpp +487 -0
  281. data/ext/boost/detail/iterator.hpp +494 -0
  282. data/ext/boost/detail/lcast_precision.hpp +184 -0
  283. data/ext/boost/detail/limits.hpp +449 -0
  284. data/ext/boost/detail/reference_content.hpp +141 -0
  285. data/ext/boost/detail/shared_count.hpp +375 -0
  286. data/ext/boost/detail/sp_counted_base.hpp +81 -0
  287. data/ext/boost/detail/sp_counted_base_acc_ia64.hpp +150 -0
  288. data/ext/boost/detail/sp_counted_base_cw_ppc.hpp +170 -0
  289. data/ext/boost/detail/sp_counted_base_cw_x86.hpp +158 -0
  290. data/ext/boost/detail/sp_counted_base_gcc_ia64.hpp +157 -0
  291. data/ext/boost/detail/sp_counted_base_gcc_ppc.hpp +181 -0
  292. data/ext/boost/detail/sp_counted_base_gcc_sparc.hpp +166 -0
  293. data/ext/boost/detail/sp_counted_base_gcc_x86.hpp +173 -0
  294. data/ext/boost/detail/sp_counted_base_nt.hpp +107 -0
  295. data/ext/boost/detail/sp_counted_base_pt.hpp +135 -0
  296. data/ext/boost/detail/sp_counted_base_solaris.hpp +113 -0
  297. data/ext/boost/detail/sp_counted_base_sync.hpp +151 -0
  298. data/ext/boost/detail/sp_counted_base_w32.hpp +130 -0
  299. data/ext/boost/detail/sp_counted_impl.hpp +231 -0
  300. data/ext/boost/detail/sp_typeinfo.hpp +83 -0
  301. data/ext/boost/detail/workaround.hpp +202 -0
  302. data/ext/boost/enable_shared_from_this.hpp +73 -0
  303. data/ext/boost/function.hpp +66 -0
  304. data/ext/boost/function/detail/function_iterate.hpp +16 -0
  305. data/ext/boost/function/detail/maybe_include.hpp +267 -0
  306. data/ext/boost/function/detail/prologue.hpp +25 -0
  307. data/ext/boost/function/function_base.hpp +762 -0
  308. data/ext/boost/function/function_template.hpp +969 -0
  309. data/ext/boost/function_equal.hpp +28 -0
  310. data/ext/boost/get_pointer.hpp +29 -0
  311. data/ext/boost/implicit_cast.hpp +29 -0
  312. data/ext/boost/integer_traits.hpp +236 -0
  313. data/ext/boost/io/ios_state.hpp +431 -0
  314. data/ext/boost/io_fwd.hpp +67 -0
  315. data/ext/boost/is_placeholder.hpp +31 -0
  316. data/ext/boost/iterator.hpp +59 -0
  317. data/ext/boost/iterator/detail/config_def.hpp +135 -0
  318. data/ext/boost/iterator/detail/config_undef.hpp +25 -0
  319. data/ext/boost/iterator/detail/enable_if.hpp +86 -0
  320. data/ext/boost/iterator/detail/facade_iterator_category.hpp +200 -0
  321. data/ext/boost/iterator/detail/minimum_category.hpp +116 -0
  322. data/ext/boost/iterator/interoperable.hpp +50 -0
  323. data/ext/boost/iterator/iterator_adaptor.hpp +366 -0
  324. data/ext/boost/iterator/iterator_categories.hpp +188 -0
  325. data/ext/boost/iterator/iterator_facade.hpp +879 -0
  326. data/ext/boost/iterator/iterator_traits.hpp +92 -0
  327. data/ext/boost/iterator/reverse_iterator.hpp +69 -0
  328. data/ext/boost/iterator/transform_iterator.hpp +188 -0
  329. data/ext/boost/lexical_cast.hpp +1205 -0
  330. data/ext/boost/limits.hpp +146 -0
  331. data/ext/boost/mem_fn.hpp +389 -0
  332. data/ext/boost/mpl/always.hpp +39 -0
  333. data/ext/boost/mpl/and.hpp +60 -0
  334. data/ext/boost/mpl/apply.hpp +229 -0
  335. data/ext/boost/mpl/apply_fwd.hpp +107 -0
  336. data/ext/boost/mpl/apply_wrap.hpp +203 -0
  337. data/ext/boost/mpl/arg.hpp +131 -0
  338. data/ext/boost/mpl/arg_fwd.hpp +28 -0
  339. data/ext/boost/mpl/assert.hpp +370 -0
  340. data/ext/boost/mpl/aux_/adl_barrier.hpp +48 -0
  341. data/ext/boost/mpl/aux_/arg_typedef.hpp +31 -0
  342. data/ext/boost/mpl/aux_/arity.hpp +39 -0
  343. data/ext/boost/mpl/aux_/arity_spec.hpp +67 -0
  344. data/ext/boost/mpl/aux_/common_name_wknd.hpp +34 -0
  345. data/ext/boost/mpl/aux_/config/adl.hpp +40 -0
  346. data/ext/boost/mpl/aux_/config/arrays.hpp +30 -0
  347. data/ext/boost/mpl/aux_/config/bind.hpp +33 -0
  348. data/ext/boost/mpl/aux_/config/compiler.hpp +64 -0
  349. data/ext/boost/mpl/aux_/config/ctps.hpp +30 -0
  350. data/ext/boost/mpl/aux_/config/dtp.hpp +46 -0
  351. data/ext/boost/mpl/aux_/config/eti.hpp +47 -0
  352. data/ext/boost/mpl/aux_/config/gcc.hpp +23 -0
  353. data/ext/boost/mpl/aux_/config/has_apply.hpp +32 -0
  354. data/ext/boost/mpl/aux_/config/has_xxx.hpp +33 -0
  355. data/ext/boost/mpl/aux_/config/integral.hpp +38 -0
  356. data/ext/boost/mpl/aux_/config/intel.hpp +21 -0
  357. data/ext/boost/mpl/aux_/config/lambda.hpp +32 -0
  358. data/ext/boost/mpl/aux_/config/msvc.hpp +21 -0
  359. data/ext/boost/mpl/aux_/config/msvc_typename.hpp +26 -0
  360. data/ext/boost/mpl/aux_/config/nttp.hpp +41 -0
  361. data/ext/boost/mpl/aux_/config/overload_resolution.hpp +29 -0
  362. data/ext/boost/mpl/aux_/config/pp_counter.hpp +26 -0
  363. data/ext/boost/mpl/aux_/config/preprocessor.hpp +39 -0
  364. data/ext/boost/mpl/aux_/config/static_constant.hpp +25 -0
  365. data/ext/boost/mpl/aux_/config/ttp.hpp +41 -0
  366. data/ext/boost/mpl/aux_/config/use_preprocessed.hpp +19 -0
  367. data/ext/boost/mpl/aux_/config/workaround.hpp +19 -0
  368. data/ext/boost/mpl/aux_/full_lambda.hpp +354 -0
  369. data/ext/boost/mpl/aux_/has_apply.hpp +32 -0
  370. data/ext/boost/mpl/aux_/has_type.hpp +23 -0
  371. data/ext/boost/mpl/aux_/include_preprocessed.hpp +42 -0
  372. data/ext/boost/mpl/aux_/integral_wrapper.hpp +93 -0
  373. data/ext/boost/mpl/aux_/lambda_arity_param.hpp +25 -0
  374. data/ext/boost/mpl/aux_/lambda_support.hpp +169 -0
  375. data/ext/boost/mpl/aux_/msvc_never_true.hpp +34 -0
  376. data/ext/boost/mpl/aux_/na.hpp +95 -0
  377. data/ext/boost/mpl/aux_/na_assert.hpp +34 -0
  378. data/ext/boost/mpl/aux_/na_fwd.hpp +31 -0
  379. data/ext/boost/mpl/aux_/na_spec.hpp +175 -0
  380. data/ext/boost/mpl/aux_/nested_type_wknd.hpp +48 -0
  381. data/ext/boost/mpl/aux_/nttp_decl.hpp +35 -0
  382. data/ext/boost/mpl/aux_/preprocessed/gcc/and.hpp +69 -0
  383. data/ext/boost/mpl/aux_/preprocessed/gcc/apply.hpp +169 -0
  384. data/ext/boost/mpl/aux_/preprocessed/gcc/apply_fwd.hpp +52 -0
  385. data/ext/boost/mpl/aux_/preprocessed/gcc/apply_wrap.hpp +84 -0
  386. data/ext/boost/mpl/aux_/preprocessed/gcc/arg.hpp +123 -0
  387. data/ext/boost/mpl/aux_/preprocessed/gcc/bind.hpp +561 -0
  388. data/ext/boost/mpl/aux_/preprocessed/gcc/bind_fwd.hpp +52 -0
  389. data/ext/boost/mpl/aux_/preprocessed/gcc/full_lambda.hpp +558 -0
  390. data/ext/boost/mpl/aux_/preprocessed/gcc/or.hpp +69 -0
  391. data/ext/boost/mpl/aux_/preprocessed/gcc/placeholders.hpp +105 -0
  392. data/ext/boost/mpl/aux_/preprocessed/gcc/quote.hpp +123 -0
  393. data/ext/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp +101 -0
  394. data/ext/boost/mpl/aux_/preprocessor/def_params_tail.hpp +105 -0
  395. data/ext/boost/mpl/aux_/preprocessor/enum.hpp +62 -0
  396. data/ext/boost/mpl/aux_/preprocessor/filter_params.hpp +28 -0
  397. data/ext/boost/mpl/aux_/preprocessor/params.hpp +65 -0
  398. data/ext/boost/mpl/aux_/preprocessor/sub.hpp +65 -0
  399. data/ext/boost/mpl/aux_/static_cast.hpp +27 -0
  400. data/ext/boost/mpl/aux_/template_arity.hpp +189 -0
  401. data/ext/boost/mpl/aux_/template_arity_fwd.hpp +23 -0
  402. data/ext/boost/mpl/aux_/type_wrapper.hpp +47 -0
  403. data/ext/boost/mpl/aux_/value_wknd.hpp +89 -0
  404. data/ext/boost/mpl/aux_/yes_no.hpp +58 -0
  405. data/ext/boost/mpl/bind.hpp +551 -0
  406. data/ext/boost/mpl/bind_fwd.hpp +99 -0
  407. data/ext/boost/mpl/bool.hpp +39 -0
  408. data/ext/boost/mpl/bool_fwd.hpp +33 -0
  409. data/ext/boost/mpl/eval_if.hpp +71 -0
  410. data/ext/boost/mpl/has_xxx.hpp +272 -0
  411. data/ext/boost/mpl/identity.hpp +45 -0
  412. data/ext/boost/mpl/if.hpp +135 -0
  413. data/ext/boost/mpl/int.hpp +22 -0
  414. data/ext/boost/mpl/int_fwd.hpp +27 -0
  415. data/ext/boost/mpl/integral_c.hpp +51 -0
  416. data/ext/boost/mpl/integral_c_fwd.hpp +32 -0
  417. data/ext/boost/mpl/integral_c_tag.hpp +26 -0
  418. data/ext/boost/mpl/lambda.hpp +29 -0
  419. data/ext/boost/mpl/lambda_fwd.hpp +57 -0
  420. data/ext/boost/mpl/limits/arity.hpp +21 -0
  421. data/ext/boost/mpl/logical.hpp +21 -0
  422. data/ext/boost/mpl/next.hpp +19 -0
  423. data/ext/boost/mpl/next_prior.hpp +49 -0
  424. data/ext/boost/mpl/not.hpp +51 -0
  425. data/ext/boost/mpl/or.hpp +61 -0
  426. data/ext/boost/mpl/placeholders.hpp +100 -0
  427. data/ext/boost/mpl/protect.hpp +55 -0
  428. data/ext/boost/mpl/quote.hpp +140 -0
  429. data/ext/boost/mpl/size_t.hpp +25 -0
  430. data/ext/boost/mpl/size_t_fwd.hpp +28 -0
  431. data/ext/boost/mpl/void.hpp +76 -0
  432. data/ext/boost/mpl/void_fwd.hpp +26 -0
  433. data/ext/boost/next_prior.hpp +51 -0
  434. data/ext/boost/non_type.hpp +27 -0
  435. data/ext/boost/noncopyable.hpp +36 -0
  436. data/ext/boost/none.hpp +28 -0
  437. data/ext/boost/none_t.hpp +24 -0
  438. data/ext/boost/operators.hpp +943 -0
  439. data/ext/boost/optional.hpp +18 -0
  440. data/ext/boost/optional/optional.hpp +922 -0
  441. data/ext/boost/optional/optional_fwd.hpp +22 -0
  442. data/ext/boost/preprocessor/arithmetic/add.hpp +51 -0
  443. data/ext/boost/preprocessor/arithmetic/dec.hpp +288 -0
  444. data/ext/boost/preprocessor/arithmetic/inc.hpp +288 -0
  445. data/ext/boost/preprocessor/arithmetic/sub.hpp +50 -0
  446. data/ext/boost/preprocessor/array/data.hpp +28 -0
  447. data/ext/boost/preprocessor/array/elem.hpp +29 -0
  448. data/ext/boost/preprocessor/array/size.hpp +28 -0
  449. data/ext/boost/preprocessor/cat.hpp +35 -0
  450. data/ext/boost/preprocessor/comma_if.hpp +17 -0
  451. data/ext/boost/preprocessor/config/config.hpp +70 -0
  452. data/ext/boost/preprocessor/control/detail/while.hpp +536 -0
  453. data/ext/boost/preprocessor/control/expr_iif.hpp +31 -0
  454. data/ext/boost/preprocessor/control/if.hpp +30 -0
  455. data/ext/boost/preprocessor/control/iif.hpp +34 -0
  456. data/ext/boost/preprocessor/control/while.hpp +312 -0
  457. data/ext/boost/preprocessor/debug/error.hpp +33 -0
  458. data/ext/boost/preprocessor/detail/auto_rec.hpp +293 -0
  459. data/ext/boost/preprocessor/detail/check.hpp +48 -0
  460. data/ext/boost/preprocessor/detail/is_binary.hpp +30 -0
  461. data/ext/boost/preprocessor/empty.hpp +17 -0
  462. data/ext/boost/preprocessor/enum.hpp +17 -0
  463. data/ext/boost/preprocessor/enum_params.hpp +17 -0
  464. data/ext/boost/preprocessor/facilities/empty.hpp +21 -0
  465. data/ext/boost/preprocessor/facilities/identity.hpp +23 -0
  466. data/ext/boost/preprocessor/identity.hpp +17 -0
  467. data/ext/boost/preprocessor/inc.hpp +17 -0
  468. data/ext/boost/preprocessor/iterate.hpp +17 -0
  469. data/ext/boost/preprocessor/iteration/detail/bounds/lower1.hpp +99 -0
  470. data/ext/boost/preprocessor/iteration/detail/bounds/upper1.hpp +99 -0
  471. data/ext/boost/preprocessor/iteration/detail/iter/forward1.hpp +1342 -0
  472. data/ext/boost/preprocessor/iteration/iterate.hpp +82 -0
  473. data/ext/boost/preprocessor/list/adt.hpp +73 -0
  474. data/ext/boost/preprocessor/list/append.hpp +40 -0
  475. data/ext/boost/preprocessor/list/detail/fold_left.hpp +279 -0
  476. data/ext/boost/preprocessor/list/detail/fold_right.hpp +277 -0
  477. data/ext/boost/preprocessor/list/fold_left.hpp +303 -0
  478. data/ext/boost/preprocessor/list/fold_right.hpp +40 -0
  479. data/ext/boost/preprocessor/list/for_each_i.hpp +65 -0
  480. data/ext/boost/preprocessor/list/reverse.hpp +40 -0
  481. data/ext/boost/preprocessor/list/transform.hpp +49 -0
  482. data/ext/boost/preprocessor/logical/and.hpp +30 -0
  483. data/ext/boost/preprocessor/logical/bitand.hpp +38 -0
  484. data/ext/boost/preprocessor/logical/bool.hpp +288 -0
  485. data/ext/boost/preprocessor/logical/compl.hpp +36 -0
  486. data/ext/boost/preprocessor/punctuation/comma.hpp +21 -0
  487. data/ext/boost/preprocessor/punctuation/comma_if.hpp +31 -0
  488. data/ext/boost/preprocessor/repeat.hpp +17 -0
  489. data/ext/boost/preprocessor/repetition/detail/for.hpp +536 -0
  490. data/ext/boost/preprocessor/repetition/enum.hpp +66 -0
  491. data/ext/boost/preprocessor/repetition/enum_binary_params.hpp +54 -0
  492. data/ext/boost/preprocessor/repetition/enum_params.hpp +41 -0
  493. data/ext/boost/preprocessor/repetition/for.hpp +306 -0
  494. data/ext/boost/preprocessor/repetition/repeat.hpp +825 -0
  495. data/ext/boost/preprocessor/repetition/repeat_from_to.hpp +87 -0
  496. data/ext/boost/preprocessor/seq/elem.hpp +304 -0
  497. data/ext/boost/preprocessor/seq/enum.hpp +288 -0
  498. data/ext/boost/preprocessor/seq/for_each_i.hpp +61 -0
  499. data/ext/boost/preprocessor/seq/seq.hpp +44 -0
  500. data/ext/boost/preprocessor/seq/size.hpp +548 -0
  501. data/ext/boost/preprocessor/slot/detail/def.hpp +49 -0
  502. data/ext/boost/preprocessor/slot/detail/shared.hpp +247 -0
  503. data/ext/boost/preprocessor/slot/slot.hpp +32 -0
  504. data/ext/boost/preprocessor/stringize.hpp +33 -0
  505. data/ext/boost/preprocessor/tuple/eat.hpp +57 -0
  506. data/ext/boost/preprocessor/tuple/elem.hpp +385 -0
  507. data/ext/boost/preprocessor/tuple/rem.hpp +72 -0
  508. data/ext/boost/preprocessor/tuple/to_list.hpp +62 -0
  509. data/ext/boost/range/as_literal.hpp +131 -0
  510. data/ext/boost/range/begin.hpp +132 -0
  511. data/ext/boost/range/config.hpp +54 -0
  512. data/ext/boost/range/const_iterator.hpp +64 -0
  513. data/ext/boost/range/detail/common.hpp +117 -0
  514. data/ext/boost/range/detail/implementation_help.hpp +99 -0
  515. data/ext/boost/range/detail/sfinae.hpp +77 -0
  516. data/ext/boost/range/detail/str_types.hpp +38 -0
  517. data/ext/boost/range/difference_type.hpp +29 -0
  518. data/ext/boost/range/distance.hpp +34 -0
  519. data/ext/boost/range/empty.hpp +34 -0
  520. data/ext/boost/range/end.hpp +131 -0
  521. data/ext/boost/range/functions.hpp +27 -0
  522. data/ext/boost/range/iterator.hpp +72 -0
  523. data/ext/boost/range/iterator_range.hpp +643 -0
  524. data/ext/boost/range/mutable_iterator.hpp +64 -0
  525. data/ext/boost/range/rbegin.hpp +65 -0
  526. data/ext/boost/range/rend.hpp +65 -0
  527. data/ext/boost/range/reverse_iterator.hpp +40 -0
  528. data/ext/boost/range/size.hpp +36 -0
  529. data/ext/boost/range/size_type.hpp +78 -0
  530. data/ext/boost/range/value_type.hpp +34 -0
  531. data/ext/boost/ref.hpp +178 -0
  532. data/ext/boost/shared_ptr.hpp +619 -0
  533. data/ext/boost/src/pthread/exceptions.cpp +146 -0
  534. data/ext/boost/src/pthread/once.cpp +51 -0
  535. data/ext/boost/src/pthread/thread.cpp +709 -0
  536. data/ext/boost/src/pthread/timeconv.inl +130 -0
  537. data/ext/boost/src/tss_null.cpp +34 -0
  538. data/ext/boost/src/win32/exceptions.cpp +124 -0
  539. data/ext/boost/src/win32/thread.cpp +629 -0
  540. data/ext/boost/src/win32/timeconv.inl +130 -0
  541. data/ext/boost/src/win32/tss_dll.cpp +72 -0
  542. data/ext/boost/src/win32/tss_pe.cpp +269 -0
  543. data/ext/boost/static_assert.hpp +122 -0
  544. data/ext/boost/thread.hpp +21 -0
  545. data/ext/boost/thread/condition.hpp +16 -0
  546. data/ext/boost/thread/condition_variable.hpp +21 -0
  547. data/ext/boost/thread/detail/config.hpp +94 -0
  548. data/ext/boost/thread/detail/move.hpp +33 -0
  549. data/ext/boost/thread/detail/platform.hpp +71 -0
  550. data/ext/boost/thread/exceptions.hpp +109 -0
  551. data/ext/boost/thread/locks.hpp +589 -0
  552. data/ext/boost/thread/mutex.hpp +21 -0
  553. data/ext/boost/thread/once.hpp +29 -0
  554. data/ext/boost/thread/pthread/condition_variable.hpp +184 -0
  555. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +66 -0
  556. data/ext/boost/thread/pthread/mutex.hpp +211 -0
  557. data/ext/boost/thread/pthread/once.hpp +85 -0
  558. data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +50 -0
  559. data/ext/boost/thread/pthread/recursive_mutex.hpp +249 -0
  560. data/ext/boost/thread/pthread/thread.hpp +339 -0
  561. data/ext/boost/thread/pthread/thread_data.hpp +102 -0
  562. data/ext/boost/thread/pthread/timespec.hpp +28 -0
  563. data/ext/boost/thread/pthread/tss.hpp +103 -0
  564. data/ext/boost/thread/recursive_mutex.hpp +21 -0
  565. data/ext/boost/thread/thread.hpp +22 -0
  566. data/ext/boost/thread/thread_time.hpp +46 -0
  567. data/ext/boost/thread/tss.hpp +18 -0
  568. data/ext/boost/thread/xtime.hpp +88 -0
  569. data/ext/boost/throw_exception.hpp +46 -0
  570. data/ext/boost/token_functions.hpp +621 -0
  571. data/ext/boost/token_iterator.hpp +128 -0
  572. data/ext/boost/tokenizer.hpp +98 -0
  573. data/ext/boost/type.hpp +18 -0
  574. data/ext/boost/type_traits/add_const.hpp +47 -0
  575. data/ext/boost/type_traits/add_pointer.hpp +72 -0
  576. data/ext/boost/type_traits/add_reference.hpp +89 -0
  577. data/ext/boost/type_traits/alignment_of.hpp +100 -0
  578. data/ext/boost/type_traits/broken_compiler_spec.hpp +117 -0
  579. data/ext/boost/type_traits/composite_traits.hpp +29 -0
  580. data/ext/boost/type_traits/config.hpp +76 -0
  581. data/ext/boost/type_traits/conversion_traits.hpp +17 -0
  582. data/ext/boost/type_traits/detail/bool_trait_def.hpp +173 -0
  583. data/ext/boost/type_traits/detail/bool_trait_undef.hpp +27 -0
  584. data/ext/boost/type_traits/detail/cv_traits_impl.hpp +97 -0
  585. data/ext/boost/type_traits/detail/false_result.hpp +28 -0
  586. data/ext/boost/type_traits/detail/ice_and.hpp +35 -0
  587. data/ext/boost/type_traits/detail/ice_eq.hpp +36 -0
  588. data/ext/boost/type_traits/detail/ice_not.hpp +31 -0
  589. data/ext/boost/type_traits/detail/ice_or.hpp +34 -0
  590. data/ext/boost/type_traits/detail/is_function_ptr_helper.hpp +220 -0
  591. data/ext/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp +817 -0
  592. data/ext/boost/type_traits/detail/size_t_trait_def.hpp +58 -0
  593. data/ext/boost/type_traits/detail/size_t_trait_undef.hpp +16 -0
  594. data/ext/boost/type_traits/detail/template_arity_spec.hpp +31 -0
  595. data/ext/boost/type_traits/detail/type_trait_def.hpp +61 -0
  596. data/ext/boost/type_traits/detail/type_trait_undef.hpp +19 -0
  597. data/ext/boost/type_traits/detail/yes_no_type.hpp +26 -0
  598. data/ext/boost/type_traits/function_traits.hpp +236 -0
  599. data/ext/boost/type_traits/has_nothrow_copy.hpp +39 -0
  600. data/ext/boost/type_traits/has_trivial_copy.hpp +49 -0
  601. data/ext/boost/type_traits/ice.hpp +20 -0
  602. data/ext/boost/type_traits/integral_constant.hpp +53 -0
  603. data/ext/boost/type_traits/intrinsics.hpp +153 -0
  604. data/ext/boost/type_traits/is_abstract.hpp +144 -0
  605. data/ext/boost/type_traits/is_arithmetic.hpp +43 -0
  606. data/ext/boost/type_traits/is_array.hpp +90 -0
  607. data/ext/boost/type_traits/is_class.hpp +128 -0
  608. data/ext/boost/type_traits/is_const.hpp +142 -0
  609. data/ext/boost/type_traits/is_convertible.hpp +418 -0
  610. data/ext/boost/type_traits/is_enum.hpp +180 -0
  611. data/ext/boost/type_traits/is_float.hpp +27 -0
  612. data/ext/boost/type_traits/is_function.hpp +95 -0
  613. data/ext/boost/type_traits/is_integral.hpp +73 -0
  614. data/ext/boost/type_traits/is_member_function_pointer.hpp +134 -0
  615. data/ext/boost/type_traits/is_member_pointer.hpp +114 -0
  616. data/ext/boost/type_traits/is_pod.hpp +135 -0
  617. data/ext/boost/type_traits/is_pointer.hpp +160 -0
  618. data/ext/boost/type_traits/is_reference.hpp +116 -0
  619. data/ext/boost/type_traits/is_same.hpp +103 -0
  620. data/ext/boost/type_traits/is_scalar.hpp +55 -0
  621. data/ext/boost/type_traits/is_union.hpp +49 -0
  622. data/ext/boost/type_traits/is_void.hpp +33 -0
  623. data/ext/boost/type_traits/is_volatile.hpp +131 -0
  624. data/ext/boost/type_traits/remove_const.hpp +78 -0
  625. data/ext/boost/type_traits/remove_cv.hpp +61 -0
  626. data/ext/boost/type_traits/remove_pointer.hpp +43 -0
  627. data/ext/boost/type_traits/remove_reference.hpp +50 -0
  628. data/ext/boost/type_traits/type_with_alignment.hpp +288 -0
  629. data/ext/boost/utility.hpp +19 -0
  630. data/ext/boost/utility/addressof.hpp +58 -0
  631. data/ext/boost/utility/base_from_member.hpp +87 -0
  632. data/ext/boost/utility/compare_pointees.hpp +68 -0
  633. data/ext/boost/utility/enable_if.hpp +119 -0
  634. data/ext/boost/visit_each.hpp +29 -0
  635. data/ext/boost/weak_ptr.hpp +188 -0
  636. data/ext/common/Application.h +511 -0
  637. data/ext/common/ApplicationPool.h +205 -0
  638. data/ext/common/ApplicationPoolServer.h +794 -0
  639. data/ext/common/ApplicationPoolServerExecutable.cpp +743 -0
  640. data/ext/common/ApplicationPoolStatusReporter.h +336 -0
  641. data/ext/common/Base64.cpp +143 -0
  642. data/ext/common/Base64.h +57 -0
  643. data/ext/common/CachedFileStat.cpp +62 -0
  644. data/ext/common/CachedFileStat.h +51 -0
  645. data/ext/common/CachedFileStat.hpp +243 -0
  646. data/ext/common/DummySpawnManager.h +108 -0
  647. data/ext/common/Exceptions.h +258 -0
  648. data/ext/common/FileChangeChecker.h +209 -0
  649. data/ext/common/Logging.cpp +65 -0
  650. data/ext/common/Logging.h +123 -0
  651. data/ext/common/MessageChannel.h +615 -0
  652. data/ext/common/PoolOptions.h +355 -0
  653. data/ext/common/SpawnManager.h +561 -0
  654. data/ext/common/StandardApplicationPool.h +821 -0
  655. data/ext/common/StaticString.h +148 -0
  656. data/ext/common/StringListCreator.h +83 -0
  657. data/ext/common/SystemTime.cpp +33 -0
  658. data/ext/common/SystemTime.h +88 -0
  659. data/ext/common/Timer.h +90 -0
  660. data/ext/common/Utils.cpp +681 -0
  661. data/ext/common/Utils.h +497 -0
  662. data/ext/common/Version.h +31 -0
  663. data/ext/nginx/Configuration.c +1098 -0
  664. data/ext/nginx/Configuration.h +71 -0
  665. data/ext/nginx/ContentHandler.c +1225 -0
  666. data/ext/nginx/ContentHandler.h +64 -0
  667. data/ext/nginx/HelperServer.cpp +850 -0
  668. data/ext/nginx/HttpStatusExtractor.h +350 -0
  669. data/ext/nginx/ScgiRequestParser.h +317 -0
  670. data/ext/nginx/StaticContentHandler.c +257 -0
  671. data/ext/nginx/StaticContentHandler.h +37 -0
  672. data/ext/nginx/config +45 -0
  673. data/ext/nginx/ngx_http_passenger_module.c +653 -0
  674. data/ext/nginx/ngx_http_passenger_module.h +72 -0
  675. data/ext/oxt/backtrace.cpp +177 -0
  676. data/ext/oxt/backtrace.hpp +135 -0
  677. data/ext/oxt/detail/backtrace_disabled.hpp +39 -0
  678. data/ext/oxt/detail/backtrace_enabled.hpp +155 -0
  679. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +82 -0
  680. data/ext/oxt/detail/spin_lock_portable.hpp +38 -0
  681. data/ext/oxt/detail/spin_lock_pthreads.hpp +97 -0
  682. data/ext/oxt/detail/tracable_exception_disabled.hpp +46 -0
  683. data/ext/oxt/detail/tracable_exception_enabled.hpp +48 -0
  684. data/ext/oxt/macros.hpp +58 -0
  685. data/ext/oxt/spin_lock.hpp +55 -0
  686. data/ext/oxt/system_calls.cpp +351 -0
  687. data/ext/oxt/system_calls.hpp +244 -0
  688. data/ext/oxt/thread.cpp +32 -0
  689. data/ext/oxt/thread.hpp +335 -0
  690. data/ext/oxt/tracable_exception.cpp +87 -0
  691. data/ext/oxt/tracable_exception.hpp +35 -0
  692. data/ext/phusion_passenger/extconf.rb +36 -0
  693. data/ext/phusion_passenger/native_support.c +308 -0
  694. data/lib/jeweler_spec.rb +86 -0
  695. data/lib/phusion_passenger/abstract_installer.rb +196 -0
  696. data/lib/phusion_passenger/abstract_request_handler.rb +475 -0
  697. data/lib/phusion_passenger/abstract_server.rb +369 -0
  698. data/lib/phusion_passenger/abstract_server_collection.rb +306 -0
  699. data/lib/phusion_passenger/admin_tools.rb +48 -0
  700. data/lib/phusion_passenger/admin_tools/control_process.rb +150 -0
  701. data/lib/phusion_passenger/application.rb +113 -0
  702. data/lib/phusion_passenger/console_text_template.rb +66 -0
  703. data/lib/phusion_passenger/constants.rb +31 -0
  704. data/lib/phusion_passenger/dependencies.rb +425 -0
  705. data/lib/phusion_passenger/events.rb +50 -0
  706. data/lib/phusion_passenger/exceptions.rb +103 -0
  707. data/lib/phusion_passenger/html_template.rb +109 -0
  708. data/lib/phusion_passenger/message_channel.rb +229 -0
  709. data/lib/phusion_passenger/packaging.rb +39 -0
  710. data/lib/phusion_passenger/platform_info.rb +550 -0
  711. data/lib/phusion_passenger/rack/application_spawner.rb +146 -0
  712. data/lib/phusion_passenger/rack/request_handler.rb +122 -0
  713. data/lib/phusion_passenger/railz/application_spawner.rb +412 -0
  714. data/lib/phusion_passenger/railz/cgi_fixed.rb +68 -0
  715. data/lib/phusion_passenger/railz/framework_spawner.rb +334 -0
  716. data/lib/phusion_passenger/railz/request_handler.rb +73 -0
  717. data/lib/phusion_passenger/simple_benchmarking.rb +52 -0
  718. data/lib/phusion_passenger/spawn_manager.rb +372 -0
  719. data/lib/phusion_passenger/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +9 -0
  720. data/lib/phusion_passenger/templates/apache2/config_snippets.txt.erb +13 -0
  721. data/lib/phusion_passenger/templates/apache2/deployment_example.txt.erb +23 -0
  722. data/lib/phusion_passenger/templates/apache2/no_write_permission_to_passenger_root.txt.erb +9 -0
  723. data/lib/phusion_passenger/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +11 -0
  724. data/lib/phusion_passenger/templates/apache2/run_installer_as_root.txt.erb +8 -0
  725. data/lib/phusion_passenger/templates/apache2/welcome.txt.erb +15 -0
  726. data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +14 -0
  727. data/lib/phusion_passenger/templates/app_init_error.html.erb +46 -0
  728. data/lib/phusion_passenger/templates/database_error.html.erb +24 -0
  729. data/lib/phusion_passenger/templates/error_layout.css +97 -0
  730. data/lib/phusion_passenger/templates/error_layout.html.erb +39 -0
  731. data/lib/phusion_passenger/templates/framework_init_error.html.erb +10 -0
  732. data/lib/phusion_passenger/templates/general_error.html.erb +8 -0
  733. data/lib/phusion_passenger/templates/invalid_app_root.html.erb +9 -0
  734. data/lib/phusion_passenger/templates/load_error.html.erb +6 -0
  735. data/lib/phusion_passenger/templates/nginx/ask_for_extra_configure_flags.txt.erb +8 -0
  736. data/lib/phusion_passenger/templates/nginx/cannot_write_to_dir.txt.erb +11 -0
  737. data/lib/phusion_passenger/templates/nginx/config_snippets.txt.erb +17 -0
  738. data/lib/phusion_passenger/templates/nginx/config_snippets_inserted.txt.erb +20 -0
  739. data/lib/phusion_passenger/templates/nginx/confirm_extra_configure_flags.txt.erb +5 -0
  740. data/lib/phusion_passenger/templates/nginx/deployment_example.txt.erb +22 -0
  741. data/lib/phusion_passenger/templates/nginx/pcre_could_not_be_downloaded.txt.erb +11 -0
  742. data/lib/phusion_passenger/templates/nginx/pcre_could_not_be_extracted.txt.erb +11 -0
  743. data/lib/phusion_passenger/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +11 -0
  744. data/lib/phusion_passenger/templates/nginx/possible_solutions_for_download_and_extraction_problems.txt.erb +20 -0
  745. data/lib/phusion_passenger/templates/nginx/query_download_and_install.txt.erb +21 -0
  746. data/lib/phusion_passenger/templates/nginx/run_installer_as_root.txt.erb +8 -0
  747. data/lib/phusion_passenger/templates/nginx/welcome.txt.erb +15 -0
  748. data/lib/phusion_passenger/templates/version_not_found.html.erb +6 -0
  749. data/lib/phusion_passenger/utils.rb +611 -0
  750. data/lib/phusion_passenger/utils/rewindable_input.rb +116 -0
  751. data/lib/phusion_passenger/wsgi/application_spawner.rb +104 -0
  752. data/lib/phusion_passenger/wsgi/request_handler.py +199 -0
  753. data/man/passenger-config.1 +29 -0
  754. data/man/passenger-make-enterprisey.8 +23 -0
  755. data/man/passenger-memory-stats.8 +33 -0
  756. data/man/passenger-status.8 +43 -0
  757. data/man/passenger-stress-test.1 +43 -0
  758. data/misc/copy_boost_headers.rb +125 -0
  759. data/misc/find_owner_pipe_leaks.rb +128 -0
  760. data/misc/rake/cplusplus.rb +57 -0
  761. data/misc/rake/extensions.rb +182 -0
  762. data/misc/rake/gempackagetask.rb +99 -0
  763. data/misc/rake/packagetask.rb +186 -0
  764. data/misc/rake/rdoctask.rb +209 -0
  765. data/misc/render_error_pages.rb +116 -0
  766. data/test/ApplicationPoolServerTest.cpp +114 -0
  767. data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +33 -0
  768. data/test/ApplicationPoolTest.cpp +599 -0
  769. data/test/Base64Test.cpp +48 -0
  770. data/test/CachedFileStatTest.cpp +402 -0
  771. data/test/CxxTestMain.cpp +143 -0
  772. data/test/FileChangeCheckerTest.cpp +331 -0
  773. data/test/HttpStatusExtractorTest.cpp +198 -0
  774. data/test/MessageChannelTest.cpp +312 -0
  775. data/test/PoolOptionsTest.cpp +117 -0
  776. data/test/ScgiRequestParserTest.cpp +337 -0
  777. data/test/SpawnManagerTest.cpp +64 -0
  778. data/test/StandardApplicationPoolTest.cpp +27 -0
  779. data/test/StaticStringTest.cpp +51 -0
  780. data/test/SystemTimeTest.cpp +37 -0
  781. data/test/UtilsTest.cpp +257 -0
  782. data/test/config.yml.example +30 -0
  783. data/test/integration_tests/apache2_tests.rb +595 -0
  784. data/test/integration_tests/hello_world_rack_spec.rb +36 -0
  785. data/test/integration_tests/hello_world_wsgi_spec.rb +41 -0
  786. data/test/integration_tests/mycook_spec.rb +192 -0
  787. data/test/integration_tests/nginx_tests.rb +151 -0
  788. data/test/oxt/backtrace_test.cpp +128 -0
  789. data/test/oxt/oxt_test_main.cpp +25 -0
  790. data/test/oxt/syscall_interruption_test.cpp +38 -0
  791. data/test/ruby/abstract_request_handler_spec.rb +85 -0
  792. data/test/ruby/abstract_server_collection_spec.rb +246 -0
  793. data/test/ruby/abstract_server_spec.rb +51 -0
  794. data/test/ruby/application_spec.rb +43 -0
  795. data/test/ruby/message_channel_spec.rb +170 -0
  796. data/test/ruby/rack/application_spawner_spec.rb +99 -0
  797. data/test/ruby/rails/application_spawner_spec.rb +159 -0
  798. data/test/ruby/rails/framework_spawner_spec.rb +133 -0
  799. data/test/ruby/rails/minimal_spawner_spec.rb +93 -0
  800. data/test/ruby/rails/spawner_error_handling_spec.rb +107 -0
  801. data/test/ruby/rails/spawner_privilege_lowering_spec.rb +97 -0
  802. data/test/ruby/spawn_manager_spec.rb +205 -0
  803. data/test/ruby/spawn_server_spec.rb +26 -0
  804. data/test/ruby/utils_spec.rb +335 -0
  805. data/test/ruby/wsgi/application_spawner_spec.rb +54 -0
  806. data/test/stub/apache2/httpd.conf.erb +81 -0
  807. data/test/stub/apache2/mime.types +748 -0
  808. data/test/stub/garbage1.dat +0 -0
  809. data/test/stub/garbage2.dat +0 -0
  810. data/test/stub/garbage3.dat +0 -0
  811. data/test/stub/http_request.yml +23 -0
  812. data/test/stub/message_channel.rb +9 -0
  813. data/test/stub/message_channel_2.rb +10 -0
  814. data/test/stub/message_channel_3.rb +17 -0
  815. data/test/stub/nginx/koi-utf +109 -0
  816. data/test/stub/nginx/koi-win +103 -0
  817. data/test/stub/nginx/mime.types +70 -0
  818. data/test/stub/nginx/nginx.conf.erb +57 -0
  819. data/test/stub/nginx/win-utf +126 -0
  820. data/test/stub/rack/config.ru +4 -0
  821. data/test/stub/rack/public/rack.jpg +0 -0
  822. data/test/stub/rails_apps/foobar/app/controllers/application.rb +12 -0
  823. data/test/stub/rails_apps/foobar/app/controllers/bar_controller_1.rb +5 -0
  824. data/test/stub/rails_apps/foobar/app/controllers/bar_controller_2.rb +5 -0
  825. data/test/stub/rails_apps/foobar/app/controllers/foo_controller.rb +21 -0
  826. data/test/stub/rails_apps/foobar/app/helpers/application_helper.rb +3 -0
  827. data/test/stub/rails_apps/foobar/config/boot.rb +108 -0
  828. data/test/stub/rails_apps/foobar/config/database.yml +19 -0
  829. data/test/stub/rails_apps/foobar/config/environment.rb +59 -0
  830. data/test/stub/rails_apps/foobar/config/environments/development.rb +17 -0
  831. data/test/stub/rails_apps/foobar/config/environments/production.rb +18 -0
  832. data/test/stub/rails_apps/foobar/config/initializers/inflections.rb +10 -0
  833. data/test/stub/rails_apps/foobar/config/initializers/mime_types.rb +5 -0
  834. data/test/stub/rails_apps/foobar/config/routes.rb +35 -0
  835. data/test/stub/rails_apps/mycook/app/controllers/application.rb +12 -0
  836. data/test/stub/rails_apps/mycook/app/controllers/recipes_controller.rb +5 -0
  837. data/test/stub/rails_apps/mycook/app/controllers/uploads_controller.rb +15 -0
  838. data/test/stub/rails_apps/mycook/app/controllers/welcome_controller.rb +71 -0
  839. data/test/stub/rails_apps/mycook/app/helpers/application_helper.rb +3 -0
  840. data/test/stub/rails_apps/mycook/app/views/layouts/default.rhtml +26 -0
  841. data/test/stub/rails_apps/mycook/app/views/recipes/create.rhtml +13 -0
  842. data/test/stub/rails_apps/mycook/app/views/recipes/index.rhtml +3 -0
  843. data/test/stub/rails_apps/mycook/app/views/recipes/new.rhtml +8 -0
  844. data/test/stub/rails_apps/mycook/app/views/uploads/index.rhtml +1 -0
  845. data/test/stub/rails_apps/mycook/app/views/uploads/new.html.erb +8 -0
  846. data/test/stub/rails_apps/mycook/app/views/welcome/cached.rhtml +1 -0
  847. data/test/stub/rails_apps/mycook/app/views/welcome/index.rhtml +20 -0
  848. data/test/stub/rails_apps/mycook/config/boot.rb +108 -0
  849. data/test/stub/rails_apps/mycook/config/database.yml +19 -0
  850. data/test/stub/rails_apps/mycook/config/environment.rb +61 -0
  851. data/test/stub/rails_apps/mycook/config/environments/development.rb +18 -0
  852. data/test/stub/rails_apps/mycook/config/environments/production.rb +19 -0
  853. data/test/stub/rails_apps/mycook/config/initializers/inflections.rb +10 -0
  854. data/test/stub/rails_apps/mycook/config/initializers/mime_types.rb +5 -0
  855. data/test/stub/rails_apps/mycook/config/routes.rb +38 -0
  856. data/test/stub/rails_apps/mycook/log/useless.txt +1 -0
  857. data/test/stub/rails_apps/mycook/public/404.html +30 -0
  858. data/test/stub/rails_apps/mycook/public/422.html +30 -0
  859. data/test/stub/rails_apps/mycook/public/500.html +30 -0
  860. data/test/stub/rails_apps/mycook/public/dispatch.cgi +10 -0
  861. data/test/stub/rails_apps/mycook/public/dispatch.fcgi +24 -0
  862. data/test/stub/rails_apps/mycook/public/dispatch.rb +10 -0
  863. data/test/stub/rails_apps/mycook/public/favicon.ico +0 -0
  864. data/test/stub/rails_apps/mycook/public/images/angrywizard.gif +0 -0
  865. data/test/stub/rails_apps/mycook/public/images/cookbook.gif +0 -0
  866. data/test/stub/rails_apps/mycook/public/images/header.png +0 -0
  867. data/test/stub/rails_apps/mycook/public/images/rails.png +0 -0
  868. data/test/stub/rails_apps/mycook/public/javascripts/application.js +2 -0
  869. data/test/stub/rails_apps/mycook/public/javascripts/controls.js +963 -0
  870. data/test/stub/rails_apps/mycook/public/javascripts/dragdrop.js +972 -0
  871. data/test/stub/rails_apps/mycook/public/javascripts/effects.js +1120 -0
  872. data/test/stub/rails_apps/mycook/public/javascripts/prototype.js +4225 -0
  873. data/test/stub/rails_apps/mycook/public/robots.txt +5 -0
  874. data/test/stub/rails_apps/mycook/public/uploads.html +26 -0
  875. data/test/stub/rails_apps/mycook/public/welcome/cached.html +26 -0
  876. data/test/stub/rails_apps/mycook/sites/some.site/public/uploads.html +26 -0
  877. data/test/stub/rails_apps/mycook/sites/some.site/public/welcome/cached.html +26 -0
  878. data/test/stub/rails_apps/mycook/tmp/cache/useless.txt +1 -0
  879. data/test/stub/rails_apps/mycook/tmp/pids/useless.txt +1 -0
  880. data/test/stub/rails_apps/mycook/tmp/sessions/useless.txt +1 -0
  881. data/test/stub/rails_apps/mycook/tmp/sockets/useless.txt +1 -0
  882. data/test/stub/spawn_server.rb +20 -0
  883. data/test/stub/upload_data.txt +494 -0
  884. data/test/stub/vendor_rails/minimal/README +1 -0
  885. data/test/stub/vendor_rails/minimal/actionmailer/lib/action_mailer.rb +0 -0
  886. data/test/stub/vendor_rails/minimal/actionpack/lib/action_controller.rb +19 -0
  887. data/test/stub/vendor_rails/minimal/actionpack/lib/action_pack.rb +0 -0
  888. data/test/stub/vendor_rails/minimal/actionpack/lib/action_view.rb +0 -0
  889. data/test/stub/vendor_rails/minimal/activerecord/lib/active_record.rb +7 -0
  890. data/test/stub/vendor_rails/minimal/activeresource/lib/active_resource.rb +0 -0
  891. data/test/stub/vendor_rails/minimal/activesupport/lib/active_support.rb +17 -0
  892. data/test/stub/vendor_rails/minimal/activesupport/lib/active_support/whiny_nil.rb +0 -0
  893. data/test/stub/vendor_rails/minimal/railties/lib/dispatcher.rb +0 -0
  894. data/test/stub/vendor_rails/minimal/railties/lib/initializer.rb +52 -0
  895. data/test/stub/vendor_rails/minimal/railties/lib/ruby_version_check.rb +1 -0
  896. data/test/stub/wsgi/passenger_wsgi.py +3 -0
  897. data/test/stub/wsgi/public/wsgi-snake.jpg +0 -0
  898. data/test/stub/zsfa/header.png +0 -0
  899. data/test/stub/zsfa/index.html +14 -0
  900. data/test/stub/zsfa/zsfa.png +0 -0
  901. data/test/support/Support.cpp +84 -0
  902. data/test/support/Support.h +118 -0
  903. data/test/support/apache2_controller.rb +250 -0
  904. data/test/support/config.rb +38 -0
  905. data/test/support/multipart.rb +62 -0
  906. data/test/support/nginx_controller.rb +98 -0
  907. data/test/support/run_rspec_tests.rb +10 -0
  908. data/test/support/test_helper.rb +207 -0
  909. data/test/support/tut.h +1234 -0
  910. data/test/support/tut_reporter.h +256 -0
  911. data/test/support/valgrind.h +2539 -0
  912. metadata +1078 -0
@@ -0,0 +1,197 @@
1
+ Security of user switching support in Passenger
2
+ ===============================================
3
+
4
+ Problem description
5
+ -------------------
6
+ TIP: It is strongly recommended that you first read our
7
+ link:Architectural%20overview.html[Architectural Overview].
8
+
9
+ A straightforward implementation of Passenger will spawn Rails applications in
10
+ the same user context as Apache itself. On server machines which host multiple
11
+ websites for multiple users, this may not be desired. All Rails applications
12
+ spawned by Passenger will be able to read and write to all directories that the
13
+ web server can. So for example, Joe's Rails applications could read Jane's
14
+ Rails application's 'database.yml' or delete her application files. This is
15
+ also a problem that typically plagues PHP web hosts.
16
+
17
+ There are multiple ways to solve this problem. The goal of this document is to
18
+ inform the reader about the solutions have we have analyzed, so that
19
+ Passenger's security may be peer reviewed.
20
+
21
+
22
+ Analysis of possible solutions
23
+ ------------------------------
24
+ It seems that the only way to solve this problem on Unix, is to run each Rails
25
+ application server as its owner's user and group. Passenger can make use of
26
+ one of the following methods to implement this:
27
+
28
+ 1. Apache (and thus Passenger) must already be running as root.
29
+ 2. Using Apache's suEXEC.
30
+ 3. A setuid root wrapper application must exist, to allow non-root processes
31
+ to obtain root privileges (or at least, the privilege to switch user).
32
+ 4. For each user $X that Passenger will need to switch to, there must exist
33
+ a setuid $X wrapper application.
34
+ 5. Using 'su'.
35
+ 6. Using 'sudo'.
36
+
37
+ Let us take a look at each method in detail.
38
+
39
+ [[apache_root]]
40
+ Apache must already be running as root
41
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
42
+ First, let us take a look at the typical Apache setup, in which Apache is bound
43
+ to port 80, and uses the prefork MPM. Binding to any port lower than 1024
44
+ requires root privileges, so Apache is typically run as root. This poses an
45
+ unacceptable security risk, so Apache's prefork MPM will, upon receiving an
46
+ HTTP request, spawn a child process with the privileges of a normal user,
47
+ typically 'www-data' or 'nobody'.
48
+ See http://httpd.apache.org/docs/2.2/mod/prefork.html[the documentation for the
49
+ prefork MPM] - in particular the ``User'' and ``Group'' directives - for details.
50
+ The process which is responsible for spawning child processes (also called the
51
+ control process) is run as root. This is also true for
52
+ http://httpd.apache.org/docs/2.2/mod/worker.html[the worker MPM].
53
+
54
+ Since Passenger has access to the control process, in the typical Apache setup,
55
+ Passenger can already launch Rails applications as a different user. But now we
56
+ have to ask this question:
57
+
58
+ =================================
59
+ If Apache is not running as root, are there still any Passenger users who
60
+ want to run Rails applications as different users?
61
+ =================================
62
+
63
+ If the answer is yes, then we cannot use this method.
64
+
65
+ The advantage of this method is that setting up Apache to run as root is
66
+ incredibly easy, and requires no new framework to be written. However, testing
67
+ this method in automated unit tests will require running the unit test suit as
68
+ root.
69
+
70
+ Using Apache's suEXEC
71
+ ~~~~~~~~~~~~~~~~~~~~~
72
+ Apache's http://httpd.apache.org/docs/2.0/suexec.html[suEXEC] allows one to
73
+ run CGI processes as different users. But it seems that suEXEC can only be
74
+ used for CGI, and is not a general-purpose mechanism. The
75
+ http://alain.knaff.lu/howto/PhpSuexec/[PHP-suEXEC] software allows one to run
76
+ PHP applications via suEXEC, but it requires patching suEXEC. If Passenger is
77
+ to use suEXEC, then it is likely that we'll have to patch suEXEC. The suEXEC
78
+ website strongly discourages patching.
79
+
80
+ Using a setuid root wrapper application
81
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
82
+ If we use this method, we must be extremely careful. It must not be possible
83
+ for arbitrary processes to gain root privileges. We want Passenger, and only
84
+ Passenger, to be able to gain root privileges.
85
+
86
+ There are multiple ways to implement this security. The first one is to use
87
+ a password file, which only Apache and the wrapper can read, through
88
+ the use of proper file permissions. The password file must never be world
89
+ readable or writable.
90
+
91
+ It works as follows:
92
+
93
+ 1. Passenger runs the wrapper.
94
+ 2. Passenger passes the content of the password file to the wrapper, via
95
+ an anonymous pipe (or some other anonymous channel, that no other
96
+ processes can access).
97
+ 3. The wrapper checks whether the passed content is the same as what is in
98
+ the password file. If it is, then it is proven that whatever application
99
+ ran the wrapper has read access to the password file, and thus is authorized
100
+ to use the wrapper.
101
+
102
+ An obvious problem that arises is: how does the wrapper locate its own password
103
+ file? We obviously do not want to be able to specify the password filename as
104
+ an argument to the wrapper: that would defeat the point of the password file.
105
+ The solution is that the filename is to be hardcoded into the binary during
106
+ compile time.
107
+
108
+ Another way to implement security is to use a whitelist of users that are
109
+ allowed to use the wrapper. The wrapper can then check whether the calling
110
+ process's user is in the whitelist.
111
+
112
+ Writing a wrapper is not too hard. Furthermore, unit tests do not have to be
113
+ run as root, in contrast to the run-Apache-as-root method.
114
+
115
+ [[setuid_root]]
116
+ Using a setuid $X wrapper application
117
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
118
+ A setuid $X wrapper will work in a fashion similar to the setuid root wrapper,
119
+ i.e. it will use a password file for authorization.
120
+
121
+ Passenger does not spawn Rails applications itself, but does so via the spawn
122
+ server. This spawn server is also responsible for preloading the Rails
123
+ framework and the Rails application code, in order to speed up the spawning
124
+ of Rails applications. See the design document of the spawn server for details.
125
+ The spawn server never calls `exec()`: doing so will make preloading useless.
126
+ If Passenger is to use a setuid $X wrapper, then it must start the spawn
127
+ server via the wrapper. The spawn server itself cannot use the wrapper.
128
+
129
+ However, doing so will make preloading less efficient. Passenger will be forced
130
+ to run a spawn server for each user. The different spawn servers do not share
131
+ memory with each other, so a lot of memory is wasted compared to the other
132
+ methods.
133
+
134
+ Implementing this will also take more work. One has to create a different
135
+ wrapper for each user, and to install it.
136
+
137
+ Using 'su'
138
+ ~~~~~~~~~~
139
+ The standard Unix 'su' tool asks for the root password. It's a bad idea for
140
+ Apache to know the root password, so using 'su' is not a viable alternative.
141
+
142
+ Using 'sudo'
143
+ ~~~~~~~~~~~~
144
+ It might be possible to use the 'sudo' utility. sudo can be configured in
145
+ such a way that the user Apache runs as can use sudo without having to enter a
146
+ password.
147
+
148
+ However, Passenger uses an anonymous communication channel (an unnamed Unix
149
+ socket) to communicate with the spawn server. sudo seems to close all file
150
+ descriptors before executing an application, so Passenger will have to
151
+ communicate with the spawn server via a non-anonymous channel, such as a named
152
+ Unix socket. Because other processes can access this channel, it can introduce
153
+ potential security problems. Note that passing information via program arguments
154
+ is not secure: it is possible to view that information with tools like 'ps',
155
+ or (on Linux) by reading the file `/proc/$PID/cmdline`.
156
+
157
+ So it seems 'sudo' is not a viable alternative.
158
+
159
+ Common security issues
160
+ ~~~~~~~~~~~~~~~~~~~~~~
161
+ Whatever method Passenger will use, the following security principles must be
162
+ honored:
163
+
164
+ - Rails applications must never be run as root.
165
+
166
+ It might also be worthy to look into suEXEC's security model for inspiration.
167
+
168
+ Also, the following questions remain:
169
+
170
+ - Is there a need for a user whitelist/blacklist? That is, is there a need for
171
+ the ability to restrict the set of users that Passenger can switch to?
172
+
173
+
174
+ Chosen solution
175
+ ---------------
176
+ Running Apache as root and writing a setuid root wrapper are the main
177
+ contestants. The former is preferred, because it's easier to implement.
178
+
179
+ We have had some conversations with people on the IRC channel #rubyonrails.
180
+ Among those people, nobody has ever run Apache as non-root. Because of this
181
+ we have chosen to implement the <<apache_root,Running Apache as root>>
182
+ solution, until a significant number of users request us to implement the
183
+ <<setuid_root,setuid root wrapper>> solution.
184
+
185
+ Please read link:rdoc/index.html[the Ruby API documentation] -- in particular
186
+ that of the 'ApplicationSpawner' class -- for implementation details. But to
187
+ make a long story short: it will switch to the owner of the file
188
+ 'config/environment.rb'. User whitelisting/blacklisting is currently not
189
+ implemented. We rely on the system administrator to set the correct owner
190
+ on that file.
191
+
192
+ We have also not implemented suEXEC's security model. suEXEC's model is quite
193
+ paranoid, and although paranoia is good to a certain extend, it can be in the
194
+ way of usability while proving little extra security. We are not entirely
195
+ convinced that implementing suEXEC's full security model will provide
196
+ significant benefits, but if you have good reasons to think otherwise, please
197
+ feel free to discuss it with us.
@@ -0,0 +1,1848 @@
1
+ = Phusion Passenger users guide =
2
+
3
+ image:images/phusion_banner.png[link="http://www.phusion.nl/"]
4
+
5
+ Phusion Passenger is an Apache module, which makes deploying Ruby and Ruby on
6
+ Rails applications on Apache a breeze. It follows the usual Ruby on Rails
7
+ conventions, such as "Don't-Repeat-Yourself" and ease of setup, while at the
8
+ same time providing enough flexibility.
9
+
10
+ This users guide will teach you:
11
+
12
+ - How to install Phusion Passenger.
13
+ - How to configure Phusion Passenger.
14
+ - How to deploy a Ruby on Rails application.
15
+ - How to deploy a link:http://rack.rubyforge.org/[Rack]-based Ruby application.
16
+ - How to solve common problems.
17
+
18
+ This guide assumes that the reader is somewhat familiar with Apache and with
19
+ using the commandline.
20
+
21
+
22
+ == Supported operating systems ==
23
+
24
+ Phusion Passenger works on any POSIX-compliant operating system. In other
25
+ words: practically any operating system on earth, except Microsoft Windows.
26
+
27
+ Phusion Passenger is confirmed on a large number of operating systems and Linux
28
+ distributions, including, but not limited to, Ubuntu, Debian, CentOS/Fedora/RHEL,
29
+ Gentoo, Mac OS X, FreeBSD and Solaris. Both 32-bit and 64-bit platforms are supported.
30
+
31
+ The only POSIX-compliant operating system on which Phusion Passenger for Apache is
32
+ known not to work at this time, is OpenBSD. Please use Phusion Passenger for Nginx
33
+ instead.
34
+
35
+ If Phusion Passenger does not work on your platform then please
36
+ link:http://code.google.com/p/phusion-passenger/issues/list[report a bug]
37
+ or
38
+ link:http://groups.google.com/group/phusion-passenger[join our discussion list].
39
+
40
+
41
+ == Installing, upgrading and uninstalling Phusion Passenger ==
42
+
43
+ === Generic installation instructions ===
44
+
45
+ [[install_passenger]]
46
+ ==== Overview of installation methods ====
47
+
48
+ There are three ways to install Phusion Passenger:
49
+
50
+ 1. By installing the Phusion Passenger gem, as instructed on the
51
+ link:http://www.modrails.com/install.html[``Install'' page on the Phusion
52
+ Passenger website].
53
+ 2. By downloading the source tarball from the Phusion Passenger website
54
+ ('passenger-x.x.x.tar.gz').
55
+ 3. By installing a native Linux package (e.g. Debian package).
56
+
57
+ The following sections will explain each installation method. Please read the
58
+ section for the installation method that you prefer. In our opinion, installing
59
+ the gem or the native package is easiest. For these two installation methods,
60
+ Phusion Passenger provides an easy-to-use installer.
61
+
62
+ ==== Preparation (gem and source tarball only)
63
+ If you want to install Phusion Passenger via the gem or the source tarball,
64
+ then some preparations might be required. You can skip this subsection if
65
+ you're installing Phusion Passenger via a native Linux package, because no
66
+ compilation is necessary.
67
+
68
+ ===== Switching to a root command prompt =====
69
+
70
+ Before installing, you will probably need to switch to the `root` user first.
71
+ When you install Phusion Passenger via a gem or a source tarball, some Phusion
72
+ Passenger files have to be compiled, which requires write access to the
73
+ directory in which the Phusion Passenger files are located. On Unix systems,
74
+ the root user is the user who has write access to the entire system. So unless
75
+ you know that your normal user account has write access to the Phusion Passenger
76
+ directory, you should switch to root before installing Phusion Passenger.
77
+
78
+ You can switch to root by typing the following command:
79
+
80
+ -------------------------
81
+ sudo -s
82
+ -------------------------
83
+
84
+ This will open a command prompt as the root user, from which you can proceed
85
+ with installing Phusion Passenger.
86
+
87
+ If your system does not have 'sudo' installed, please type the following command instead, which should do the same thing:
88
+
89
+ -------------------------
90
+ su
91
+ -------------------------
92
+
93
+ [[specifying_correct_apache_install]]
94
+ ===== Specifying the correct Apache installation =====
95
+
96
+ The Phusion Passenger installer will attempt to automatically detect Apache,
97
+ and compile Phusion Passenger against that Apache version. It does this by
98
+ looking for the `apxs` or `apxs2` command in the PATH environment variable.
99
+ Apxs is an integral part of any Apache installation.
100
+
101
+ However, some systems have multiple Apache installations. This is likely
102
+ the case on MacOS X: the OS ships with Apache, but users tend to install
103
+ another Apache version seperately, e.g. via MacPorts. If your system has
104
+ multiple Apache installations, then you will need to tell the Phusion Passenger
105
+ installer which one to use. It is very important that you specify the
106
+ correct Apache installation, because if you load Phusion Passenger in an
107
+ Apache installation that it wasn't compiled against, then it will likely
108
+ crash.
109
+
110
+ On yet other systems, Apache is installed in a non-standard location,
111
+ preventing the Phusion Passenger installer from detecting Apache. This
112
+ is most likely the case on systems on which Apache was installed by hand
113
+ from source, i.e. as opposed to installed through the system's native
114
+ package manager. If this is the case, then you will also have to tell
115
+ the installer where it can find Apache.
116
+
117
+ To do so, set the `APXS2` environment variable to the full path of the
118
+ correct `apxs` or `apxs2` command. Suppose that you want to use the Apache
119
+ installation in '/opt/apache2'. Then, assuming that the corresponding
120
+ `apxs` program's path is '/opt/apache2/bin/apxs', type:
121
+
122
+ ----------------------------------
123
+ export APXS2=/opt/apache2/bin/apxs
124
+ ----------------------------------
125
+
126
+ NOTE: On some systems, the `apxs` program might be called `apxs2`, and it might
127
+ be located in the `sbin` folder instead of the `bin` folder.
128
+
129
+ .Environment variables and 'sudo'
130
+ NOTE: By default, the 'sudo' command will erase any environment variables that it
131
+ doesn't recognize, prior to executing the given command. So if you set APXS2 as a
132
+ normal user, then run `sudo passenger-install-apache2-module` (which is the command
133
+ for the Phusion Passenger installer), then the installer will not receive the
134
+ environment variable value that you set. To solve this problem, please become root
135
+ prior to setting any environment variables, as described in the previous subsection.
136
+
137
+ [[specifying_ruby_installation]]
138
+ ===== Specifying the correct Ruby installation =====
139
+
140
+ If your system has multiple Ruby installations -- which is likely the case on
141
+ MacOS X, or if you've also installed
142
+ link:http://www.rubyenterpriseedition.com[Ruby Enterprise Edition] -- then you
143
+ will need to tell the operating system which Ruby installation to use, prior to
144
+ running the Phusion Passenger installer. If you only have one Ruby installation
145
+ (the case on most Linux systems), then you can skip this section because Phusion
146
+ Passenger will automatically detect it.
147
+
148
+ To specify a Ruby installation, prepend your Ruby installation's `bin`
149
+ directory to the `PATH` environment variable. For example, if you have the
150
+ following Ruby installations:
151
+
152
+ - /usr/bin/ruby
153
+ - /opt/myruby/bin/ruby
154
+
155
+ and you want to use the latter, then type:
156
+
157
+ ----------------------------------
158
+ export PATH=/opt/myruby/bin:$PATH
159
+ ----------------------------------
160
+
161
+
162
+ ==== Installing via the gem ====
163
+
164
+ Please install the gem and then run the Phusion Passenger installer, by typing the
165
+ following commands:
166
+ ------------------------------------------------------
167
+ gem install passenger-x.x.x.gem
168
+ passenger-install-apache2-module
169
+ ------------------------------------------------------
170
+ Please follow the instructions given by the installer.
171
+
172
+
173
+ ==== Installing via the source tarball ====
174
+
175
+ Extract the tarball to whatever location you prefer. *The Phusion Passenger files
176
+ are to reside in that location permanently.* For example, if you would like
177
+ Phusion Passenger to reside in `/opt/passenger-x.x.x`:
178
+ ------------------------------------------------------
179
+ cd /opt
180
+ tar xzvf ~/YourDownloadsFolder/passenger-x.x.x.tar.gz
181
+ ------------------------------------------------------
182
+
183
+ Next, run the included installer:
184
+ ------------------------------------------------------
185
+ /opt/passenger-x.x.x/bin/passenger-install-apache2-module
186
+ ------------------------------------------------------
187
+ Please follow the instructions given by the installer.
188
+
189
+ IMPORTANT: Please do not remove the 'passenger-x.x.x' folder after
190
+ installation. Furthermore, the 'passenger-x.x.x' folder must be accessible by Apache.
191
+
192
+
193
+ ==== Installing via a native Linux package ====
194
+
195
+ John Leach from Brightbox has kindly provided an Ubuntu Hardy package for Phusion Passenger. The package is available from the link:http://apt.brightbox.net[Brightbox repository].
196
+
197
+ Please install the native Linux package, e.g.:
198
+ ------------------------------------------------------
199
+ sudo sh -c 'echo "deb http://apt.brightbox.net hardy main" > /etc/apt/sources.list.d/brightbox.list'
200
+ sudo sh -c 'wget -q -O - http://apt.brightbox.net/release.asc | apt-key add -'
201
+ sudo apt-get update
202
+ sudo apt-get install libapache2-mod-passenger
203
+ ------------------------------------------------------
204
+
205
+ ==== What does the installer do? ====
206
+
207
+ Although we call it an ``installer'', it doesn't actually install anything.
208
+ The installer checks whether all required dependencies are installed,
209
+ compiles Phusion Passenger for you, and tells you how to modify the Apache
210
+ configuration file, but it doesn't copy any files around.
211
+
212
+ `passenger-install-apache2-module` is actually just a user-friendly frontend
213
+ around the command `rake apache2`, which performs the actual compilation of
214
+ Phusion Passenger.
215
+
216
+
217
+ === Operating system-specific instructions and information ===
218
+
219
+ ==== MacOS X ====
220
+
221
+ Ben Ruebenstein has written an excellent
222
+ link:http://benr75.com/articles/2008/04/12/setup-mod_rails-phusion-mac-os-x-leopard[tutorial
223
+ on installing Phusion Passenger on OS X].
224
+
225
+ ==== Ubuntu Linux ====
226
+
227
+ Ben Hughes has written an link:http://www.railsgarden.com/2008/04/12/configurating-passenger-mod_rails-on-slicehost-with-ubuntu-710/[article on installing Phusion Passenger on Ubuntu].
228
+
229
+ ==== OpenSolaris ====
230
+
231
+ J Aaron Farr has written a link:http://cubiclemuses.com/cm/articles/2009/04/09/rails-passenger-open-solaris-ec2/[guide]
232
+ about setting up Ruby on Rails and Phusion Passenger on OpenSolaris and EC2.
233
+
234
+
235
+ === Upgrading or downgrading Phusion Passenger ===
236
+
237
+ ==== Via a gem or a source tarball ====
238
+
239
+ To ugrade or downgrade Phusion Passenger via the gem or the source tarball, install the newer
240
+ or older version as you normally would; that is, install the gem or unpack the tarball, and
241
+ run `passenger-install-apache2-module`. Eventually `passenger-install-apache2-module` will tell
242
+ you to copy & paste some settings into the Apache configuration file; something that looks along
243
+ the lines of:
244
+
245
+ -----------------------------------
246
+ LoadModule passenger_module ...
247
+ PassengerRoot ...
248
+ PassengerRuby ...
249
+ -----------------------------------
250
+
251
+ Because you already have Phusion Passenger installed, you already have the same settings
252
+ in your Apache configuration file, just with different values. Replace the old settings with
253
+ the new ones that the installer outputs.
254
+
255
+ When you're done, restart Apache.
256
+
257
+ ==== Via a native Linux package
258
+
259
+ There are no special instructions required to upgrade or downgrade Phusion Passenger
260
+ via a native Linux package.
261
+
262
+ === Unloading (disabling) Phusion Passenger from Apache without uninstalling it ===
263
+
264
+ You can temporarily unload (disable) Phusion Passenger from Apache, without
265
+ uninstalling the Phusion Passenger files, so that Apache behaves as if Phusion
266
+ Passenger was never installed in the first place. This might be useful to you if,
267
+ for example, you seem to be experiencing a problem caused by Phusion Passenger,
268
+ but you want to make sure whether that's actually the case, without having
269
+ to through the hassle of uninstalling Phusion Passenger completely.
270
+
271
+ To unload Phusion Passenger from Apache, edit your Apache configuration file(s)
272
+ and comment out:
273
+
274
+ - all Phusion Passenger configuration directives.
275
+ - the 'LoadModule passenger_module' directive.
276
+
277
+ For example, if your configuration file looks like this...
278
+
279
+ -----------------------------------
280
+ Listen *:80
281
+ NameVirtualHosts *:80
282
+ ....
283
+
284
+ LoadModule passenger_module /somewhere/passenger-x.x.x/ext/apache2/mod_passenger.so
285
+
286
+ PassengerRuby /usr/bin/ruby
287
+ PassengerRoot /somewhere/passenger/x.x.x
288
+ PassengerMaxPoolSize 10
289
+
290
+ <VirtualHost *:80>
291
+ ServerName www.foo.com
292
+ DocumentRoot /webapps/foo/public
293
+ RailsBaseURI /rails
294
+ </VirtualHost>
295
+ -----------------------------------
296
+
297
+ ...then comment out the relevant directives, so that it looks like this:
298
+
299
+ -----------------------------------
300
+ Listen *:80
301
+ NameVirtualHosts *:80
302
+ ....
303
+
304
+ # LoadModule passenger_module /somewhere/passenger-x.x.x/ext/apache2/mod_passenger.so
305
+
306
+ # PassengerRuby /usr/bin/ruby
307
+ # PassengerRoot /somewhere/passenger/x.x.x
308
+ # PassengerMaxPoolSize 10
309
+
310
+ <VirtualHost *:80>
311
+ ServerName www.foo.com
312
+ DocumentRoot /webapps/foo/public
313
+ # RailsBaseURI /rails
314
+ </VirtualHost>
315
+ -----------------------------------
316
+
317
+ After you've done this, save the file and restart Apache.
318
+
319
+ === Uninstalling Phusion Passenger ===
320
+
321
+ To uninstall Phusion Passenger, please first remove all Phusion Passenger
322
+ configuration directives from your Apache configuration file(s). After you've
323
+ done this, you need to remove the Phusion Passenger files.
324
+
325
+ - If you installed Phusion Passenger via a gem, then type `gem uninstall passenger`.
326
+ You might have to run this as root.
327
+ - If you installed Phusion Passenger via a source tarball, then remove the directory
328
+ in which you placed the extracted Phusion Passenger files. This directory is the
329
+ same as the one pointed to the by 'PassengerRoot' configuration directive.
330
+ - If you installed Phusion Passenger via a Debian package, then remove type
331
+ `sudo apt-get remove libapache2-mod-passenger`.
332
+
333
+
334
+ == Deploying a Ruby on Rails application ==
335
+
336
+ Suppose you have a Ruby on Rails application in '/webapps/mycook', and you own
337
+ the domain 'www.mycook.com'. You can either deploy your application to the
338
+ virtual host's root (i.e. the application will be accessible from the root URL,
339
+ 'http://www.mycook.com/'), or in a sub URI (i.e. the application will be
340
+ accessible from a sub URL, such as 'http://www.mycook.com/railsapplication').
341
+
342
+ NOTE: The default `RAILS_ENV` environment in which deployed Rails applications
343
+ are run, is ``production''. You can change this by changing the
344
+ <<rails_env,'RailsEnv'>> configuration option.
345
+
346
+ === Deploying to a virtual host's root ===
347
+
348
+ Add a virtual host entry to your Apache configuration file. Make sure that the
349
+ following conditions are met:
350
+
351
+ - The virtual host's document root must point to your Ruby on Rails application's
352
+ 'public' folder.
353
+ - The Apache per-directory permissions must allow access to this folder.
354
+ - MultiViews must be disabled for this folder.
355
+
356
+ For example:
357
+ -------------------------------------------
358
+ <VirtualHost *:80>
359
+ ServerName www.mycook.com
360
+ DocumentRoot /webapps/mycook/public
361
+ <Directory /webapps/mycook/public>
362
+ Allow from all
363
+ Options -MultiViews
364
+ </Directory>
365
+ </VirtualHost>
366
+ -------------------------------------------
367
+
368
+ You may also need to tweak your file/folder permissions. Make sure that the
369
+ following folders are readable and executable by Apache:
370
+
371
+ * this 'public' folder.
372
+ * the application's 'config' folder.
373
+ * all parent folders. That is, /webapps/mycook and /webapps must also be readable and executable by Apache.
374
+
375
+ Then restart Apache. The application has now been deployed.
376
+
377
+ [[deploying_rails_to_sub_uri]]
378
+ === Deploying to a sub URI ===
379
+
380
+ Suppose that you already have a virtual host:
381
+
382
+ -------------------------------------------
383
+ <VirtualHost *:80>
384
+ ServerName www.phusion.nl
385
+ DocumentRoot /websites/phusion
386
+ <Directory /websites/phusion>
387
+ Allow from all
388
+ </Directory>
389
+ </VirtualHost>
390
+ -------------------------------------------
391
+
392
+ And you want your Ruby on Rails application to be accessible from the URL
393
+ 'http://www.phusion.nl/rails'.
394
+
395
+ To do this, make a symlink from your Ruby on Rails application's 'public'
396
+ folder to a directory in the document root. For example:
397
+ -------------------------------------------
398
+ ln -s /webapps/mycook/public /websites/phusion/rails
399
+ -------------------------------------------
400
+
401
+ Next, add a <<RailsBaseURI,RailsBaseURI>> option to the virtual host configuration,
402
+ and also make sure that:
403
+
404
+ - The Apache per-directory permissions allow access to this folder.
405
+ - MultiViews is disabled for this folder.
406
+
407
+ For example:
408
+ -------------------------------------------
409
+ <VirtualHost *:80>
410
+ ServerName www.phusion.nl
411
+ DocumentRoot /websites/phusion
412
+ <Directory /websites/phusion>
413
+ Allow from all
414
+ </Directory>
415
+
416
+ RailsBaseURI /rails # <-- These lines have
417
+ <Directory /websites/phusion/rails> # <-- been added.
418
+ Options -MultiViews # <--
419
+ </Directory> # <--
420
+ </VirtualHost>
421
+ -------------------------------------------
422
+ Then restart Apache. The application has now been deployed.
423
+
424
+ NOTE: If you're deploying to a sub-URI then please make sure that your view
425
+ templates correctly handles references to sub-URI static assets! Otherwise
426
+ you may find broken links to images, CSS files, JavaScripts, etc. Please read
427
+ <<sub_uri_deployment_uri_fix,How to fix broken images/CSS/JavaScript URIs in sub-URI deployments>>
428
+ for more information.
429
+
430
+ [TIP]
431
+ ======================================
432
+ You can deploy multiple Rails applications under a virtual host, by specifying
433
+ <<RailsBaseURI,RailsBaseURI>> multiple times. For example:
434
+ ---------------------------------
435
+ <VirtualHost *:80>
436
+ ....
437
+ RailsBaseURI /app1
438
+ RailsBaseURI /app2
439
+ RailsBaseURI /app3
440
+ </VirtualHost>
441
+ ---------------------------------
442
+ ======================================
443
+
444
+ === Redeploying (restarting the Ruby on Rails application) ===
445
+
446
+ Deploying a new version of a Ruby on Rails application is as simple as
447
+ re-uploading the application files, and restarting the application.
448
+
449
+ There are two ways to restart the application:
450
+
451
+ 1. By restarting Apache.
452
+ 2. By creating or modifying the file 'tmp/restart.txt' in the Rails
453
+ application's <<application_root,root folder>>. Phusion Passenger will
454
+ automatically restart the application during the next request.
455
+
456
+ For example, to restart our example MyCook application, we type this in the
457
+ command line:
458
+ -------------------------------------------
459
+ touch /webapps/mycook/tmp/restart.txt
460
+ -------------------------------------------
461
+
462
+ Please note that, unlike earlier versions of Phusion Passenger, 'restart.txt'
463
+ is not automatically deleted. Phusion Passenger checks whether the timestamp
464
+ of this file has changed in order to determine whether the application should
465
+ be restarted.
466
+
467
+ === Migrations ===
468
+
469
+ Phusion Passenger is not related to Ruby on Rails migrations in any way. To
470
+ run migrations on your deployment server, please login to your deployment
471
+ server (e.g. with 'ssh') and type `rake db:migrate RAILS_ENV=production` in
472
+ a shell console, just like one would normally run migrations.
473
+
474
+ === Capistrano integration ===
475
+
476
+ See <<capistrano,Capistrano recipe>>.
477
+
478
+
479
+ == Deploying a Rack-based Ruby application ==
480
+
481
+ Phusion Passenger supports arbitrary Ruby web applications that follow the
482
+ link:http://rack.rubyforge.org/[Rack] interface.
483
+
484
+ Phusion Passenger assumes that Rack application directories have a certain layout.
485
+ Suppose that you have a Rack application in '/webapps/rackapp'. Then that
486
+ folder must contain at least three entries:
487
+
488
+ - 'config.ru', a Rackup file for starting the Rack application. This file must contain
489
+ the complete logic for initializing the application.
490
+ - 'public/', a folder containing public static web assets, like images and stylesheets.
491
+ - 'tmp/', used for 'restart.txt' (our application restart mechanism). This will
492
+ be explained in a following subsection.
493
+
494
+ So '/webapps/rackapp' must, at minimum, look like this:
495
+ ----------------------
496
+ /webapps/rackapp
497
+ |
498
+ +-- config.ru
499
+ |
500
+ +-- public/
501
+ |
502
+ +-- tmp/
503
+ ----------------------
504
+
505
+ Suppose you own the domain 'www.rackapp.com'. You can either deploy your application
506
+ to the virtual host's root (i.e. the application will be accessible from the root URL,
507
+ 'http://www.rackapp.com/'), or in a sub URI (i.e. the application will be
508
+ accessible from a sub URL, such as 'http://www.rackapp.com/rackapp').
509
+
510
+ NOTE: The default `RACK_ENV` environment in which deployed Rack applications
511
+ are run, is ``production''. You can change this by changing the
512
+ <<rack_env,'RackEnv'>> configuration option.
513
+
514
+ === Tutorial/example: writing and deploying a Hello World Rack application ===
515
+
516
+ First we create a Phusion Passenger-compliant Rack directory structure:
517
+
518
+ -------------------------------------------
519
+ $ mkdir /webapps/rack_example
520
+ $ mkdir /webapps/rack_example/public
521
+ $ mkdir /webapps/rack_example/tmp
522
+ -------------------------------------------
523
+
524
+ Next, we write a minimal "hello world" Rack application:
525
+
526
+ -------------------------------------------
527
+ $ cd /webapps/rack_example
528
+ $ some_awesome_editor config.ru
529
+ ...type in some source code...
530
+ $ cat config.ru
531
+ app = proc do |env|
532
+ [200, { "Content-Type" => "text/html" }, ["hello <b>world</b>"]]
533
+ end
534
+ run app
535
+ -------------------------------------------
536
+
537
+ Finally, we deploy it by adding the following configuration options to
538
+ the Apache configuration file:
539
+
540
+ -------------------------------------------
541
+ <VirtualHost *:80>
542
+ ServerName www.rackexample.com
543
+ DocumentRoot /webapps/rack_example/public
544
+ <Directory /webapps/rack_example/public>
545
+ Allow from all
546
+ Options -MultiViews
547
+ </Directory>
548
+ </VirtualHost>
549
+ -------------------------------------------
550
+
551
+ And we're done! After an Apache restart, the above Rack application will be available
552
+ under the URL 'http://www.rackexample.com/'.
553
+
554
+ === Deploying to a virtual host's root ===
555
+
556
+ Add a virtual host entry to your Apache configuration file. Make sure that the
557
+ following conditions are met:
558
+
559
+ - The virtual host's document root must point to your Rack application's
560
+ 'public' folder.
561
+ - The Apache per-directory permissions must allow access to this folder.
562
+ - MultiViews must be disabled for this folder.
563
+
564
+ For example:
565
+ -------------------------------------------
566
+ <VirtualHost *:80>
567
+ ServerName www.rackapp.com
568
+ DocumentRoot /webapps/rackapp/public
569
+ <Directory /webapps/rackapp/public>
570
+ Allow from all
571
+ Options -MultiViews
572
+ </Directory>
573
+ </VirtualHost>
574
+ -------------------------------------------
575
+
576
+ You may also need to tweak your file/folder permissions. Make sure that the
577
+ following folders are readable and executable by Apache:
578
+
579
+ * this 'public' folder.
580
+ * the application's 'config' folder.
581
+ * all parent folders. That is, /webapps/rackapp and /webapps must also be readable and executable by Apache.
582
+
583
+ Then restart Apache. The application has now been deployed.
584
+
585
+ [[deploying_rack_to_sub_uri]]
586
+ === Deploying to a sub URI ===
587
+
588
+ Suppose that you already have a virtual host:
589
+
590
+ -------------------------------------------
591
+ <VirtualHost *:80>
592
+ ServerName www.phusion.nl
593
+ DocumentRoot /websites/phusion
594
+ <Directory /websites/phusion>
595
+ Allow from all
596
+ </Directory>
597
+ </VirtualHost>
598
+ -------------------------------------------
599
+
600
+ And you want your Rack application to be accessible from the URL
601
+ 'http://www.phusion.nl/rack'.
602
+
603
+ To do this, make a symlink from your Rack application's 'public'
604
+ folder to a directory in the document root. For example:
605
+ -------------------------------------------
606
+ ln -s /webapps/rackapp/public /websites/phusion/rack
607
+ -------------------------------------------
608
+
609
+ Next, add a <<RackBaseURI,RackBaseURI>> option to the virtual host configuration,
610
+ and also make sure that:
611
+
612
+ - The Apache per-directory permissions allow access to this folder.
613
+ - MultiViews is disabled for this folder.
614
+
615
+ For example:
616
+ -------------------------------------------
617
+ <VirtualHost *:80>
618
+ ServerName www.phusion.nl
619
+ DocumentRoot /websites/phusion
620
+ <Directory /websites/phusion>
621
+ Allow from all
622
+ </Directory>
623
+
624
+ RackBaseURI /rails # <-- These lines have
625
+ <Directory /websites/phusion/rails> # <-- been added.
626
+ Options -MultiViews # <--
627
+ </Directory> # <--
628
+ </VirtualHost>
629
+ -------------------------------------------
630
+ Then restart Apache. The application has now been deployed.
631
+
632
+ [TIP]
633
+ ======================================
634
+ You can deploy multiple Rack applications under a virtual host, by specifying
635
+ <<RackBaseURI,RackBaseURI>> multiple times. For example:
636
+ ---------------------------------
637
+ <VirtualHost *:80>
638
+ ....
639
+ RackBaseURI /app1
640
+ RackBaseURI /app2
641
+ RackBaseURI /app3
642
+ </VirtualHost>
643
+ ---------------------------------
644
+ ======================================
645
+
646
+ === Redeploying (restarting the Rack application) ===
647
+
648
+ Deploying a new version of a Rack application is as simple as
649
+ re-uploading the application files, and restarting the application.
650
+
651
+ There are two ways to restart the application:
652
+
653
+ 1. By restarting Apache.
654
+ 2. By creating or modifying the file 'tmp/restart.txt' in the Rack
655
+ application's <<application_root,root folder>>. Phusion Passenger will
656
+ automatically restart the application.
657
+
658
+ For example, to restart our example application, we type this in the
659
+ command line:
660
+ -------------------------------------------
661
+ touch /webapps/rackapp/tmp/restart.txt
662
+ -------------------------------------------
663
+
664
+ === Rackup specifications for various web frameworks ===
665
+ include::users_guide_snippets/rackup_specifications.txt[]
666
+
667
+
668
+ == Configuring Phusion Passenger ==
669
+
670
+ After installation, Phusion Passenger does not need any further configurations.
671
+ Nevertheless, the system administrator may be interested in changing
672
+ Phusion Passenger's behavior. Phusion Passenger's Apache module supports the
673
+ following configuration options:
674
+
675
+ === PassengerRoot <directory> ===
676
+ The location to the Phusion Passenger root directory. This configuration option
677
+ is essential to Phusion Passenger, and allows Phusion Passenger to locate its own
678
+ data files. The correct value is given by the installer.
679
+
680
+ If you've moved Phusion Passenger to a different directory then you need to update
681
+ this option as well. Please read
682
+ <<moving_phusion_passenger,Moving Phusion Passenger to a different directory>> for more information.
683
+
684
+ This required option may only occur once, in the global server configuration.
685
+
686
+ === PassengerLogLevel <integer> ===
687
+ This option allows one to specify how much information Phusion Passenger should
688
+ write to the Apache error log file. A higher log level value means that more
689
+ information will be logged.
690
+
691
+ Possible values are:
692
+
693
+ - '0': Show only errors and warnings.
694
+ - '1': Show the most important debugging information. This might be useful for
695
+ system administrators who are trying to figure out the cause of a
696
+ problem.
697
+ - '2': Show more debugging information. This is typically only useful for developers.
698
+ - '3': Show even more debugging information.
699
+
700
+ This option may only occur once, in the global server configuration.
701
+ The default is '0'.
702
+
703
+ [[PassengerRuby]]
704
+ === PassengerRuby <filename> ===
705
+ This option allows one to specify the Ruby interpreter to use.
706
+
707
+ This option may only occur once, in the global server configuration.
708
+ The default is 'ruby'.
709
+
710
+ [[PassengerAppRoot]]
711
+ === PassengerAppRoot <path/to/root> ===
712
+ By default, Phusion Passenger assumes that the application's root directory
713
+ is the parent directory of the 'public' directory. This option allows one to
714
+ specify the application's root independently from the DocumentRoot, which
715
+ is useful if the 'public' directory lives in a non-standard place.
716
+
717
+ This option may occur in the following places:
718
+
719
+ * In the global server configuration.
720
+ * In a virtual host configuration block.
721
+ * In a `<Directory>` or `<Location>` block.
722
+ * In '.htaccess', if `AllowOverride Options` is on.
723
+
724
+ In each place, it may be specified at most once.
725
+
726
+ Example:
727
+
728
+ -----------------------------
729
+ <VirtualHost test.host>
730
+ DocumentRoot /var/rails/zena/sites/example.com/public
731
+ PassengerAppRoot /var/rails/zena # <-- normally Phusion Passenger would
732
+ # have assumed that the application
733
+ # root is "/var/rails/zena/sites/example.com"
734
+ </VirtualHost>
735
+ -----------------------------
736
+
737
+ [[PassengerUseGlobalQueue]]
738
+ === PassengerUseGlobalQueue <on|off> ===
739
+ Turns the use of global queuing on or off.
740
+
741
+ This option may occur in the following places:
742
+
743
+ * In the global server configuration.
744
+ * In a virtual host configuration block.
745
+
746
+ In each place, it may be specified at most once. The default value is 'off'.
747
+
748
+ 'This feature is sponsored by http://www.37signals.com/[37signals].'
749
+
750
+ include::users_guide_snippets/global_queueing_explained.txt[]
751
+
752
+
753
+ [[PassengerUserSwitching]]
754
+ === PassengerUserSwitching <on|off> ===
755
+ Whether to enable <<user_switching,user switching support>>.
756
+
757
+ This option may only occur once, in the global server configuration.
758
+ The default value is 'on'.
759
+
760
+ [[PassengerDefaultUser]]
761
+ === PassengerDefaultUser <username> ===
762
+ Phusion Passenger enables <<user_switching,user switching support>> by default.
763
+ This configuration option allows one to specify which user Rails/Rack
764
+ applications must run as, if user switching fails or is disabled.
765
+
766
+ This option may only occur once, in the global server configuration.
767
+ The default value is 'nobody'.
768
+
769
+ === PassengerEnabled <on|off> ===
770
+ You can set this option to 'off' to completely disable Phusion Passenger for
771
+ a certain location. This is useful if, for example, you want to integrate a PHP
772
+ application into the same virtual host as a Rails application.
773
+
774
+ Suppose that you have a Rails application in '/apps/foo'. Suppose that you've
775
+ dropped Wordpress -- a blogging application written in PHP -- in
776
+ '/apps/foo/public/wordpress'. You can then configure Phusion Passenger as
777
+ follows:
778
+
779
+ ------------------------------------
780
+ <VirtualHost *:80>
781
+ ServerName www.foo.com
782
+ DocumentRoot /apps/foo/public
783
+ <Directory /apps/foo/public/wordpress>
784
+ PassengerEnabled off
785
+ AllowOverride all # <-- Makes Wordpress's .htaccess file work.
786
+ </Directory>
787
+ </VirtualHost>
788
+ ------------------------------------
789
+
790
+ This way, Phusion Passenger will not interfere with Wordpress.
791
+
792
+ 'PassengerEnabled' may occur in the following places:
793
+
794
+ * In the global server configuration.
795
+ * In a virtual host configuration block.
796
+ * In a `<Directory>` or `<Location>` block.
797
+ * In '.htaccess'.
798
+
799
+ In each place, it may be specified at most once. The default value is 'on'.
800
+
801
+ [[PassengerTempDir]]
802
+ === PassengerTempDir <directory> ===
803
+ Specifies the directory that Phusion Passenger should use for storing temporary
804
+ files. This includes things such as Unix socket files, buffered file uploads
805
+ (see also <<PassengerUploadBufferDir,PassengerUploadBufferDir>>), etc.
806
+
807
+ This option may be specified once, in the global server configuration. The
808
+ default temp directory that Phusion Passenger uses is '/tmp'.
809
+
810
+ This option is especially useful if Apache is not allowed to write to /tmp
811
+ (which is the case on some systems with strict SELinux policies) or if the
812
+ partition that /tmp lives on doesn't have enough disk space.
813
+
814
+ .Command line tools
815
+ Some Phusion Passenger command line administration tools, such as
816
+ `passenger-status`, must know what Phusion Passenger's temp directory is
817
+ in order to function properly. You can pass the directory through the
818
+ `PASSENGER_TMPDIR` environment variable, or the `TMPDIR` environment variable
819
+ (the former will be used if both are specified).
820
+
821
+ For example, if you set 'PassengerTempDir' to '/my_temp_dir', then invoke
822
+ `passenger-status` after you've set the `PASSENGER_TMPDIR` or `TMPDIR`
823
+ environment variable, like this:
824
+
825
+ ----------------------------------------------------------
826
+ export PASSENGER_TMPDIR=/my_temp-dir
827
+ sudo -E passenger-status
828
+ # The -E option tells 'sudo' to preserve environment variables.
829
+ ----------------------------------------------------------
830
+
831
+ [[PassengerUploadBufferDir]]
832
+ === PassengerUploadBufferDir <directory> ===
833
+ Phusion Passenger buffers large file uploads to disk in order prevent slow file
834
+ uploads from blocking web applications. By default, a subdirectory in the
835
+ system's temporary files directory (or a subdirectory in the directory specified
836
+ in <<PassengerTempDir,PassengerTempDir>>, if set) is automatically created for
837
+ storing these buffered file uploads.
838
+
839
+ This configuration directive allows you to specify a different directory for storing
840
+ buffered file uploads. If you've specified such a directory (as opposed to using
841
+ Phusion Passenger's default) then you *must* ensure that this directory exists.
842
+
843
+ This configuration directive is also useful if you're using apache2-mpm-itk.
844
+ The buffered file upload directory that Phusion Passenger creates by default has
845
+ very strict permissions: it can only be accessed by the Apache worker processes.
846
+ However, Phusion Passenger assumes that all Apache worker processes are running
847
+ as the same user. apache2-mpm-itk breaks this assumption by running multiple
848
+ Apache worker processes as different users. So if you're using apace2-mpm-itk,
849
+ you should set this option to a directory that is writable by all Apache worker
850
+ processes, such as '/tmp'.
851
+
852
+ You may specify 'PassengerUploadBufferDir' in the following places:
853
+
854
+ * In the global server configuration.
855
+ * In a virtual host configuration block.
856
+ * In a `<Directory>` or `<Location>` block.
857
+ * In '.htaccess', if `AllowOverrides Options` is enabled.
858
+
859
+ In each place, it may be specified at most once.
860
+
861
+ === PassengerRestartDir <directory> ===
862
+ As described in the deployment chapters of this document, Phusion Passenger
863
+ checks the file 'tmp/restart.txt' in the applications'
864
+ <<application_root,root directory>> for restarting applications. Sometimes it
865
+ may be desirable for Phusion Passenger to look in a different directory instead,
866
+ for example for security reasons (see below). This option allows you to
867
+ customize the directory in which 'restart.txt' is searched for.
868
+
869
+ You may specify 'PassengerRestartDir' in the following places:
870
+
871
+ * In the global server configuration.
872
+ * In a virtual host configuration block.
873
+ * In a `<Directory>` or `<Location>` block.
874
+ * In '.htaccess', if `AllowOverrides Options` is enabled.
875
+
876
+ In each place, it may be specified at most once.
877
+
878
+ You can either set it to an absolute directory, or to a directory relative to
879
+ the <<application_root,application root>>. Examples:
880
+
881
+ -----------------------------------
882
+ <VirtualHost *:80>
883
+ ServerName www.foo.com
884
+ # Phusion Passenger will check for /apps/foo/public/tmp/restart.txt
885
+ DocumentRoot /apps/foo/public
886
+ </VirtualHost>
887
+
888
+ <VirtualHost *:80>
889
+ ServerName www.bar.com
890
+ DocumentRoot /apps/bar/public
891
+ # An absolute filename is given; Phusion Passenger will
892
+ # check for /restart_files/bar/restart.txt
893
+ PassengerRestartDir /restart_files/bar
894
+ </VirtualHost>
895
+
896
+ <VirtualHost *:80>
897
+ ServerName www.baz.com
898
+ DocumentRoot /apps/baz/public
899
+ # A relative filename is given; Phusion Passenger will
900
+ # check for /apps/baz/restart_files/restart.txt
901
+ #
902
+ # Note that this directory is relative to the APPLICATION ROOT, *not*
903
+ # the value of DocumentRoot!
904
+ PassengerRestartDir restart_files
905
+ </VirtualHost>
906
+ -----------------------------------
907
+
908
+ .What are the security reasons for wanting to customize PassengerRestartDir?
909
+ Touching restart.txt will cause Phusion Passenger to restart the application.
910
+ So anybody who can touch restart.txt can effectively cause a Denial-of-Service
911
+ attack by touching restart.txt over and over. If your web server or one of your
912
+ web applications has the permission to touch restart.txt, and one of them has a
913
+ security flaw which allows an attacker to touch restart.txt, then that will
914
+ allow the attacker to cause a Denial-of-Service.
915
+
916
+ You can prevent this from happening by pointing PassengerRestartDir to a
917
+ directory that's readable by Apache, but only writable by administrators.
918
+
919
+
920
+ === Resource control and optimization options ===
921
+
922
+ ==== PassengerMaxPoolSize <integer> ====
923
+ The maximum number of Ruby on Rails or Rack application instances that may
924
+ be simultaneously active. A larger number results in higher memory usage,
925
+ but improved ability to handle concurrent HTTP clients.
926
+
927
+ The optimal value depends on your system's hardware and the server's average
928
+ load. You should experiment with different values. But generally speaking,
929
+ the value should be at least equal to the number of CPUs (or CPU cores) that
930
+ you have. If your system has 2 GB of RAM, then we recommend a value of '30'.
931
+ If your system is a Virtual Private Server (VPS) and has about 256 MB RAM, and
932
+ is also running other services such as MySQL, then we recommend a value of '2'.
933
+
934
+ If you find that your server is unable to handle the load on your Rails/Rack websites
935
+ (i.e. running out of memory) then you should lower this value. (Though if your
936
+ sites are really that popular, then you should strongly consider upgrading your
937
+ hardware or getting more servers.)
938
+
939
+ This option may only occur once, in the global server configuration.
940
+ The default value is '6'.
941
+
942
+ TIP: We strongly recommend you to <<reducing_memory_usage,use Ruby Enterprise
943
+ Edition>>. This allows you to reduce the memory usage of your Ruby on Rails applications
944
+ by about 33%. And it's not hard to install.
945
+
946
+ ==== PassengerMaxInstancesPerApp <integer> ====
947
+ The maximum number of application instances that may be simultaneously active
948
+ for a single application. This helps to make sure that a single application
949
+ will not occupy all available slots in the application pool.
950
+
951
+ This value must be less than <<PassengerMaxPoolSize,PassengerMaxPoolSize>>. A value of 0
952
+ means that there is no limit placed on the number of instances a single application
953
+ may use, i.e. only the global limit of <<PassengerMaxPoolSize,PassengerMaxPoolSize>>
954
+ will be enforced.
955
+
956
+ This option may only occur once, in the global server configuration.
957
+ The default value is '0'.
958
+
959
+ [[PassengerPoolIdleTime]]
960
+ ==== PassengerPoolIdleTime <integer> ====
961
+ The maximum number of seconds that an application instance may be idle. That is,
962
+ if an application instance hasn't received any traffic after the given number of
963
+ seconds, then it will be shutdown in order to conserve memory.
964
+
965
+ Decreasing this value means that applications will have to be spawned
966
+ more often. Since spawning is a relatively slow operation, some visitors may
967
+ notice a small delay when they visit your Rails/Rack website. However, it will also
968
+ free up resources used by applications more quickly.
969
+
970
+ The optimal value depends on the average time that a visitor spends on a single
971
+ Rails/Rack web page. We recommend a value of `2 * x`, where `x` is the average
972
+ number of seconds that a visitor spends on a single Rails/Rack web page. But your
973
+ mileage may vary.
974
+
975
+ When this value is set to '0', application instances will not be shutdown unless
976
+ it's really necessary, i.e. when Phusion Passenger is out of worker processes
977
+ for a given application and one of the inactive application instances needs to
978
+ make place for another application instance. Setting the value to 0 is
979
+ recommended if you're on a non-shared host that's only running a few
980
+ applications, each which must be available at all times.
981
+
982
+ This option may only occur once, in the global server configuration.
983
+ The default value is '300'.
984
+
985
+ [[PassengerMaxRequests]]
986
+ ==== PassengerMaxRequests <integer> ====
987
+ The maximum number of requests an application instance will process. After
988
+ serving that many requests, the application instance will be shut down and
989
+ Phusion Passenger will restart it. A value of 0 means that there is no maximum:
990
+ an application instance will thus be shut down when its idle timeout has been
991
+ reached.
992
+
993
+ This option is useful if your application is leaking memory. By shutting
994
+ it down after a certain number of requests, all of its memory is guaranteed
995
+ to be freed by the operating system.
996
+
997
+ This option may occur in the following places:
998
+
999
+ * In the global server configuration.
1000
+ * In a virtual host configuration block.
1001
+ * In a `<Directory>` or `<Location>` block.
1002
+ * In '.htaccess', if `AllowOverride Limits` is on.
1003
+
1004
+ In each place, it may be specified at most once. The default value is '0'.
1005
+
1006
+ [CAUTION]
1007
+ =====================================================
1008
+ The <<PassengerMaxRequests,PassengerMaxRequests>> directive should be considered
1009
+ as a workaround for misbehaving applications. It is advised that you fix the
1010
+ problem in your application rather than relying on these directives as a
1011
+ measure to avoid memory leaks.
1012
+ =====================================================
1013
+
1014
+ ==== PassengerStatThrottleRate <integer> ====
1015
+ By default, Phusion Passenger performs several filesystem checks (or, in
1016
+ programmers jargon, 'stat() calls') each time a request is processed:
1017
+
1018
+ - It checks whether 'config/environment.rb', 'config.ru' or 'passenger_wsgi.py'
1019
+ is present, in order to autodetect Rails, Rack and WSGI applications.
1020
+ - It checks whether 'restart.txt' has changed or whether 'always_restart.txt'
1021
+ exists, in order to determine whether the application should be restarted.
1022
+
1023
+ On some systems where disk I/O is expensive, e.g. systems where the harddisk is
1024
+ already being heavily loaded, or systems where applications are stored on NFS
1025
+ shares, these filesystem checks can incur a lot of overhead.
1026
+
1027
+ You can decrease or almost entirely eliminate this overhead by setting
1028
+ 'PassengerStatThrottleRate'. Setting this option to a value of 'x' means that
1029
+ the above list of filesystem checks will be performed at most once every 'x'
1030
+ seconds. Setting it to a value of '0' means that no throttling will take place,
1031
+ or in other words, that the above list of filesystem checks will be performed on
1032
+ every request.
1033
+
1034
+ This option may occur in the following places:
1035
+
1036
+ * In the global server configuration.
1037
+ * In a virtual host configuration block.
1038
+ * In a `<Directory>` or `<Location>` block.
1039
+ * In '.htaccess', if `AllowOverride Limits` is on.
1040
+
1041
+ In each place, it may be specified at most once. The default value is '0'.
1042
+
1043
+ [[PassengerHighPerformance]]
1044
+ ==== PassengerHighPerformance <on|off> ====
1045
+ By default, Phusion Passenger is compatible with mod_rewrite and most other
1046
+ Apache modules. However, a lot of effort is required in order to be compatible.
1047
+ If you turn 'PassengerHighPerformance' to 'on', then Phusion Passenger will be
1048
+ a little faster, in return for reduced compatibility with other Apache modules.
1049
+
1050
+ In places where 'PassengerHighPerformance' is turned on, mod_rewrite rules will
1051
+ likely not work. mod_autoindex (the module which displays a directory index)
1052
+ will also not work. Other Apache modules may or may not work, depending on what
1053
+ they exactly do. We recommend you to find out how other modules behave in high
1054
+ performance mode via testing.
1055
+
1056
+ This option is *not* an all-or-nothing global option: you can enable high
1057
+ performance mode for certain virtual hosts or certain URLs only.
1058
+ The 'PassengerHighPerformance' option may occur in the following places:
1059
+
1060
+ * In the global server configuration.
1061
+ * In a virtual host configuration block.
1062
+ * In a `<Directory>` or `<Location>` block.
1063
+ * In '.htaccess'.
1064
+
1065
+ In each place, it may be specified at most once. The default value is 'off',
1066
+ so high performance mode is disabled by default, and you have to explicitly
1067
+ enable it.
1068
+
1069
+ .When to enable high performance mode?
1070
+
1071
+ If you do not use mod_rewrite or other Apache modules then it might make
1072
+ sense to enable high performance mode.
1073
+
1074
+ It's likely that some of your applications depend on mod_rewrite or other
1075
+ Apache modules, while some do not. In that case you can enable high performance
1076
+ for only those applications that don't use other Apache modules. For example:
1077
+
1078
+ ------------------------------------
1079
+ <VirtualHost *:80>
1080
+ ServerName www.foo.com
1081
+ DocumentRoot /apps/foo/public
1082
+ .... mod_rewrite rules or options for other Apache modules here ...
1083
+ </VirtualHost>
1084
+
1085
+ <VirtualHost *:80>
1086
+ ServerName www.bar.com
1087
+ DocumentRoot /apps/bar/public
1088
+ PassengerHighPerformance on
1089
+ </VirtualHost>
1090
+ ------------------------------------
1091
+
1092
+ In the above example, high performance mode is only enabled for www.bar.com.
1093
+ It is disabled for everything else.
1094
+
1095
+ If your application generally depends on mod_rewrite or other Apache modules,
1096
+ but a certain URL that's accessed often doesn't depend on those other modules,
1097
+ then you can enable high performance mode for a certain URL only. For example:
1098
+
1099
+ ------------------------------------
1100
+ <VirtualHost *:80>
1101
+ ServerName www.foo.com
1102
+ DocumentRoot /apps/foo/public
1103
+ .... mod_rewrite rules or options for other Apache modules here ...
1104
+
1105
+ <Location /chatroom/ajax_update_poll>
1106
+ PassengerHighPerformance on
1107
+ </Location>
1108
+ </VirtualHost>
1109
+ ------------------------------------
1110
+
1111
+ This enables high performance mode for
1112
+ http://www.foo.com/chatroom/ajax_update_poll only.
1113
+
1114
+
1115
+ === Compatibility options ===
1116
+
1117
+ [[PassengerResolveSymlinksInDocumentRoot]]
1118
+ ==== PassengerResolveSymlinksInDocumentRoot <on|off> ====
1119
+ Configures whether Phusion Passenger should resolve symlinks in the document root.
1120
+ Please refer to <<application_detection,How Phusion Passenger detects whether a
1121
+ virtual host is a web application>> for more information.
1122
+
1123
+ This option may occur in the following places:
1124
+
1125
+ * In the global server configuration.
1126
+ * In a virtual host configuration block.
1127
+ * In a `<Directory>` or `<Location>` block.
1128
+ * In '.htaccess', if `AllowOverride Options` is on.
1129
+
1130
+ In each place, it may be specified at most once. It is off by default.
1131
+
1132
+ ==== PassengerAllowEncodedSlashes <on|off> ====
1133
+ By default, Apache doesn't support URLs with encoded slashes (%2f), e.g. URLs like
1134
+ this: `/users/fujikura%2fyuu`. If you access such an URL then Apache will return a
1135
+ 404 Not Found error. This can be solved by turning on PassengerAllowEncodedSlashes
1136
+ as well as Apache's
1137
+ link:http://httpd.apache.org/docs/2.0/mod/core.html#allowencodedslashes[AllowEncodedSlashes].
1138
+
1139
+ Is it important that you turn on both AllowEncodedSlashes *and* PassengerAllowEncodedSlashes,
1140
+ otherwise this feature will not work properly.
1141
+
1142
+ PassengerAllowEncodedSlashes may occur in the following places:
1143
+
1144
+ * In the global server configuration.
1145
+ * In a virtual host configuration block.
1146
+ * In a `<Directory>` or `<Location>` block.
1147
+ * In '.htaccess', if `AllowOverride Options` is on.
1148
+
1149
+ In each place, it may be specified at most once. It is off by default.
1150
+
1151
+ Please note however that turning on support for encoded slashes will break support for
1152
+ mod_rewrite passthrough rules. Because of bugs/limitations in Apache, Phusion Passenger
1153
+ can support either encoded slashes or mod_rewrite passthrough rules, but not both at the
1154
+ same time. Luckily this option can be specified anywhere, so you can enable it only for
1155
+ virtual hosts or URLs that need it:
1156
+
1157
+ ----------------------------------
1158
+ <VirtualHost *:80>
1159
+ ServerName www.example.com
1160
+ DocumentRoot /webapps/example/public
1161
+ AllowEncodedSlashes on
1162
+ RewriteEngine on
1163
+
1164
+ # Check for maintenance file and redirect all requests
1165
+ RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
1166
+ RewriteCond %{SCRIPT_FILENAME} !maintenance.html
1167
+ RewriteRule ^.*$ /system/maintenance.html [L]
1168
+
1169
+ # Make /about an alias for /info/about.
1170
+ RewriteRule ^/about$ /info/about [PT,L]
1171
+
1172
+ <Location ~ "^/users/">
1173
+ # In a location block so that it doesn't interfere with the
1174
+ # above /about mod_rewrite rule.
1175
+ PassengerAllowEncodedSlashes on
1176
+ </Location>
1177
+ </VirtualHost>
1178
+ ----------------------------------
1179
+
1180
+ With this, http://www.example.com/users/fujikura%2fyuu will work properly, and
1181
+ accessing http://www.example.com/about will properly display the result of
1182
+ http://www.example.com/info/about. Notice that PassengerAllowEncodedSlashes only
1183
+ interferes with passthrough rules, not with any other mod_rewrite rules. The rules for
1184
+ displaying maintenance.html will work fine even for URLs starting with "/users".
1185
+
1186
+
1187
+ === Ruby on Rails-specific options ===
1188
+
1189
+ ==== RailsAutoDetect <on|off> ====
1190
+ Whether Phusion Passenger should automatically detect whether a virtual host's
1191
+ document root is a Ruby on Rails application. The default is 'on'.
1192
+
1193
+ This option may occur in the global server configuration or in a virtual host
1194
+ configuration block.
1195
+
1196
+ For example, consider the following configuration:
1197
+
1198
+ -----------------------------
1199
+ RailsAutoDetect off
1200
+ <VirtualHost *:80>
1201
+ ServerName www.mycook.com
1202
+ DocumentRoot /webapps/mycook/public
1203
+ </VirtualHost>
1204
+ -----------------------------
1205
+
1206
+ If one goes to 'http://www.mycook.com/', the visitor will see the contents of
1207
+ the '/webapps/mycook/public' folder, instead of the output of the Ruby on Rails
1208
+ application.
1209
+
1210
+ It is possible to explicitly specify that the host is a Ruby on Rails
1211
+ application by using the <<RailsBaseURI,RailsBaseURI>> configuration option:
1212
+
1213
+ -----------------------------
1214
+ RailsAutoDetect off
1215
+ <VirtualHost *:80>
1216
+ ServerName www.mycook.com
1217
+ DocumentRoot /webapps/mycook/public
1218
+ RailsBaseURI / # This line has been added.
1219
+ </VirtualHost>
1220
+ -----------------------------
1221
+
1222
+ [[RailsBaseURI]]
1223
+ ==== RailsBaseURI <uri> ====
1224
+ Used to specify that the given URI is a Rails application. See
1225
+ <<deploying_rails_to_sub_uri,Deploying Rails to a sub URI>> for an example.
1226
+
1227
+ It is allowed to specify this option multiple times. Do this to deploy multiple
1228
+ Rails applications in different sub-URIs under the same virtual host.
1229
+
1230
+ This option may occur in the following places:
1231
+
1232
+ * In the global server configuration.
1233
+ * In a virtual host configuration block.
1234
+ * In a `<Directory>` or `<Location>` block.
1235
+ * In '.htaccess', if `AllowOverride Options` is on.
1236
+
1237
+ [[rails_env]]
1238
+ ==== RailsEnv <string> ====
1239
+ This option allows one to specify the default `RAILS_ENV` value.
1240
+
1241
+ This option may occur in the following places:
1242
+
1243
+ * In the global server configuration.
1244
+ * In a virtual host configuration block.
1245
+ * In a `<Directory>` or `<Location>` block.
1246
+ * In '.htaccess', if `AllowOverride Options` is on.
1247
+
1248
+ In each place, it may be specified at most once. The default value is 'production'.
1249
+
1250
+ [[RailsSpawnMethod]]
1251
+ ==== RailsSpawnMethod <string> ====
1252
+ [TIP]
1253
+ ."What spawn method should I use?"
1254
+ =========================================================
1255
+ This subsection attempts to describe spawn methods, but it's okay if you don't (want to)
1256
+ understand it, as it's mostly a technical detail. You can basically follow this rule of thumb:
1257
+
1258
+ ************************************************
1259
+ If your application works on Mongrel, but not on Phusion Passenger, then set
1260
+ `RailsSpawnMethod` to 'conservative'. Otherwise, leave it at 'smart-lv2' (the default).
1261
+ ************************************************
1262
+
1263
+ However, we do recommend you to try to understand it. The 'smart' and 'smart-lv2' spawn
1264
+ methods bring many benefits.
1265
+ =========================================================
1266
+
1267
+ include::users_guide_snippets/rails_spawn_method.txt[]
1268
+
1269
+ This option may occur in the following places:
1270
+
1271
+ * In the global server configuration.
1272
+ * In a virtual host configuration block.
1273
+
1274
+ In each place, it may be specified at most once. The default value is 'smart-lv2'.
1275
+
1276
+ ==== RailsFrameworkSpawnerIdleTime <integer> ====
1277
+ The FrameworkSpawner server (explained in <<spawning_methods_explained,Spawning
1278
+ methods explained>>) has an idle timeout, just like the backend processes spawned by
1279
+ Phusion Passenger do. That is, it will automatically shutdown if it hasn't done
1280
+ anything for a given period.
1281
+
1282
+ This option allows you to set the FrameworkSpawner server's idle timeout, in
1283
+ seconds. A value of '0' means that it should never idle timeout.
1284
+
1285
+ Setting a higher value will mean that the FrameworkSpawner server is kept around
1286
+ longer, which may slightly increase memory usage. But as long as the
1287
+ FrameworkSpawner server is running, the time to spawn a Ruby on Rails backend
1288
+ process only takes about 40% of the time that is normally needed, assuming that
1289
+ you're using the 'smart' <<RailsSpawnMethod,spawning method>>. So if your
1290
+ system has enough memory, is it recommended that you set this option to a high
1291
+ value or to '0'.
1292
+
1293
+ This option may occur in the following places:
1294
+
1295
+ * In the global server configuration.
1296
+ * In a virtual host configuration block.
1297
+
1298
+ In each place, it may be specified at most once. The default value is '1800' (30 minutes).
1299
+
1300
+ ==== RailsAppSpawnerIdleTime <integer> ====
1301
+ The ApplicationSpawner server (explained in <<spawning_methods_explained,Spawning
1302
+ methods explained>>) has an idle timeout, just like the backend processes spawned by
1303
+ Phusion Passenger do. That is, it will automatically shutdown if it hasn't done
1304
+ anything for a given period.
1305
+
1306
+ This option allows you to set the ApplicationSpawner server's idle timeout, in
1307
+ seconds. A value of '0' means that it should never idle timeout.
1308
+
1309
+ Setting a higher value will mean that the ApplicationSpawner server is kept around
1310
+ longer, which may slightly increase memory usage. But as long as the
1311
+ ApplicationSpawner server is running, the time to spawn a Ruby on Rails backend
1312
+ process only takes about 10% of the time that is normally needed, assuming that
1313
+ you're using the 'smart' or 'smart-lv2' <<RailsSpawnMethod,spawning method>>. So if your
1314
+ system has enough memory, is it recommended that you set this option to a high
1315
+ value or to '0'.
1316
+
1317
+ This option may occur in the following places:
1318
+
1319
+ * In the global server configuration.
1320
+ * In a virtual host configuration block.
1321
+
1322
+ In each place, it may be specified at most once. The default value is '600' (10 minutes).
1323
+
1324
+ === Rack-specific options ===
1325
+
1326
+ ==== RackAutoDetect <on|off> ====
1327
+ Whether Phusion Passenger should automatically detect whether a virtual host's
1328
+ document root is a Rack application. The default is 'on'.
1329
+
1330
+ This option may occur in the global server configuration or in a virtual host
1331
+ configuration block.
1332
+
1333
+ For example, consider the following configuration:
1334
+
1335
+ -----------------------------
1336
+ RackAutoDetect off
1337
+ <VirtualHost *:80>
1338
+ ServerName www.rackapp.com
1339
+ DocumentRoot /webapps/my_rack_app/public
1340
+ </VirtualHost>
1341
+ -----------------------------
1342
+
1343
+ If one goes to 'http://www.rackapp.com/', the visitor will see the contents of
1344
+ the '/webapps/my_rack_app/public' folder, instead of the output of the Rack
1345
+ application.
1346
+
1347
+ It is possible to explicitly specify that the host is a Rack
1348
+ application by using the <<RackBaseURI,RackBaseURI>> configuration option:
1349
+
1350
+ -----------------------------
1351
+ RackAutoDetect off
1352
+ <VirtualHost *:80>
1353
+ ServerName www.rackapp.com
1354
+ DocumentRoot /webapps/my_rack_app/public
1355
+ RackBaseURI / # This line was added
1356
+ </VirtualHost>
1357
+ -----------------------------
1358
+
1359
+ [[RackBaseURI]]
1360
+ ==== RackBaseURI <uri> ====
1361
+ Used to specify that the given URI is a Rack application. See
1362
+ <<deploying_rack_to_sub_uri,Deploying Rack to a sub URI>> for an example.
1363
+
1364
+ It is allowed to specify this option multiple times. Do this to deploy multiple
1365
+ Rack applications in different sub-URIs under the same virtual host.
1366
+
1367
+ This option may occur in the following places:
1368
+
1369
+ * In the global server configuration.
1370
+ * In a virtual host configuration block.
1371
+ * In a `<Directory>` or `<Location>` block.
1372
+ * In '.htaccess', if `AllowOverride Options` is on.
1373
+
1374
+ [[rack_env]]
1375
+ ==== RackEnv <string> ====
1376
+ The given value will be accessible in Rack applications in the `RACK_ENV`
1377
+ environment variable. This allows one to define the environment in which
1378
+ Rack applications are run, very similar to `RAILS_ENV`.
1379
+
1380
+ This option may occur in the following places:
1381
+
1382
+ * In the global server configuration.
1383
+ * In a virtual host configuration block.
1384
+ * In a `<Directory>` or `<Location>` block.
1385
+ * In '.htaccess', if `AllowOverride Options` is on.
1386
+
1387
+ In each place, it may be specified at most once. The default value is 'production'.
1388
+
1389
+ === Deprecated options ===
1390
+
1391
+ The following options have been deprecated, but are still supported for backwards
1392
+ compatibility reasons.
1393
+
1394
+ ==== RailsRuby ====
1395
+ Deprecated in favor of <<PassengerRuby,PassengerRuby>>.
1396
+
1397
+ ==== RailsUserSwitching ====
1398
+ Deprecated in favor of <<PassengerUserSwitching,PassengerUserSwitching>>.
1399
+
1400
+ ==== RailsDefaultUser ====
1401
+ Deprecated in favor of <<PassengerDefaultUser,PassengerDefaultUser>>.
1402
+
1403
+ ==== RailsAllowModRewrite ====
1404
+ This option doesn't do anything anymore in recent versions of Phusion Passenger.
1405
+
1406
+
1407
+ == Troubleshooting ==
1408
+
1409
+ === Operating system-specific problems ===
1410
+
1411
+ ==== MacOS X: The installer cannot locate MAMP's Apache ====
1412
+
1413
+ .Symptoms
1414
+ *******************************************************************************
1415
+ The installer finds Apache 2 development headers at `/Applications/MAMP/Library/bin/apxs`.
1416
+ However, Apache cannot be found. The installer also outputs the following error:
1417
+ ------------------------------------
1418
+ cannot open /Applications/MAMP/Library/build/config_vars.mk:
1419
+ No such file or directory at /Applications/MAMP/Library/bin/apxs line 218.
1420
+ ------------------------------------
1421
+ *******************************************************************************
1422
+
1423
+ Your MAMP installation seems to be broken. In particular, 'config_vars.mk' is missing.
1424
+ Please read link:http://forum.mamp.info/viewtopic.php?t=1866[this forum topic] to learn how
1425
+ to fix this problem.
1426
+
1427
+ See also link:http://code.google.com/p/phusion-passenger/issues/detail?id=12[this bug report].
1428
+
1429
+
1430
+ === Problems during installation ===
1431
+
1432
+ [[installing_ruby_dev]]
1433
+ ==== Ruby development headers aren't installed ====
1434
+
1435
+ .Symptoms
1436
+ *******************************************************************************
1437
+ Installing Phusion Passenger fails because of one of the following errors:
1438
+
1439
+ - The Phusion Passenger installer tells you that the Ruby development headers
1440
+ aren't installed.
1441
+ - The error message ``'no such file to load -- mkmf''' occurs.
1442
+ - The error message ``'ruby.h: No such file or directory''' occurs.
1443
+ *******************************************************************************
1444
+
1445
+ Phusion Passenger makes use of a native extension, so the Ruby development headers
1446
+ must be installed. On most Linux systems, Ruby and the Ruby development headers
1447
+ are contained in separate packages, so having Ruby installed does not
1448
+ automatically imply having the development headers installed.
1449
+
1450
+ Here's how you can install the development headers:
1451
+
1452
+ Ubuntu/Debian::
1453
+ Please type:
1454
+ +
1455
+ -----------------------------------------
1456
+ sudo apt-get install ruby1.8-dev
1457
+ -----------------------------------------
1458
+
1459
+ Fedora/CentOS/RHEL::
1460
+ Please type:
1461
+ +
1462
+ -----------------------------------------
1463
+ su -c 'yum install ruby-devel'
1464
+ -----------------------------------------
1465
+
1466
+ FreeBSD::
1467
+ Please install Ruby from 'ports' or with `pkg_add`. If that fails,
1468
+ please install Ruby from source.
1469
+
1470
+ MacOS X::
1471
+ Please install Ruby from source.
1472
+
1473
+ Other operating systems::
1474
+ Please consult your operating system's native package database.
1475
+ There should be a package containing the Ruby development headers.
1476
+ If that fails, please install Ruby from source.
1477
+
1478
+ NOTE: If you've installed a new Ruby version (i.e. your system now contains
1479
+ multiple Ruby installations), then you will need to tell Phusion Passenger
1480
+ which Ruby installation you want to use. Please read
1481
+ <<specifying_ruby_installation,Specifying the correct Ruby installation>>.
1482
+
1483
+ ==== Apache development headers aren't installed ====
1484
+
1485
+ .Symptoms
1486
+ *******************************************************************************
1487
+ Installing Phusion Passenger fails because of one of the following errors:
1488
+
1489
+ - The installer says that the Apache development headers aren't installed.
1490
+ - The error message ``'httpd.h: No such file or directory''' occurs.
1491
+ +
1492
+ (Instead of 'httpd.h', the message might also be 'http_config.h' or something
1493
+ else similar to 'http_*.h'.)
1494
+ *******************************************************************************
1495
+
1496
+ Ubuntu::
1497
+ Please type:
1498
+ +
1499
+ -----------------------------------------
1500
+ sudo apt-get install apache2-prefork-dev
1501
+ -----------------------------------------
1502
+
1503
+ Debian::
1504
+ Please type:
1505
+ +
1506
+ -----------------------------------------
1507
+ sudo apt-get install apache2-dev
1508
+ -----------------------------------------
1509
+
1510
+ Fedora/CentOS/RHEL::
1511
+ Please type:
1512
+ +
1513
+ --------------------------------
1514
+ su -c 'yum install httpd-devel'
1515
+ --------------------------------
1516
+
1517
+ FreeBSD::
1518
+ Please install Apache from 'ports' or with `pkg_add`. If that fails,
1519
+ please install Apache from source.
1520
+
1521
+ MacOS X::
1522
+ Please install Apache from source.
1523
+
1524
+ Other operating systems::
1525
+ Please consult your operating system's native package database.
1526
+ There should be a package containing the Apache development headers.
1527
+ If that fails, please install Apache from source.
1528
+
1529
+
1530
+ ==== APR development headers aren't installed ====
1531
+
1532
+ .Symptoms
1533
+ *******************************************************************************
1534
+ Installing Phusion Passenger fails because one of the following errors:
1535
+
1536
+ - The installer tells you that APR development headers aren't installed.
1537
+ - The error message ``'apr_pools.h: No such file or directory''' occurs.
1538
+ - The error message ``'apr_strings.h: No such file or directory''' occurs.
1539
+ *******************************************************************************
1540
+
1541
+ Ubuntu::
1542
+ Please type:
1543
+ +
1544
+ -----------------------------------------
1545
+ sudo apt-get install libapr1-dev
1546
+ -----------------------------------------
1547
+
1548
+ Debian::
1549
+ Please type:
1550
+ +
1551
+ -----------------------------------------
1552
+ sudo apt-get install libapr1-dev
1553
+ -----------------------------------------
1554
+
1555
+ Fedora/CentOS/RHEL::
1556
+ Please type:
1557
+ +
1558
+ --------------------------------
1559
+ su -c 'yum install apr-devel'
1560
+ --------------------------------
1561
+
1562
+ Other Linux distributions::
1563
+ Please consult your distribution's package database. There should be a
1564
+ package which provides APR development headers.
1565
+
1566
+ Other operating systems::
1567
+ The APR development are bundled with Apache. If the APR headers aren't,
1568
+ then it probably means that they have been removed after Apache's been
1569
+ installed. Please reinstall Apache to get back the APR headers.
1570
+
1571
+
1572
+ ==== Phusion Passenger is using the wrong Apache during installation ====
1573
+
1574
+ Please <<specifying_correct_apache_install,Specifying the correct Apache
1575
+ installation>>, and re-run the Phusion Passenger installer.
1576
+
1577
+
1578
+ ==== Phusion Passenger is using the wrong Ruby during installation ====
1579
+
1580
+ Please <<specifying_ruby_installation,Specifying the correct Ruby
1581
+ installation>>, and re-run the Phusion Passenger installer.
1582
+
1583
+
1584
+ === Problems after installation ===
1585
+
1586
+ [TIP]
1587
+ .The golden tip: read your Apache error logs!
1588
+ =====================================================
1589
+ 'mod_passenger' will write all errors to the Apache error log. So if
1590
+ you're experiencing post-installation problems, please look
1591
+ inside the Apache error logs. It will tell you what exactly went wrong.
1592
+ =====================================================
1593
+
1594
+ ==== My Rails application works on Mongrel, but not on Phusion Passenger ====
1595
+
1596
+ Please try setting <<RailsSpawnMethod,RailsSpawnMethod>> to 'conservative'.
1597
+
1598
+ ==== Phusion Passenger has been compiled against the wrong Apache installation ====
1599
+
1600
+ .Symptoms
1601
+ *******************************************************************************
1602
+ Apache crashes during startup (after being daemonized). The Apache error log
1603
+ says ``'seg fault or similar nasty error detected in the parent process'''.
1604
+ *******************************************************************************
1605
+
1606
+ This problem is most likely to occur on MacOS X. Most OS X users have multiple
1607
+ Apache installations on their system.
1608
+
1609
+ To solve this problem, please <<specifying_correct_apache_install,specify the
1610
+ correct Apache installation>>, and <<install_passenger,reinstall Phusion
1611
+ Passenger>>.
1612
+
1613
+ ==== I get a "304 Forbidden" error ====
1614
+
1615
+ See next subsection.
1616
+
1617
+ ==== Static assets such as images and stylesheets aren't being displayed ====
1618
+
1619
+ Static assets are accelerated, i.e. they are served directly by Apache and do not
1620
+ go through the Rails stack. There are two reasons why Apache doesn't serve static
1621
+ assets correctly:
1622
+
1623
+ 1. Your Apache configuration is too strict, and does not allow HTTP clients to
1624
+ access static assets. This can be achieved with an `Allow from all` directive
1625
+ in the correct place. For example:
1626
+ +
1627
+ -----------------------------------------
1628
+ <Directory "/webapps/mycook/public">
1629
+ Options FollowSymLinks
1630
+ AllowOverride None
1631
+ Order allow,deny
1632
+ Allow from all
1633
+ </Directory>
1634
+ -----------------------------------------
1635
+ +
1636
+ See also link:http://groups.google.com/group/phusion-passenger/browse_thread/thread/9699a639a87f85f4/b9d71a03bf2670a5[this discussion].
1637
+
1638
+ 2. The Apache process doesn't have permission to access your Rails application's folder.
1639
+ Please make sure that the Rails application's folder, as well as all of its parent folders,
1640
+ have the correct permissions and/or ownerships.
1641
+
1642
+ ==== The Apache error log says that the spawn manager script does not exist, or that it does not have permission to execute it ====
1643
+
1644
+ If you are sure that the 'PassengerRoot' configuration option is set correctly,
1645
+ then this problem is most likely caused by the fact that you're running Apache
1646
+ with SELinux. On Fedora, CentOS and RedHat Enterprise Linux, Apache is locked
1647
+ down by SELinux policies.
1648
+
1649
+ To solve this problem, you must set some permissions on the Phusion Passenger files
1650
+ and folders, so that Apache can access them.
1651
+
1652
+ - If you've installed Phusion Passenger via a gem, then run this command to determine
1653
+ Phusion Passenger's root folder:
1654
+ +
1655
+ ------------------------------------------------------------------
1656
+ passenger-config --root
1657
+ ------------------------------------------------------------------
1658
+ +
1659
+ Next, run the following command:
1660
+ +
1661
+ ------------------------------------------------------------------
1662
+ chcon -R -h -t httpd_sys_content_t /path-to-passenger-root
1663
+ ------------------------------------------------------------------
1664
+ +
1665
+ where '/path-to-passenger-root' should be replaced with whatever
1666
+ `passenger-config --root` printed.
1667
+
1668
+ - If you've installed Phusion Passenger via the source tarball, then run the following
1669
+ command:
1670
+ +
1671
+ ------------------------------------------------------------------
1672
+ chcon -R -h -t httpd_sys_content_t /path/to/passenger/folder
1673
+ ------------------------------------------------------------------
1674
+
1675
+ Once the permissions are fixed, restart Apache.
1676
+
1677
+ ==== The Rails application reports that it's unable to start because of a permission error ====
1678
+
1679
+ Please check whether your Rails application's folder has the correct
1680
+ permissions. By default, Rails applications are started as the owner of the
1681
+ file 'config/environment.rb', except if the file is owned by root. If the
1682
+ file is owned by root, then the Rails application will be started as 'nobody'
1683
+ (or as the user specify by <<RailsDefaultUser,RailsDefaultUser>>, if that's
1684
+ specified).
1685
+
1686
+ Please read <<user_switching,User switching (security)>> for details.
1687
+
1688
+ ==== My Rails application's log file is not being written to ====
1689
+
1690
+ There are a couple things that you should be aware of:
1691
+
1692
+ - By default, Phusion Passenger runs Rails applications in 'production' mode,
1693
+ so please be sure to check 'production.log' instead of 'development.log'. See
1694
+ <<RailsEnv,RailsEnv>> for configuration.
1695
+ - By default, Phusion Passenger runs Rails applications as the owner of 'environment.rb'.
1696
+ So the log file can only be written to if that user has write permission to the
1697
+ log file. Please 'chmod' or 'chown' your log file accordingly.
1698
+ +
1699
+ See <<User_switching,User switching (security)>> for details.
1700
+
1701
+ If you're using a RedHat-derived Linux distribution (such as Fedora or CentOS)
1702
+ then it is link:http://code.google.com/p/phusion-passenger/issues/detail?id=4[possible
1703
+ that SELinux is interfering]. RedHat's SELinux policy only allows Apache to read/write
1704
+ directories that have the 'httpd_sys_content_t' security context. Please run the
1705
+ following command to give your Rails application folder that context:
1706
+
1707
+ -----------------------------------------------------------
1708
+ chcon -R -h -t httpd_sys_content_t /path/to/your/rails/app
1709
+ -----------------------------------------------------------
1710
+
1711
+
1712
+ [[conflicting_apache_modules]]
1713
+ === Conflicting Apache modules ===
1714
+
1715
+ ==== mod_userdir ====
1716
+
1717
+ 'mod_userdir' is not compatible with Phusion Passenger at the moment.
1718
+
1719
+ ==== MultiViews (mod_negotiation) ====
1720
+
1721
+ MultiViews is not compatible with Phusion Passenger. You should disable MultiViews
1722
+ for all Phusion Passenger hosts.
1723
+
1724
+ ==== VirtualDocumentRoot ====
1725
+
1726
+ VirtualDocumentRoot is not compatible with Phusion Passenger at the moment.
1727
+
1728
+
1729
+ == Analysis and system maintenance tools ==
1730
+
1731
+ include::users_guide_snippets/analysis_and_system_maintenance_tools.txt[]
1732
+
1733
+
1734
+ == Tips ==
1735
+
1736
+ include::users_guide_snippets/tips.txt[]
1737
+
1738
+ === X-Sendfile support ===
1739
+
1740
+ Phusion Passenger does not provide X-Sendfile support by itself. Please install
1741
+ link:http://tn123.ath.cx/mod_xsendfile/[mod_xsendfile] for X-Sendfile support.
1742
+
1743
+ === Upload progress ===
1744
+
1745
+ Phusion Passenger does not provide upload progress support by itself. Please
1746
+ try drogus's link:http://github.com/drogus/apache-upload-progress-module/tree/master[
1747
+ Apache upload progress module] instead.
1748
+
1749
+
1750
+ == Under the hood ==
1751
+ Phusion Passenger hides a lot of complexity for the end user (i.e. the web server
1752
+ system administrator), but sometimes it is desirable to know what is going on.
1753
+ This section describes a few things that Phusion Passenger does under the hood.
1754
+
1755
+ === Static assets serving ===
1756
+ Phusion Passenger accelerates serving of static files. This means that, if an URI
1757
+ maps to a file that exists, then Phusion Passenger will let Apache serve that file
1758
+ directly, without hitting the web application.
1759
+
1760
+ Phusion Passenger does all this without the need for any mod_rewrite rules. People
1761
+ who are switching from an old Mongrel-based setup might have mod_rewrite rules such
1762
+ as these:
1763
+
1764
+ ------------------------------------------------------------
1765
+ # Check whether this request has a corresponding file; if that
1766
+ # exists, let Apache serve it, otherwise forward the request to
1767
+ # Mongrel.
1768
+ RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
1769
+ RewriteRule ^(.*)$ balancer://mongrel%{REQUEST_URI} [P,QSA,L]
1770
+ ------------------------------------------------------------
1771
+
1772
+ These kind of mod_rewrite rules are no longer required, and you can safely remove
1773
+ them.
1774
+
1775
+ === Page caching support ===
1776
+ For each HTTP request, Phusion Passenger will automatically look for a corresponding
1777
+ page cache file, and serve that if it exists. It does this by appending ".html" to
1778
+ the filename that the URI normally maps to, and checking whether that file exists.
1779
+ This check occurs after checking whether the original mapped filename exists (as part
1780
+ of static asset serving). All this is done without the need for special mod_rewrite
1781
+ rules.
1782
+
1783
+ For example, suppose that the browser requests '/foo/bar'.
1784
+
1785
+ 1. Phusion Passenger will first check whether this URI maps to a static file, i.e.
1786
+ whether the file 'foo/bar' exists in the web application's 'public' directory.
1787
+ If it does then Phusion Passenger will serve this file through Apache immediately.
1788
+ 2. If that doesn't exist, then Phusion Passenger will check whether the file
1789
+ 'foo/bar.html' exists. If it does then Phusion Passenger will serve this file
1790
+ through Apache immediately.
1791
+ 3. If 'foo/bar.html' doesn't exist either, then Phusion Passenger will forward the
1792
+ request to the underlying web application.
1793
+
1794
+ Note that Phusion Passenger's page caching support doesn't work if your web
1795
+ application uses a non-standard page cache directory, i.e. if it doesn't cache to
1796
+ the 'public' directory. In that case you'll need to use mod_rewrite to serve such
1797
+ page cache files.
1798
+
1799
+ [[application_detection]]
1800
+ === How Phusion Passenger detects whether a virtual host is a web application ===
1801
+ After you've read the deployment instructions you might wonder how Phusion Passenger
1802
+ knows that the DocumentRoot points to a web application that Phusion Passenger is
1803
+ able to serve, and how it knows what kind of web application it is (e.g. Rails or Rack).
1804
+
1805
+ Phusion Passenger checks whether the virtual host is a Rails application by checking
1806
+ whether the following file exists:
1807
+
1808
+ ------------------------------------------------
1809
+ dirname(DocumentRoot) + "/config/environment.rb"
1810
+ ------------------------------------------------
1811
+
1812
+ If you're not a programmer and don't understand the above pseudo-code snippet, it means
1813
+ that Phusion Passenger will:
1814
+
1815
+ 1. Extract the parent directory filename from the value of the DocumentRoot directory.
1816
+ 2. Append the text "/config/environment.rb" to the result, and check whether the resulting
1817
+ filename exists.
1818
+
1819
+ So suppose that your document root is '/webapps/foo/public'. Phusion Passenger will check
1820
+ whether the file '/webapps/foo/config/environment.rb' exists.
1821
+
1822
+ Note that Phusion Passenger does *not* resolve any symlinks in the document root path by
1823
+ default since version 2.2.0 -- in contrast to versions earlier than 2.2.0, which do resolve
1824
+ symlinks.
1825
+ So for example, suppose that your DocumentRoot points to '/home/www/example.com', which in
1826
+ turn is a symlink to '/webapps/example.com/public'. In versions earlier than 2.2.0, Phusion
1827
+ Passenger will check whether '/webapps/example.com/config/environment.rb' exists because it
1828
+ resolves all symlinks. Phusion Passenger 2.2.0 and later however will check for
1829
+ '/home/www/config/environment.rb'. This file of course doesn't exist, and as a result Phusion
1830
+ Passenger will not activate itself for this virtual host, and you'll most likely see an Apache
1831
+ mod_dirindex directory listing.
1832
+
1833
+ If you need the old symlink-resolving behavior for whatever reason, then you can turn on
1834
+ <<PassengerResolveSymlinksInDocumentRoot,PassengerResolveSymlinksInDocumentRoot>>.
1835
+
1836
+ Another way to solve this situation is to explicitly tell Phusion Passenger what the
1837
+ correct application root is through the <<PassengerAppRoot,PassengerAppRoot>> configuration
1838
+ directive.
1839
+
1840
+ Autodetection of Rack applications happens through the same mechanism, exception that
1841
+ Phusion Passenger will look for 'config.ru' instead of 'config/environment.rb'.
1842
+
1843
+
1844
+ include::users_guide_snippets/appendix_a_about.txt[]
1845
+
1846
+ include::users_guide_snippets/appendix_b_terminology.txt[]
1847
+
1848
+ include::users_guide_snippets/appendix_c_spawning_methods.txt[]