apache源码安装

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.4httpd-2.4的新特性: MPM支持运行DSO机制(Dynamic Share Object,模块的动态装/卸载机制),以模块形式按需加载 支持event MPM,eventMPM模块生产环境可用 支持异步读写 支持每个模块及每个目录分别使用各自的日志级别 每个请求相关的专业配置,使用来配置 增强版的表达式分析器 支持毫秒级的keepalive timeout 基于FQDN的虚拟主机不再需要NameVirtualHost指令 支持用户自定义变量 支持新的指令(AllowOverrideList) 降低对内存的消耗
工作模型工作方式
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自带的工具程序

工具功能
htpasswdbasic认证基于文件实现时,用到的帐号密码生成工具
apachectlhttpd自带的服务控制脚本,支持start,stop,restart
apxs由httpd-devel包提供的,扩展httpd使用第三方模块的工具
rotatelogs日志滚动工具
suexec访问某些有特殊权限配置的资源时,临时切换至指定用户运行的工具
abapache 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”

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值