apache http server - proste i zaawansowane przypadki użycia
TRANSCRIPT
Apache HTTP Serverproste i zaawansowane przypadki użycia
Wojciech Lichotamaj 2012
Agenda
1. Wstęp2. Konfiguracja
● logowanie● konfiguracja SSL● serwowanie plików z dysku● serwowanie aplikacji (mod_rewrite, mod_wsgi)● konfiguracja cache w przeglądarce● autentykacja (htpasswd, ldap)
3. Optymalizacja ● mpm_prefork● mpm_worker● mpm + wsgi
Dlaczego?
● najpopularniejszy○ 65% serwerów○ 57% stron www
● dojrzały○ 1.0 - 1995○ 1.3 - 1998○ 2.0 - 2004○ 2.2 - 2005○ 2.4 - 2012
● otwarty i darmowy● duża ilość rozszerzeń
Konfiguracja
Plik httpd.conf i pliki jawnie dołączane przez parametr IncludeNadpisywanie przez plik.htaccess
Parametr i wartość, np.:DocumentRoot "/var/www/html"
Grupowanie, np.:<Directory "/var/www/cgi-bin">
...</Directory>
Komendy
Zarządzenie procesem: apachectl● start, stop, restart● reload● graceful● status● configtest
Zarządzenie plikiem haseł: htpasswd
Testowanie wydajności: ab
Konfiguracja - RedHat
1. Pliki:/etc/httpd/...
conf/httpd.confconf.d/*.confvhost.d/*.conf
2. Komendy:/etc/init.d/httpd
3. Logi:/var/log/httpd/...
access.logerror.log
Konfiguracja - Debian
1. Pliki:/etc/apache2/...
httpd.confmods-available/*.confmods-enabled/*.confsites-available/*.confsites-enabled/*.conf
2. Komendy:/etc/init.d/apache2a2enmod, a2dismoda2ensite, a2dissite
Logi
Parametry:○ Format logowania
LogFormat "%t %r %>s %b" combined
○ Logowanie rządańCustomLog "access.log" combined
○ Logowanie błędówErrorLog "error.log"
HTTPS - mod_ssl
Minimum:SSLEngine onSSLProxyEngine onSSLCertificateFile server.crtSSLCertificateKeyFile server.key
Dodatkowo:SSLProtocolSSLCipherSuiteSSLOptions
Certyfikat "self-signed"
● openssl genrsa -des3 -out server.key 1024● openssl req -new -key server.key -out
server.csr● cp server.key server.key.org● openssl rsa -in server.key.org -out
server.key● openssl x509 -req -days 365 -in server.
csr -signkey server.key -out server.crt
Virtual Host
Pozwala definiować inną konfigurację dla domen. Określa jakie domeny są obsługiwane na jakim interfejsie sieciowym bądź porcie.
Listen 80NameVirtualHost *:80
<VirtualHost *:80>ServerName server.domain.comServerAlias www.server.domain.com...
</VirtualHost>
Serwowanie plików<VirtualHost *:80>
DocumentRoot /var/www/vhost/html
<Directory /var/www/vhost/html>AllowOverride NoneOrder allow,denyAllow from all
</Directory>
<Location /files>Options Indexes FollowSymLinks
</Location></VirtualHost>
Serwowanie aplikacjimod_proxy
Moduł odpowiedzialny za funkcjonalność prośredniczenia żądań do innych aplikacji.
<VirtualHost *:80>ServerName vhost.example.com
ProxyPass / http://127.0.0.1:8080/ProxyPassReverse / http://127.0.0.1:8080/ProxyPreserveHost On
</VirtualHost>
Serwowanie aplikacjimod_rewrite<VirtualHost *:80>
ServerName vhost.example.com
RewriteEngine OnRewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R]
</VirtualHost>
<VirtualHost *:443>ServerName vhost.example.comDocumentRoot /var/www/vhost/html
RewriteEngine OnRewriteRule ^/static/(.*) /static/$1 [L]RewriteRule ^/(.*)$ http://127.0.0.1:8080/$1 [L,P]
</VirtualHost>
Serwowanie aplikacjimod_rewrite
Moduł pozwala na przepisywanie jednych adresów po spełnienie odpowiednich warunków.
Flagi reguł:● L (last) - ignoruje dalsze reguły● NC - dopasowanie ścieżki bez
rozróżniania wielkości liter● NE - nie escapuje znaków● P - przekazanie do mod_proxy● R - przekierowanie (ang. redirect)● E= - ustawia zmienną środowiskową
Serwowanie aplikacjimod_rewriteServerName example.comServerAlias pl.example.comServerAlias example.com.pl
RewriteEngine onRewriteCond %{REQUEST_METHOD} !^POST$RewriteRule ^/submit$ http://%{SERVER_NAME}/404 [R]
RewriteCond %{HTTP_HOST} ^pl\. [OR]RewriteCond %{HTTP_HOST} \.pl$
RewriteRule ^/(.*)$ http://example.com/pl/$1 [R]
Serwowanie aplikacjimod_rewriteServerName example.comServerAlias *.example.com
RewriteEngine OnRewriteRule .* - [E=lang:en]RewriteCond %{HTTP_HOST} (.*)\.example\.comRewriteRule .* - [E=lang:%1]RequestHeader set X_SITE_LANG %{lang}eRewriteRule ^/(.*)$ http://127.0.0.1:8080/$1 [L,P]
Serwowanie aplikacjimod_wsgi
Moduł pozwala hostować aplikacje obsługujące interface WSGI.
Udostępnia 3 tryby:● WSGIScriptAlias● SetHandler● WSGIDaemonProcess
Serwowanie aplikacjimod_wsgi - WSGIScriptAlias<VirtualHost *:80>
ServerName django.example.comDocumentRoot /var/www/django
<Directory /var/www/django/>Order allow,denyAllow from all
</Directory>
RewriteEngine OnRewriteRule ^/site-media/(.*) /site-media/$1 [L]WSGIScriptAlias / /var/www/django/wsgi.py
</VirtualHost>
Serwowanie aplikacjimod_wsgi - SetHandler<VirtualHost *:80>
ServerName wsgiapp.example.com
Alias / /var/www/wsgiapp/<Directory /var/www/wsgiapp/>
Options ExecCGISetHandler wsgi-script
Order allow,denyAllow from all
</Directory></VirtualHost>
Serwowanie aplikacjimod_wsgi - WSGIDaemonProcessWSGIDaemonProcess app-name processes=3 threads=10WSGIScriptAlias / /var/www/wsgiapp/wsgi.py
<Directory /var/www/wsgiapp/>Options ExecCGIWSGIProcessGroup app-nameOrder allow,denyAllow from all
</Directory>
"Cachowanie" w przeglądarceExpiresActive OnExpiresDefault A0
ExpiresByType application/x-javascript A604800ExpiresByType application/javascript A604800ExpiresByType text/css "access plus 1 month"ExpiresByType image/x-icon "access plus 1 year"ExpiresByType image/jpeg "access plus 1 month"ExpiresByType image/png "access plus 1 month"ExpiresByType image/gif "access plus 1 month"
Nadpisywanie "Cachowania"w przeglądarce
<VirtualHost *:80> ExpiresActive On ExpiresByType image/jpeg "access plus 1 month" ProxyPass / http://127.0.0.1:8001/</VirtualHost><VirtualHost 127.0.0.1:8001>
Header unset ETagHeader unset Last-ModifiedHeader unset Cache-ControlHeader unset ExpiresHeader unset Content-RangeWSGIScriptAlias / /var/www/django/wsgi.py
</VirtualHost>
Modyfikacja nagłówkówmod_headers
RequestHeader zmienia nagłówek rządania przed przekazaniem do aplikacji, a Header modyfikuje nagłówek odpowiedzi. Operacje:
● set● append● merge● add● unset● echo● edit
Modyfikacja nagłówkówmod_headers - przykłady
Przekazanie nagłówka:RequestHeader set plone_skin "Plone Classic Theme"
Poprawianie przekierowań:Header edit Location ^http://127.0.0.1:8800$ /Header edit Location ^http://127.0.0.1:8800/ /
Przekazywanie zalogowanego użytkownika:RewriteCond %{LA-U:REMOTE_USER} (.+)RewriteRule ^/(.*)$ /$1 [PT,E=RU:%1]RequestHeader set X_REMOTE_USER %{RU}e
Podstawowe uwierzytelnianie<Location />
AuthType BasicAuthName "Password Required"AuthUserFile /etc/httpd/users.authRequire valid-user
</Location>
Komendy:htpasswd -cm /etc/httpd/users.auth user1htpasswd -m /etc/httpd/users.auth user2htpasswd -D /etc/httpd/users.auth user1
Uwierzytelnianie LDAPmod_ldap<Location />
AuthType BasicAuthName "LDAP"AuthBasicProvider ldapRequire valid-userAuthLDAPURL "..."AuthzLDAPAuthoritative offAuthLDAPGroupAttributeIsDN on
</Location>
ldap://ldap.softax.pl:389/ou=Accounts,dc=softax,dc=pl?uidldap://ldap.softax.local/ou=Accounts,dc=softax,dc=local?uidldap://ldap.stxnext.local/ou=people,dc=stxnext,dc=local?uid
Silnik Apachempm_prefork
● podstawowy silnik (najstarszy)● wiele procesów potomnych● bez watków = thread-safe● więcej pamięci
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0</IfModule>
Silnik Apachempm_worker
● w httpd od 2.0● kilka procesów potomnych● każdy potomny ma kilka wątków● mniej pamięci, ale nie "thread-safe"
<IfModule mpm_worker_module> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25</IfModule>
Optymalizacja WSGI(z moich obserwacji)WSGIDaemonProcess spowalnia bo jest dodatkowa komunikacja po unix'owym plikowym socket'ie. Dlatego lepiej aby mpm sterował ilością procesów i wątków.
prefork + szybkie zabijanie = średnio pamięci + dobra odpowiedź + zwieszki!
prefork + wolne zabijanie = dużo pamięci + dobra odpowiedź
prefork + dużo na starcie + wolne zabijanie = = wolny start + bardzo dużo pamięci + najszybsza odpowiedź
worker + szybkie zabijanie = mało pamięci + średnia odpowiedź
worker + wolne zabijanie = średnio pamięci + dobra odpowiedź
worker + dużo na starcie + wolne zabijanie = średnio pamięci + szybka odpowiedź
Zwracać uwagę na sprzęt (ilość rdzeni, pamięć) oraz charakter ruchu.