Here are some rough notes from thinking about better configs for a 
future OpenSolaris release.  The exact content isn't so important in the 
short term as how to package it, but by all means comment on any aspect 
of interest.  Please ;)

--/--

Getting a production-ready Apache configuration in OpenSolaris 2008.11

The default configuration for Apache and unbundled modules like 
mod_dtrace and
mod_php enables as many features as practical at the cost of performance.

Several changes are necessary for production configurations to limit the 
memory
and CPU use.

A. loaded modules

For production, modules shouldn't be loaded if they aren't used, as they
consume memory and sometimes CPU even if they aren't configured.

Also, the set of loaded modules in a production config shouldn't be based
directly on which packages are installed.

httpd.conf loads all Apache-provided modules by virtue of these lines in 
the
configuration:

  <IfDefine 64bit>
  Include /etc/apache2/2.2/conf.d/modules-64.load
  </IfDefine>
  <IfDefine !64bit>
  Include /etc/apache2/2.2/conf.d/modules-32.load
  </IfDefine>

Use alternate files production-modules-64.load* and 
production-modules-32.load,
which load only the following basic set of modules:

  mod_authz_host
  mod_log_config
  mod_env
  mod_expires
  mod_headers
  mod_unique_id
  mod_setenvif
  mod_mime
  mod_autoindex
  mod_cgi (prefork MPM) or mod_cgid (worker MPM)
  mod_dir
  mod_actions
  mod_alias
  mod_rewrite

  (*These files aren't provided but are easy to create.)

Any additional modules which are required must be added manually.  Adding
further modules should be performed in conjunction with configuring the
related feature.

httpd.conf also loads several other add-on modules whose packages install
configuration snippets in /etc/apache2/2.2/conf.d, because of the following
lines in the configuration:

  Include /etc/apache2/2.2/conf.d/*.conf

Reading a directory of .conf files is desireable, but a production config
shouldn't read that directly since its content depends on which packages 
are installed.

Replace that include with

  Include /etc/apache2/2.2/production-conf.d/*.conf

  (This directory isn't created when the product is installed.)

Adding LoadModule directives for any additional modules will be done
only as necessary for features required in the production server.

B. Very basic MPM configuration

The choice of MPM may be based on the exact workload.  At a minimum, we
need to fix the default configuration so that it doesn't allow the web
server to use too many system resources (processes, memory, swap space).

This section of httpd.conf needs to be removed:

  <IfModule prefork.c>
     ListenBacklog 8192
     ServerLimit 2048
     MaxClients 2048
  </IfModule>

Copy samples-conf.d/mpm.conf to production-conf.d; that sample file
has reasonable, initial defaults for both worker and prefork MPMs.  It
can be modified during later testing as necessary.

C. If you need to enable SSL

   load mod_ssl from within production-modules-{32|64}.load

   copy samples.d/ssl.conf to production-conf.d and modify for
   your configuration

   Is the cipher selection in ssl.conf reasonable?  (good combination of 
security + performance?)

   MPM implications: Does SSL use heap library extensively, and thus 
perform worse
   with more threads per process?  (guess: worker is fine with <= 100 
threads per child)

D. If you need to enable name-based (non-SSL) virtual hosts

   <VirtualHost www.example.com>
   ServerName www.example.com:80

   ...
   </VirtualHost>

   define any configuration specific to this vhost, such as log files,
   document root, etc.

   If mod_rewrite configuration at global scope should apply to this
   vhost, add "RewriteOptions inherit" within the vhost.

   If global scope (outside of any VirtualHost) is not intended for
   use, you can deny access.

   MPM implications: none
  
E. If you need to enable web server authentication and authorization

   (from definitions in LDAP, files, databases, etc.)

   Note that some applications handle this internally and don't rely on
   the web server.

   MPM implications: which auth methods cache, and which are cross-process?
     (mod_ldap has a shared-memory cache, which should help prefork; but
     pooled server connections are specific to a child process so prefork
     could perform worse)

F. If you need to host PHP applications

   if prefork, copy conf.d/php5.2.conf to production-conf.d

   if worker, copy samples.d/fcgid.conf to production-conf.d/php-fcgid.conf
   and fix the AddHandler or Location container

   MPM implications:
      OpenSolaris mod_php refuses to work in worker MPM, right?
      your PHP applications may use support libraries which aren't 
thread-safe

      if a small amount of your load is PHP, memory use can be reduced 
by using
      FastCGI to communicate with a small number of PHP processes, 
instead of
      hosting the PHP application in every Apache process

G. If you need to reverse proxy some requests to another server

   MPM implications: pooled connections better utilized with worker

H. If you need to route requests to GlassFish or Tomcat

   when to use mod_proxy_ajp vs. mod_proxy_http vs. mod_jk (and how)

   MPM implications: pooled connections better utilized with worker

I. If you need to host mod_perl applications

   do we have a sample for this?

   MPM implications: prefork must be used

J. If you need to enable mod_disk_cache

   we need a sample configuration for this to place the cache in an 
appropriate
   place

(not going to cover the 20 million Apache features; just those which are
commonly needed for production and require more than a few lines in the
config)

...

Z. real MPM tuning

   among other things: make sure you drive Apache to MaxClients during 
testing
   and survive; otherwise, MaxClients may be too high

   don't let MinSpareXXX and MaxSpareXXX be too close to each other, or 
Apache
   will continually create and terminate child processes; the difference 
should be
   a meaningful percentage of normal load (at least 20%?)

   use mod_status to monitor utilization of processes/threads to 
determine if
   MaxClients is appropriate

   and so on

--/--

new files that could be installed with Apache as part of these instructions:

/etc/apache2/2.2/httpd-production.conf:
like httpd.conf but has the changes mentioned above

/etc/apache2/2.2/production-conf.d/:
new directory where admin places conf snippets to activate features 
within production config

/etc/apache2/2.2/production-conf.d/production-modules-{32|64}.load:
like conf.d/modules-{32|64}.load, but has just the core which are 
required in just about every production config

Something like this would switch from the default enable-everything 
config to this alternate config:

 svccfg -s apache22 setprop httpd/startup_options = astring: 
-f/etc/apache2/2.2/httpd-production.conf


Reply via email to