web весна 2012 лекция 3
TRANSCRIPT
Web сервера
Смаль Дмитрий[email protected]
Что такое 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_rewriteRewriteEngine 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("\r\n")
file = open('/www' + str(url), 'r')
data = file.read(1024).encode('utf8')
conn.send(data)
file.close()
conn.close()
Blocking I/O
Как обслужить более 1
клиента?1) Многопоточность (threads)
+ экономия памяти
+ быстрый запуск потока
- все библиотеки должны быть thread-safe
2) Дочерние процессы (prefork)
+ простота, не обязательно thread-safe
- потребление памяти
- медленый запуск процессов
3) Комбинированный режим (worker)
Non-blocking I/O
AIO
Event Driven Programming1) множество открытых файлов
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!
7) Для разработки.
Front-end и Back-end
Front-end
Легкий, множество соединений
1) отдача статических файлов
2) проксирование (reverse proxy)
3) балансировка нагрузки
4) кеширование
5) сборка SSI
6) авторизация, SSL, нарезка картинок
Проксирование в nginxupstream 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)