• Main Page
  • Modules
  • Classes
  • Files
  • File List

Configuration.h

00001 /*
00002  *  Phusion Passenger - http://www.modrails.com/
00003  *  Copyright (c) 2008, 2009 Phusion
00004  *
00005  *  "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
00006  *
00007  *  Permission is hereby granted, free of charge, to any person obtaining a copy
00008  *  of this software and associated documentation files (the "Software"), to deal
00009  *  in the Software without restriction, including without limitation the rights
00010  *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00011  *  copies of the Software, and to permit persons to whom the Software is
00012  *  furnished to do so, subject to the following conditions:
00013  *
00014  *  The above copyright notice and this permission notice shall be included in
00015  *  all copies or substantial portions of the Software.
00016  *
00017  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00018  *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00019  *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00020  *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00021  *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00022  *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00023  *  THE SOFTWARE.
00024  */
00025 #ifndef _PASSENGER_CONFIGURATION_H_
00026 #define _PASSENGER_CONFIGURATION_H_
00027 
00028 #ifdef __cplusplus
00029         #include "Utils.h"
00030         #include "MessageChannel.h"
00031         #include "Logging.h"
00032 #endif
00033 
00034 /* The APR headers must come after the Passenger headers. See Hooks.cpp
00035  * to learn why.
00036  *
00037  * MessageChannel.h must be included -- even though we don't actually use
00038  * MessageChannel.h in here, it's necessary to make sure that apr_want.h
00039  * doesn't b0rk on 'struct iovec'.
00040  */
00041 #include <apr_pools.h>
00042 #include <httpd.h>
00043 #include <http_config.h>
00044 
00045 /**
00046  * @defgroup Configuration Apache module configuration
00047  * @ingroup Core
00048  * @{
00049  */
00050 
00051 #ifdef __cplusplus
00052         #include <set>
00053         #include <string>
00054 
00055         namespace Passenger {
00056         
00057                 using namespace std;
00058                 
00059                 /**
00060                  * Per-directory configuration information.
00061                  *
00062                  * Use the getter methods to query information, because those will return
00063                  * the default value if the value is not specified.
00064                  */
00065                 struct DirConfig {
00066                         enum Threeway { ENABLED, DISABLED, UNSET };
00067                         enum SpawnMethod { SM_UNSET, SM_SMART, SM_SMART_LV2, SM_CONSERVATIVE };
00068                         
00069                         Threeway enabled;
00070                         
00071                         std::set<std::string> railsBaseURIs;
00072                         std::set<std::string> rackBaseURIs;
00073                         
00074                         /** Whether to autodetect Rails applications. */
00075                         Threeway autoDetectRails;
00076                         
00077                         /** Whether to autodetect Rack applications. */
00078                         Threeway autoDetectRack;
00079                         
00080                         /** Whether to autodetect WSGI applications. */
00081                         Threeway autoDetectWSGI;
00082                         
00083                         /** Whether mod_rewrite should be allowed for Rails applications. */
00084                         Threeway allowModRewrite;
00085                         
00086                         /** The environment (i.e. value for RAILS_ENV) under which
00087                          * Rails applications should operate. */
00088                         const char *railsEnv;
00089                         
00090                         /** The path to the application's root (for example: RAILS_ROOT
00091                          * for Rails applications, directory containing 'config.ru'
00092                          * for Rack applications). If this value is NULL, the default
00093                          * autodetected path will be used.
00094                          */
00095                         const char *appRoot;
00096                         
00097                         /** The environment (i.e. value for RACK_ENV) under which
00098                          * Rack applications should operate. */
00099                         const char *rackEnv;
00100                         
00101                         /** The Rails spawn method to use. */
00102                         SpawnMethod spawnMethod;
00103                         
00104                         /**
00105                          * The idle timeout, in seconds, of Rails framework spawners.
00106                          * May also be 0 (which indicates that the framework spawner should
00107                          * never idle timeout) or -1 (which means that the value is not specified).
00108                          */
00109                         long frameworkSpawnerTimeout;
00110                         
00111                         /**
00112                          * The idle timeout, in seconds, of Rails application spawners.
00113                          * May also be 0 (which indicates that the application spawner should
00114                          * never idle timeout) or -1 (which means that the value is not specified).
00115                          */
00116                         long appSpawnerTimeout;
00117                         
00118                         /**
00119                          * The maximum number of requests that the spawned application may process
00120                          * before exiting. A value of 0 means unlimited.
00121                          */
00122                         unsigned long maxRequests;
00123                         
00124                         /** Indicates whether the maxRequests option was explicitly specified
00125                          * in the directory configuration. */
00126                         bool maxRequestsSpecified;
00127                         
00128                         /**
00129                          * The maximum amount of memory (in MB) the spawned application may use.
00130                          * A value of 0 means unlimited.
00131                          */
00132                         unsigned long memoryLimit;
00133                         
00134                         /** Indicates whether the memoryLimit option was explicitly specified
00135                          * in the directory configuration. */
00136                         bool memoryLimitSpecified;
00137                         
00138                         /** Whether symlinks in the document root path should be resolved.
00139                          * The implication of this is documented in the users guide, section
00140                          * "How Phusion Passenger detects whether a virtual host is a web application".
00141                          */
00142                         Threeway resolveSymlinksInDocRoot;
00143                         
00144                         /** Whether high performance mode should be turned on. */
00145                         Threeway highPerformance;
00146                         
00147                         /** Whether global queuing should be used. */
00148                         Threeway useGlobalQueue;
00149                         
00150                         /**
00151                          * Whether encoded slashes in URLs should be supported. This however conflicts
00152                          * with mod_rewrite support because of a bug/limitation in Apache, so it's one
00153                          * or the other.
00154                          */
00155                         Threeway allowEncodedSlashes;
00156                         
00157                         /**
00158                          * Throttle the number of stat() calls on files like
00159                          * restart.txt to the once per given number of seconds.
00160                          */
00161                         unsigned long statThrottleRate;
00162                         
00163                         /** Indicates whether the statThrottleRate option was
00164                          * explicitly specified in the directory configuration. */
00165                         bool statThrottleRateSpecified;
00166                         
00167                         /** The directory in which Passenger should look for
00168                          * restart.txt. NULL means that the default directory
00169                          * should be used.
00170                          */
00171                         const char *restartDir;
00172                         
00173                         /**
00174                          * The directory in which Passenger should place upload buffer
00175                          * files. NULL means that the default directory should be used.
00176                          */
00177                         const char *uploadBufferDir;
00178                         
00179                         /*************************************/
00180                         /*************************************/
00181                         
00182                         bool isEnabled() const {
00183                                 return enabled != DISABLED;
00184                         }
00185                         
00186                         string getAppRoot(const char *documentRoot) const {
00187                                 if (appRoot == NULL) {
00188                                         if (resolveSymlinksInDocRoot == DirConfig::ENABLED) {
00189                                                 return extractDirName(resolveSymlink(documentRoot));
00190                                         } else {
00191                                                 return extractDirName(documentRoot);
00192                                         }
00193                                 } else {
00194                                         return appRoot;
00195                                 }
00196                         }
00197                         
00198                         string getAppRoot(const string &documentRoot) const {
00199                                 if (appRoot == NULL) {
00200                                         if (resolveSymlinksInDocRoot == DirConfig::ENABLED) {
00201                                                 return extractDirName(resolveSymlink(documentRoot));
00202                                         } else {
00203                                                 return extractDirName(documentRoot);
00204                                         }
00205                                 } else {
00206                                         return appRoot;
00207                                 }
00208                         }
00209                         
00210                         const char *getRailsEnv() const {
00211                                 if (railsEnv != NULL) {
00212                                         return railsEnv;
00213                                 } else {
00214                                         return "production";
00215                                 }
00216                         }
00217                         
00218                         const char *getRackEnv() const {
00219                                 if (rackEnv != NULL) {
00220                                         return rackEnv;
00221                                 } else {
00222                                         return "production";
00223                                 }
00224                         }
00225                         
00226                         const char *getSpawnMethodString() {
00227                                 switch (spawnMethod) {
00228                                 case SM_SMART:
00229                                         return "smart";
00230                                 case SM_SMART_LV2:
00231                                         return "smart-lv2";
00232                                 case SM_CONSERVATIVE:
00233                                         return "conservative";
00234                                 default:
00235                                         return "smart-lv2";
00236                                 }
00237                         }
00238                         
00239                         unsigned long getMaxRequests() {
00240                                 if (maxRequestsSpecified) {
00241                                         return maxRequests;
00242                                 } else {
00243                                         return 0;
00244                                 }
00245                         }
00246                         
00247                         unsigned long getMemoryLimit() {
00248                                 if (memoryLimitSpecified) {
00249                                         return memoryLimit;
00250                                 } else {
00251                                         return 200;
00252                                 }
00253                         }
00254                         
00255                         bool highPerformanceMode() const {
00256                                 return highPerformance == ENABLED;
00257                         }
00258                         
00259                         bool usingGlobalQueue() const {
00260                                 return useGlobalQueue == ENABLED;
00261                         }
00262                         
00263                         bool allowsEncodedSlashes() const {
00264                                 return allowEncodedSlashes == ENABLED;
00265                         }
00266                         
00267                         unsigned long getStatThrottleRate() const {
00268                                 if (statThrottleRateSpecified) {
00269                                         return statThrottleRate;
00270                                 } else {
00271                                         return 0;
00272                                 }
00273                         }
00274                         
00275                         const char *getRestartDir() const {
00276                                 if (restartDir != NULL) {
00277                                         return restartDir;
00278                                 } else {
00279                                         return "";
00280                                 }
00281                         }
00282                         
00283                         string getUploadBufferDir() const {
00284                                 if (uploadBufferDir != NULL) {
00285                                         return uploadBufferDir;
00286                                 } else {
00287                                         return getPassengerTempDir() + "/webserver_private";
00288                                 }
00289                         }
00290                         
00291                         /*************************************/
00292                 };
00293                 
00294                 /**
00295                  * Server-wide (global, not per-virtual host) configuration information.
00296                  *
00297                  * Use the getter methods to query information, because those will return
00298                  * the default value if the value is not specified.
00299                  */
00300                 struct ServerConfig {
00301                         /** The filename of the Ruby interpreter to use. */
00302                         const char *ruby;
00303                         
00304                         /** The Passenger root folder. */
00305                         const char *root;
00306                         
00307                         /** The log verbosity. */
00308                         unsigned int logLevel;
00309                         
00310                         /** The maximum number of simultaneously alive application
00311                          * instances. */
00312                         unsigned int maxPoolSize;
00313                         
00314                         /** Whether the maxPoolSize option was explicitly specified in
00315                          * this server config. */
00316                         bool maxPoolSizeSpecified;
00317                         
00318                         /** The maximum number of simultaneously alive Rails application
00319                          * that a single Rails application may occupy. */
00320                         unsigned int maxInstancesPerApp;
00321                         
00322                         /** Whether the maxInstancesPerApp option was explicitly specified in
00323                          * this server config. */
00324                         bool maxInstancesPerAppSpecified;
00325                         
00326                         /** The maximum number of seconds that an application may be
00327                          * idle before it gets terminated. */
00328                         unsigned int poolIdleTime;
00329                         
00330                         /** Whether the poolIdleTime option was explicitly specified in
00331                          * this server config. */
00332                         bool poolIdleTimeSpecified;
00333                         
00334                         /** Whether user switching support is enabled. */
00335                         bool userSwitching;
00336                         
00337                         /** Whether the userSwitching option was explicitly specified in
00338                          * this server config. */
00339                         bool userSwitchingSpecified;
00340 
00341                         /** The user that applications must run as if user switching
00342                          * fails or is disabled. NULL means the option is not specified.
00343                          */
00344                         const char *defaultUser;
00345                         
00346                         /** The temp directory that Passenger should use. NULL
00347                          * means unspecified.
00348                          */
00349                         const char *tempDir;
00350                         
00351                         const char *getRuby() const {
00352                                 if (ruby != NULL) {
00353                                         return ruby;
00354                                 } else {
00355                                         return "ruby";
00356                                 }
00357                         }
00358                         
00359                         const char *getDefaultUser() const {
00360                                 if (defaultUser != NULL) {
00361                                         return defaultUser;
00362                                 } else {
00363                                         return "nobody";
00364                                 }
00365                         }
00366                         
00367                         const char *getTempDir() const {
00368                                 if (tempDir != NULL) {
00369                                         return tempDir;
00370                                 } else {
00371                                         return getSystemTempDir();
00372                                 }
00373                         }
00374                 };
00375         }
00376 
00377         extern "C" {
00378 #endif
00379 
00380 /** Configuration hook for per-directory configuration structure creation. */
00381 void *passenger_config_create_dir(apr_pool_t *p, char *dirspec);
00382 
00383 /** Configuration hook for per-directory configuration structure merging. */
00384 void *passenger_config_merge_dir(apr_pool_t *p, void *basev, void *addv);
00385 
00386 /** Configuration hook for per-server configuration structure creation. */
00387 void *passenger_config_create_server(apr_pool_t *p, server_rec *s);
00388 
00389 /** Configuration hook for per-server configuration structure merging. */
00390 void *passenger_config_merge_server(apr_pool_t *p, void *basev, void *overridesv);
00391 
00392 void passenger_config_merge_all_servers(apr_pool_t *pool, server_rec *main_server);
00393 
00394 /** Apache module commands array. */
00395 extern const command_rec passenger_commands[];
00396 
00397 #ifdef __cplusplus
00398         }
00399 #endif
00400 
00401 /**
00402  * @}
00403  */
00404 
00405 #endif /* _PASSENGER_CONFIGURATION_H_ */

Generated on Thu Oct 7 2010 21:20:41 for Passenger by  doxygen 1.7.1