apache http server - proste i zaawansowane przypadki użycia
TRANSCRIPT
![Page 1: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/1.jpg)
Apache HTTP Serverproste i zaawansowane przypadki użycia
Wojciech Lichotamaj 2012
![Page 2: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/2.jpg)
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
![Page 3: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/3.jpg)
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ń
![Page 4: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/4.jpg)
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>
![Page 5: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/5.jpg)
Komendy
Zarządzenie procesem: apachectl● start, stop, restart● reload● graceful● status● configtest
Zarządzenie plikiem haseł: htpasswd
Testowanie wydajności: ab
![Page 6: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/6.jpg)
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
![Page 7: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/7.jpg)
Konfiguracja - Debian
1. Pliki:/etc/apache2/...
httpd.confmods-available/*.confmods-enabled/*.confsites-available/*.confsites-enabled/*.conf
2. Komendy:/etc/init.d/apache2a2enmod, a2dismoda2ensite, a2dissite
![Page 8: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/8.jpg)
Logi
Parametry:○ Format logowania
LogFormat "%t %r %>s %b" combined
○ Logowanie rządańCustomLog "access.log" combined
○ Logowanie błędówErrorLog "error.log"
![Page 9: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/9.jpg)
HTTPS - mod_ssl
Minimum:SSLEngine onSSLProxyEngine onSSLCertificateFile server.crtSSLCertificateKeyFile server.key
Dodatkowo:SSLProtocolSSLCipherSuiteSSLOptions
![Page 10: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/10.jpg)
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
![Page 11: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/11.jpg)
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>
![Page 12: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/12.jpg)
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>
![Page 13: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/13.jpg)
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>
![Page 14: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/14.jpg)
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>
![Page 15: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/15.jpg)
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ą
![Page 16: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/16.jpg)
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]
![Page 17: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/17.jpg)
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]
![Page 18: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/18.jpg)
Serwowanie aplikacjimod_wsgi
Moduł pozwala hostować aplikacje obsługujące interface WSGI.
Udostępnia 3 tryby:● WSGIScriptAlias● SetHandler● WSGIDaemonProcess
![Page 19: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/19.jpg)
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>
![Page 20: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/20.jpg)
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>
![Page 21: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/21.jpg)
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>
![Page 22: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/22.jpg)
"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"
![Page 23: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/23.jpg)
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>
![Page 24: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/24.jpg)
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
![Page 25: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/25.jpg)
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
![Page 26: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/26.jpg)
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
![Page 27: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/27.jpg)
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
![Page 28: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/28.jpg)
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>
![Page 29: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/29.jpg)
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>
![Page 30: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/30.jpg)
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.
![Page 31: Apache http server - proste i zaawansowane przypadki użycia](https://reader035.vdocuments.pub/reader035/viewer/2022081401/5575722ed8b42a2e248b526f/html5/thumbnails/31.jpg)