一、网站基础;
二、HTTP协议分析;
三、TCP数据包状态分析;
四、apache原理详解;
五、案例:搭建apache网站服务;
1.域名:域名是一个IP地址的“面具” ,目的是便于记忆和访问一个或一组服务器的地址(网站,电子邮件,FTP等)。
2.域名解析:本地HOSTS解析、DNS服务器解析
3.网站的基本概念:网站、网页、主页;HTTP、URL、HTML、超链接
4.web网站:有web1.0(以编辑为特征)和web2.0(侧重用户交互)
5.动态页面与静态页面的差别:
1)URL不同:静态页面没有?、动态页面包含?
2)后缀不同(开发语言不同):静态页面一般以.html/.htm/.xml;动态页面一般以.php/.asp/.jsp/.pl/.py/.cgi等为后缀
3)静态页面的内容是固定的,动态页面的内容会因用户、浏览器、时间、地点等而发生变化。
http://(协议头)cn.bing.com(域名)/(URI资源:路径/文件名):
https://jx.tmall.com/?ali_trackid=2:mm_28347190_2425761_27186547:1512434578_208_1779858597
6.网站传输协议:http--超文本传输协议、https--安全超文本传输协议;
1.HTTP:超文本传输协议协议是互联网上应用最为广泛的一种网络协议,协议的核心功能是传输 Web 服务器上的 HTML 页面及其他文件;
2.版本:http0.9(已过时)、http1.0和http1.1(目前广泛使用)、http2.0(未普及);
3.http协议请求流程:
影响客户端访问web站点的因素:客户端请求的网络I/O;Web服务器请求页面的磁盘I/O;
4.HTTP 协议有多种获得 Web 资源的方法:
5.http状态返回状态码:
6.http报文格式:一个完整的http访问包含请求(request)和响应(response);
7.使用fiddler抓包工具抓包,查看http报文格式:
1.tcp报文走向:
2.TCP建立连接与断开连接时,连接的状态变化:
3.查看系统中数据包的状态;
netstat -anto ##查看系统中所有连接
netstat -ant |awk '/^tcp|^udp/{state[$6]++}END{for(i in state){print i,state[i]}}' ##统计连接
1.概述:apache作为最早的web服务程序,基于http协议提供网页浏览服务;
2.特点:模块化设置、开放源代码、跨平台应用、支持多种web编程语言、运行稳定;
3.apache的常见三种工作模式:
Apache 的核心模块叫多路处理模块Multi-Processing Module,简称 MPM;
MPM-prefox:多进程模式,一个进程处理一个连接,每个进程相对来讲都是独立的,这个过程会用到select机制来通知;特点:稳定、响应快、消耗大量cpu和内存、keep-alive长连接占据问题;
注解:keep-alive长连接-- TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。
实现长连接要客户端和服务端都支持长连接。
MPM-worker:多进程多线程、一个进程开多个线程、每一个线程处理一个连接,但通知机制还是select不过可以接受更多的请求;特点:节省资源、兼容性不好、稳定性不高、keep-alive长连接占据问题;
MPM-event:worker的升级版、把服务器进程和连接进行分离,基于异步I/O模型。请求过来后进程并不处理请求,而是直接交由其他机制来处理,通过epoll机制来通知请求是否完成;在这个过程中,进程本身一直处于空闲状态,可以一直接收用户请求。可以实现一个进程响应多个用户请求。并且event模式对于keep-alive连接处理也有所优化,event模式有单独的线程处理keep-alive长连接,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。特点:支持海量级高并发负载、消耗资源少、但其对https支持的不完美;
总结:
不同模式效率不同,主要用于调优、命令“httpd -l”查看当前使用模式;
环境:
系统 IP地址 主机名 所需软件
Centos 6.5 192.168.100.150 www.linuxfan.cn httpd-2.2.17.tar.gz
实验步骤:
准备环境,上传软件包,并解压编译安装;
安装后优化调整;
修改定制配置文件并启动服务;
客户端访问测试;
优化httpd服务:调整其工作模式;
准备环境,上传软件包,并解压编译安装;
[root@www ~]# rpm -e httpd --nodeps
[root@www ~]# wget http://archive.apache.org/dist/httpd/httpd-2.2.17.tar.gz
[root@www ~]# tar zxvf httpd-2.2.17.tar.gz -C /usr/src/
[root@www ~]# cd /usr/src/httpd-2.2.17/
[root@www httpd-2.2.17]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-cgi && make &&make install
[root@www httpd-2.2.17]# echo $? ##返回0为成功
0
[root@www httpd-2.2.17]# ls /usr/local/httpd/ ##安装成功
bin cgi-bin error icons lib man modules
build conf htdocs include logs manual
注解:
bin:存放命令;
lib:httpd的链接文件
man:帮助文档
modules:模块文件
conf:配置文件存放位置
htdocs:网页存放位置
logs:日志存放文件位置
[root@www httpd-2.2.17]# cd
[root@www ~]#
安装后优化调整;
[root@www ~]# ln -s /usr/local/httpd/bin/* /usr/local/bin/ ##优化执行命令的路径
[root@www ~]# cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd
[root@www ~]# vi /etc/init.d/httpd
1 #!/bin/bash
2 # chkconfig: 35 85 15 ##在3和5运行级别开机启动,开机启动顺序为85,关机关闭顺序为15
81 $HTTPD -k $ARGV &&echo "httpd is $ARGV complete." ##第82行,添加输出信息
:wq
[root@www ~]# chmod +x /etc/init.d/httpd
[root@www ~]# chkconfig --add httpd
[root@www ~]# chkconfig --list httpd
httpd 0:关闭 1:关闭 2:关闭 3:启用 4:关闭 5:启用 6:关闭
修改定制配置文件、准备网页文档、并启动服务;
[root@www ~]# vi /usr/local/httpd/conf/httpd.conf ##修改主配置文件
:set nu ##打印出行号
29 ServerRoot "/usr/local/httpd"
40 Listen 80
65 User daemon
66 Group daemon
88 ServerAdmin [email protected] ##修改管理员的邮箱
97 ServerName www.linuxfan.cn:80 ##添加网站的域名
104 DocumentRoot "/usr/local/httpd/htdocs"
186 ErrorLog "logs/error_log"
193 LogLevel warn
215 CustomLog "logs/access_log" common
:wq
[root@www ~]# cat < /usr/local/httpd/htdocs/index.html ##准备网页文档
www.linuxfan.cn
www.linuxfan.cn
END
[root@lwh ~]# ls /usr/local/httpd/htdocs/ ##上传网页中调用的图片
index.html linux.jpg
[root@www ~]# /etc/init.d/httpd start
httpd is start complete.
[root@www ~]# netstat -utpln |grep httpd
tcp 0 0 :::80 :::* LISTEN 73341/httpd
[root@www httpd]# netstat -nat | awk '/^tcp/ {++S[$NF]} END {for(key in S) print key,"\t",S[key]}'
FIN_WAIT2 38
CLOSING 3
SYN_RECV 1
CLOSE_WAIT 1
TIME_WAIT 261
ESTABLISHED 71
LAST_ACK 2
FIN_WAIT1 9
注解:
CLOSED 无连接是活动的或正在进行
LISTEN 服务器在等待进入呼叫
SYN_RECV 一个连接请求已经到达,等待确认
SYN_SENT 应用已经开始,打开一个连接
ESTABLISHED 正常数据传输状态/当前并发连接数
FIN_WAIT1 应用说它已经完成
FIN_WAIT2 另一边已同意释放
ITMED_WAIT 等待所有分组死掉
CLOSING 两边同时尝试关闭
TIME_WAIT 另一边已初始化一个释放
LAST_ACK 等待所有分组死掉
客户端访问测试;
[root@www ~]# curl -o 192.168.100.150
优化httpd服务:调整其工作模式;
1.查看工作模式:
[root@www ~]# /usr/local/httpd/bin/httpd -V |grep MPM ##查看工作模式
Server MPM: prefork
注:设置httpd的工作模式时,不仅考虑网站的并发连接等工作效率,也要考虑服务器硬件占用情况,内存尤为重点考虑;
2.prefork(进程+子进程)模式,默认:
StartServers 服务器启动时建立的子进程数量,推荐:小型网站:默认、中:20-50、大:50-100;
MinSpareServers 空闲子进程最小数量,当空闲子进程数少于该数值将产生新的子进程,推荐:与startservers一致;
MaxSpareServers 空闲子进程最大数量,当空闲子进程数大于该数值将杀死多于子进程。这个值不要设得过大,但如果设的值比 MinSpareServers 小, Apache 会自动把其调整为MinSpareServers+1;
MaxClients 限定最大用户并发数, 是对 Apache 性能影响最大的参数。默认是150个进程,如果请求总数达到该设置的值时--可以使用ps -ef |grep http |wc -l来查看,那么后边的请求就需要排队,直到某个已经建立完成的请求处理完成后。这就是apache服务器系统资源剩余很多,但是http访问还是很慢的原因,理论上这个值设置的越大,apache可以处理的请求就越多,那么如果该值超过256,那么apache则无法启动,如果想配置更大值,必须在源码包中修改serverlimit(服务极限)这个参数,该参数最大为200000,对位于源代码包下 server/mpm/prefork/prefork.c 中以下两行做相应修改即可:
#define DEFAULT_SERVER_LIMIT 256
#define MAX_SERVER_LIMIT 200000
改后重新编译安装;
MaxRequestsPerChild 每个子进程在其生存期内允许服务的最大请求数量,若为0则代表该进程不会因为请求数量的变化而停止,建议10000-30000,避免出现活动请求占用服务器内存资源;
[root@www ~]# /usr/local/httpd/bin/httpd -V |grep MPM
Server MPM: prefork
-D APACHE_MPM_DIR="server/mpm/prefork"
[root@www ~]# vi /usr/local/httpd/conf/extra/httpd-mpm.conf
36
37 StartServers 5
38 MinSpareServers 5
39 MaxSpareServers 20
40 MaxClients 150
41 MaxRequestsPerChild 10000
42
[root@www ~]# vi /usr/local/httpd/conf/httpd.conf ##去掉注释
370 Include conf/extra/httpd-mpm.conf
[root@www ~]# /etc/init.d/httpd restart
[root@www ~]# ps aux |grep httpd |grep -v grep ##一个主进程,五个子进程
daemon 3849 0.0 0.3 27996 1528 ? S 21:37 0:00 /usr/local/httpd/bin/httpd -k restart
daemon 3850 0.0 0.3 27996 1528 ? S 21:37 0:00 /usr/local/httpd/bin/httpd -k restart
daemon 3851 0.0 0.3 27996 1528 ? S 21:37 0:00 /usr/local/httpd/bin/httpd -k restart
daemon 3852 0.0 0.3 27996 1528 ? S 21:37 0:00 /usr/local/httpd/bin/httpd -k restart
daemon 3853 0.0 0.3 27996 1528 ? S 21:37 0:00 /usr/local/httpd/bin/httpd -k restart
root 53394 0.0 0.4 27996 2088 ? Ss 19:19 0:00 /usr/local/httpd/bin/httpd -k restart
3.worker(多进程+多线程)工作模式:
StartServers 服务器启动时建立的子进程数量,推荐:小=默认、中=3-5、大=5-10;
MaxClients 限定最大用户并发数、推荐:500以上;
MinSpareThreads 空闲子线程最小数量,当空闲子线程数少于该数值将产生新的子线程,推荐:小=默认、中=50-100、大=100-200;
MaxSpareServers 空闲子线程最大数量,当空闲子线程数大于该数值将杀死多于子线程,推荐:小=默认、中=80-160、大=200-400;
ThreadsPerChild 每个子进程的最大并发线程数,推荐:小型网站1000、中1000-2000、大2000-3500,推荐:小=默认、中=50-100、大=100-200;
MaxRequestsPerChild 每个子进程在其生存期内允许服务的最大请求数量。如果设置为“ 0”,子进程将永远不会结束。推荐:小10000、大20000-50000;
注:如若开启worker工作模式,需要在编译安装时--with-mpm=worker选项指定;
当从prefox切换到worker时,重新编译安装时;
执行make命令出现以下错误:
/usr/src/httpd-2.2.17/server/mpm/prefork/prefork.c:862: undefined reference to `ap_mpm_pod_signal'
collect2: ld returned 1 exit status
make[1]: *** [httpd] 错误 1
make[1]: Leaving directory `/usr/src/httpd-2.2.17'
make: *** [all-recursive] 错误 1
可执行命令make clean清空已编译内容,重新编译即可;
[root@www ~]# /usr/local/httpd/bin/httpd -V |grep MPM
Server MPM: worker
-D APACHE_MPM_DIR="server/mpm/worker"
[root@www ~]# vi /usr/local/httpd/conf/extra/httpd-mpm.conf
51
52 StartServers 2
53 MaxClients 150
54 MinSpareThreads 25
55 MaxSpareThreads 75
56 ThreadsPerChild 50
57 MaxRequestsPerChild 10000
58
[root@www ~]# vi /usr/local/httpd/conf/httpd.conf
371 Include conf/extra/httpd-mpm.conf
:wq
[root@www ~]# ps aux |grep httpd |grep -v grep
root 33118 0.0 0.4 28168 2044 ? Ss 00:18 0:00 /usr/local/httpd/bin/httpd -k restart
daemon 33119 0.0 0.2 27900 1372 ? S 00:18 0:00 /usr/local/httpd/bin/httpd -k restart
daemon 33121 0.0 0.4 628528 2156 ? Sl 00:18 0:00 /usr/local/httpd/bin/httpd -k restart
4.event工作模式:
ServerLimit 服务器开启最大的进程数
StartServers 服务器启动时建立的子进程数量,推荐:小=默认、中=3-5、大=5-10;
MaxClients 限定最大用户并发数、为ServerLimit* ThreadsPerChild、推荐:500以上;
MinSpareThreads 空闲子线程最小数量,当空闲子线程数少于该数值将产生新的子线程,推荐:小=默认、中=50-100、大=100-200;
MaxSpareServers 空闲子线程最大数量,当空闲子线程数大于该数值将杀死多于子线程,推荐:小=默认、中=80-160、大=200-400;
ThreadsPerChild 每个子进程的最大并发线程数,推荐:小型网站1000、中1000-2000、大2000-3500,推荐:小=默认、中=50-100、大=100-200;
MaxConnectionsPerChild 每个子进程在其生存期内允许服务的最大请求数量。如果设置为“ 0”,子进程将永远不会结束。推荐:小10000、大20000-50000;
注:如若开启worker工作模式,需要在编译安装时--with-mpm=event选项指定,并且内核版本最低需要2.6;
[root@www ~]# /usr/local/httpd/bin/httpd -V |grep MPM
Server MPM: Event
-D APACHE_MPM_DIR="server/mpm/experimental/event"
[root@www ~]# vi /usr/local/httpd/conf/extra/httpd-mpm.conf
111
112 ServerLimit 1000
113 StartServers 20
114 MinSpareThreads 25
115 MaxSpareThreads 1200
116 ThreadsPerChild 50
117 MaxConnectionsPerChild 1000
118
[root@www ~]# vi /usr/local/httpd/conf/httpd.conf
371 Include conf/extra/httpd-mpm.conf
:wq
[root@www ~]# ps aux |grep httpd |grep -v grep
root 18598 0.1 3.6 44416 18276 ? Ss 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18599 0.0 0.2 27900 1376 ? S 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18600 0.0 0.4 644776 2164 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18601 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18602 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18603 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18604 0.0 0.4 644776 2160 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18605 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18606 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18607 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18608 0.0 0.4 644776 2160 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18609 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18610 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18611 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18612 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18613 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18614 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18615 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18616 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18617 0.0 0.4 644776 2160 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18618 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18619 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start