hppt
httpd
httpd简介
httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。
通常,httpd不应该被直接调用,而应该在类Unix系统中由apachectl调用,在Windows中作为服务运行。
httpd版本
本文主要介绍httpd的两大版本,httpd-2.2和httpd-2.4。
- CentOS6系列的版本默认提供的是httpd-2.2版本的rpm包
- CentOS7系列的版本默认提供的是httpd-2.4版本的rpm包
httpd的特性
httpd有很多特性,下面就分别来说说httpd-2.2版本和httpd-2.4版本各自的特性。
版本 | 特性 |
---|---|
2.2 | 事先创建进程 按需维持适当的进程 模块化设计,核心比较小,各种功能通过模块添加(包括PHP),支持运行时配置,支持单独编译模块 支持多种方式的虚拟主机配置,如基于ip的虚拟主机,基于端口的虚拟主机,基于域名的虚拟主机等 支持https协议(通过mod_ssl模块实现) 支持用户认证 支持基于IP或域名的ACL访问控制机制 支持每目录的访问控制(用户访问默认主页时不需要提供用户名和密码,但是用户访问某特定目录时需要提供用户名和密码) 支持URL重写 支持MPM(Multi Path Modules,多处理模块)。用于定义httpd的工作模型(单进程、单进程多线程、多进程、多进程单线程、多进程多线程) |
2.4 | httpd-2.4的新特性: MPM支持运行DSO机制(Dynamic Share Object,模块的动态装/卸载机制),以模块形式按需加载 支持event MPM,eventMPM模块生产环境可用 支持异步读写 支持每个模块及每个目录分别使用各自的日志级别 每个请求相关的专业配置,使用 |
工作模型 | 工作方式 |
---|---|
prefork | 多进程模型,预先生成进程,一个请求用一个进程响应 一个主进程负责生成n个子进程,子进程也称为工作进程 每个子进程处理一个用户请求,即使没有用户请求,也会预先生成多个空闲进程,随时等待请求到达,最大不会超过1024个 |
worker | 基于线程工作,一个请求用一个线程响应(启动多个进程,每个进程生成多个线程) |
event | 基于事件的驱动,一个进程处理多个请求 |
httpd-2.4新增的模块
httpd-2.4在之前的版本基础上新增了几大模块,下面就几个常用的来介绍一下。
模块 | 功能 |
---|---|
mod_proxy_fcgi | 反向代理时支持apache服务器后端协议的模块 |
mod_ratelimit | 提供速率限制功能的模块 |
mod_remoteip | 基于ip的访问控制机制被改变,不再支持使用Order,Deny,Allow来做基于IP的访问控制 |
httpd基础
httpd自带的工具程序
工具 | 功能 |
---|---|
htpasswd | basic认证基于文件实现时,用到的帐号密码生成工具 |
apachectl | httpd自带的服务控制脚本,支持start,stop,restart |
apxs | 由httpd-devel包提供的,扩展httpd使用第三方模块的工具 |
rotatelogs | 日志滚动工具 |
suexec | 访问某些有特殊权限配置的资源时,临时切换至指定用户运行的工具 |
ab | apache benchmark,httpd的压力测试工具 |
rpm包安装的httpd程序环境
文件/目录 | 对应的功能 |
---|---|
/var/log/httpd/access.log | 访问日志 |
/var/log/httpd/error_log | 错误日志 |
/var/www/html/ | 站点文档目录 |
/usr/lib64/httpd/modules/ | 模块文件路径 |
/etc/httpd/conf/httpd.conf | 主配置文件 |
/etc/httpd/conf.modules.d/*.conf | 模块配置文件 |
/etc/httpd/conf.d/*.conf | 辅助配置文件 |
mpm:以DSO机制提供,配置文件为/etc/httpd/conf.modules.d/00-mpm.conf
web相关的命令
curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等协议。
curl支持以下功能:
- https认证
- http的POST/PUT等方法
- ftp上传
- kerberos认证
- http上传
- 代理服务器
- cookies
- 用户名/密码认证
- 下载文件断点续传
- socks5代理服务器
- 通过http代理服务器上传文件到ftp服务器
语法:curl [options] [URL ...]
常用的options:
-A/--user-agent <string> //设置用户代理发送给服务器
-basic //使用Http基本认证
--tcp-nodelay //使用TCP_NODELAY选项
-e/--referer <URL> //来源网址
--cacert <file> //CA证书(SSL)
--compressed //要求返回时压缩的格式
-H/--header <line> //自定义请求首部信息传递给服务器
-I/--head //只显示响应报文首部信息
--limit-rate <rate> //设置传输速度
-u/--user <user[:password]> //设置服务器的用户和密码
-0/--http1 //使用http 1.0版本,默认使用1.1版本。这个选项是数字0而不是字母o
-o/--output //把输出写到文件中
-#/--progress-bar //进度条显示当前的传送状态
通过curl下载文件
root@localhost ~]# curl -o apr-util https://mirrors.bfsu.edu.cn/apache/apr/apr-util-1.6.1.tar.bz2
httpd命令
语法:httpd [options]
语法:httpd [options]
-l //查看静态编译的模块,列出核心中编译了哪些模块。 \
//它不会列出使用LoadModule指令动态加载的模块
-M //输出一个已经启用的模块列表,包括静态编译在服务 \
//器中的模块和作为DSO动态加载的模块
-v //显示httpd的版本,然后退出
-V //显示httpd和apr/apr-util的版本和编译参数,然后退出
-X //以调试模式运行httpd。仅启动一个工作进程,并且 \
//服务器不与控制台脱离
-t //检查配置文件是否有语法错误
[root@localhost /]# httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
[root@localhost /]# httpd -M
AH00558: httpd: Could not reliably determine the server's fully qualified domain
name, using localhost.localdomain. Set the 'ServerName' directive globally to
suppress this message
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
access_compat_module (shared)
actions_module (shared)
alias_module (shared)
mpm_event_module (shared)
……
[root@localhost /]# httpd -v
Server version: Apache/2.4.37 (centos)
Server built: Jul 31 2020 23:10:22
[root@localhost /]# httpd -V
Server version: Apache/2.4.37 (centos)
Server built: Jul 31 2020 23:10:22
Server's Module Magic Number: 20120211:83
Server loaded: APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: event
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="run/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
httpd源码安装
安装依赖包和需要的软件
[root@localhost ~]# dnf -y install gcc gcc-c++ make pcre-devel openssl openssl-devel libtool expat-devel bzip2
//安装过程省略
下载源码包和依赖包
[root@localhost ~]# wget https://mirrors.bfsu.edu.cn/apache/apr/apr-1.7.0.tar.bz2 //使用wget命令下载依赖包apr
[root@localhost ~]# wget https://mirrors.bfsu.edu.cn/apache/apr/apr-util-1.6.1.tar.bz2 //使用wget命令下载依赖包apr-utli
[root@localhost ~]# wget https://mirrors.bfsu.edu.cn/apache/httpd/httpd-2.4.46.tar.bz2 //使用wget命令下载httpd
[root@localhost ~]# ls
anaconda-ks.cfg apr-util-1.6.1.tar.bz2
apr-1.7.0.tar.bz2 httpd-2.4.46.tar.bz2
依次解压源码包
[root@localhost ~]# tar xf apr-1.7.0.tar.bz2
[root@localhost ~]# tar xf apr-util-1.6.1.tar.bz2
[root@localhost ~]# tar xf httpd-2.4.46.tar.bz2
httpd依赖apr和apr-util,apr-util又依赖apr所以得按照顺序先安装apr再安装apr-util最后安装httpd
安装apr
[root@localhost ~]# cd apr-1.7.0
[root@localhost apr-1.7.0]# vim configure
$RM "$cfgfile" //将此行注释或者删除
[root@localhost apr-1.7.0]# ./configure --prefix=/usr/local/apr
//配置过程省略
[root@localhost apr-1.7.0]# make
//编译过程省略
[root@localhost apr-1.7.0]# make install
//编译安装过程省略
安装apr-util
[root@localhost apr-1.7.0]# cd ../apr-util-1.6.1
[root@localhost apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
//配置过程省略
[root@localhost apr-util-1.6.1]# make
//编译过程省略
[root@localhost apr-util-1.6.1]# make install
//编译安装过程省略
安装httpd
[root@localhost apr-util-1.6.1]# cd ../httpd-2.4.46
[root@localhost httpd-2.4.46]# ./configure --prefix=/usr/local/apache \
--sysconfdir=/etc/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util/ \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork
//配置过程省略
[root@localhost httpd-2.4.46]# make
//编译过程省略
[root@localhost httpd-2.4.46]# make install
//编译安装过程省略
启动apache服务
[root@localhost ~]# /usr/local/apache/bin/apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
[root@localhost ~]# ss -ant
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
ESTAB 0 0 192.168.96.129:22 192.168.96.1:55507
ESTAB 0 36 192.168.96.129:22 192.168.96.1:55709
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
关闭防火墙和selinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
打开浏览器输入ip地址
正向代理、反向代理、透明代理
正向代理
正向代理,就是一个位于客户端和原始服务器之前的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并且指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端,客户端才能使用正向代理。
比如我们要去访问某个网站,我们直接访问不通,那么我们就可以找一个代理服务器为我们服务,我们通过代理服务器请求到这个网站。对于这个网站而言他只知道有一个服务器访问了自己,并不知道你访问了他。
再举一个简单的例子什么是正向代理:
假设A和B是同学,但平时并不是很熟,A向B借钱,被B拒绝了。
此时A联系了C,C是A的好朋友,C和B也很熟。
C向B借了钱并且给了A。
此时A拿到了B的钱,但B并不知道他的钱借给了A。
这时B同学扮演了一个非常关键的角色,就是代理,也可以说是正向代理
即就是隐藏了真实的客户端
反向代理
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
反向代理方式是指以代理服务器来接收internet网上的连接请求,然后将请求转发给内部网络上的服务器,并从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个节点服务器。
例如:
我们平时访问百度时,直接访问www.baidu.com。
它背后可能有成千上万的服务器为我们服务,但具体是哪一台为我们服务,我们并不知道,也没必要知道。
我们只需要知道反向代理服务器是谁就可以(只要达到目的就可以了)。
透明代理
透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改变你的请求报文,并会传送真实IP
用户 A 和用户 B 并不知道行为管理设备充当透明代理行为,当用户 A 或用户 B 向服务器 A 或服务器 B 提交请求的时候,透明代理设备根据自身策略拦截并修改用户 A 或 B 的报文,并作为实际的请求方,向服务器 A 或 B 发送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户 A 或 B,如果透明代理设置不允许访问服务器 B,那么用户 A 或者用户 B 就不会得到服务器 B 的数据。
http协议的状态码及含义
1xx:100-101,纯信息提示
100:服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求,响应状态码为"Continue"
101:服务器转换协议,服务器将遵从客户的请求转换到另外一种协议,响应状态码为"Switching Protocols"
2XX:200-206,“成功”类的信息
200:请求资源正常。请求的所有数据通过响应报文的entity-body部分发送,响应状态码为“OK”
201:请求被创建完成,同时新的资源被创建,响应状态码为"Created"
202:供处理的请求已被接受,但处理未完成,响应状态码为"Accepted"
203:文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝,响应状态码为"Non-authoritative information"
204:没有新文档。浏览器应该继续显示原来的文档。响应状态码为"No Content"
205:没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容,响应状态码为"Reset Content"
206:客户发送了一个带有Range头的GET请求,服务器完成了它
3XX:300-305,“重定向”类的信息
301:永久重定向,响应状态码为“Moved Permanently”
请求的URL指向的资源已经被删除,但在响应报文中通过首部Location指明了资源现在所处的新位置,客户端需要请求新位置的资源
302:临时重定向,我这里正忙,你要的资源在另一个地方也有,你先去那里要,响应状态码为“Found”
与301相似,但在响应报文中通过Location指明资源现在所处的临时新位置
304:客户端发出了条件式请求,但服务器端发现客户端请求的资源已被客户端缓存过且未发生改变,让客户端直接到缓存里去取。响应状态码为“Not Modified”
4XX:400-415,“客户端错误”类的信息
400:由于客户端请求有语法错误,不能被服务器所理解,响应状态码为“Bad Request”
401:需要输入帐号和密码认证方能访问资源,响应状态码为“Unauthorized”
403:请求被禁止,响应状态码为“Forbidden”
404:服务器无法找到客户端请求的资源,响应状态码为“Not Found”
5XX:500-505,“服务端错误”类的信息
500:服务器内部错误,响应状态码为“Internal Server Error”
502:代理服务器从后端服务器收到了一条伪响应,响应状态码为“Bad Gateway”
503:服务器当前不能够处理客户端的请求,在一段时间之后,响应状态码为“Service”