Nick Kew wrote:
> Jeff Trawick wrote:
>> 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 ;)
>
> No prepackaged config is going to suit a real user.
>
> The nearest we can come is to boil it down to "wizard" level,
> where the user just defines things like virtual hosts.  But we're
> not really even near that.  Nor, I think, should we be:
> the server admin task should not be dumbed down to the point
> where admins are likely to shoot themselves in the foot through
> following recipes.
>
> My point: how much effort should we really devote to it?
>
> Alternative proposal: more educational material.  This is inspired
> in part by chats I had with some Sun folks at FOSDEM.  The suggestion
> is that I might put together some webcast tutorials on apache topics
> we can offer as added value to our users.  I'm quite keen on that
> idea, starting with Apache but perhaps moving on to other webstack
> components in due course.
>
> ++++
>
> Having said that, it's good that you're giving the issue some thought.
> Someone remind me: have we contemplated something along the lines
> of Debian's a2ensite for generating virtualhost templates, for instance?
>
>> 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.
>
> Here's a thought inspired by your post: a script to scan an httpd.conf,
> and highlight any modules loaded but not used.  This is not trivial,
> but shouldn't be too hard with a known set of modules, such as those
> bundled as standard from apache.org.
>
>> 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
>
> Hmmm.  There's very little in there that's really core.
> I'd say drop mod_unique_id, and consider carefully whether
> the bigger modules (cgi[d] and maybe rewrite) should
> default to on.  But that just illustrates the difficulty
> in selecting a "core" set.
>
>>  (*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.
>
> +1, with provisos as above.  But that conjunction could apply to most
> of the above modules too: both env modules, mod_expires, mod_headers,
> mod_actions, and even mod_alias).
>
>> 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
>>
This was done to provide better user experience. The assumption here is 
that when the user installs a specific package
he/she intends to make use of its functionality.
>> 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.
>
> This looks like it's heading towards something like Debian's a2enmod,
> which makes a similar mods-available vs mods-enabled distinction.
> I think that has some merit, but also causes a lot of confusion[1].
>
> If we do go down this road, we should align what we do with what
> Debian (and thus Ubuntu/etc) do rather than create yet another
> variant to confuse the world.
>
I agree with Nick.
>> 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.
>>
Agree.
>> 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.
>
> Presumably something like samples.d/www.example.com
>
>>   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)
>
> A lot of these sound like good material for tutorials, whether
> webcast or written.  Or ideally, give users the choice.
>
>> 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
>
> Talking of which, did you see Vincent Deffontaines' recent post on
> httpd-docs concerning updating the performance tuning discussion
> at httpd.apache.org?
>
>> --/--
>>
>> 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
>
> Won't those risk confusing more than they enlighten?  I'd prefer
> to keep httpd.conf as production, and use different names for
> non-production samples.  Again, see [1].
>
>> /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
>
> [1] 
> http://www.theregister.co.uk/2006/11/04/apache_packages_support_vacuum/
>
Instead of a new layout for the production environment, can't we make 
the existing configuration layout
suitable for both developer and production environment ?
e.g., Have 2 sets of files - one to load the core / commonly used 
modules and another one to load the non-core/uncommonly used modules.
By default, include both these files in either modules-*.load or in 
httpd.conf. Since making the configuration production-ready involves
many manual steps, we can as well ask the user to comment or rename the 
loading of non-core file.
Similarly, for config files in conf.d, unwanted ones can be moved to 
samples-conf.d or renamed to something else (say *.unused).

Regards,
Seema.


Reply via email to