passenger 4.0.23 → 4.0.24

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (54) hide show
  1. data.tar.gz.asc +7 -7
  2. data/NEWS +17 -0
  3. data/bin/passenger-config +3 -0
  4. data/bin/passenger-install-apache2-module +1 -1
  5. data/bin/passenger-install-nginx-module +1 -1
  6. data/build/integration_tests.rb +5 -3
  7. data/debian.template/control.template +6 -4
  8. data/doc/Users guide Apache.idmap.txt +9 -5
  9. data/doc/Users guide Apache.txt +38 -3
  10. data/doc/Users guide Nginx.idmap.txt +58 -54
  11. data/doc/Users guide Nginx.txt +126 -63
  12. data/doc/Users guide Standalone.idmap.txt +19 -15
  13. data/doc/Users guide Standalone.txt +92 -0
  14. data/doc/users_guide_snippets/environment_variables.txt +11 -0
  15. data/doc/users_guide_snippets/installation.txt +8 -8
  16. data/doc/users_guide_snippets/troubleshooting/default.txt +12 -4
  17. data/ext/apache2/Configuration.cpp +0 -10
  18. data/ext/apache2/Configuration.hpp +0 -3
  19. data/ext/apache2/ConfigurationCommands.cpp +18 -0
  20. data/ext/apache2/ConfigurationFields.hpp +12 -6
  21. data/ext/apache2/ConfigurationFields.hpp.erb +10 -5
  22. data/ext/apache2/ConfigurationSetters.cpp +27 -0
  23. data/ext/apache2/CreateDirConfig.cpp +3 -0
  24. data/ext/apache2/Hooks.cpp +15 -74
  25. data/ext/apache2/MergeDirConfig.cpp +21 -0
  26. data/ext/apache2/SetHeaders.cpp +8 -0
  27. data/ext/common/ApplicationPool2/Group.h +1 -1
  28. data/ext/common/ApplicationPool2/Implementation.cpp +22 -5
  29. data/ext/common/ApplicationPool2/Options.h +10 -1
  30. data/ext/common/ApplicationPool2/Pool.h +4 -0
  31. data/ext/common/Constants.h +4 -2
  32. data/ext/common/agents/HelperAgent/RequestHandler.h +1 -0
  33. data/ext/nginx/CacheLocationConfig.c +20 -0
  34. data/ext/nginx/ConfigurationCommands.c +10 -0
  35. data/ext/nginx/ConfigurationFields.h +2 -0
  36. data/ext/nginx/CreateLocationConfig.c +5 -0
  37. data/ext/nginx/MergeLocationConfig.c +6 -0
  38. data/ext/nginx/config +14 -14
  39. data/lib/phusion_passenger.rb +1 -1
  40. data/lib/phusion_passenger/apache2/config_options.rb +23 -0
  41. data/lib/phusion_passenger/constants.rb +3 -1
  42. data/lib/phusion_passenger/nginx/config_options.rb +4 -0
  43. data/lib/phusion_passenger/platform_info/operating_system.rb +2 -0
  44. data/lib/phusion_passenger/platform_info/ruby.rb +24 -0
  45. data/lib/phusion_passenger/standalone/app_finder.rb +65 -25
  46. data/lib/phusion_passenger/standalone/command.rb +1 -1
  47. data/lib/phusion_passenger/standalone/start_command.rb +6 -5
  48. data/resources/templates/installer_common/run_installer_as_root.txt.erb +4 -1
  49. data/resources/templates/standalone/config.erb +1 -1
  50. data/test/cxx/ApplicationPool2/PoolTest.cpp +18 -0
  51. metadata +13 -5
  52. metadata.gz.asc +7 -7
  53. checksums.yaml +0 -15
  54. checksums.yaml.gz.asc +0 -12
@@ -680,83 +680,25 @@ private:
680
680
  }
681
681
  apr_table_setn(r->headers_out, "Status", r->status_line);
682
682
 
683
- //bool xsendfile = hasModXsendfile() &&
684
- // apr_table_get(r->err_headers_out, "X-Sendfile");
685
-
686
683
  UPDATE_TRACE_POINT();
687
- ap_pass_brigade(r->output_filters, bb);
688
-
689
- /*
690
- if (r->connection->aborted) {
691
- P_WARN("Either the visitor clicked on the 'Stop' button in the "
692
- "web browser, or the visitor's connection has stalled "
693
- "and couldn't receive the data that Apache is sending "
694
- "to it. As a result, you will probably see a 'Broken Pipe' "
695
- "error in this log file. Please ignore it, "
696
- "this is normal. You might also want to increase Apache's "
697
- "TimeOut configuration option if you experience this "
698
- "problem often.");
699
- } else if (!bucketState->completed && !xsendfile) {
700
- // mod_xsendfile drops the entire output bucket so
701
- // suppress this message when mod_xsendfile is active.
702
- P_WARN("Apache stopped forwarding the backend's response, "
703
- "even though the HTTP client did not close the "
704
- "connection. Is this an Apache bug?");
684
+ if (config->errorOverride == DirConfig::ENABLED
685
+ && ap_is_HTTP_ERROR(r->status))
686
+ {
687
+ /* Send ErrorDocument.
688
+ * Clear r->status for override error, otherwise ErrorDocument
689
+ * thinks that this is a recursive error, and doesn't find the
690
+ * custom error page.
691
+ */
692
+ int originalStatus = r->status;
693
+ r->status = HTTP_OK;
694
+ return originalStatus;
695
+ } if (ap_pass_brigade(r->output_filters, bb) == APR_SUCCESS) {
696
+ apr_brigade_cleanup(bb);
705
697
  }
706
- */
707
-
708
698
  return OK;
709
- } else if (backendData[0] == '\0') {
710
- /* if ((long long) timer.elapsed() >= r->server->timeout / 1000) {
711
- // Looks like an I/O timeout.
712
- P_ERROR("No data received from " <<
713
- "the backend application (process " <<
714
- backendPid << ") within " <<
715
- (r->server->timeout / 1000) << " msec. Either " <<
716
- "the backend application is frozen, or " <<
717
- "your TimeOut value of " <<
718
- (r->server->timeout / 1000000) <<
719
- " seconds is too low. Please check " <<
720
- "whether your application is frozen, or " <<
721
- "increase the value of the TimeOut " <<
722
- "configuration directive.");
723
- } else {
724
- P_ERROR("The backend application (process " <<
725
- backendPid << ") did not send a valid " <<
726
- "HTTP response; instead, it sent nothing " <<
727
- "at all. It is possible that it has crashed; " <<
728
- "please check whether there are crashing " <<
729
- "bugs in this application.");
730
- } */
731
- apr_table_setn(r->err_headers_out, "Status", "500 Internal Server Error");
732
- return HTTP_INTERNAL_SERVER_ERROR;
733
699
  } else {
734
- /* if ((long long) timer.elapsed() >= r->server->timeout / 1000) {
735
- // Looks like an I/O timeout.
736
- P_ERROR("The backend application (process " <<
737
- backendPid << ") hasn't sent a valid " <<
738
- "HTTP response within " <<
739
- (r->server->timeout / 1000) << " msec. Either " <<
740
- "the backend application froze while " <<
741
- "sending a response, or " <<
742
- "your TimeOut value of " <<
743
- (r->server->timeout / 1000000) <<
744
- " seconds is too low. Please check " <<
745
- "whether the application is frozen, or " <<
746
- "increase the value of the TimeOut " <<
747
- "configuration directive. The application " <<
748
- "has sent this data so far: [" <<
749
- backendData << "]");
750
- } else {
751
- P_ERROR("The backend application (process " <<
752
- backendPid << ") didn't send a valid " <<
753
- "HTTP response. It might have crashed " <<
754
- "during the middle of sending an HTTP " <<
755
- "response, so please check whether there " <<
756
- "are crashing problems in your application. " <<
757
- "This is the data that it sent: [" <<
758
- backendData << "]");
759
- } */
700
+ // HelperAgent sent an empty response, or an invalid response.
701
+ apr_brigade_cleanup(bb);
760
702
  apr_table_setn(r->err_headers_out, "Status", "500 Internal Server Error");
761
703
  return HTTP_INTERNAL_SERVER_ERROR;
762
704
  }
@@ -1005,7 +947,6 @@ private:
1005
947
  addHeader(output, "PASSENGER_APP_ROOT", mapper.getAppRoot());
1006
948
  addHeader(output, "PASSENGER_APP_GROUP_NAME", config->getAppGroupName(mapper.getAppRoot()));
1007
949
  #include "SetHeaders.cpp"
1008
- addHeader(output, "PASSENGER_PYTHON", config->python);
1009
950
  addHeader(output, "PASSENGER_ENV", config->getEnvironment());
1010
951
  addHeader(output, "PASSENGER_SPAWN_METHOD", config->getSpawnMethodString());
1011
952
  addHeader(r, output, "PASSENGER_MAX_REQUEST_QUEUE_SIZE", config->maxRequestQueueSize);
@@ -47,6 +47,20 @@
47
47
 
48
48
 
49
49
 
50
+ config->python =
51
+ (add->python == NULL) ?
52
+ base->python :
53
+ add->python;
54
+
55
+
56
+
57
+ config->nodejs =
58
+ (add->nodejs == NULL) ?
59
+ base->nodejs :
60
+ add->nodejs;
61
+
62
+
63
+
50
64
  config->minInstances =
51
65
  (add->minInstances == UNSET_INT_VALUE) ?
52
66
  base->minInstances :
@@ -68,6 +82,13 @@
68
82
 
69
83
 
70
84
 
85
+ config->errorOverride =
86
+ (add->errorOverride == DirConfig::UNSET) ?
87
+ base->errorOverride :
88
+ add->errorOverride;
89
+
90
+
91
+
71
92
  config->maxRequests =
72
93
  (add->maxRequests == UNSET_INT_VALUE) ?
73
94
  base->maxRequests :
@@ -44,6 +44,14 @@
44
44
 
45
45
 
46
46
 
47
+ addHeader(output, "PASSENGER_PYTHON", config->python);
48
+
49
+
50
+
51
+ addHeader(output, "PASSENGER_NODEJS", config->nodejs);
52
+
53
+
54
+
47
55
  addHeader(r, output, "PASSENGER_MIN_INSTANCES", config->minInstances);
48
56
 
49
57
 
@@ -186,7 +186,7 @@ private:
186
186
  void spawnThreadRealMain(const SpawnerPtr &spawner, const Options &options,
187
187
  unsigned int restartsInitiated);
188
188
  void finalizeRestart(GroupPtr self, Options options, SpawnerFactoryPtr spawnerFactory,
189
- vector<Callback> postLockActions);
189
+ unsigned int restartsInitiated, vector<Callback> postLockActions);
190
190
  void startCheckingDetachedProcesses(bool immediately);
191
191
  void detachedProcessesCheckerMain(GroupPtr self);
192
192
  void wakeUpGarbageCollector();
@@ -907,17 +907,19 @@ Group::restart(const Options &options) {
907
907
  vector<Callback> actions;
908
908
 
909
909
  assert(isAlive());
910
- assert(!m_restarting);
911
910
  P_DEBUG("Restarting group " << name);
912
- // Tell the restarter thread to exit as soon as possible.
911
+
912
+ // If there is currently a restarter thread or a spawner thread active,
913
+ // the following tells them to abort their current work as soon as possible.
913
914
  restartsInitiated++;
915
+
914
916
  m_spawning = false;
915
917
  m_restarting = true;
916
918
  detachAll(actions);
917
919
  getPool()->interruptableThreads.create_thread(
918
920
  boost::bind(&Group::finalizeRestart, this, shared_from_this(),
919
921
  options.copyAndPersist().clearPerRequestFields(),
920
- getPool()->spawnerFactory, actions),
922
+ getPool()->spawnerFactory, restartsInitiated, actions),
921
923
  "Group restarter: " + name,
922
924
  POOL_HELPER_THREAD_STACK_SIZE
923
925
  );
@@ -926,7 +928,7 @@ Group::restart(const Options &options) {
926
928
  // The 'self' parameter is for keeping the current Group object alive while this thread is running.
927
929
  void
928
930
  Group::finalizeRestart(GroupPtr self, Options options, SpawnerFactoryPtr spawnerFactory,
929
- vector<Callback> postLockActions)
931
+ unsigned int restartsInitiated, vector<Callback> postLockActions)
930
932
  {
931
933
  TRACE_POINT();
932
934
 
@@ -957,6 +959,15 @@ Group::finalizeRestart(GroupPtr self, Options options, SpawnerFactoryPtr spawner
957
959
  P_DEBUG("Group " << name << " is shutting down, so aborting restart");
958
960
  return;
959
961
  }
962
+ if (restartsInitiated != this->restartsInitiated) {
963
+ // Before this restart could be finalized, another restart command was given.
964
+ // The spawner we just created might be out of date now so we abort.
965
+ P_DEBUG("Restart of group " << name << " aborted because a new restart was initiated concurrently");
966
+ if (debug != NULL && debug->restarting) {
967
+ debug->debugger->send("Restarting aborted");
968
+ }
969
+ return;
970
+ }
960
971
 
961
972
  // Run some sanity checks.
962
973
  pool->fullVerifyInvariants();
@@ -1006,8 +1017,14 @@ void
1006
1017
  Group::detachedProcessesCheckerMain(GroupPtr self) {
1007
1018
  TRACE_POINT();
1008
1019
  PoolPtr pool = getPool();
1009
- boost::unique_lock<boost::mutex> lock(pool->syncher);
1010
1020
 
1021
+ Pool::DebugSupportPtr debug = pool->debugSupport;
1022
+ if (debug != NULL && debug->detachedProcessesChecker) {
1023
+ debug->debugger->send("About to start detached processes checker");
1024
+ debug->messages->recv("Proceed with starting detached processes checker");
1025
+ }
1026
+
1027
+ boost::unique_lock<boost::mutex> lock(pool->syncher);
1011
1028
  while (true) {
1012
1029
  assert(detachedProcessesCheckerActive);
1013
1030
 
@@ -101,6 +101,7 @@ private:
101
101
 
102
102
  result.push_back(&ruby);
103
103
  result.push_back(&python);
104
+ result.push_back(&nodejs);
104
105
  result.push_back(&loggingAgentAddress);
105
106
  result.push_back(&loggingAgentUsername);
106
107
  result.push_back(&loggingAgentPassword);
@@ -245,6 +246,12 @@ public:
245
246
  * is a Python app.
246
247
  */
247
248
  StaticString python;
249
+
250
+ /**
251
+ * Path to the Node.js command to use, in case the application to spawn
252
+ * is a Node.js app.
253
+ */
254
+ StaticString nodejs;
248
255
 
249
256
  /**
250
257
  * Any rights that the spawned application process may have. The SpawnManager
@@ -386,6 +393,7 @@ public:
386
393
  defaultUser = "nobody";
387
394
  ruby = DEFAULT_RUBY;
388
395
  python = DEFAULT_PYTHON;
396
+ nodejs = DEFAULT_NODEJS;
389
397
  rights = DEFAULT_BACKEND_ACCOUNT_RIGHTS;
390
398
  debugger = false;
391
399
  loadShellEnvvars = true;
@@ -532,6 +540,7 @@ public:
532
540
  appendKeyValue (vec, "postexec_chroot", postexecChroot);
533
541
  appendKeyValue (vec, "ruby", ruby);
534
542
  appendKeyValue (vec, "python", python);
543
+ appendKeyValue (vec, "nodejs", nodejs);
535
544
  appendKeyValue (vec, "logging_agent_address", loggingAgentAddress);
536
545
  appendKeyValue (vec, "logging_agent_username", loggingAgentUsername);
537
546
  appendKeyValue (vec, "logging_agent_password", loggingAgentPassword);
@@ -585,7 +594,7 @@ public:
585
594
  } else if (appType == "wsgi") {
586
595
  return python + "\t" + resourceLocator.getHelperScriptsDir() + "/wsgi-loader.py";
587
596
  } else if (appType == "node") {
588
- return "node\t" + resourceLocator.getHelperScriptsDir() + "/node-loader.js";
597
+ return nodejs + "\t" + resourceLocator.getHelperScriptsDir() + "/node-loader.js";
589
598
  } else if (appType == "meteor") {
590
599
  return ruby + "\t" + resourceLocator.getHelperScriptsDir() + "/meteor-loader.rb";
591
600
  } else {
@@ -92,7 +92,9 @@ public:
92
92
  typedef UnionStation::LoggerPtr LoggerPtr;
93
93
 
94
94
  struct DebugSupport {
95
+ /** Mailbox for the unit tests to receive messages on. */
95
96
  MessageBoxPtr debugger;
97
+ /** Mailbox for the ApplicationPool code to receive messages on. */
96
98
  MessageBoxPtr messages;
97
99
 
98
100
  // Choose aspects to debug.
@@ -101,6 +103,7 @@ public:
101
103
  bool superGroup;
102
104
  bool oobw;
103
105
  bool testOverflowRequestQueue;
106
+ bool detachedProcessesChecker;
104
107
 
105
108
  // The following fields may only be accessed by Pool.
106
109
  boost::mutex syncher;
@@ -113,6 +116,7 @@ public:
113
116
  spawning = true;
114
117
  superGroup = false;
115
118
  oobw = false;
119
+ detachedProcessesChecker = false;
116
120
  testOverflowRequestQueue = false;
117
121
  spawnLoopIteration = 0;
118
122
  }
@@ -52,6 +52,8 @@
52
52
 
53
53
  #define DEFAULT_MAX_POOL_SIZE 6
54
54
 
55
+ #define DEFAULT_NODEJS "node"
56
+
55
57
  #define DEFAULT_POOL_IDLE_TIME 300
56
58
 
57
59
  #define DEFAULT_PYTHON "python"
@@ -78,7 +80,7 @@
78
80
 
79
81
  #define NGINX_DOC_URL "http://www.modrails.com/documentation/Users%20guide%20Nginx.html"
80
82
 
81
- #define PASSENGER_VERSION "4.0.23"
83
+ #define PASSENGER_VERSION "4.0.24"
82
84
 
83
85
  #define POOL_HELPER_THREAD_STACK_SIZE 262144
84
86
 
@@ -98,7 +100,7 @@
98
100
 
99
101
  #define STANDALONE_DOC_URL "http://www.modrails.com/documentation/Users%20guide%20Standalone.html"
100
102
 
101
- #define STANDALONE_NGINX_CONFIGURE_OPTIONS "--with-cc-opt='-Wno-error' --without-http_fastcgi_module --without-http_scgi_module --without-http_uwsgi_module --with-http_gzip_static_module --with-http_stub_status_module"
103
+ #define STANDALONE_NGINX_CONFIGURE_OPTIONS "--with-cc-opt='-Wno-error' --without-http_fastcgi_module --without-http_scgi_module --without-http_uwsgi_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module"
102
104
 
103
105
  #define SUPPORT_URL "http://www.phusionpassenger.com/support"
104
106
 
@@ -1718,6 +1718,7 @@ private:
1718
1718
  fillPoolOption(client, options.environment, "PASSENGER_ENV");
1719
1719
  fillPoolOption(client, options.ruby, "PASSENGER_RUBY");
1720
1720
  fillPoolOption(client, options.python, "PASSENGER_PYTHON");
1721
+ fillPoolOption(client, options.nodejs, "PASSENGER_NODEJS");
1721
1722
  fillPoolOption(client, options.user, "PASSENGER_USER");
1722
1723
  fillPoolOption(client, options.group, "PASSENGER_GROUP");
1723
1724
  fillPoolOption(client, options.minProcesses, "PASSENGER_MIN_INSTANCES");
@@ -58,6 +58,13 @@ u_char int_buf[32], *end, *buf, *pos;
58
58
 
59
59
 
60
60
 
61
+ if (conf->nodejs.data != NULL) {
62
+ len += 17;
63
+ len += conf->nodejs.len + 1;
64
+ }
65
+
66
+
67
+
61
68
  if (conf->environment.data != NULL) {
62
69
  len += 14;
63
70
  len += conf->environment.len + 1;
@@ -246,6 +253,19 @@ buf = pos = ngx_pnalloc(cf->pool, len);
246
253
 
247
254
 
248
255
 
256
+ if (conf->nodejs.data != NULL) {
257
+ pos = ngx_copy(pos,
258
+ "PASSENGER_NODEJS",
259
+ 17);
260
+ pos = ngx_copy(pos,
261
+ conf->nodejs.data,
262
+ conf->nodejs.len);
263
+ *pos = '\0';
264
+ pos++;
265
+ }
266
+
267
+
268
+
249
269
  if (conf->environment.data != NULL) {
250
270
  pos = ngx_copy(pos,
251
271
  "PASSENGER_ENV",
@@ -69,6 +69,16 @@
69
69
  NULL
70
70
  },
71
71
 
72
+ {
73
+
74
+ ngx_string("passenger_nodejs"),
75
+ NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LIF_CONF | NGX_CONF_TAKE1,
76
+ ngx_conf_set_str_slot,
77
+ NGX_HTTP_LOC_CONF_OFFSET,
78
+ offsetof(passenger_loc_conf_t, nodejs),
79
+ NULL
80
+ },
81
+
72
82
  {
73
83
 
74
84
  ngx_string("passenger_app_env"),
@@ -79,6 +79,8 @@
79
79
 
80
80
  ngx_str_t group;
81
81
 
82
+ ngx_str_t nodejs;
83
+
82
84
  ngx_str_t python;
83
85
 
84
86
  ngx_str_t ruby;
@@ -54,6 +54,11 @@
54
54
 
55
55
 
56
56
 
57
+ conf->nodejs.data = NULL;
58
+ conf->nodejs.len = 0;
59
+
60
+
61
+
57
62
  conf->environment.data = NULL;
58
63
  conf->environment.len = 0;
59
64
 
@@ -58,6 +58,12 @@
58
58
 
59
59
 
60
60
 
61
+ ngx_conf_merge_str_value(conf->nodejs,
62
+ prev->nodejs,
63
+ NULL);
64
+
65
+
66
+
61
67
  ngx_conf_merge_str_value(conf->environment,
62
68
  prev->environment,
63
69
  NULL);
@@ -3,6 +3,8 @@ export PATH
3
3
 
4
4
  if ! ruby -v >/dev/null 2>/dev/null; then
5
5
  echo '*** ERROR: Cannot find the "ruby" command in $PATH. Please fix your $PATH. You can learn more about $PATH at: http://www.modrails.com/documentation/Users%20guide%20Nginx.html#_the_path_environment_variable'
6
+ echo '*** Do you think that you set $PATH correctly, and you happen to be using sudo or rvmsudo? Read this: http://www.modrails.com/documentation/Users%20guide%20Nginx.html#env_vars_and_sudo'
7
+ exit 1
6
8
  fi
7
9
 
8
10
  if test "x$PASSENGER_LIBS" = "x" && ! passenger-config --compiled; then
@@ -25,6 +27,13 @@ if test "x$PASSENGER_LIBS" = "x" && ! passenger-config --compiled; then
25
27
  echo "*** Phusion Passenger support files have been successfully compiled. ***"
26
28
  fi
27
29
 
30
+ if test "x$PASSENGER_INCLUDEDIR" = "x"; then
31
+ PASSENGER_INCLUDEDIR=`passenger-config --includedir`
32
+ fi
33
+ if test "x$PASSENGER_LIBS" = "x"; then
34
+ PASSENGER_LIBS=`passenger-config --nginx-libs`
35
+ fi
36
+
28
37
  ngx_addon_name=ngx_http_passenger_module
29
38
  HTTP_MODULES="$HTTP_MODULES ngx_http_passenger_module"
30
39
  NGX_ADDON_SRCS="$NGX_ADDON_SRCS \
@@ -41,20 +50,11 @@ NGX_ADDON_DEPS="$NGX_ADDON_DEPS \
41
50
  ${ngx_addon_dir}/ContentHandler.h \
42
51
  ${ngx_addon_dir}/StaticContentHandler.h \
43
52
  ${ngx_addon_dir}/ngx_http_passenger_module.h \
44
- `passenger-config --includedir`/common/Constants.h \
45
- `passenger-config --includedir`/common/AgentsStarter.h \
46
- `passenger-config --includedir`/common/ApplicationPool2/AppTypes.h"
47
- if test "x$PASSENGER_INCLUDEDIR" = "x"; then
48
- CORE_INCS="$CORE_INCS `passenger-config --includedir`"
49
- else
50
- CORE_INCS="$CORE_INCS $PASSENGER_INCLUDEDIR"
51
- fi
52
- if test "x$PASSENGER_LIBS" = "x"; then
53
- CORE_LIBS="$CORE_LIBS `passenger-config --nginx-libs`"
54
- else
55
- CORE_LIBS="$CORE_LIBS $PASSENGER_LIBS"
56
- fi
57
- CORE_LIBS="$CORE_LIBS -lstdc++ -lpthread"
53
+ ${PASSENGER_INCLUDEDIR}/common/Constants.h \
54
+ ${PASSENGER_INCLUDEDIR}/common/AgentsStarter.h \
55
+ ${PASSENGER_INCLUDEDIR}/common/ApplicationPool2/AppTypes.h"
56
+ CORE_INCS="$CORE_INCS $PASSENGER_INCLUDEDIR"
57
+ CORE_LIBS="$CORE_LIBS $PASSENGER_LIBS -lstdc++ -lpthread"
58
58
 
59
59
  ngx_feature="Math library"
60
60
  ngx_feature_name=