(一)http协议介绍

http: 超文本传输协议,http协议是应用层协议,实现http协议的软件都监听的TCP的80端口之上。http协议也是一种文本协议,是基于TCP协议实现
http协议有几个版本:http/1.0、http/1.1(使用最多)、http/2.0

  • http协议的工作方式
请求头
请求体 响应头
响应体
  • curl命令讲解
curl命令:curl命令是一个利用URL规则在命令行下工作的文件传输工具。

curl命令格式
curl [选项] 请求的URL 常用选项
-I:其实就是向服务器端发送了一个HEAD的请求方法,只显示响应报文首部信息 示例:
curl -I http://www.baidu.com
  • telnet命令模仿浏览器发送请求报文
[root@6 ~]# telnet 192.168.23.4 8000 
Trying 192.168.23.4...
Connected to 192.168.23.4.
Escape character is '^]'.
GET /index.html HTTP/1.1 # 输入请求报文信息,两行信息即可
Host: 192.168.23.4 HTTP/1.1 200 OK
Date: Mon, 21 Aug 2017 18:50:45 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Mon, 21 Aug 2017 18:44:22 GMT
ETag: "24aa-1e-55747de074076"
Accept-Ranges: bytes
Content-Length: 30
Connection: close
Content-Type: text/html; charset=UTF-8 <p>你好,我是尹欢一</p>
Connection closed by foreign host.
  • 一次完整http请求过程(必须掌握)
(1)当用户在浏览器输入一个URL,且回车,会先进行DNS解析请求
(2)客户端拿到DNS解析请求返回的IP之后,去请对应的服务器站点的资源
(3)服务器端判断是否接受请求,如果接收请求,会对请求报文进行解析,分析请求报文的请求头信息,分析请求头的请求资源
(4)服务器端对请求头的请求资源进行解析之后,构建响应头和响应体,组合为响应报文
(5)服务端发送响应报文给客户端,服务端在本地记录http对应的日志信息
(6)客户端解析响应报文
  • 请求报文首部的基本格式
<请求方法> <请求的URL> <协议对应的版本信息>
头部字段: (key : value)
<请求体>
  • http服务器程序类型
(1)httpd(Apache)
(2)nginx
(3)lighted
(4)IIS
(5)tomcat
(6)Tengine
...

(二)httpd介绍

特性:模块化,支持模块动态装卸载,支持MPM(多路处理模块)

  • 什么是多路处理模块(MPM)

    • httpd进程运行的模式
(1)prefork
多进程模型,每个进程响应一个请求
(2)worker
多进程多线程模型,每个线程处理一个用户请求
(3)event(最优)
事件驱动模型,多进程模型,每个进程响应多个请求
  • httpd版本介绍
httpd 2.2(红帽6)
httpd 2.4(红帽7)

(三)httpd安装

httpd的安装有RPM包安装和源码编译安装两种方式

  • 红帽6安装httpd2.4

    • (1)RPM包安装
yum install -y httpd
    • (2)编译安装httpd-2.4.25.tar
说明:httpd-2.4依赖apr-1.4以上版本 , 依赖apr-util-1.4以上版本, 因此先编译安装apr-1.5.2、apr-util-1.5.4

(0)yum gourpinstall -y "Development tools" "Server Platform Development"
yum install -y pcre-devel
(1)先将apr-1.5.2、apr-util-1.5.4、httpd-2.4下载到本地,解压
(2)编译安装apr-1.5.2
cd apr-1.5.2
./configure --prefix=/usr/local/apr/
make && make install
(3)编译安装apr-util-1.5.4
cd ../apr-util-1.5.4
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
(4)编译安装httpd-2.4
cd ../httpd-2.4.25
./configure --prefix=/usr/local/apache-2.4 --sysconfdir=/etc/httpd-2.4 --enable-so --enable-ssl --enable-cgi --enable-rewrite --enable-modules=most --enable-mpms-shared=all --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-mpm=prefork
make && make install
  • 红帽7安装httpd

    • (1)RPM包安装
yum install -y httpd
    • (2)编译安装httpd-2.4.25.tar
# 安装包组
yum groupinstall -y "Development tools" "Server Platform Development" # 安装依赖开发包
yum install pcre-devel apr-devel apr-util-devel openssl-devel # 解压本地的httpd-2.4.25.tar
tar xf httpd-2.4.25.tar
cd httpd-2.4.25 # 配置安装信息,生成make file, yum 安装的RPM包一般都是在/usr目录下
./configure --prefix=/usr/local/apache2.4 --sysconfdir=/etc/httpd2.4 --enable-so --enable-ssl --enable-rewrite --enable-modules=most --enable-mpms-shared=all --with-zlib --with-pcre --with-apr=/usr --with-apr-util=/usr --with-mpm=prefork # 编译安装
make && make install

(四)httpd介绍

基于红帽6RPM包安装的httpd2.2版本、基于红帽7RPM包安装的httpd2.4版本

  • httpd2.2软件配置说明
配置文件: 
/etc/httpd/conf/httpd.conf 主配置文件
/etc/httpd/conf.d/*.conf 主配置文件
服务脚本
/etc/rc.d/init.d/httpd 脚本配置文件:
/etc/sysconfig/httpd 脚本配置文件中定义了,httpd以哪种MPM模式启动 主程序文件
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker 日志文件
/var/log/httpd:
access_log:访问日志
error_log:错误日志 站点文档
/var/www/html 模块文件路径
/usr/lib64/httpd/modules 启动程序和开机自启
service {start|stop|restart|status|configtest|reload} httpd
chkconfig httpd on
  • httpd2.4软件配置说明
配置文件
/etc/httpd/conf/httpd.conf 主配置文件
/etc/httpd/conf.d/*.conf 其他配置文件
/etc/httpd/conf.modules.d/*.conf 模块相关的配置文件 systemd 启动脚本文件 (服务脚本)
/usr/lib/systemd/system/httpd.service 主程序
/usr/sbin/httpd 日志文件(其中access_log:访问日志,error_log:错误日志)
/var/log/httpd 中心主机站点根路径
/var/www/html 模块文件路径
/usr/lib64/httpd/modules 启动程序和开机自启
systemctl {start|stop|restart|status|reload} httpd.service
systemctl enable httpd.service # 开机自启

(五)httpd2.2详解

基于红帽6RPM包安装的httpd2.2版本、基于红帽7RPM包安装的httpd2.4版本

  • 配置文件全局介绍
(1)主配置文件:/etc/httpd/conf/httpd.conf 
全局配置:Section 1: Global Environment 第33行
中心主机配置: Section 2: ‘Main’ server configuration 第246行
虚拟主机配置:Section 3: Virtual Hosts 第986行 (2)每一次修改配置文件之后,可以使用httpd -t检查配置文件是否错误,一般如果没有给ServerName值的话会报错,那么给一个IP作为ServerName的值
httpd -t #检查下配置文件的语法是否错误
(3)在全局配置段,可以修改其监听的端口, 修改监听的端口之后,只有重启服务才能生效,reload不能生效,只能restart
Listen 80 可以改为:Listen 8000

配置文件详细介绍(超级重要必须掌握)

  • 1:设置监听的端口(很重要)
    在全局配置段,可以修改其监听的端口, 修改监听的端口之后,只有重启服务才能生效,reload不能生效,只能restart
Listen 80 可以改为:Listen 8000
  • 2:持久连接
    由于web服务的连接是:基于一个TCP的虚连接,http事务可重复执行多次。例如我们打开https://www.taobao.com,首先返回的是首页的HTML骨架资源,再返回的是CSS级联样式表资源,最后返回的是JavaScript代码资源。TCP连接建立后,每个资源获取完成后不全断开连接,而是继续等待其他资源请求的进行

    KeepAlive On 或 Off :设置TCP保持连接关闭或开启
KeepAliveTimeout 15 :设置保持连接的超时时长
MaxKeepAliveRequests 100 : 设置最大保持连接数量
  • 3:MPM机制(多处理模块机制)(很重要)
    httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个模块,CentOS 6的rpm包为此专门提供了三个程序文件,httpd(prefork),httpd.worker,httpd.event,分别用于实现对不同的MPM机制的支持。

    当httpd启动时候,可以使用 ps aux  | awk '/httpd$/{print $11}' 命令查看当前httpd是以哪一种机制运行的,如果是/usr/sbin/httpd,那么就是以prefork模式运行的,如果是/usr/sbin/httpd.worker,那么就是以worker模式运行的,如果是/usr/sbin/httpd.event,那么就是以event模式运行的。

    使用 httpd -l 命令可以查看编译的核心模块

    使用 httpd -M 查看静态编译及动态编译的模块

    在配置文件中可以配置prefork模式和worker模式的属性信息
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule> <IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
  • 4:启用或禁用模块(DSO)(很重要)
LoadModule <模块名> <模块相对路径>
例如:LoadModule auth_basic_module modules/mod_auth_basic.so
这里的auth_basic_module是模块名,modules/mod_auth_basic.so是模块文件的路径,如果模块前面没有路径,表示启用相关模块
模块的完全路径是:/etc/httpd/modules/*
  • 5:定义中心主机(重要)
指定DocumentRoot(这是中心主机的站点根目录,中心主机的根站点目录可以更换)
例如:DocumentRoot "/var/www/html"
可以修改为其他的路径:DocumentRoot "/app/www"
  • 6:站定访问控制

    • 基于两种机制指明对哪些资源进行何种的访问控制
1:基于文件系统路径的访问控制
<Directory "/var/www/html">
这样的访问控制表明,对于/var/www/html目录下的所有的文件均有效
</Directory> <File "某文件路径">
这样的访问控制表明,对于某文件路径有效
</File> <FileMatch "模式匹配">
这样的访问控制表明,对于被模式匹配到的文件有效
</FileMatch> 2:基于URL的访问控制
# 显示httpd服务器的状态信息,这样的访问控制表明,对于访问http://ip:port/server-status都生效
<Location /server-status>
SetHandler server-status
Order deny,allow
#Deny from all
Allow from all
</Location> # 显示httpd软件信息,这样的访问控制表明,LocationMatch中指定的URL的效用
<LocationMatch "URL">
......
</LocationMatch>
  • 7:Directory访问控制中指令详解
1:Options:用于控制目录中所有的资源被访问的方式,后跟一个或多个以空白字符分割的选项列表
Indexes:如果输入的网址对应服务器上的一个文件目录,而此目录中又没有DirectoryIndex指令(例如:DirectoryIndex index.html index.http.var),那么服务器会返回由mod_autoindex模块生成的一个格式化后的目录列表,但是如果访问的是根路径就返回Apache的首页信息
FollowSymLinks:服务器允许在此目录中使用符号连接。如果该配置选项位于<Location>配置段中,将会被忽略。
一般来说,在Options这一项设置为 None。 2:AllowOverride:与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中
ALL:所有指令都可以放进去
None:所有指令都不可以放进去 3:order和allow、deny
Order:定义生效次序,写在后面的表示默认法则
Allow from all:表明任意网段都可以访问
Deny from all:表明任意网段都不可以访问 例如:
Allow from 192.168.23.0/24:表示只是允许192.168.23.0网段的主机访问。
Allow from 192.168.23.24/32:表示只是允许192.168.23.24主机访问。
  • 8:定义站点的默认主页面
DirectoryIndex index.html index.html.var
如果在站点根目录没有index.html,那么直接在浏览器输入域名就会返回Apache的首页信息
  • 9:给路径取别名
定义格式为:Alias /文件系统路径/ "/别名路径/"
举个例子:
如果现在你的DocumentRoot "/app/www" : 那么站点的根目录就是/app/www
此时在浏览器访问http://192.168.23.4/users/index.html,那么在服务器的文件系统上访问的文件为/app/www/users/index.html。
那么如果指定一个别名:Alias /users/ "/app/www/username/"
那么此时,在浏览器访问http://192.168.23.4/users/index.html,那么在服务器的文件系统上访问的文件为/app/www/username/index.html。
  • 10:设定默认字符集
AddDefaultCharset UTF-8
  • 11:设定日志的保存级别日志
1:访问日志
(1)访问日志的四种格式定义如下:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent %h:客户端IP地址
%l:remote user,登入名,通常为“-”号
%u:远程用户名,非登入时,为-号
%t:服务器收到请求时的时间
%r:First line of request,表示请求报文的首行,首行记录了:请求的方法,URL和http协议版本
%>s:响应的状态码
%b:不包含http首部的响应报文的大小,单位是字节
%{Referer}i:请求报文中首部“referer”的值,referer为哪个页面的超链接跳转至当前页面的
%{User-Agent}i:请求报文中首部的“User-Agent”的值,User-Agent为发出请求的命令程序 (2)指定访问日志保存在哪里,选择使用哪种访问日志格式
CustomLog /logs/httpd/httpd_access_log combined 2:错误日志
(1)指定错误日志的路径
ErrorLog /logs/httpd/httpd_error_log
(2)指定错误日志的记录级别
LogLevel warn
(3)错误级别的类型
log层级的取值有:debug, info, notice, warn, error, crit, alert, emerg
比指定错误级别层次高的级别的错误日志都会被记录
  • 12:基于用户的访问认证安全机制
有两种认证的安全机制:
basic:明文
digest:消息摘要认证 1:basic 认证
(1)在Location的访问认证中设置 基于单个用户进行认证
<Location /server-info>
SetHandler server-info
AuthType Basic
AuthName "请求输入你的用户名和密码"
AuthUserFile "/etc/httpd/conf/.htpasswd"
Require user yhy
</Location> 如果让/etc/httpd/conf/.htpasswd中的用户都可以登入,需要修改最后一行指令
<Location /server-info>
SetHandler server-info
AuthType Basic
AuthName "请求输入你的用户名和密码"
AuthUserFile "/etc/httpd/conf/.htpasswd"
# 修改下面这一行指令
Require valid-user
</Location> (2)如何创建虚拟用户文件 使用命令 htpasswd 进行创建
例如:htpasswd -m -c /etc/httpd/conf/.htpasswd yhy
htpasswd的选项说明:
-c:自动创建指定的用户文件
-m:MD5格式化加密
-s:sha格式加密
-D:删除指定用户 (3)还可以基于用户组进行认证
基于组认证
<Location /server-info>
SetHandler server-info
AuthType Basic
AuthName "请求输入你的用户名和密码"
AuthUserFile "/etc/httpd/conf/.htpasswd"
AuthGroupFile "/etc/httpd/conf/.htgroup"
Require group my_group
</Location> 创建用户账号
htpasswd -m -c /etc/httpd/conf/.htpasswd1 yhy1
htpasswd -m -c /etc/httpd/conf/.htpasswd2 yhy2
htpasswd -m -c /etc/httpd/conf/.htpasswd3 yhy3
最后分别将认证文件中的用户名和密码拷贝出来,写在一个.htpasswd文件中,那么这个文件就有多个用户了 创建组账号
创建/etc/httpd/conf/.htgroup文件,将创建的用户添加到组里面
my_group: yhy1 yhy2 yhy3
  • 13:虚拟主机的创建详解

    • 网卡取别名:ifconfig eth0:0 192.168.23.10/24
(一)虚拟主机的分类:
1:IP相同,但端口不同
2:IP不同,但端口均为默认端口
3:FQDN不同(在请求报文首部有一个Host:www.baidu.com,在解析请求报文的时候,可以从这里知道请求了哪个虚拟机) (二)三种不同的实现方案
1:基于IP:为每一个虚拟主机配置一个IP地址,编辑/etc/httpd/conf.d/virtual_machine.conf文件,添加如下配置
<VirtualHost 192.168.6.205:80>
ServerName www.taobao.com
DocumentRoot "/app/www/taobao"
</VirtualHost> <VirtualHost 192.168.6.209:80>
ServerName www.tianmao.com
DocumentRoot "/app/www/tianmao"
</VirtualHost> <VirtualHost 192.168.6.210:80>
ServerName www.jd.com
DocumentRoot "/app/www/jd"
</VirtualHost>
访问的时候通过主机名访问 2:基于PORT:为每一个虚拟主机配置一个独立的PORT
# 注意这里使用到的端口需要提前声明
Listen 800
Listen 8000
<VirtualHost 192.168.6.205:80>
ServerName www.taobao.com
DocumentRoot "/app/www/taobao"
</VirtualHost> <VirtualHost 192.168.6.209:800>
ServerName www.tianmao.com
DocumentRoot "/app/www/tianmao"
</VirtualHost> <VirtualHost 192.168.6.210:8000>
ServerName www.jd.com
DocumentRoot "/app/www/jd"
</VirtualHost>
3:基于FQDN:为每一个虚拟主机配置一个独立的FQDN(虚拟主机不要与中心主机混用,如果要使用虚拟主机,要禁用中心主机。禁用中心主机的方法:注释中心主机的DocumentRoot指令即可 )
# 注意:这里的NameVirtualHost表示所有的虚拟主机监听在同一个IP和端口上,根据不同的FQDN来识别访问了哪个虚拟主机
NameVirtualHost 192.168.6.205:80
<VirtualHost 192.168.6.205:80>
ServerName www.taobao.com
DocumentRoot "/app/www/taobao"
</VirtualHost> <VirtualHost 192.168.6.205:80>
ServerName www.tianmao.com
DocumentRoot "/app/www/tianmao"
</VirtualHost> <VirtualHost 192.168.6.205:80>
ServerName www.jd.com
DocumentRoot "/app/www/jd"
</VirtualHost> (三)虚拟主机配置方式
<VirtualHost *:80>
DocumentRoot /app/www
ServerName www.yhyblog.cn
# 除了以上两个指令,在虚拟主机中还可以有以下几个指令
ServerAlias :虚拟主机的别名,可多次使用
ErrorLog:自定义虚拟主机的错误日志
CustomLog:自定义虚拟主机的访问日志
<Directory "/app/www">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost> 示例配置如下:
<VirtualHost *:80>
DocumentRoot /app/www
ServerName www.uplooking.com
ServerAlias www.yhyblog.cn
ErrorLog /logs/uplooking_error_log
CustomLog /logs/uplooking_access_log combined
<Directory "/app/www">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost> (四):每一个虚拟主机里面都可以指定错误路径连接和访问日志路径,和Directory访问控制机制
  • 15:httpd进程的属主和属组
指定以哪个用户的身份运行httpd服务的进程
User apache
Group apache
  • 16:mod_deflate模块的使用方式
先不讲,容易让大家迷糊
  • 17:https:http协议调用OpenSSL提供的加密库
先不讲,https的概念需要先讲OpenSSL和CA证书
  • 18: httpd包自带的压力测试的工具程序
ab命令
例如:ab -c 100 -n 1000 https://www.baidu.com/index.html
-n :总请求数
-c:模拟的并发数
-k:在持久连接下进行压测
  • 19:httpd包自带的工具程序
htpasswd:基于basic实现虚拟用户的账号和密码验证机制
apachectl:httpd自带的服务器控制脚本,支持start和stop
rotatelogs:日志切割工具,自动切割日志
例如:日志信息可以根据当天的时间进行切割
20170824access_log
20170825access_log
20170826access_log
ab:Apache bench:压力测试工具

(httpd、php)的更多相关文章

  1. (httpd、php)2

    (一)再说编译安装httpd2.4 新特性: 1:MPM(多处理模块)支持运行为DSO(动态共享,动态加载模式)机制,以模块形式按需加载,支持动态加载 2:event MPM生产环境可用 3:支持异步 ...

  2. Java——搭建自己的RESTful API服务器(SpringBoot、Groovy)

    这又是一篇JavaWeb相关的博客,内容涉及: SpringBoot:微框架,提供快速构建服务的功能 SpringMVC:Struts的替代者 MyBatis:数据库操作库 Groovy:能与Java ...

  3. iOS 小谈开发者中的个人、组织(公司、企业)账号

    苹果对开发者主要分为3类:个人.组织(公司.企业).教育机构.即: 1.个人(Individual) 2.组织(Organizations) 组织类又分为2个小类: (1)公司(Company) (2 ...

  4. 那点你不知道的XHtml(Xml+Html)语法知识(DTD、XSD)

    什么是XHtml: 摘录网上的一句话,XHTML就是一个扮演着类似HTML的角色的XML. XHtml可当模板引擎应用: CYQ.Data 框架里有一套XHtmlAction模板引擎, 应用在QBlo ...

  5. Python开发:环境搭建(python3、PyCharm)

    Python开发:环境搭建(python3.PyCharm) python3版本安装 PyCharm使用(完全图解(最新经典))

  6. [UML]UML系列——类图class的关联关系(聚合、组合)

    关联的概念 关联用来表示两个或多个类的对象之间的结构关系,它在代码中表现为一个类以属性的形式包含对另一个类的一个或多个对象的应用. 程序演示:关联关系(code/assocation) 假设:一个公司 ...

  7. 联合体union和大小端(big-endian、little-endian)

    1.联合体union的基本特性——和struct的同与不同 union,中文名“联合体.共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以 ...

  8. 《zw版·Halcon-delphi系列原创教程》 酸奶自动分类脚本(机器学习、人工智能)

    <zw版·Halcon-delphi系列原创教程>酸奶自动分类脚本(机器学习.人工智能) Halcon强大的图像处理能力,令人往往会忽视其内核,是更加彪悍的机器学习.人工智能.       ...

  9. VC++中操作XML(MFC、SDK)转

    [转]VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++ ...

随机推荐

  1. selenium webdriver学习(四)------------定位页面元素(转)

    selenium webdriver学习(四)------------定位页面元素 博客分类: Selenium-webdriver seleniumwebdriver定位页面元素findElemen ...

  2. input标签前台实现文件上传

    值得注意的是:当一个表单里面包含这个上传元素的时候,表单的enctype必须指定为multipart/form-data,method必须指定为post,浏览器才会认识并正确执行.但是还有一点,浏览器 ...

  3. H3C 总线型以太网拓扑扩展

  4. supersocket Silverlight 策略服务器

    <?xml version="1.0"?> <configuration> <configSections> <section name= ...

  5. js实现开关灯游戏

    需求: 点击三个按钮,页面出现不同数量的“灯” 所有的灯有相同的点击效果.点击一个灯的时候,this和他的上下左右都会变成另一种背景色. 代码在这里~~~ 文章地址 https://www.cnblo ...

  6. 31页PPT:基于Spark的移动大数据挖掘

    31页PPT:基于Spark的移动大数据挖掘 数盟11.16 Data Science Meetup(DSM北京)分享:基于Spark的移动大数据挖掘分享嘉宾:张夏天(TalkingData首席数据科 ...

  7. Talk is cheap. Show me the code.

    Talk is cheap. Show me the code. -- Linux创始人 Linus Torvalds 2000-08-25 Stay hungry Stay foolish -- 乔 ...

  8. P1108 分解质因数

    题目描述 给你一个正整数 \(n\) ,请给 \(n\) 分解质因数,并按照样例输出的格式输出对应的结果. 输入格式 输入包含一个正整数 \(n (2 \le n \le 10^9)\) . 输出格式 ...

  9. H3C OSPF可选配置命令

  10. 提前终止forEach技巧,使用try catch

    学习react优化性能的时候,在render之前,生命周期shouldComponentUpdate里判断前后两次数据是否一致,使用了forEach嵌套if语句,如果满足条件想直接break跳出for ...