Web сервера
Смаль Дмитрий
smal@corp.mail.ru
Что такое web-сервер
Терминология

Порт (port)

Соединение (connection)

Сокет (socket)

Запрос (request)

Локейшен (location)

Файлы и директории

Файл настроек (httpd.conf)

Лог доступ (access log)

Лог ошибок (error log)
Запуск web сервера
1) Команда на запуск
sudo /etc/init.d/httpd start
/usr/sbin/httpd -f /home/me/httpd.conf
2) Чтение файла конфигурации
3) Получение порта 80
4) Открытие (создание) логов
5) Понижение привелегий (*)
6) Запуск дочерних процесов/потоков (*)
7) Готов к обработке запроса
Обработка запроса
Пример конфигурации
Listen 80
User www
DirectoryIndex index.html
DocumentRoot /www/htdocs
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.domain.ru
DocumentRoot /www/domain
ErrorLog /var/log/domain/error_log
CustomLog /var/log/domain/access_log
<Directory "/var/www/html">
Options Indexes FollowSymLinks
</Directory>
</VirtualHost>
Основные секции и директивы
<VirtualHost> – конфигурация для домена
<Location /admin> </Location>
<LocationMatch .svn> </LocationMatch>
<Directory /htdocs> </Directory>
<DirectoryMatch /inc/> </DirectoryMatch>
DocumentRoot /www/htdocs
Alias /www/htdocs/
Порядок применения
1) VirtualHost – по заголовку Host
2) DocumentRoot / Alias – вычисление пути
3) Directory и .htaccess
3) DirectoryMatch
4) Files и FilesMatch
4) Location и LocationMatch
Приоритеты – в обратном порядке
Модульная архитектура
1) web сервер – не монолитный
2) LoadModule – загрузка модулей
3) Этапы обработки запроса и модули
4) Дополнительные директивы, контексты
5) Примеры: mod_mime, mod_mime_magic,
mod_autoindex, mod_rewrite, mod_cgi,
mod_perl, mod_gzip
mod_rewrite
RewriteEngine on
# запрет картинок для сторонних сайтов
RewriteBase /img/
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .(jpe?g|gif|png|css|swf)$ - [ F ]
# несуществующие документы – на другой сервер
RewriteBase /
RewriteCond /your/docroot/%{REQUEST_FILENAME} !-f
RewriteRule ^(.+) http://webserverB.dom/
Простейший TCP сервер
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8080))
s.listen(10)
while True:
conn, addr = s.accept()
request = conn.recv(1024).decode('utf8')
url = request.rstrip("rn")
file = open('/www' + str(url), 'r')
data = file.read(1024).encode('utf8')
conn.send(data)
file.close()
Blocking I/O
Как обслужить более 1 клиента?
1) Многопоточность (threads)
+ экономия памяти
+ быстрый запуск потока
- все библиотеки должны быть thread-safe
2) Дочерние процессы (prefork)
+ простота, не обязательно thread-safe
- потребление памяти
- медленый запуск процессов
3) Комбинированный режим (worker)
Non-blocking I/O
AIO
Event Driven Programming
1) множество открытых файлов
2) select, kqueue, epoll, aio...
3) последовательное исполнение → события
4) “20 байт из сокета A”, “6 байт из файла B”
+ быстро, никакого сна
+ экономия памяти. 1 клиент – 1 структура
+ большое количество клиентов
- очень тяжело программировать
- блокирующие вызовы запрещены
Кто есть Who.
1) Apache – prefork, worker, С
2) ISS, Tomcat, Jetty – threads, Java
3) Starman, Hypnotoad – prefork, языки
высокого уровня
4) nginx, lighttpd – асинхронные, С
5) Node.JS, Tornado, POE – асинхронные,
языки высокого уровня
6) Erlang!
Front-end и Back-end
Front-end
Легкий, множество соединений
1) отдача статических файлов
2) проксирование (reverse proxy)
3) балансировка нагрузки
4) кеширование
5) сборка SSI
6) авторизация, SSL, нарезка картинок
Проксирование в nginx
upstream backend {
server back1.example.com:8080 weight=1;
server back2.example.com:8080 weight=2;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 60s;
location / {
proxy_pass http://backend;
}
location ~ /(img|css|js)/ {
root /www/static;
}
location /partner/ {
proxy_pass http://www.partner.com;
Back-end
Удобный, обработка сложных запросов,
запуск скриптов.
1) CGI
2) FastCGI
3) mod_perl, mod_python, mod_php, PHP!!!
4) PSGI, WSGI, Rack
5) apache не нужен ?
Полезные утилиты
1) top – список запущенных процессов
top -d 1
2) netstat – список сетевых соединений
netstat -t
3) telnet – элементарный tcp клиент
telnet mail.ru 80
4) ab – нагрузочное тестирование
ab -n 1000 -c 10 http://mail.ru/
Домашнее заданиe
1) Настроить Apache для запуска CGI
2) Написать Hello World CGI скрипт
1) Настроить Apache 2.2 для отдачи статики
2) Настроить nginx для отдачи статики
3) Сравнить производительность с помощью
ab (ApacheBenchmark)

Web весна 2012 лекция 3

  • 1.
  • 2.
  • 3.
    Терминология  Порт (port)  Соединение (connection)  Сокет(socket)  Запрос (request)  Локейшен (location)  Файлы и директории  Файл настроек (httpd.conf)  Лог доступ (access log)  Лог ошибок (error log)
  • 4.
    Запуск web сервера 1)Команда на запуск sudo /etc/init.d/httpd start /usr/sbin/httpd -f /home/me/httpd.conf 2) Чтение файла конфигурации 3) Получение порта 80 4) Открытие (создание) логов 5) Понижение привелегий (*) 6) Запуск дочерних процесов/потоков (*) 7) Готов к обработке запроса
  • 5.
  • 6.
    Пример конфигурации Listen 80 Userwww DirectoryIndex index.html DocumentRoot /www/htdocs NameVirtualHost *:80 <VirtualHost *:80> ServerName www.domain.ru DocumentRoot /www/domain ErrorLog /var/log/domain/error_log CustomLog /var/log/domain/access_log <Directory "/var/www/html"> Options Indexes FollowSymLinks </Directory> </VirtualHost>
  • 7.
    Основные секции идирективы <VirtualHost> – конфигурация для домена <Location /admin> </Location> <LocationMatch .svn> </LocationMatch> <Directory /htdocs> </Directory> <DirectoryMatch /inc/> </DirectoryMatch> DocumentRoot /www/htdocs Alias /www/htdocs/
  • 8.
    Порядок применения 1) VirtualHost– по заголовку Host 2) DocumentRoot / Alias – вычисление пути 3) Directory и .htaccess 3) DirectoryMatch 4) Files и FilesMatch 4) Location и LocationMatch Приоритеты – в обратном порядке
  • 9.
    Модульная архитектура 1) webсервер – не монолитный 2) LoadModule – загрузка модулей 3) Этапы обработки запроса и модули 4) Дополнительные директивы, контексты 5) Примеры: mod_mime, mod_mime_magic, mod_autoindex, mod_rewrite, mod_cgi, mod_perl, mod_gzip
  • 10.
    mod_rewrite RewriteEngine on # запреткартинок для сторонних сайтов RewriteBase /img/ RewriteCond %{HTTP_REFERER} !^$ RewriteRule .(jpe?g|gif|png|css|swf)$ - [ F ] # несуществующие документы – на другой сервер RewriteBase / RewriteCond /your/docroot/%{REQUEST_FILENAME} !-f RewriteRule ^(.+) http://webserverB.dom/
  • 11.
    Простейший TCP сервер importsocket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('127.0.0.1', 8080)) s.listen(10) while True: conn, addr = s.accept() request = conn.recv(1024).decode('utf8') url = request.rstrip("rn") file = open('/www' + str(url), 'r') data = file.read(1024).encode('utf8') conn.send(data) file.close()
  • 12.
  • 13.
    Как обслужить более1 клиента? 1) Многопоточность (threads) + экономия памяти + быстрый запуск потока - все библиотеки должны быть thread-safe 2) Дочерние процессы (prefork) + простота, не обязательно thread-safe - потребление памяти - медленый запуск процессов 3) Комбинированный режим (worker)
  • 14.
  • 15.
  • 16.
    Event Driven Programming 1)множество открытых файлов 2) select, kqueue, epoll, aio... 3) последовательное исполнение → события 4) “20 байт из сокета A”, “6 байт из файла B” + быстро, никакого сна + экономия памяти. 1 клиент – 1 структура + большое количество клиентов - очень тяжело программировать - блокирующие вызовы запрещены
  • 17.
    Кто есть Who. 1)Apache – prefork, worker, С 2) ISS, Tomcat, Jetty – threads, Java 3) Starman, Hypnotoad – prefork, языки высокого уровня 4) nginx, lighttpd – асинхронные, С 5) Node.JS, Tornado, POE – асинхронные, языки высокого уровня 6) Erlang!
  • 18.
  • 19.
    Front-end Легкий, множество соединений 1)отдача статических файлов 2) проксирование (reverse proxy) 3) балансировка нагрузки 4) кеширование 5) сборка SSI 6) авторизация, SSL, нарезка картинок
  • 20.
    Проксирование в nginx upstreambackend { server back1.example.com:8080 weight=1; server back2.example.com:8080 weight=2; } proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_read_timeout 60s; location / { proxy_pass http://backend; } location ~ /(img|css|js)/ { root /www/static; } location /partner/ { proxy_pass http://www.partner.com;
  • 21.
    Back-end Удобный, обработка сложныхзапросов, запуск скриптов. 1) CGI 2) FastCGI 3) mod_perl, mod_python, mod_php, PHP!!! 4) PSGI, WSGI, Rack 5) apache не нужен ?
  • 24.
    Полезные утилиты 1) top– список запущенных процессов top -d 1 2) netstat – список сетевых соединений netstat -t 3) telnet – элементарный tcp клиент telnet mail.ru 80 4) ab – нагрузочное тестирование ab -n 1000 -c 10 http://mail.ru/
  • 25.
    Домашнее заданиe 1) НастроитьApache для запуска CGI 2) Написать Hello World CGI скрипт 1) Настроить Apache 2.2 для отдачи статики 2) Настроить nginx для отдачи статики 3) Сравнить производительность с помощью ab (ApacheBenchmark)