# Ha, you're reading this config file looking for the easy way out!
# "how do I make my apache server go really really fast??"
# Well you could start by reading the htdocs/manual/misc/perf-tuning.html
# page.  But, we'll give you a head start.
#
# This config file is small, it is probably not what you'd expect on a
# full featured internet webserver with multiple users.  But it's
# probably a good starting point for any folks interested in testing
# performance.
#
# To run this config you'll need to use something like:
#     httpd -f @@ServerRoot@@/conf/highperformance.conf

Port 80
ServerRoot @@ServerRoot@@
DocumentRoot @@ServerRoot@@/htdocs
MaxClients 8 
StartServers 5
MinSpareServers 5
MaxSpareServers 10
# Assume no memory leaks at all
MaxRequestsPerChild 0

# this is a True Config File
# see http://www.apache.org/info/three-config-files.html
ResourceConfig /dev/null
AccessConfig /dev/null

# it's always nice to know the server has started
ErrorLog logs/error_log

# Some benchmarks require logging, which is a good requirement.  Uncomment
# this if you need logging.
#TransferLog logs/access_log

# Disable symlink protection and htaccess files, they chew far too much.
<Directory />
    AllowOverride none
    Options FollowSymLinks
    # If this was a real internet server you'd probably want to
    # uncomment these:
    #order deny,allow
    #deny from all
</Directory>

# If this was a real internet server you'd probably want to uncomment this:
#<Directory "@@ServerRoot@@/htdocs">
#    order allow,deny
#    allow from all
#</Directory>

# OK that's enough hints.  Read the documentation if you want more.
