文章目录
详解apache服务的概念与搭建
以上就是本篇Blog的层级架构
-
HTML语言:超文本标记语言,使用html语言编写的文本叫超文本,“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。
-
HTTP协议:超文本传输协议
HTTP使用统一资源标识符(URL)来建立连接和传输数据。是一个基于TCP/IP通信协议来传递数据的协议,属于应用层协议。 -
URL:统一资源定位符
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
格式:
http://www.bytedance.com:80/image/a.jpg
知识拓展:
URI:统一资源标志符,URI与URL都是定位资源位置的,就是表示这个资源的位置信息,就像经纬度一样可以表示你在世界的哪个角落。URI是一种宽泛的含义更广的定义,而URL则是URI的一个子集,就是说URL是URI的一部分。
参考阅读
之前写过一篇http服务的搭建,但是写的是rpm包安装的配置即搭建过程,如下
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Pytho/php等解释器编译到服务器中。 Apache有多种产品,可以支持SSL技术,支持多个虚拟主机。
Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个ApacheWeb站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。到目前为止Apache仍然是世界上用的最多的Web服务器,市场占有率达60%左右。
一、工作模式
Apache一共有3种稳定的MPM模式(MPM:多进程处理模块),它们分别是 prefork、worker、event
1.1 prefork
Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。
每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
- 优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。
- 缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求。
1.2 worker
使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。
在高并发的场景下, 因为比起prefork有更多的可用线程,表现会更优秀一些。
- 优点:占据更少的内存,高并发下表现更优秀。
- 缺点:必须考虑线程安全的问题。
1.3 event
它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。
keep-alive
HTTP采用keepalive方式减少TCP连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁忙的服务器会消耗完所有的线程。EventMPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限制,此时Event MPM方式是最有效的,但不能在HTTPS访问下工作。
- 优点:优化worker模式下keep-alive场景下,长期被占用的线程的资源浪费问题
- 缺点:不能在HTTPS访问下工作
如何查看当前Web服务器的工作模式?
[root@localhost ~]# httpd -V | grep -i "server mpm"
Server MPM: worker
二、文件保存位置
2.1配置文件
- 源码
主配置文件:PREFIX/etc/httpd.conf
子配置文件:PREFIX/etc/extra/*.conf - rpm
/etc/httpd/conf/httpd.conf
2.2 网页文件
- 源码
PREFIX/htdocs - rpm
/var/www/html
2.3 日志文件
- 源码
PREFIX/logs - rpm
/var/log/httpd
三、参数介绍
注意:apache配置文件严格区分大小写
3.1 针对主机环境的基本配置参数
ServerRoot /usr/local/apache2 #apache主目录
Listen :80 #监听端口
LoadModule php7 #加载的相关模块
User
Group #用户和组
ServerAdmin #管理员邮箱
ServerName #服务器名(没有域名解析时,使用临时解析。默认不开启)
ErrorLog "logs/error_log #服务器错误日志
CustomLog "logs/access_log" common #访问记录日志
DirectoryIndex index.html index.php #默认网页文件名,优先级顺序
Includeetc/extra/httpd-vhosts.conf #子配置文件中内容也会加载生效
3.2 主页目录及权限
DocumentRoot "/usr/local/apache2/htdocs" #网页文件存放目录(默认)
<Directory " /usr/local/apache2/htdocs"> #定义指定目录的权限
Options Indexes FollowSymLinks
None #没有任何额外权限
All #所有权限(除去MultiViews以外)
Indexes #浏览权限(当此目录下没有默认网页文件时,显示目录内容)
FollowSymLinks #准许软连接到其他目录
MultiViews #准许文件名泛匹配(需要手动开启模块才有效negotiation)
AllowOverride None #定义是否允许目录下.htaccess文件中的权限生效
None #.htaccess中权限不生效
All #文件中所有权限都生效
AuthConfig #文件中,只有网页认证的权限生效
Require all granted (denied) #访问控制列表
</Directory>
<IfModule dir_module> #此标签用来指定访问到指定目录时自动加载哪个页面文件
DirectoryIndex index.php index.html #可以写多个,但是有优先级之分
</IfModule>
四、实验部署
4.0 部署环境
实验环境
虚拟机:Centos6.8
网络模式:仅主机模式 192.168.56.6
apache安装版本:httpd-2.4.7
Apache依赖:apr-1.4.6.tar apr-util-1.4.1.tar pcre-8.34
Apache 的加密传输模块 mod_ssl rpm安装openssl-devel即可
环境部署总体步骤
1、源码安装
2、启动服务
3、测试
解决依赖关系:
注意:所有的源码包我都放在了/lamp
下
a. 源码包 2.4.*版本中默认没有集成 apr 的依赖包
cp -a /lamp/apr-1.4.6 /lamp/httpd-2.4.7/srclib/apr
cp -a /lamp/apr-util-1.4.1 /lamp/httpd-2.4.7/srclib/apr-util
b. Apache 默认需要依赖 pcre 软件,但由于 Apache 软件版本较高,则系统预安装的 pcre 无法使用, 所以需要人为手动安装适合版本
cd /lamp/pcre-8.34 # ./configure
make
make install
c. Apache 的加密传输模块 mod_ssl,需要安装此软件产生
yum install openssl-devel
d. httpd安装
cd /lamp/httpd-2.4.7
./configure --prefix=/usr/local/apache2 -sysconfdir=/usr/local/apache2/etc
--with-included-apr --enable-so --enable-deflate=shared --enable-expires=shared --enable-rewrite=shared --enable-ssl
make
make install
创建软连接优化
ln -s /usr/local/apache2/bin/* /usr/local/bin/
启动httpd测试:
[root@localhost ~]# apachectl -t
Syntax OK
[root@localhost ~]# apachectl start
[root@localhost ~]#
报错提示: 若启动时提示
/usr/local/apache2/module/mod_deflate.so
无权限,可关闭 SELinux 解决,类似此类.so 文件不能载入或没有权限的问题,都是 SELinux 问题,MySQL 和 Apache 都可能有类似问题。
警告提示: 发现启动服务提示: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
解决办法:打开主配置文件httpd.conf
搜索ServerName
(约在 200 行左右)改为 ServerName localhost:80(并且去掉前面的#注释)
验证: 通过浏览器输入地址访问:http://服务器 ip,若显示
It works
即表明 Apache 正常工作
访问成功后,页面会显示如下内容,这是因为/usr/local/apache2/htdocs/index.html
下的内容是这个
4.1 目录别名
当 apache 接受请求时,在默认情况下会将 DocumentRoot 目录中的文件送到客户端,如果想将某一不在 DocumentRoot 目录中的文件共享到网站上,并希望将它们留在本来位置而不需要进行移动的话, 处理这种情况可以通过建立别名的方式将 URL 指向特定的目录
1、主配置文件中打开httpd-autoindex.conf
这个子配置文件
2、进入这个子配置文件中,修改希望跳转的URL;仿照模板写一个目录别名
创建
/a/b
,并在/b
下创建一个html
的网页文件
[root@localhost ~]# mkdir -p /a/b/
[root@localhost ~]# cd /a/b
[root@localhost b]# ll
总用量 4
-rw-r--r-- 1 root root 16 2月 16 14:19 a.html
[root@localhost b]# cat a.html
this is a alias
[root@localhost b]#
网站登录测试
注意:在子配置文件中声明的是b目录,这里测试的时候也要带上
/
可见,与预期相符
4.2 用户认证
有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全。比如我们的个人网站,一般都是有一个管理后台的,虽然管理后台本身就有密码,但我们为了更加安全,可以再设置一层用户身份认证。
注意,这一层身份认证不是网页内部,写入数据库的认证,而是权限层级的页面认证,是写在操作系统的配置文件中的
1、主配置文件中对想要验证的目录编辑<Directory>
标签
注意AllowOverride的参数为All,即文件中所有权限都生效
2、创建
/usr/local/apache2/htdocs/admin
文件,并创建.htaccess
AuthName "Welcome to eichi" #提示信息
AuthType basic #加密类型
AuthUserFile /usr/local/apache2/htdocs/admin/apache.passwd #密码文件,文件名自定义。(使用绝对路径)
require valid-user#允许密码文件中所有用户访问
3、建立密码文件,加入允许访问的用户。(此用户和系统用户无关)
htpasswd -c /usr/local/apache2/htdocs/admin/apache.passwd yi
-c 建立密码文件,只有添加第一个用户时,才能-c
htpasswd -m /usr/local/apache2/htdocs/admin/apache.passwd chen
-m 再添加更多用户时,使用-m 参数
注意: htpasswd 该命令是 httpd 的命令,需要绝对路径
查看apache.passwd
文件
4、重启测试
[root@localhost admin]# apachectl -t
Syntax OK
[root@localhost admin]# apachectl restart
[root@localhost admin]#
正确输入用户名与密码后即可正确登录
点击
apache.passwd
文件可以看到被允许的用户名与密码
4.3 虚拟主机(※)
简单来说,就是一个IP为多个不同的域名提供内容,此时验证将www.eichi.com
与www.yichen.com
作为两个不同的域名,但是其内容都是192.168.56.6上
1、主配置文件中打开如下这个子配置文件的注释,即使其生效
2、修改子配置文件
3、创建/eichi
与/yichen
两个文件
[root@localhost htdocs]# cd eichi/
[root@localhost eichi]# cat index.html
this is eichi
[root@localhost eichi]# cd ../yichen/
[root@localhost yichen]# cat index.html
this is yichen
4、重启服务测试
Windows 下:浏览器下输入两个不同的域名验证网页内容(提前修改
C:\Windows\System32\drivers\etc
的 hosts 文件) Linux 下:通过 elinks/curl 命令验证:elinks/curl URL 地址(提前修改etc/hosts
的 hosts 文件)
增加如下内容
可见,与预期相符
4.4 域名跳转
一个站点难免会有多个域名,而多个域名总得有一个主次,比如此实验的网站可以用两个域名访问: www.eichi.com 和 www.yichen.com 但是不管我用哪个域名访问,最终都会跳转到 www.eichi.com 上来。这个行为就叫做域名跳转,状态码:301 是永久跳转,302 是临时跳转,网站上一定要设置为 301, 这样对搜索引擎是比较友好的。
目标:访问www.yichen.com
跳转到www.yichen.com
上
1、在主配置文件中打开重写模块。即取消注释
2、在虚拟主机的配置文件中,修改
yichen
这个文件的目录属性,即All
3、进入
yichen
文件内创建匹配规则
RewriteEngine on # 开启rewrite功能
RewriteCond %{HTTP_HOST} ^www.sohu.com # 把以www.sina.com 开头的内容赋值给HTTP_HOST变量
RewriteRule ^(.*)$ http://www.sina.com/$1 [R=permanent,L]
# ^(.*)$ 指代客户端要访问的资源
# $1 把 .* 所指代的内容赋值到$1变量中
# R=permanent 永久重定向 = 301
# L 指定该规则为最后一条生效的规则,以后的不再生效
4、重启测试
访问www.yichen.com
会自动跳转到www.eichi.com
上
4.5 ssl加密(apache+openssl=https)
HTTPS(全称:Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP
通道,简单讲是 HTTP 的安全版。即HTTP 下加入SSL 层,用于安全的 HTTP
数据传输。这个系统被内置于浏览器中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
首先检查Apache是否支持SSL,即检查相对应的模块是否安装
模块存放目录:/usr/local/apache2/modules
检查模块是否启用:apachectl -M
1、制作CA证书
a. openssl genrsa -out ca.key 1024
#建立服务器私钥,生成RSA 密钥
b. openssl req -new -key ca.key -out chen.csr
#需要依次输入国家,地区,城市,组织,组织单位,Email 等信息。最重要的是有一个 common name,可以写你的名字或者域名。如果为了 https 申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr 文件交给 CA 签名后形成服务端自己的证书
c. openssl x509 -req -days 365 -sha256 -in chen.csr -signkey ca.key -out chen.crt #使用 CA 服务器签发证书,设置证书的有效期等信息
注意 1:生成完秘钥和证书文件后,将文件存放在 Apache 的安装目录下的cert 目录下
注意 2:在生产环境中必须要在 https 证书厂商注册(否则浏览器不识别)
2、修改主配置文件,使其加载mod_ssl.so
模块,并打开/httpd-ssl.conf
这个子配置文件
3、修改子配置文件
#添加 SSL 协议支持协议,去掉不安全的协议
SSLProtocol all -SSLv2 -SSLv3
#修改加密套件如下
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
#证书公钥配置(签字的)
SSLCertificateFile cert/chen.crt
#证书私钥配置
SSLCertificateKeyFile cert/ca.key
4、在主配置文件中添加虚拟主机
5、重启服务测试验证
报错提示: AH00526: Syntax error on line 78 of
/usr/local/apache2/etc/extra/httpd-ssl.conf:SSLSessionCache: ‘shmcb’
session cache not supported (known names: ). Maybe you need to loadthe appropriate socache module (mod_socache_shmcb?).
解决方案: 要么不调用此模块,要么让调用的模块加载上,即在主配置文件中打开这个模块即可
由于CA证书是我自己制作的,即不具备权威,所以网页提示存在风险,测试环境,点击高级,继续进入即可
此时还是可以使用http登录网站的,如下所示
需求:为了保证安全,强制跳转https
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L]
可见,使用http访问apache时,自动跳转至https