域名是一个IP地址的“面具” ,目的是便于记忆和访问一个或一组服务器的地址(网站,电子邮件,FTP等)。
www.baidu.com 这是一个完整的FQDN
一个完整的FQDN=主机名+域名
主机名:www
域名:baidu.com
使用域名的原因:是因为IP地址,不容易记
网站、网页、主页;HTTP、URL、HTML、超链接
Url和uri它俩之间很相似
Url比uri能够更精确的定位到资源,资源位置是绝对路径,uri的资源位置可以是相对路径
url=https://www.baidu.com/
https: 这个是客户端访问服务端所用到的协议
www.baidu.com: 这个是客户端想要访问的服务端域名
/: 这个是客户端访问服务端的具体资源
有web1.0(以编辑为特征)和web2.0(侧重用户交互)
1)URL不同:静态页面没有?、动态页面包含?
2)后缀不同(开发语言不同):
静态页面一般以.html/.htm/.xml;
开发在写完页面之后,所写的页面需要部署到服务器上的,在部署页面之前需要在服务器上安装能够解析静态页面的服务(nginx httpd这两类web服务默认只能解析静态页面)
动态页面一般以.php/.asp/.jsp/.pl/.py/.cgi等为后缀
同样动态页面也需要在服务器上部署能够解析动态页面的服务(nginx httpd),还要安装能够解析php页面php服务
3)静态页面的内容是固定的,动态页面的内容会因用户、浏览器、时间、地点等而发生变化。
http://(协议头)cn.bing.com(域名)/(URI资源:路径/文件名):
https://jx.tmall.com/?ali_trackid=2:mm_28347190_2425761_27186547:1512434578_208_1779858597
http–超文本传输协议,监听的端口为tcp协议的80端口,不加密、https–安全超文本传输协议,监听的端口号是tcp协议的443号端口,加密传输,使用证书加密;
超文本传输协议协议是互联网上应用最为广泛的一种网络协议,协议的核心功能是传输 Web 服务器上的 HTML 页面及其他文件;
http0.9(已过时)、http1.0和http1.1(目前广泛使用)、http2.0(未普及);
影响客户端访问web站点的因素:客户端请求的网络I/O;Web服务器请求页面的磁盘I/O;
http协议是一个应用层协议,其报文分为请求报文和响应报文
当客户端请求一个网页时,会先通过http协议将请求的内容封装在http请求报文之中,服务器收到该请求报文后根据协议规范进行报文解析,然后向客户端返回响应报文。
http报文结构为:
• 起始行
对报文进行描述
• 头部
向报文中添加了一些附加信息,是一个名/只的列表,头部和协议配合工作,共同决定了客户端和服务器能做什么事情
例如:Content-Length(主体长度),Content-Type(主体类型)等。
• 主体
包含数据的主体部分
请求报文
下面是我用wireshark捕捉到的一个http请求报文,我们来分析一下它。
起始行
在请求报文中,起始行包括了3个部分:
• 请求的方法(POST)
• 请求的URL(/cgi-bin/qqshow_user_props_info)
• 协议类型及版本(HTTP/1.1)
请求方法
在本例中请求的方法是POST,http中请求方法有以下8种(其中比较常用的是GET,POST,HEAD):
1.OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
2.HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3.GET
向特定的资源发出请求。它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。
4.POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
5.PUT
向指定资源位置上传其最新内容
6.DELETE
请求服务器删除Request-URL所标识的资源
7.TRACE
回显服务器收到的请求,主要用于测试或诊断
8.CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
其实他们的本质区别是GET是从服务器上请求数据,而POST是向服务器发送数据
头部
以下只列出部分请求报文头部所独有的信息:
Client-IP:提供了运行客户端的机器的IP地址
From:提供了客户端用户的E-mail地址
Host:给出了接收请求的服务器的主机名和端口号
Referer:Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
UA-Color:提供了与客户端显示器的显示颜色有关的信息
UA-CPU:给出了客户端CPU的类型或制造商
UA-OS:给出了运行在客户端机器上的操作系统名称及版本
User-Agent:将发起请求的应用程序名称告知服务器
Accept:告诉服务器能够发送哪些媒体类型
Accept-Charset:告诉服务器能够发送哪些字符集
Accept-Encoding:告诉服务器能够发送哪些编码方式
Accept-Language:告诉服务器能够发送哪些语言
TE:告诉服务器可以使用那些扩展传输编码
Expect:允许客户端列出某请求所要求的服务器行为
Range:如果服务器支持范围请求,就请求资源的指定范围
Cookie:客户端用它向服务器传送数据
Cookie2:用来说明请求端支持的cookie版本
应答报文
和上面一样,下面是我用wireshark捕获到的一个http应答报文
起始行
应答报文的起始行也包含了3个部分
• 协议类型及版本号
• 状态码
• 状态码的文字描述
头部
响应报文首部提供的额外信息:
Age:(从最初创建开始)响应持续时间
Public:服务器为其资源支持的请求方法列表
Retry-After:如果资源不可用的话,在此日期或时间重试
Server:服务器应用程序软件的名称和版本
Title:对HTML文档来说,就是HTML文档的源端给出的标题
Warning:比原因短语更详细一些的警告报文
Accept-Ranges:对此资源来说,服务器可接受的范围类型
Vary:服务器会根据这些首部的内容挑选出最适合的资源版本发送给客户端
Proxy-Authenticate:来自代理的对客户端的质询列表
Set-Cookie:在客户端设置数据,以便服务器对客户端进行标识
Set-Cookie2:与Set-Cookie类似
WWW-Authenticate:来自服务器的对客户端的质询列表
访问日志access_log记录了所有对Web服务器的访问活动,下面是访问日志access_log中的一个标准记录
183.202.144.5 - - [13/Apr/2020:14:55:46 +0800] “GET / HTTP/1.1” 200 30 “-” "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0"
日志字段所代表的内容如下:
1.远程主机IP:表明访问网站的是谁 183.202.144.5
2.空白(E-mail):为了避免用户的邮箱被垃圾邮件骚扰,第二项就用“-”取代了
3.空白(登录名):用于记录浏览者进行身份验证时提供的名字。dgf
4.请求时间:用方括号包围,而且采用“公用日志格式”或者“标准英文格式”。 时间信息最后的“+0800”表示服务器所处时区位于UTC之后的8小时。
5.方法+资源+协议:服务器收到的是一个什么样的请求。该项信息的典型格式是“METHOD RESOURCE PROTOCOL”,即“方法 资源 协议”。
METHOD: GET、POST、HEAD、……
RESOURCE: /、index.html、/default/index.php、……(请求的文件)
PROTOCOL: HTTP+版本号
6.状态代码:请求是否成功,或者遇到了什么样的错误。大多数时候,这项值是200,它表示服务器已经成功地响应浏览器的请求,一切正常。
7.发送字节数:表示发送给客户端的总字节数。它告诉我们传输是否被打断(该数值是否和文件的大小相同)。把日志记录中的这些值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据。
8.客户端的系统,以及客户端访问服务器的浏览器类型
5.http状态返回状态码:
状态码首位 范围 分类
1xx 100-101 信息提示
2xx 200-206 成功
3xx 300-305 重定向
4xx 400-415 客户端错误
5xx 500-505 服务器错误
常见的状态返回码:
200 ok 301 请求的页面永久跳转 302 临时跳转 403 禁止访问该页面
404 找不到页面 500 服务器内部错误 502 网关错误
503 当前服务不可用 504 网关请求超时
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-prefork:多进程模式,一个进程处理一个连接,每个进程相对来讲都是独立的,这个过程会用到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 -V |grep "Server MPM"”
查看当前使用模式;
httpd_2.2版本默认的模式为prefork,httpd_2.4版本默认的模式为event;
下面是下载软件包的方法
最后直接命令行输入wget 然后把复制的地址粘贴到后面
rpm -e httpd --nodeps
wget http://archive.apache.org/dist/httpd/httpd-2.2.17.tar.gz
tar zxvf httpd-2.2.17.tar.gz -C /usr/src/
cd /usr/src/httpd-2.2.17/
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-cgi && make &&make install
httpd是高度模块化的程序,各个功能通过加载各个模块来实现。但前提是将功能对应的模块先编译好,以供httpd加载。
httpd对模块有两种编译方式:静态编译和动态编译。
• 静态编译:将模块直接编译进httpd的核心中。静态编译的所有模块都会随着httpd的启动和启动。
• 动态编译:将模块编译好,但不编译到httpd的核心中。要启动动态编译的模块,需要在httpd的配置文件中使用LoadModule指令加载。
注解:
–enable-so ##开启动态加载模块的功能
–enable-rewrite ##开启地址重写、重定向功能
–enable-cgi ##开启与一些动态编程语言之间进行交互的接口
注解:
bin:存放命令;
lib:跟httpd相关的库文件
man:帮助文档
modules:模块文件
conf:配置文件存放位置
htdocs:网页存放位置
logs:日志存放文件位置
[root@localhost httpd-2.2.17]# cd
ln -s /usr/local/httpd/bin/* /usr/local/bin/ ##优化执行命令的路径
cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd
chmod a+x /etc/init.d/httpd
修改启动脚本如下:
vi /etc/init.d/httpd
vi /usr/local/httpd/conf/httpd.conf
29 ServerRoot "/usr/local/httpd" #httpd的安装路径
40 Listen 80 #httpd监听的端口号
65 User daemon #启动httpd服务的用户
66 Group daemon #启动httpd服务的组
88 ServerAdmin admin@linuxfan.cn ##修改管理员的邮箱
97 ServerName www.linuxfan.cn:80 ##添加网站的域名
104 DocumentRoot "/usr/local/httpd/htdocs" #httpd的默认网页存放路径
131 "/usr/local/httpd/htdocs"> ##此区域标识网页的设置,如限制、认证等
...
159 </Directory>
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.com</title>
</head>
"color:#3F9; font-size:36px;">www.linuxfan.com</h1>
"./linux.jpg" alt="www.linuxfan.com" title="www.linuxfan.com width=700"" height="500" /></p>
</body>
</html>
END
启动服务
ls /usr/local/httpd/htdocs/
/etc/init.d/httpd start ##启动网站服务
netstat -utpln |grep httpd
注解:
CLOSED 无连接是活动的或正在进行
LISTEN 服务器在等待进入呼叫
SYN_RECV 一个连接请求已经到达,等待确认
SYN_SENT 应用已经开始,打开一个连接
ESTABLISHED 正常数据传输状态/当前并发连接数
FIN_WAIT1 应用说它已经完成
FIN_WAIT2 另一边已同意释放
TIMED_WAIT 等待所有分组死掉
CLOSING 两边同时尝试关闭
TIME_WAIT 另一边已初始化一个释放
LAST_ACK 等待所有分组死掉
客户端访问测试
yum -y install elinks
elinks --dump http://192.168.17.176
继续优化
删除apache的默认页面
然后删掉配置文件里第144行的Indexes
vi /usr/local/httpd/conf/httpd.conf
最后显示下面这个页面就可以了
想要显示出内容,必须跟上文件名称
1.查看工作模式:
/usr/local/httpd/bin/httpd -V |grep MPM ##查看工作模式
注:设置httpd的工作模式时,不仅考虑网站的并发连接等工作效率,也要考虑服务器硬件占用情况,内存尤为重点考虑
2.prefork(进程+子进程)模式,默认:
修改配置文件
vi /usr/local/httpd/conf/extra/httpd-mpm.conf
vi /usr/local/httpd/conf/httpd.conf +370
/etc/init.d/httpd restart
ps aux |grep httpd |grep -v grep ##一个主进程,五个子进程
3.worker(多进程+多线程)工作模式:
注:如若开启worker工作模式,需要在编译安装时–with-mpm=worker选项指定
当从prefork切换到worker时,重新编译安装时
cd /usr/src/httpd-2.2.17/ ##进入配置目录
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-cgi --with-mpm=worker ##切换到worker
make clean ##清空缓存
make && make install ##重新编译安装
此时已经切换成功
优化参数
vi /usr/local/httpd/conf/extra/httpd-mpm.conf
去掉注释
[root@www ~]# vi /usr/local/httpd/conf/httpd.conf +370
370 Include conf/extra/httpd-mpm.conf
:wq
4.event工作模式:
注:如若开启event工作模式,需要在编译安装时–with-mpm=event选项指定,并且内核版本最低需要2.6
cd /usr/src/httpd-2.2.17/ ##进入配置目录
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-cgi --with-mpm=event ##切换到event
make clean ##清空缓存
make && make install ##重新编译安装
查看工作模式
/usr/local/httpd/bin/httpd -V |grep MPM
在配置文件末尾添加参数
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 </IfModule>
[root@www ~]# vi /usr/local/httpd/conf/httpd.conf +370
370 Include conf/extra/httpd-mpm.conf
:wq
./configure --prefix=/usr/local/httpd --enable-so --enable-modules=most --enable-mpms-shared=all
查看模块
/usr/local/httpd/bin/apachectl -D DUMP_MODULES