Allgemein: Optimierung Apache2

andreas-takeshi

New Member
Da wie ich sicher viele Confixxbenutzer von der defaultconfig nicht so wirklich erfreut sind und ich jetzt bei der suche nichts allgemeines gefunden habe mache ich mal ein Thema auf.
Confixx hat bei mir bei der Installation im Bundle als Settings das hier im Apache verankert:
Code:
#
# Based upon the NCSA server configuration files originally by Rob McCool.
#
# This is the main Apache server configuration file.  It contains the
# configuration directives that give the server its instructions.
# See http://httpd.apache.org/docs/2.2/ for detailed information about
# the directives.
#
# Do NOT simply read the instructions in here without understanding
# what they do.  They're here only as hints or reminders.  If you are unsure
# consult the online docs. You have been warned.  
#
# The configuration directives are grouped into three basic sections:
#  1. Directives that control the operation of the Apache server process as a
#     whole (the 'global environment').
#  2. Directives that define the parameters of the 'main' or 'default' server,
#     which responds to requests that aren't handled by a virtual host.
#     These directives also provide default values for the settings
#     of all virtual hosts.
#  3. Settings for virtual hosts, which allow Web requests to be sent to
#     different IP addresses or hostnames and have them handled by the
#     same Apache server process.
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path.  If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "/var/log/apache2/foo.log"
# with ServerRoot set to "" will be interpreted by the
# server as "//var/log/apache2/foo.log".
#

### Section 1: Global Environment
#
# The directives in this section affect the overall operation of Apache,
# such as the number of concurrent requests it can handle or where it
# can find its configuration files.
#

#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE!  If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the LockFile documentation (available
# at <URL:http://httpd.apache.org/docs-2.1/mod/mpm_common.html#lockfile>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
ServerRoot "/etc/apache2"

#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
#<IfModule !mpm_winnt.c>
#<IfModule !mpm_netware.c>
LockFile /var/lock/apache2/accept.lock
#</IfModule>
#</IfModule>

#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15

##
## Server-Pool Size Regulation (MPM specific)
## 

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_worker_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75 
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>

# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

#
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives.  See also the AllowOverride
# directive.
#

AccessFileName .htaccess

#
# The following lines prevent .htaccess and .htpasswd files from being 
# viewed by Web clients. 
#
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>

#
# DefaultType is the default MIME type the server will use for a document
# if it cannot otherwise determine one, such as from filename extensions.
# If your server contains mostly text or HTML documents, "text/plain" is
# a good value.  If most of your content is binary, such as applications
# or images, you may want to use "application/octet-stream" instead to
# keep browsers from trying to display binary files as though they are
# text.
#
DefaultType text/plain


#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off

# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog /var/log/apache2/error.log

#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn

# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

# Include all the user configurations:
Include /etc/apache2/httpd.conf

# Include ports listing
Include /etc/apache2/ports.conf

#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
# If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

#
# Define an access log for VirtualHosts that don't define their own logfile
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined

#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#

#
# Putting this all together, we can internationalize error responses.
#
# We use Alias to redirect any /error/HTTP_<error>.html.var response to
# our collection of by-error message multi-language collections.  We use 
# includes to substitute the appropriate text.
#
# You can modify the messages' appearance without changing any of the
# default HTTP_<error>.html.var files by adding the line:
#
#   Alias /error/include/ "/your/include/path/"
#
# which allows you to create your own set of files by starting with the
# /usr/share/apache2/error/include/ files and copying them to /your/include/path/, 
# even on a per-VirtualHost basis.  The default include files will display
# your Apache version number and your ServerAdmin email address regardless
# of the setting of ServerSignature.
#
# The internationalized error documents require mod_alias, mod_include
# and mod_negotiation.  To activate them, uncomment the following 30 lines.

#    Alias /error/ "/usr/share/apache2/error/"
#
#    <Directory "/usr/share/apache2/error">
#        AllowOverride None
#        Options IncludesNoExec
#        AddOutputFilter Includes html
#        AddHandler type-map var
#        Order allow,deny
#        Allow from all
#        LanguagePriority en cs de es fr it nl sv pt-br ro
#        ForceLanguagePriority Prefer Fallback
#    </Directory>
#
#    ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
#    ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
#    ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
#    ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
#    ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
#    ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
#    ErrorDocument 410 /error/HTTP_GONE.html.var
#    ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
#    ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
#    ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
#    ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
#    ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
#    ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
#    ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
#    ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
#    ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
#    ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var



# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.

# Include generic snippets of statements
Include /etc/apache2/conf.d/

# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/

## CONFIXX

Include /etc/apache2/confixx_mhost.conf

# Dieser Eintrag sollte unbedingt am Ende der Datei bleiben

## /CONFIXX

Was ich bisher so verstanden habe ist, dass man
Code:
KeepAliveTimeout
auf einen Gerinen wert setzen sollte, wenn man wenig ram hat, aber bei 4GB ram, wie es mein Server hat würde ich da nichts ändern.

Weiter habe ich aus der Suche verstanden, dass man am besten seinen ram in die max_clients investieren sollte, also bei nur 512 MB ram
Code:
<IfModule mpm_prefork_module>
StartServers       1
MinSpareServers    1
MaxSpareServers    2
MaxClients        30
    MaxRequestsPerChild   4000
</IfModule>
Und bei mehr Ram am besten mehr Subserver erstellen und die Anzahl der MaxCliebts erhöhen.

Konkrete werte oder tipps habe ich halt noch nicht gefunden.

Falls mir jemand einen guten Link, den ich noch nicht gefunden habe oder ähnliches Geben kann können wir gerne das Thema schließen

gruß
 
Das Thema ist wirklich ein Dauerbrenner hier im Forum.
Da sollte die Board-Suche eigentlich massenweise Threads ausspucken.
(Aber wer will die schon alle lesen.)

Externe Links:
Server-Optimierung
Hochleistungs-Apache: Performance-Tuning
MySQL Tuning

"Konkrete Werte" kann man Dir zwar vorschlagen, aber eigentlich gehört jeder Server individuell eingestellt. Es kommt nämlich auch auf die Art der Nutzung an. Wer wenige Websiten mit großer Last betreibt muss den Speicher anders organisieren als ein Massenwebhoster der meist viele Sites mit weniger Last hat.

Aber einen konkreten Tipp:
KeepAliveTimeout sollte grundsätzlich auf 1-2 Sekunden gesetzt werden. Denn kein Server-Betreiber möchte dass ein "schlechter Browser" wirklich 15 Sekunden lang den Server blockiert.

huschi.
 
hi huschi,
danke ^^
deine seite habe ich bei mir schon lange in den favs... ist für mich mmer beim durchsuchen die erste wahl, aber ich habe gehofft, dass man eine allgemeine formel für die ratio zwischen

StartServers 1
MinSpareServers 1
MaxSpareServers 2
MaxClients 30
MaxRequestsPerChild 4000


finden kann.

Leider ist das thema ein dauerbrenner, nur fragt halt jeder speziefisch nach seinem server und mich interessierts auch aus wissensgründen allgemein ohne dass ichsage ich habe x webs mit y hits und z ram, etc...
 
Wenn aus "Wissensgründen" mehr über die Einstellungen erfahren möchtest, musst Du die Apache-Docs und ggf. den Source-Code studieren. ;)

Und wie gesagt: Eine allgemeine Formel gibt es nicht.
Eine Daumenregel für das MPM-Prefork lautet: MaxClients * 12MB = max. Daten-Speicherverbrauch.
Plus den sonst verbrauchten Speicher (Apache-Code-Speicher, Linux-Kernel und alle anderen Programme) gibt eine potentielle maximale Speicher-Auslastung.
Diese sollte den physikalisch vorhandenen/zugesicherten RAM nicht überschreiten.

Allerdings sind die 12 MB bereits ein Mittelwert/Spekulation und von Server zu Server unterschiedlich. ;)

huschi.
 
Server muß so konfiguriert werden, daß bei 100% Auslastung die 4 GB RAM nicht überschritten werden. Denn dann kommt es zu Fehlermeldungen und Störungen.

Von den 4 GB RAM muß man RAM für Linux, Apache, Plesk, Dr. Web, Spamassassin, Bind ect. abziehen. Was dann übrigbleibt kann für httpd Prozesse (MaxClients) und MySQL verwendet werden.

Angenommen man hat 3,5 GB für Apache hhtpd Prozesse (Tasks) und MySQL übrig. Dann kann man z.B. MySQL 500 MB RAM zuweisen und Apache 3 GB RAM für httpd Prozesse (Childs).

Jeder httpd Prozess kann einen Clienten (Seitenbesucher) bedienen. MaxClients gibt die maximale Anzahl an gleichzeitigen httpd Prozessen vor. Jeder dieser httpd Prozesse benötigt im Schnitt 12-15 MB RAM.

3000 MB RAM geteilt durch 15 MB RAM (httpd Prozess) = 200 httpd Prozesse = MaxClients = 200

Beispiel:
Code:
<IfModule mpm_prefork_module>
    StartServers          5
    [COLOR="Red"]MinSpareServers       5[/COLOR]
    MaxSpareServers      10
  [COLOR="Blue"]  MaxClients          195[/COLOR]
    MaxRequestsPerChild   4000
</IfModule>

Beim Start von Apache werden 5 httpd Prozesse erzeugt. Mindestens 5 weitere werden unbeschäftigt gehalten und maximal werden 195 httpd Prozesse erzeugt welche Requests bearbeiten können. 5 + 195 = 200 = 3000 MB RAM (maximal 195 Seitenbesucher können gleichzeitig bedient werden).

Jeder httpd Prozess wird nachdem er 4000 Requests abgearbeitet hat eleminiert und ein neuer generiert. Dies dient dazu Zombie Prozesse zu eleminieren (= Selbstreperatur).

KeepAlliveTimeout sollte generell den Wert 1 oder 2 Sekunden haben, damit die httpd Prozesse möglichst nicht unnötig blockiert werden.

Code:
KeepAlive: On
MaxKeepAliveRequests: 100
KeepAliveTimeout: 2

Verbindung zum Browser wird aufrecht erhalten und der httpd Prozess verarbeitet bis zu 100 Requests nacheinander. Jedes Objekt wie .gif . jpg Grafiken in Webseiten verursachen einen Requests. Wenn nach 2 Sekunden kein weitere Requests erfolgt, beendet der Server die Verbindung und der httpd Prozess wird wieder frei und kann andere Browser (Seitenbesucher) bedienen.

Praxis:

Ein Seitenbesucher ruft die Webseite auf. Alle Objekte der Seite werden sofort übermittelt. Seitenbesucher schaut sich auf der Webseite um. Seitenbesucher verursacht 2 Sekunden lang kein weiteres Request. Httpd Prozess wird frei und bedient nächsten Seitenbesucher.

Bei einem KeepAliveTimeout: 15 würde der httpd Prozess noch 15 Sekunden nach dem letzen Request warten bis die Verbindung getrennt wird. 15 Sekunden in der der Prozess quasi nix tut und nur wartet = Resourcenverschwendung.

MySQL + Apache Performance Tuning

Beispiel:

Eine Webseite hat z.B. 200 .jpg Bilder. Beim Aufruf der Seite müssen also die HTML Datei und 200 .jpg Bilder an den Browser übermittelt werden. Dies wären 201 Requests an den Server. Ohne KeepAlive würde die Verbindung nach jedem Requests (.jpg Bild) beendet werden und müßte erneut aufgebaut werden. Bei aktiviertem KeepAlive wird die Verbindung aufrecht erhalten und ein httpd Prozess bearbeitet alle 201 Requests nacheinander. Die Seite baut sich ruck zuck auf. MaxKeepAliveRequests sollte dann natürlich den Wert 201 und nicht 100 haben!

Timeout würde ich auf 30 Sekunden setzen. 5 Minuten wäre mir zu lang :)
 
Last edited by a moderator:
Eine gut gelungene Erklärung ist das nicht wirklich, Noto. :(
Der Unterschied zwischen Min- und MaxSpareServers ist sogar fehlerhaft. Du beachtest nämlich nicht, dass dies nur eine Art Garbage-Collector-Einstellungen sind. Die Anzahl der aktuellen Childs wird nicht ständig überprüft. Seit Apache 2.2 sind sogar mehr Aufgaben davon vom Master auf die Childs ausgelagert worden.

Die MaxClients sind ein absoluter Maximalwert. Da kommen keine weiteren 5 (von woher auch immer) dazu.
Und beim MaxKeepAliveRequests muss man beachten, dass alle modernen Browser mehrere Connections gleichzeitig nutzen um die Ladegeschwindigkeit zu erhöhen. Bei 200 Bildern in einer Seite würden es bei Firefox 6 Connections (siehe "network.http.max-persistent-connections-per-server") mit KeepAlive versuchen. Macht dann ca. 33 KeepAlive-Requests pro Child.

Ein Browser beendet seine Connection i.d.R. auch sauber. Die Probleme machen meistens die (unsauber programmierten) Bots und Script-Kiddies.

PS: Wenn man MaxClients auf 200 stellt, sollte man darauf achten, dass auch ausreichend MySQL-Connections vorhanden sind. Wodurch wiederum MySQL mehr Speicher braucht...

huschi.
 
Back
Top