ASF, 协议实现的软件程序, HTTPD特性
HTTP基本应用,客户端工具使用(telnet, elinks, curl)
ASF: Apache Software Foundation Apache 软件基金会
FSF: Free Software Foundaton 自由软件基金会
ASF赖以起家的是: httpd<命名:apache>
http协议实现
Http特性
模块化设计:DSO(Dynamic Share Object)
MPM机制(Multipurpose Process Modules) 多路处理模块
HTTP安装
httpd.i686 //The Apache HTTP Server is a powerful, efficient, and extensible //强大、高效、可扩展
/etc/httpd //家目录 /etc/httpd/conf.d //配置片段目录 /etc/httpd/conf/httpd.conf //主配置 /etc/httpd/logs //日志目录 /etc/httpd/modules //模块目录 /etc/httpd/run //运行中的进程的数据 /etc/rc.d/init.d/httpd //服务脚本 /etc/sysconfig/httpd //服务脚本配置 /usr/lib/httpd/modules /usr/lib/httpd/modules/mod_actions.so //DSO机制,动态共享对象 /usr/sbin/apachectl //apachectl程序 /usr/sbin/httpd //MPM为IO,串行响应的进程 /usr/sbin/httpd.event //MPM为复用I/O模型,并行响应的进程 <2.2的httpd,event不成熟> /usr/sbin/httpd.worker //MPM............................. //ps axu | fgrep httpd可查看 /usr/share/doc/httpd-2.2.15 //<DOCUMENTATION> /usr/share/doc/httpd-2.2.15/ABOUT_APACHE /usr/share/doc/httpd-2.2.15/CHANGES /usr/share/doc/httpd-2.2.15/LICENSE /usr/share/doc/httpd-2.2.15/NOTICE /usr/share/doc/httpd-2.2.15/README /usr/share/doc/httpd-2.2.15/VERSIONING /usr/share/man/man8/apachectl.8.gz //<MAN Document> /usr/share/man/man8/htcacheclean.8.gz /usr/share/man/man8/httpd.8.gz /usr/share/man/man8/rotatelogs.8.gz /usr/share/man/man8/suexec.8.gz /var/cache/mod_proxy //<缓存目录> /var/lib/dav //<程序运行中的数据> /var/log/httpd //《日志目录》 /var/run/httpd //《运行中的httpd进程的数据》 /var/www/error/ //错误页面html网页存放目录 /var/www/html //DocuRoot目录,资源路径的根映射的位置
httpd配置文件
/etc/httpd/conf/httpd.conf //首次配置需要备份文件: # cp -v /etc/httpd/conf/httpd.conf{,.bak}
配置文件格式
# fgrep ‘Section‘ /etc/httpd/conf/httpd.conf ### Section 1: Global Environment //全局环境:定义httpd通用功能特性 ### Section 2: ‘Main‘ server configuration //主配置段:一个服务器提供单个站点 ### Section 3: Virtual Hosts //虚拟主机:一个服务器提供多个站点
配置指令格式
Directive(指令) Value(值) 指令:不区分大小写 值:可能区分大小写
1、port
使用示例
1、备份文件 # cp -v /etc/httpd/conf/httpd.conf{,.bak} 监听在不同端口 Listen 80 Listen 8080 2、重启 # service httpd restart # ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 :::8080 :::* LISTEN 0 128 :::80 :::*
2、持久和非持久连接
//并发访问量过大场景,时间或数量限制过大时,可能会导致后续的请求被[拒绝服务],可以关闭或调整时间或数量限制
不同版本对应的特性
httpd-2.0配置持久连接
KeepAlive Off //持久连接功能 MaxKeepAliveRequests 100 // persistent connetion 内所允许的最大请求数量,<调高数字获取较大性能> KeepAliveTimeout 15 //在TCP连接上等待请求的最大秒数
telnet协议客户端命令
使用示例
连接即刻断开
连接不会立即断开
3、MPM 并发响应模型Multipath Process Module
10多种[适用在多种平台之上] Linux: prefork, worker, event 编译时,一次只能编译单个模块
1)查看当前使用的模块
2)查看装载的模块
3)更换MPM
复用IO,线程 启动瞬间:5个,1个僵尸 root 2494 1.0 1.4 11688 3560 ? Ss 19:07 0:00 /usr/sbin/httpd.worker apache 2496 0.0 0.0 0 0 ? Z 19:07 0:00 [httpd.worker] <defunct> apache 2497 0.0 1.1 289420 2964 ? Sl 19:07 0:00 /usr/sbin/httpd.worker apache 2498 0.0 1.1 289420 2960 ? Sl 19:07 0:00 /usr/sbin/httpd.worker apache 2499 0.0 1.1 289420 2960 ? Sl 19:07 0:00 /usr/sbin/httpd.worker apache 2528 0.0 1.1 289420 2960 ? Sl 19:07 0:00 /usr/sbin/httpd.worker 过了几秒后,4个线程 root 2224 0.0 1.4 11688 3568 ? Ss 19:06 0:00 /usr/sbin/httpd.worker apache 2228 0.0 1.1 289420 2972 ? Sl 19:06 0:00 /usr/sbin/httpd.worker apache 2229 0.0 1.1 289420 2972 ? Sl 19:06 0:00 /usr/sbin/httpd.worker apache 2230 0.0 1.1 289420 2964 ? Sl 19:06 0:00 /usr/sbin/httpd.worker 复用IO,线程 root 2644 0.2 1.4 11676 3548 ? Ss 19:08 0:00 /usr/sbin/httpd.event apache 2647 0.0 1.1 289408 2848 ? Sl 19:08 0:00 /usr/sbin/httpd.event apache 2648 0.0 1.1 289408 2852 ? Sl 19:08 0:00 /usr/sbin/httpd.event apache 2649 0.0 1.1 289408 2852 ? Sl 19:08 0:00 /usr/sbin/httpd.event
4)MPM配置详解 /etc/httpd/conf/httpd.conf <网站的承载能力有一定影响>
# prefork MPM # StartServers: 启动服务器后,预留的进程数 # MinSpareServers: minimum number of server processes which are kept spare # MaxSpareServers: maximum number of server processes which are kept spare # ServerLimit: 服务器的生命周期内为MaxClients准备的最大值 # MaxClients: 最大并发数 # MaxRequestsPerChild: 每个进程最大响应请求数 <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 </IfModule> # worker MPM # StartServers: 启动服务预留进程数 # MaxClients: 最大并发数 # MinSpareThreads: 最小并发数 # MaxSpareThreads: maximum number of worker threads which are kept spare # ThreadsPerChild: 每个进程内的线程数 # MaxRequestsPerChild: 每个线程最多响应请求数 <IfModule worker.c> StartServers 4 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 //0表示没有上限 </IfModule> 配置:影响网站的承载能力
PV承载量= \(每秒请求资源数 * 86400 \)/每个页面的资源数 //满载工作
考虑:全天满负荷运行?带宽使用大小?
带宽:每个PV消耗多少KB * PV承载量
使用示例
查看此模块已经被装载 # httpd -M | fgrep deflate_module deflate_module (shared) 禁用 #LoadModule deflate_module modules/mod_deflate.so 重载 # service httpd reload 查看 # httpd -M | fgrep deflate_module Syntax OK
4、URL资源路径映射之一:DocRoot <资源路径的根映射为文件系统的哪个目录>
使用示例:
默认配置
在配置文件中,定义DocumentRoot指令
DocumentRoot "/var/www/html"
给出默认主页
# cat > /var/www/html/index.html << EOF <html> <head> <title>MageEdu</title> </head> <body> <h1>Hello</h1> <p> <a href="https://s5.51cto.com/wyfs02/M00/07/31/wKiom1nEuS7Tii_KAAA2TqP_0qY316.png">haha</p> </body> </html> EOF
重载配置文件
# httpd -t //先测试语法 # service httpd reload //重载配置文件
在浏览器中访问时:
非默认配置
在配置文件中,定义DocumentRoot指令
DocumentRoot "/www/htdocs"
准备根映射路径
# install -d /www/htdocs # echo ‘Test Page‘ > /www/htdocs/index.html
重载配置文件
# httpd -t # service httpd reload
二次测试
5、站点访问控制
6、默认主页面
DirectoryIndex index.html index.html.var
自左向右,依次匹配给出目录下的文件,存在时,显示
7、文件系统路径访问控制
7、1基于来源地址
使用示例
Indexes<下载站使用>
1、允许索引 DocumentRoot "/www/htdocs" <Directory "/var/www/html"> Options Indexes FollowSymLinks # mv /etc/httpd/conf.d/welcome.conf{,.bak} # mv /var/www/html/index.html{,.bak} 2、重载 # httpd -t # service httpd reload
2、允许索引 DocumentRoot "/www/htdocs" <Directory "/www/htdocs"> Options Indexes FollowSymLinks # httpd -t # service httpd reload
FollowSymlinks
1、允许跟踪 DocumentRoot "/www/htdocs" <Directory "/www/htdocs"> Options Indexes FollowSymLinks # ln -s / /www/htdocs/hello
2、不允许跟踪 DocumentRoot "/www/htdocs" <Directory "/www/htdocs"> Options Indexes -FollowSymLinks # httpd -t # service httpd reload
来源地址访问控制
配置 Order deny,allow deny from 192.168.1.100
7、2用户访问控制
安全域:认证后方能访问的目录,应该用名称标识
定义在/etc/httpd/conf/httpd.conf文件中
1)基于用户认证
2)基于组认证
使用示例
1、创建目录,使之能访问
# install -d /www/htdocs/admin # echo "hello" > /www/htdocs/admin/index.html
2、添加配置
<Directory "/www/htdocs/admin"> Options None AllowOverride None AuthType Basic AuthName "Administrator private" AuthUserFile "/etc/httpd/conf.d/.htpasswd" Require valid-user </Directory>
# httpd -t # service httpd reload # htpasswd -c -m /etc/httpd/conf.d/.htpasswd tom # htpasswd -m /etc/httpd/conf.d/.htpasswd obama # htpasswd -m /etc/httpd/conf.d/.htpasswd obama
3、添加组配置
<Directory "/www/htdocs/admin"> Options None AllowOverride None AuthType Basic AuthName "Administrator private" AuthUserFile "/etc/httpd/conf.d/.htpasswd" AuthGroupFile "/etc/httpd/conf.d/.htgroup" Require group weblogic </Directory>
# httpd -t # service httpd reload
8、日志设定
错误日志
1、日志为链接路径
访问日志
官方:httpd.apache.org http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#logformat Documetation --> 2.2 --> 日志文件
192.168.206.1 - tom [18/Sep/2017:02:59:24 +0800] "GET /admin/ HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" %h 宏,替换为请求者IP %h remote host, 客户端IP %l remote logname,登陆的用户名, mod_ident模块 为空时,用 " - " 表示 %u remote user, 用户访问控制的basic, digst认证的用户名 为空时,用 " - " 表示 %t Time the request was received (standard english format) 请求被服务器接收的时间 %r First line of request 请求报文的首行: telnet> GET / HTTP/1.1 %>s Status 响应状态码 %b Size of response in bytes excluding[排除] HTTP headers %{Referer}i 请求报文当中referer变量值,到达当前页面的入口 " - " 网站有名 "不为空时,网站的广告有效" ${User-Agent}i 请求报文中,usergent变量值: 用户代理:发起请求的用到的进程< elink, ab, telnet, 浏览器, curl > 搜索引擎是爬虫爬出来的>
9、路径别名
使用示例
DocumentRoot "/www/htdocs" Alias /bbs "/forum/htdocs" # mkdir -pv /forum/htdocs # cat /forum/htdocs/index.html <html> <head> <title>Test</title> </head> <body> <h1></h1> <p> <a href="https://s5.51cto.com/wyfs02/M01/A5/E2/wKioL1nEuHezY3RsAABFaz2unFQ496.png">hello</a> </body> </html> 访问: http://192.168.206.128/bbs/
10、字符集设定
11、虚拟主机
虚拟主机的类型
基于名称完成不同虚拟主机的识别
封装时: HTTP首部、TCP首部、IP首部、帧首部..
Host: 浏览器键入的主机名 //"应用层首部"中附加,非通信子网
配置前提
虚拟主机配置格式
1、基于IP,配置虚拟主机(不易记,IP需要购买)
#DocumentRoot "/www/htdocs" <VirtualHost 192.168.206.128:80> ServerName web1.magedu.com DocumentRoot "/www/web1/htdocs" </VirtualHost> <VirtualHost 192.168.206.129:80> ServerName web2.magedu.com DocumentRoot "/www/web2/htdocs" </VirtualHost> # mkdir -pv /www/{web1,web2,web3,web4,web5,web6}/htdocs # echo "web1.magedu.com" > /www/web1/htdocs/index.html # echo "web2.magedu.com" > /www/web2/htdocs/index.html # ip addr add 192.168.206.139/24 dev eth0
测试
# httpd -t Syntax OK # service httpd reload
登陆
2、基于端口,配置虚拟主机(用的少)
Listen 8080 Listen 8888 <VirtualHost 192.168.206.139:8080> ServerName web3.magedu.com DocumentRoot "/www/web3/htdocs" </VirtualHost> <VirtualHost 192.168.206.139:8888> ServerName web4.magedu.com DocumentRoot "/www/web4/htdocs" </VirtualHost> # echo "web3.magedu.com" > /www/web3/htdocs/index.html # echo "web4.magedu.com" > /www/web4/htdocs/index.html
测试
# httpd -t # service httpd restart
登陆
3、基于Host,配置虚拟主机(在应用层封装Host首部即可)
NameVirtualHost *:80 <VirtualHost *:80> ServerName web5.magedu.com DocumentRoot "/www/web5/htdocs" </VirtualHost> <VirtualHost *:80> ServerName web6.magedu.com DocumentRoot "/www/web6/htdocs" </VirtualHost> # echo "web5.magedu.com" > /www/web5/htdocs/index.html # echo "web6.magedu.com" > /www/web6/htdocs/index.html
测试
# httpd -t # service httpd reload
登陆
1、启动一个新的客户机 完成主机名到ip的映射 192.168.206.128 web1.magedu.com web2.magedu.com web3.magedu.com web5.magedu.com 2、测试 # yum -y install curl # curl web5.magedu.com web5.magedu.com # curl web6.magedu.com web6.magedu.com