文章目录
二、Apache web服务
2.1 Apache介绍
Apache Software Fondation基金
httpd是apache的web服务器端软件
2.2 相比nginx优缺点
2.2.1 缺点
资源占用高
并发性能差
2.2.2 优点
rewrite,比nginx 的rewrite 强大
模块多
少bug
稳定
处理动态请求能力优于nginx
2.3 MPM(多处理模块)
可以通过httpd -V查看
[root@localhost ~]# httpd -V | grep -i "server mpm"
Server MPM: Prefork
prefork(默认) 单进程模型
worker 单线程响应单用户请求
event 单进程响应多用户请求
2.3.1 prefork工作模式
(一个进程处理一个客户端请求)
Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
作用:用一个进程处理一个用户请求。
优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求。
2.3.2 worker工作模式
(一个进程生成多个线程,一个线程处理一个客户端请求)
使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些
作用:一个进程生成多个线程,一个线程处理一个用户请求
优点:占据更少的内存,高并发下表现更优秀。
缺点:必须考虑线程安全的问题。
2.3.3 event工作模式
(支持keepalive,数据传送完毕自动断开,但是不支持https)
用一个线程处理一个用户请求。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,
将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。
HTTP采用keepalive方式减少TCP连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁忙的服务器会消耗完所有的线程。Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限 制,此时Event MPM方式是最有效的,但不能在HTTPS访问下工作。
Apache针对不同的操作系统提供了多个不同的MPM模块,例如:mpm_beos、mpm_event、mpm_netware、mpmt_os2、mpm_prefork、mpm_winnt、mpm_worker。
不同操作系统上默认的MPM模块 | ||
---|---|---|
操作系统 | MPM模块 | 描述 |
Windows | mpm_winnt | 它只创建一个单独的子进程,并在这个子进程中轮流产生多个线程来处理请求。 |
Unix/Linux | mpm_prefork | (一个进程处理一个客户端请求) |
BeOS | mpm_beos | 由Be公司开发的一种多媒体操作系统,官方版已停止更新。 |
Netware | mpm_netware | 由NOVELL公司推出的一种网络操作系统 |
OS/2 | mpmt_os2 | 一种最初由微软和IBM共同开发的操作系统,现由IBM单独开发(微软放弃OS/2,转而开发Windows) |
2.4 相关文件(2.4)
主配置文件: /etc/httpd/conf/httpd.conf 编译安装目录/conf/httpd.conf
其他配置文件:
/etc/httpd/conf.d/*.conf
/etc/httpd/conf.modules.d/*.conf
网页数据文件: /var/www/html 编译安装目录/html/
2.5 监听端口
http: tcp 80
https: tcp 443
2.6 主配置文件(httpd2.2)
httpd.apache.org
Section 1: Global Environment
-
ServerTokens OS
-
ServerRoot “/etc/httpd” 服务端相关文件默认目录
-
PidFile run/httpd.pid 进程运行时将pid写入文件
-
Listen 80 监听端口
-
KeepAlive Off 是否开启持久连接
-
Include conf.d/*.conf 将conf.d目录下所有.conf结尾文件包含进来(Include conf.modules.d/*.conf)
-
User apache 服务进程(/usr/sbin/httpd)执行者
-
Group apache 服务进程执行组
Section 2: ‘Main’ server configuration 配置主站点
- ServerAdmin root@localhost 网站管理员邮箱
- ServerName www.pl.com 站点名称
- DocumentRoot “/var/www/html” 站点根目录
- DirectoryIndex index.html index.html.var 目录首页
- ErrorLog logs/error_log 错误日志
- CustomLog logs/access_log combined 用户访问日志
- Alias /icons/ “/var/www/icons/” 别名,当访问/icons目录即访问/var/www/icons(www.pl.com/icon/a.jpg、/var/www/icons/a.jpg)
- 为指定目录定义功能
<Directory />
Options FollowSymLinks
#FollowSymLinks 是否允许追踪符号链接
#Indexes 索引,用于基于http协议的文件浏览
AllowOverride None
</Directory>
-
访问控制
Order allow,deny (默认拒绝所有)
Allow from allOrder deny,allow (默认允许所有)
deny from 192.168.1.0/24
allow from all
Section 3: Virtual Hosts
- NameVirtualHost *:80 #开启虚拟主机
- <VirtualHost *:80>
- DocumentRoot /var/www/html
- ServerName www.pl.com
- ErrorLog logs/www.pl.com-error_log
- CustomLog logs/www.pl.com-custom_log common
- </VirtualHost>
- <VirtualHost *:80>
- DocumentRoot /test
- ServerName www.test.com
- ErrorLog logs/www.test.com-error_log
- CustomLog logs/www.test.com-custom_log common
- <Directory /test/download>
- options indexes #将download目录作为文件共享目录,并生成索引页面
- </Directory>
web认证功能
<VirtualHost *:80>
<Directory /test/private>
AuthName "Input your username and password,please!"
AuthType Basic
AuthUserFile /etc/httpd/testpasswd
require valid-user
</Directory>
</VirtualHost>
生成用户认证文件 htpasswd -cm /etc/httpd/testpasswd alice (第一次添加用户需-c)
1.基于IP的虚拟主机
2.基于端口的虚拟主机
3.基于域名的虚拟主机
2.6.1 基于域名的虚拟主机
配置文件
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory />
AllowOverride none
Require all granted # 修改这个
</Directory>
[root@localhost ~]# vim /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
DocumentRoot "/data/pl"
ServerName www.pl.com
ErrorLog "logs/www.pl.com-error_log"
TransferLog "logs/host.pl.com-access_log"
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/haha"
ServerName www.haha.com
ErrorLog "logs/www.haha.com-error_log"
TransferLog "logs/host.haha.com-access_log"
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/hehe"
ServerName www.hehe.com
ErrorLog "logs/www.hehe.com-error_log"
TransferLog "logs/host.hehe.com-access_log"
</VirtualHost>
创建文件
[root@localhost ~]# mkdir /data
[root@localhost ~]# mkdir /data/{pl,haha,hehe}
[root@localhost ~]# echo "<h>pl</h>" > /data/pl/index.html
[root@localhost ~]# echo "<h>haha</h>" > /data/haha/index.html
[root@localhost ~]# echo "<h>hehe</h>" > /data/hehe/index.html
写入域名解析
[root@localhost ~]# vim /etc/hosts
192.168.217.155 www.pl.com www.haha.com www.hehe.com
测试
2.6.2 虚拟主机做文件共享以及认证
-
www.pl.com 静态页面
-
www.haha.com 文件共享
-
www.hehe.com 认证
-
解析动态php请求
配置
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory />
AllowOverride none
Require all granted # 修改这个
</Directory>
[root@localhost ~]# vim /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
DocumentRoot "/data/pl"
ServerName www.pl.com
ErrorLog "logs/www.pl.com-error_log"
TransferLog "logs/host.pl.com-access_log"
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/haha"
ServerName www.haha.com
ErrorLog "logs/www.haha.com-error_log"
TransferLog "logs/host.haha.com-access_log"
<Directory "/data/haha/share">
Options Indexes
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/hehe"
ServerName www.hehe.com
ErrorLog "logs/www.hehe.com-error_log"
TransferLog "logs/host.hehe.com-access_log"
<Directory "/data/hehe/secert">
AuthName "Input your username and password,please!"
AuthType Basic
AuthUserFile /etc/httpd/testpasswd
require valid-user
</Directory>
</VirtualHost>
文件共享
[root@localhost ~]# rm -rf /data/haha/index.html
[root@localhost ~]# mkdir /data/haha/share
[root@localhost ~]# cp -a /etc/*.conf /data/haha/share/
访问
认证
[root@localhost ~]# htpasswd -cm /etc/httpd/testpasswd alice
New password:
Re-type new password:
Adding password for user alice
[root@localhost ~]# mkdir /data/hehe/secert
[root@localhost ~]# echo "this is secert" > /data/hehe/secert/index.html
访问
可以看到
2.7 源码编译安装httpd2.4
0.安装相关编译工具
[root@httpd ~]# yum install -y automake make autoconf gcc expat-devel gcc-c++
[root@httpd ~]# wget http://archive.apache.org/dist/apr/apr-1.5.1.tar.gz
[root@httpd ~]# wget http://archive.apache.org/dist/apr/apr-util-1.6.1.tar.gz
[root@httpd ~]# wget http://www.zlib.net/zlib-1.2.11.tar.gz
[root@httpd ~]# wget https://sourceforge.net/projects/pcre/files/pcre/8.38/pcre-8.38.tar.gz
[root@httpd ~]# wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2n.tar.gz
[root@httpd ~]# wget http://archive.apache.org/dist/httpd/httpd-2.4.29.tar.gz
1.下载源码包
apr-1.5.1.tar.gz
[root@httpd ~]# tar -xzvf apr-1.5.1.tar.gz
[root@httpd ~]# cd apr-1.5.1
[root@httpd apr-1.5.1]# ./configure --prefix=/usr/local/apr
[root@httpd apr-1.5.1]# make && make install
yum -y install libtool libtool-ltdl libtool-ltdl-devel
apr-util-1.6.1.tar.gz
[root@httpd ~]# tar -xzvf apr-util-1.6.1.tar.gz
[root@httpd ~]# cd apr-util-1.6.1
[root@httpd apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@httpd apr-util-1.6.1]# make && make install
zlib-1.2.11.tar.gz
[root@httpd ~]# tar -xzvf zlib-1.2.11.tar.gz
[root@httpd ~]# cd zlib-1.2.11
[root@httpd zlib-1.2.11]# ./configure --prefix=/usr/local/apr
[root@httpd zlib-1.2.11]# make && make install
pcre-8.38.tar.gz
[root@httpd ~]# tar -xzvf pcre-8.38.tar.gz
[root@httpd ~]# cd pcre-8.38
[root@httpd pcre-8.38]# ./configure --prefix=/usr/local/pcre
[root@httpd pcre-8.38]# make && make install
openssl-1.0.2n.tar.gz
[root@httpd ~]# tar -xzvf openssl-1.0.2n.tar.gz
[root@httpd ~]# cd openssl-1.0.2n
[root@httpd openssl-1.0.2n]# ./config -fPIC --prefix=/usr/local/openssl enable-shared
[root@httpd openssl-1.0.2n]# make && make install
httpd-2.4.29.tar.gz
[root@httpd ~]# tar -xzvf httpd-2.4.29.tar.gz
[root@httpd ~]# cd httpd-2.4.29
[root@httpd httpd-2.4.29]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-ssl --with-ssl=/usr/local/openssl --enable-cgi --enable-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-mpm=event --with-pcre=/usr/local/pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-expires --enable-deflate
[root@httpd httpd-2.4.29]# make && make install
yum install -y zlib-devel
apr-util版本太高
开启服务
[root@httpd ~]# /usr/local/httpd/bin/apachectl start
访问192.168.217.154:80