HTTP-Apache篇
1. apache介绍和特点
1.1 apache特性
- 高度模块化:core + modules
- DSO:Dynamic Shared Object 动态加/卸载
- MPM:multi-processing module 多路处理模块
1.2 apache功能
- 虚拟主机:IP、Port、FQDN
- CGI:Common Gateway Interface,通用网关接口
- 反向代理
- 负载均衡
- 路径别名
- 丰富的用户认证机制:basic,digest
- 支持第三方模块
1.3 apache-httpd-2.4特性
- MPM支持运行为DSO机制;以模块形式按需加载
- event MPM生产环境可用
- 异步读写机制
- 支持每模块及每目录的单独日志级别定义
- 每请求相关的专用配置
- 增强版的表达式分析式
- 毫秒级持久连接时长定义
- 基于FQDN的虚拟主机不需要NameVirutalHost指令
- 新指令
- 支持用户自定义变量
- 更低的内存消耗
2. MPM工作模式
2.1 prefork MPM:
- prefork:预派生模式,多进程I/O模型,每个进程响应一个请求,CentOS7 默认模型
- 一个主进程:生成和回收n个子进程,创建套接字,不响应请求
- 多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求
prefork:一个主进程生成多个子进程,每个子进程有一个线程用来响应请求。子进程数可以设置
- 优点:稳定
- 缺点:慢,占用资源,不适用于高并发场景
2.2 worker MPM:
- worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型
- 一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应
请求:m*n
worker MPM:多进程,多线程混合模式,其中每个进程的线程是固定的,当线程不够用的时候回启动新的线程。
- 优点:相比prefork 占用的内存较少,可以同时处理更多的请求
- 缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。
2.3 event MPM:
事件驱动模型(worker模型的变种),CentOS8 默认模型
event模式也是多进程多线程的模式,和worker模式不同的是,event模式里每个进程会有一个监控线程来管理工作线程,当有一个真实请求时,监控线程会将请求传递给工作线程,而当来一个空请求时,监控线程不分配工作线程。
- 优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀
- 缺点:缺点:没有线程安全控制
3. httpd相关文件
各个配置文件路径都是yum安装后的路径。
3.1 配置文件:
/etc/httpd/conf/httpd.conf
主配置文件
/etc/httpd/conf.d/*.conf
子配置文件
/etc/httpd/conf.d/conf.modules.d
/ 模块加载的配置文件
检查配置语法:httpd -t
或者bin/apachectl -t
3.2 服务单元文件:
/usr/lib/systemd/system/httpd.service
- 配置文件:/etc/sysconfig/httpd
3.3 服务控制和启动
- systemctl enable|disable httpd.service
- systemctl {start|stop|restart|status|reload} httpd.service
3.4模块文件路径:
/etc/httpd/modules
/usr/lib64/httpd/modules
3.5 主服务器程序文件:
/usr/sbin/httpd
3.6 主进程文件:
/etc/httpd/run/httpd.pid
3.7 日志文件目录:
/var/log/httpd
- access_log: 访问日志
- error_log:错误日志
4. apache安装
4.1 yum安装
yum install apache -y
4.2 编译安装
4.2.1 编译前说明
apache和别的app编译不太一样是因为,Apache在编译以前要安装APR
APR:Apache portable Run-time libraries,Apache可移植运行库,主要为上层的应用程序提供一个可以
跨越多操作系统平台使用的底层支持接口库
如图,各个app都是在通过操作系统的API接口进行开发的,操作系统的不同,API接口也会不同。而APR就相当于应用程序和系统API接口之间的层级,因为应用程序不直接接触操作系统,顾不用考虑API接口不同导致的问题
说明:安装httpd-2.4,依赖于apr-1.4+, apr-util-1.4+
4.2.2 安装依赖
[root@centos8 data]# yum -y install gcc make pcre-devel openssl-devel expat-devel
下载源代码并解压缩:
[root@centos8 data]# ll
total 8180
-rw-r--r-- 1 root root 872238 Dec 9 17:06 apr-1.7.0.tar.bz2
-rw-r--r-- 1 root root 428595 Dec 9 17:06 apr-util-1.6.1.tar.bz2
-rw-r--r-- 1 root root 7072373 Dec 9 17:05 httpd-2.4.41.tar.bz2
4.2.3 编译安装httpd的方法一
编译安装apr
[root@centos8 ~]# tar -xvf apr-1.7.0.tar.bz2
[root@centos8 ~]# cd apr-1.7.0/
[root@centos8 ~]# ./configure --prefix=/app/apr
[root@centos8 ~]# make && make install
编译安装apr-util
[root@centos8 data]# tar xvf apr-util-1.6.1.tar.bz2
[root@centos8 data]# cd apr-util-1.6.1/
[root@centos8 apr-util-1.6.1]# ./configure --prefix=/app/apr-util --with-apr=/app/apr
[root@centos8 apr-util-1.6.1]# make && make install
编译安装httpd-2.4
[root@centos8 data]# tar xf httpd-2.4.41.tar.bz2
[root@centos8 data]# cd httpd-2.4.41/
[root@centos8 httpd-2.4.41]#./configure --prefix=/app/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-apr=/app/apr/ \
--with-apr-util=/app/apr-util/ \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork
[root@centos8 httpd-2.4.41]# make -j 2 && make install
会有一大堆输出,每次执行完以后可以用echo $?
来确认是否有报错
4.2.4 编译安装httpd-2.4方法二
[root@centos8 data]# tar xf apr-1.7.0.tar.bz2
[root@centos8 data]# tar xf apr-util-1.6.1.tar.bz2
[root@centos8 data]# tar xf httpd-2.4.41.tar.bz2
将apr 和apr-util源码与httpd 源码合并
[root@centos8 data]# mv apr-1.7.0 httpd-2.4.41/srclib/apr
[root@centos8 data]# mv apr-util-1.6.1 httpd-2.4.41/srclib/apr-util
[root@centos8 data]# ll httpd-2.4.41/srclib/
total 12
drwxr-xr-x 27 1001 1001 4096 Apr 2 2019 apr
drwxr-xr-x 20 1001 1001 4096 Oct 18 2017 apr-util
-rw-r--r-- 1 root 40 121 Feb 11 2005 Makefile.in
[root@centos8 data]#
将三者一并编译并安装
[root@centos8 data]# cd httpd-2.4.41/
[root@centos8 httpd-2.4.41]# ls
ABOUT_APACHE CMakeLists.txt INSTALL NWGNUmakefile
acinclude.m4 config.layout InstallBin.dsp os
Apache-apr2.dsw configure LAYOUT README
Apache.dsw configure.in libhttpd.dep README.cmake
apache_probes.d docs libhttpd.dsp README.platforms
ap.d emacs-style libhttpd.mak ROADMAP
build httpd.dep LICENSE server
BuildAll.dsp httpd.dsp Makefile.in srclib
BuildBin.dsp httpd.mak Makefile.win support
buildconf httpd.spec modules test
CHANGES include NOTICE VERSIONING
[root@centos8 httpd-2.4.41]# ./configure \
--prefix=/app/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-included-apr \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork
[root@centos8 httpd-2.4.41]# make -j 2 && make install
4.2.5 编译安装后配置
Httpd编译过程:/app/httpd24/build/config.nice
自带的服务控制脚本:/app/httpd24/bin/apachectl
创建用户
[root@centos8 ~]# useradd -s /sbin/nologin -r apache
修改配置文件
vim /app/httpd24/conf/httpd
user apache
group apache
修改环境变量
root@centos8 ~]# vim /etc/profile.d/httpd.sh
PATH=/app/httpd24/bin:$PATH
[root@centos8 ~]# . /etc/profile.d/httpd.sh
设置开机自启
[root@centos8 ~]# ll /etc/rc.d/rc.local
-rw-r--r--. 1 root root 474 May 23 2019 /etc/rc.d/rc.local
[root@centos8 ~]# vim /etc/rc.d/rc.local
/app/httpd24/bin/apachectl start
[root@centos8 ~]# chmod +x /etc/rc.d/rc.local
[root@centos8 ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x 1 root root 507 Dec 10 19:33 /etc/rc.d/rc.local
-. 1 root root 474 May 23 2019 /etc/rc.d/rc.local
[root@centos8 ~]# vim /etc/rc.d/rc.local
/app/httpd24/bin/apachectl start
[root@centos8 ~]# chmod +x /etc/rc.d/rc.local
[root@centos8 ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x 1 root root 507 Dec 10 19:33 /etc/rc.d/rc.local