SlideShare a Scribd company logo
1 of 31
Download to read offline
Apache HTTP Server
proste i zaawansowane przypadki użycia

           Wojciech Lichota
                maj 2012
Agenda
1. Wstęp
2. 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 Include
Nadpisywanie 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.conf
     conf.d/*.conf
     vhost.d/*.conf
2. Komendy:
   /etc/init.d/httpd
3. Logi:
   /var/log/httpd/...
     access.log
     error.log
Konfiguracja - Debian
1. Pliki:
   /etc/apache2/...
     httpd.conf
     mods-available/*.conf
     mods-enabled/*.conf
     sites-available/*.conf
     sites-enabled/*.conf
2. Komendy:
   /etc/init.d/apache2
   a2enmod, a2dismod
   a2ensite, a2dissite
Logi
Parametry:
  ○ Format logowania
    LogFormat "%t %r %>s %b" combined

  ○ Logowanie rządań
    CustomLog "access.log" combined

  ○ Logowanie błędów
    ErrorLog "error.log"
HTTPS - mod_ssl
Minimum:
  SSLEngine on
  SSLProxyEngine on
  SSLCertificateFile server.crt
  SSLCertificateKeyFile server.key

Dodatkowo:
  SSLProtocol
  SSLCipherSuite
  SSLOptions
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 80
NameVirtualHost *:80
<VirtualHost *:80>
   ServerName server.domain.com
   ServerAlias www.server.domain.com
   ...
</VirtualHost>
Serwowanie plików
<VirtualHost *:80>
   DocumentRoot /var/www/vhost/html
   <Directory /var/www/vhost/html>
      AllowOverride None
      Order allow,deny
      Allow from all
   </Directory>
   <Location /files>
      Options Indexes FollowSymLinks
   </Location>
</VirtualHost>
Serwowanie aplikacji
mod_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 aplikacji
mod_rewrite
<VirtualHost *:80>
   ServerName vhost.example.com
   RewriteEngine On
   RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R]
</VirtualHost>
<VirtualHost *:443>
   ServerName vhost.example.com
   DocumentRoot /var/www/vhost/html
   RewriteEngine On
   RewriteRule ^/static/(.*) /static/$1 [L]
   RewriteRule ^/(.*)$ http://127.0.0.1:8080/$1 [L,P]
</VirtualHost>
Serwowanie aplikacji
mod_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 aplikacji
mod_rewrite
ServerName example.com
ServerAlias pl.example.com
ServerAlias example.com.pl

RewriteEngine on
RewriteCond %{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 aplikacji
mod_rewrite
ServerName example.com
ServerAlias *.example.com

RewriteEngine On
RewriteRule .* - [E=lang:en]
RewriteCond %{HTTP_HOST} (.*).example.com
RewriteRule .* - [E=lang:%1]
RequestHeader set X_SITE_LANG %{lang}e
RewriteRule ^/(.*)$ http://127.0.0.1:8080/$1 [L,P]
Serwowanie aplikacji
mod_wsgi
Moduł pozwala hostować aplikacje obsługujące
interface WSGI.

Udostępnia 3 tryby:
  ● WSGIScriptAlias
  ● SetHandler
  ● WSGIDaemonProcess
Serwowanie aplikacji
mod_wsgi - WSGIScriptAlias
<VirtualHost *:80>
   ServerName django.example.com
   DocumentRoot /var/www/django
   <Directory /var/www/django/>
      Order allow,deny
      Allow from all
   </Directory>
   RewriteEngine On
   RewriteRule ^/site-media/(.*) /site-media/$1 [L]
   WSGIScriptAlias / /var/www/django/wsgi.py
</VirtualHost>
Serwowanie aplikacji
mod_wsgi - SetHandler
<VirtualHost *:80>
   ServerName wsgiapp.example.com
   Alias / /var/www/wsgiapp/
   <Directory /var/www/wsgiapp/>
      Options ExecCGI
      SetHandler wsgi-script
      Order allow,deny
      Allow from all
   </Directory>
</VirtualHost>
Serwowanie aplikacji
mod_wsgi - WSGIDaemonProcess
WSGIDaemonProcess app-name processes=3 threads=10
WSGIScriptAlias / /var/www/wsgiapp/wsgi.py

<Directory /var/www/wsgiapp/>
   Options ExecCGI
   WSGIProcessGroup app-name
   Order allow,deny
   Allow from all
</Directory>
"Cachowanie" w przeglądarce
ExpiresActive On
ExpiresDefault A0

ExpiresByType   application/x-javascript A604800
ExpiresByType   application/javascript A604800
ExpiresByType   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 ETag
   Header unset Last-Modified
   Header unset Cache-Control
   Header unset Expires
   Header unset Content-Range
   WSGIScriptAlias / /var/www/django/wsgi.py
</VirtualHost>
Modyfikacja nagłówków
mod_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ów
mod_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 Basic
   AuthName "Password Required"
   AuthUserFile /etc/httpd/users.auth
   Require valid-user
</Location>


Komendy:
htpasswd -cm /etc/httpd/users.auth user1
htpasswd -m /etc/httpd/users.auth user2
htpasswd -D /etc/httpd/users.auth user1
Uwierzytelnianie LDAP
mod_ldap
<Location />
   AuthType Basic
   AuthName "LDAP"
   AuthBasicProvider ldap
   Require valid-user
   AuthLDAPURL "..."
   AuthzLDAPAuthoritative off
   AuthLDAPGroupAttributeIsDN on
</Location>

ldap://ldap.softax.pl:389/ou=Accounts,dc=softax,dc=pl?uid
ldap://ldap.softax.local/ou=Accounts,dc=softax,dc=local?uid
ldap://ldap.stxnext.local/ou=people,dc=stxnext,dc=local?uid
Silnik Apache
mpm_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 Apache
mpm_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.
Apache http server - proste i zaawansowane przypadki użycia

More Related Content

What's hot

Serwer internetowy w systemie Linux
Serwer internetowy w systemie LinuxSerwer internetowy w systemie Linux
Serwer internetowy w systemie Linuxbm9ib2r5
 
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-PolskaModsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-PolskaLeszek Mi?
 
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PROIDEA
 
Metaprogramowanie w JS
Metaprogramowanie w JSMetaprogramowanie w JS
Metaprogramowanie w JSDawid Rusnak
 
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótkaWebpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótkaMarcin Gajda
 
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwAsynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwLuke Adamczewski
 
ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogoKamil Monticolo
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPLaravel Poland MeetUp
 
Przetwarzanie asynchroniczne w zastosowaniach webowych
Przetwarzanie asynchroniczne w zastosowaniach webowychPrzetwarzanie asynchroniczne w zastosowaniach webowych
Przetwarzanie asynchroniczne w zastosowaniach webowychleafnode
 
Budowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki startBudowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki startSages
 
Zabezpiecz swoją stronę w Joomla!
Zabezpiecz swoją stronę w Joomla!Zabezpiecz swoją stronę w Joomla!
Zabezpiecz swoją stronę w Joomla!Wojciech Klocek
 
Optymalizacyjna magia, czyli jak wyciągać króliki z kapelusza
Optymalizacyjna magia, czyli jak wyciągać króliki z kapelusza Optymalizacyjna magia, czyli jak wyciągać króliki z kapelusza
Optymalizacyjna magia, czyli jak wyciągać króliki z kapelusza SzymonSadlo
 
Jak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzieńJak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzieńPaweł Kondraciuk
 
HTTP od zera do bohatera
HTTP od zera do bohateraHTTP od zera do bohatera
HTTP od zera do bohateraHordeTechnology
 
Info meet pomiary wydajności
Info meet pomiary wydajnościInfo meet pomiary wydajności
Info meet pomiary wydajnościmagda3695
 

What's hot (20)

Serwer internetowy w systemie Linux
Serwer internetowy w systemie LinuxSerwer internetowy w systemie Linux
Serwer internetowy w systemie Linux
 
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-PolskaModsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
 
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
 
Metaprogramowanie w JS
Metaprogramowanie w JSMetaprogramowanie w JS
Metaprogramowanie w JS
 
Torquebox
TorqueboxTorquebox
Torquebox
 
PHP-PM. Hit czy kit?
PHP-PM. Hit czy kit?PHP-PM. Hit czy kit?
PHP-PM. Hit czy kit?
 
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótkaWebpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
 
Potęga pliku .htaccess
Potęga pliku .htaccessPotęga pliku .htaccess
Potęga pliku .htaccess
 
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwAsynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
 
ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogo
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 
Przetwarzanie asynchroniczne w zastosowaniach webowych
Przetwarzanie asynchroniczne w zastosowaniach webowychPrzetwarzanie asynchroniczne w zastosowaniach webowych
Przetwarzanie asynchroniczne w zastosowaniach webowych
 
Budowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki startBudowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki start
 
Android i REST
Android i RESTAndroid i REST
Android i REST
 
Zabezpiecz swoją stronę w Joomla!
Zabezpiecz swoją stronę w Joomla!Zabezpiecz swoją stronę w Joomla!
Zabezpiecz swoją stronę w Joomla!
 
Optymalizacyjna magia, czyli jak wyciągać króliki z kapelusza
Optymalizacyjna magia, czyli jak wyciągać króliki z kapelusza Optymalizacyjna magia, czyli jak wyciągać króliki z kapelusza
Optymalizacyjna magia, czyli jak wyciągać króliki z kapelusza
 
Po co nam RSocket?
Po co nam RSocket?Po co nam RSocket?
Po co nam RSocket?
 
Jak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzieńJak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzień
 
HTTP od zera do bohatera
HTTP od zera do bohateraHTTP od zera do bohatera
HTTP od zera do bohatera
 
Info meet pomiary wydajności
Info meet pomiary wydajnościInfo meet pomiary wydajności
Info meet pomiary wydajności
 

Viewers also liked

Compiled Websites with Plone, Django, Xapian and SSI
Compiled Websites with Plone, Django, Xapian and SSICompiled Websites with Plone, Django, Xapian and SSI
Compiled Websites with Plone, Django, Xapian and SSIWojciech Lichota
 
Sandman - makes things REST
Sandman - makes things RESTSandman - makes things REST
Sandman - makes things RESTWojciech Lichota
 
Transakcyjność w django
Transakcyjność w djangoTransakcyjność w django
Transakcyjność w djangoMarcin Baran
 
Zwinność procesu rekrutacyjnego w branży IT
Zwinność procesu rekrutacyjnego w branży ITZwinność procesu rekrutacyjnego w branży IT
Zwinność procesu rekrutacyjnego w branży ITSTX Next
 
Pyra stxnext
Pyra stxnextPyra stxnext
Pyra stxnextradekj200
 
Jak przygotować się do rozmowy rekrutacyjnej na Python Developera
Jak przygotować się do rozmowy rekrutacyjnej na Python DeveloperaJak przygotować się do rozmowy rekrutacyjnej na Python Developera
Jak przygotować się do rozmowy rekrutacyjnej na Python DeveloperaWojciech Lichota
 
Raspberry pi - tiny hardware, huge idea
Raspberry pi - tiny hardware, huge ideaRaspberry pi - tiny hardware, huge idea
Raspberry pi - tiny hardware, huge ideaWojciech Lichota
 
Anty-wzorce w różnorodności w branży it
Anty-wzorce w różnorodności w branży itAnty-wzorce w różnorodności w branży it
Anty-wzorce w różnorodności w branży itAgata Landzwójczak
 
Continuous Deployment aplikacji w Django
Continuous Deployment aplikacji w DjangoContinuous Deployment aplikacji w Django
Continuous Deployment aplikacji w DjangoWojciech Lichota
 

Viewers also liked (12)

Grok Prezentacja
Grok PrezentacjaGrok Prezentacja
Grok Prezentacja
 
Compiled Websites with Plone, Django, Xapian and SSI
Compiled Websites with Plone, Django, Xapian and SSICompiled Websites with Plone, Django, Xapian and SSI
Compiled Websites with Plone, Django, Xapian and SSI
 
Sandman - makes things REST
Sandman - makes things RESTSandman - makes things REST
Sandman - makes things REST
 
Grok Artykul
Grok ArtykulGrok Artykul
Grok Artykul
 
Transakcyjność w django
Transakcyjność w djangoTransakcyjność w django
Transakcyjność w django
 
Jak działa CPython
Jak działa CPythonJak działa CPython
Jak działa CPython
 
Zwinność procesu rekrutacyjnego w branży IT
Zwinność procesu rekrutacyjnego w branży ITZwinność procesu rekrutacyjnego w branży IT
Zwinność procesu rekrutacyjnego w branży IT
 
Pyra stxnext
Pyra stxnextPyra stxnext
Pyra stxnext
 
Jak przygotować się do rozmowy rekrutacyjnej na Python Developera
Jak przygotować się do rozmowy rekrutacyjnej na Python DeveloperaJak przygotować się do rozmowy rekrutacyjnej na Python Developera
Jak przygotować się do rozmowy rekrutacyjnej na Python Developera
 
Raspberry pi - tiny hardware, huge idea
Raspberry pi - tiny hardware, huge ideaRaspberry pi - tiny hardware, huge idea
Raspberry pi - tiny hardware, huge idea
 
Anty-wzorce w różnorodności w branży it
Anty-wzorce w różnorodności w branży itAnty-wzorce w różnorodności w branży it
Anty-wzorce w różnorodności w branży it
 
Continuous Deployment aplikacji w Django
Continuous Deployment aplikacji w DjangoContinuous Deployment aplikacji w Django
Continuous Deployment aplikacji w Django
 

Similar to Apache http server - proste i zaawansowane przypadki użycia

Krytyczne błędy konfiguracji
Krytyczne błędy konfiguracjiKrytyczne błędy konfiguracji
Krytyczne błędy konfiguracjiLogicaltrust pl
 
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Polcode
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegroallegro.tech
 
Optymalizacja aplikacji ASP.NET
Optymalizacja aplikacji ASP.NETOptymalizacja aplikacji ASP.NET
Optymalizacja aplikacji ASP.NETBartlomiej Zass
 
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaThymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaMaciej Ziarko
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?Brainhub
 
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?The Software House
 
Laravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravel Poland MeetUp
 
Błędy userów, niedoróbki koderów
Błędy userów, niedoróbki koderówBłędy userów, niedoróbki koderów
Błędy userów, niedoróbki koderówArkadiusz Stęplowski
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Cloudskraqa
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJSSages
 
Zhakuj swojego Wordpressa, WordUP Trojmiasto
Zhakuj swojego Wordpressa, WordUP TrojmiastoZhakuj swojego Wordpressa, WordUP Trojmiasto
Zhakuj swojego Wordpressa, WordUP Trojmiastosecman_pl
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptJacek Okrojek
 
NK API - Przykłady
NK API - PrzykładyNK API - Przykłady
NK API - Przykładynasza-klasa
 
Websites vs Cloud Services - OLMUG
Websites vs Cloud Services - OLMUGWebsites vs Cloud Services - OLMUG
Websites vs Cloud Services - OLMUGBart Zaremba
 
Bezpieczenstwo Portali Spolecznosciowych W Ujeciu Robakow Web 20 Pingwinaria2009
Bezpieczenstwo Portali Spolecznosciowych W Ujeciu Robakow Web 20 Pingwinaria2009Bezpieczenstwo Portali Spolecznosciowych W Ujeciu Robakow Web 20 Pingwinaria2009
Bezpieczenstwo Portali Spolecznosciowych W Ujeciu Robakow Web 20 Pingwinaria2009Logicaltrust pl
 
Optimizing Drupal Performance (Polish)
Optimizing Drupal Performance (Polish)Optimizing Drupal Performance (Polish)
Optimizing Drupal Performance (Polish)Timur Kamanin
 

Similar to Apache http server - proste i zaawansowane przypadki użycia (20)

Krytyczne błędy konfiguracji
Krytyczne błędy konfiguracjiKrytyczne błędy konfiguracji
Krytyczne błędy konfiguracji
 
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
 
Optymalizacja aplikacji ASP.NET
Optymalizacja aplikacji ASP.NETOptymalizacja aplikacji ASP.NET
Optymalizacja aplikacji ASP.NET
 
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaThymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?
 
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
 
Laravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelniania
 
Jaki hosting pod wordpressa
Jaki hosting pod wordpressaJaki hosting pod wordpressa
Jaki hosting pod wordpressa
 
Błędy userów, niedoróbki koderów
Błędy userów, niedoróbki koderówBłędy userów, niedoróbki koderów
Błędy userów, niedoróbki koderów
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJS
 
Zhakuj swojego Wordpressa, WordUP Trojmiasto
Zhakuj swojego Wordpressa, WordUP TrojmiastoZhakuj swojego Wordpressa, WordUP Trojmiasto
Zhakuj swojego Wordpressa, WordUP Trojmiasto
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScript
 
NK API - Przykłady
NK API - PrzykładyNK API - Przykłady
NK API - Przykłady
 
Websites vs Cloud Services - OLMUG
Websites vs Cloud Services - OLMUGWebsites vs Cloud Services - OLMUG
Websites vs Cloud Services - OLMUG
 
[TestWarez 2017] Architektura frameworka testowego
[TestWarez 2017] Architektura frameworka testowego[TestWarez 2017] Architektura frameworka testowego
[TestWarez 2017] Architektura frameworka testowego
 
Bezpieczenstwo Portali Spolecznosciowych W Ujeciu Robakow Web 20 Pingwinaria2009
Bezpieczenstwo Portali Spolecznosciowych W Ujeciu Robakow Web 20 Pingwinaria2009Bezpieczenstwo Portali Spolecznosciowych W Ujeciu Robakow Web 20 Pingwinaria2009
Bezpieczenstwo Portali Spolecznosciowych W Ujeciu Robakow Web 20 Pingwinaria2009
 
Optimizing Drupal Performance (Polish)
Optimizing Drupal Performance (Polish)Optimizing Drupal Performance (Polish)
Optimizing Drupal Performance (Polish)
 

Apache http server - proste i zaawansowane przypadki użycia

  • 1. Apache HTTP Server proste i zaawansowane przypadki użycia Wojciech Lichota maj 2012
  • 2. Agenda 1. Wstęp 2. 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
  • 3. 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ń
  • 4. Konfiguracja Plik httpd.conf i pliki jawnie dołączane przez parametr Include Nadpisywanie przez plik.htaccess Parametr i wartość, np.: DocumentRoot "/var/www/html" Grupowanie, np.: <Directory "/var/www/cgi-bin"> ... </Directory>
  • 5. Komendy Zarządzenie procesem: apachectl ● start, stop, restart ● reload ● graceful ● status ● configtest Zarządzenie plikiem haseł: htpasswd Testowanie wydajności: ab
  • 6. Konfiguracja - RedHat 1. Pliki: /etc/httpd/... conf/httpd.conf conf.d/*.conf vhost.d/*.conf 2. Komendy: /etc/init.d/httpd 3. Logi: /var/log/httpd/... access.log error.log
  • 7. Konfiguracja - Debian 1. Pliki: /etc/apache2/... httpd.conf mods-available/*.conf mods-enabled/*.conf sites-available/*.conf sites-enabled/*.conf 2. Komendy: /etc/init.d/apache2 a2enmod, a2dismod a2ensite, a2dissite
  • 8. Logi Parametry: ○ Format logowania LogFormat "%t %r %>s %b" combined ○ Logowanie rządań CustomLog "access.log" combined ○ Logowanie błędów ErrorLog "error.log"
  • 9. HTTPS - mod_ssl Minimum: SSLEngine on SSLProxyEngine on SSLCertificateFile server.crt SSLCertificateKeyFile server.key Dodatkowo: SSLProtocol SSLCipherSuite SSLOptions
  • 10. 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
  • 11. Virtual Host Pozwala definiować inną konfigurację dla domen. Określa jakie domeny są obsługiwane na jakim interfejsie sieciowym bądź porcie. Listen 80 NameVirtualHost *:80 <VirtualHost *:80> ServerName server.domain.com ServerAlias www.server.domain.com ... </VirtualHost>
  • 12. Serwowanie plików <VirtualHost *:80> DocumentRoot /var/www/vhost/html <Directory /var/www/vhost/html> AllowOverride None Order allow,deny Allow from all </Directory> <Location /files> Options Indexes FollowSymLinks </Location> </VirtualHost>
  • 13. Serwowanie aplikacji mod_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>
  • 14. Serwowanie aplikacji mod_rewrite <VirtualHost *:80> ServerName vhost.example.com RewriteEngine On RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R] </VirtualHost> <VirtualHost *:443> ServerName vhost.example.com DocumentRoot /var/www/vhost/html RewriteEngine On RewriteRule ^/static/(.*) /static/$1 [L] RewriteRule ^/(.*)$ http://127.0.0.1:8080/$1 [L,P] </VirtualHost>
  • 15. Serwowanie aplikacji mod_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ą
  • 16. Serwowanie aplikacji mod_rewrite ServerName example.com ServerAlias pl.example.com ServerAlias example.com.pl RewriteEngine on RewriteCond %{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]
  • 17. Serwowanie aplikacji mod_rewrite ServerName example.com ServerAlias *.example.com RewriteEngine On RewriteRule .* - [E=lang:en] RewriteCond %{HTTP_HOST} (.*).example.com RewriteRule .* - [E=lang:%1] RequestHeader set X_SITE_LANG %{lang}e RewriteRule ^/(.*)$ http://127.0.0.1:8080/$1 [L,P]
  • 18. Serwowanie aplikacji mod_wsgi Moduł pozwala hostować aplikacje obsługujące interface WSGI. Udostępnia 3 tryby: ● WSGIScriptAlias ● SetHandler ● WSGIDaemonProcess
  • 19. Serwowanie aplikacji mod_wsgi - WSGIScriptAlias <VirtualHost *:80> ServerName django.example.com DocumentRoot /var/www/django <Directory /var/www/django/> Order allow,deny Allow from all </Directory> RewriteEngine On RewriteRule ^/site-media/(.*) /site-media/$1 [L] WSGIScriptAlias / /var/www/django/wsgi.py </VirtualHost>
  • 20. Serwowanie aplikacji mod_wsgi - SetHandler <VirtualHost *:80> ServerName wsgiapp.example.com Alias / /var/www/wsgiapp/ <Directory /var/www/wsgiapp/> Options ExecCGI SetHandler wsgi-script Order allow,deny Allow from all </Directory> </VirtualHost>
  • 21. Serwowanie aplikacji mod_wsgi - WSGIDaemonProcess WSGIDaemonProcess app-name processes=3 threads=10 WSGIScriptAlias / /var/www/wsgiapp/wsgi.py <Directory /var/www/wsgiapp/> Options ExecCGI WSGIProcessGroup app-name Order allow,deny Allow from all </Directory>
  • 22. "Cachowanie" w przeglądarce ExpiresActive On ExpiresDefault A0 ExpiresByType application/x-javascript A604800 ExpiresByType application/javascript A604800 ExpiresByType 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"
  • 23. 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 ETag Header unset Last-Modified Header unset Cache-Control Header unset Expires Header unset Content-Range WSGIScriptAlias / /var/www/django/wsgi.py </VirtualHost>
  • 24. Modyfikacja nagłówków mod_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
  • 25. Modyfikacja nagłówków mod_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
  • 26. Podstawowe uwierzytelnianie <Location /> AuthType Basic AuthName "Password Required" AuthUserFile /etc/httpd/users.auth Require valid-user </Location> Komendy: htpasswd -cm /etc/httpd/users.auth user1 htpasswd -m /etc/httpd/users.auth user2 htpasswd -D /etc/httpd/users.auth user1
  • 27. Uwierzytelnianie LDAP mod_ldap <Location /> AuthType Basic AuthName "LDAP" AuthBasicProvider ldap Require valid-user AuthLDAPURL "..." AuthzLDAPAuthoritative off AuthLDAPGroupAttributeIsDN on </Location> ldap://ldap.softax.pl:389/ou=Accounts,dc=softax,dc=pl?uid ldap://ldap.softax.local/ou=Accounts,dc=softax,dc=local?uid ldap://ldap.stxnext.local/ou=people,dc=stxnext,dc=local?uid
  • 28. Silnik Apache mpm_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>
  • 29. Silnik Apache mpm_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>
  • 30. 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.