httpd服务

1、httpd服务简介

Apache HTTP Server(简称Apache或httpd)是Apache软件基金会的一个开放源代码的网页服务器软件,旨在为unix,windows等操作系统中提供开源httpd服务。由于其安全性、高效性及可扩展性,被广泛使用,自1996年4月以来,Apache一直是Internet上最流行的web服务。它快速、可靠并且可通过简单的API扩充,将Perl、Python等解释器等编译到httpd的相关模块中。

Apache

2、httpd版本

  • CentOS6系列的版本默认提供的是httpd-2.2版本的rpm包
  • CentOS7系列的版本默认提供的是httpd-2.4版本的rpm包

3、httpd服务特点

名称 特点
高度模块化 core + modules,核心加模块,想要什么功能添加什么模块;
DSO Dynamic Shared Object,动态共享库;
MPM Multipath processing Modules 多路处理模块。
  • MPM的工作模型
名称 特点
prefork 多进程模型,每个进程响应一个请求、一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理,每个子进程处理一个请求;即使没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个子进程。
worker 多进程多线程模型,每线程处理一个用户请求、一个主进程:负责生成子进程、负责创建套接字、负责接收请求、并将其派发给某子进程进行处理,每个子进程负责生成多个线程,每个线程负责响应用户请求;并发响应数量为:子进程数量*子进程创建的最大线程数量。
event 事件驱动模型,多进程模型,每个进程响应多个请求、一个主进程 :负责生成子进程、负责创建套接字、负责接收请求,并将其派发给某个子进程进行处理,子进程基于事件驱动机制直接响应多个请求。

注:配置文件 /etc/httpd/conf.modules.d/00-mpm.conf 中可以切换工作模型;httpd-2.2以前的版本不支持切换MPM工作模型。

4、httpd功能

CGI:通用网关接口(Common Gateway Interface)是一种根据请求信息动态产生回应内容的技术。
虚拟主机:基于IP,PORT, FQDN(域名)实现多站点共存。
路径别名:设置访问的网址(url)的别名。
丰富的用户认证机制:basic基本用户认证,digest摘要认证。
支持第三方模块:不同的模块实现不同的功能。
正向代理,反向代理,负载均衡。

5、httpd配置文件

httpd目前有多个版本,主流有两个版本分别为:2.2、2.4;在安装了httpd软件之后,会生成配置文件。
这些文件有:

  • 主配置文件:/etc/httpd/conf/httpd.conf ,这个是httpd最主要的配置文件
  • 扩展配置文件:/etc/httpd/conf.d/*.conf ,这个是httpd的额外配置文件
  • 网页的存放目录:/var/www/html/
  • 模块的目录:/etc/httpd/modules/
  • 日志目录:/var/log/httpd/*
    • 访问日志为:./access_log
    • 错误日志为:./error_log

6、httpd服务配置

6.1 基本配置

服务安装

[root@hzz ~]# yum -y install httpd

注意:请关闭firewalld防火墙和selinux安全子系统。

服务管理

#启动服务/关闭服务
[root@hzz ~]# systemctl start httpd
[root@hzz ~]# systemctl stop httpd

#开机自启/取消开机自启
[root@hzz ~]# systemctl enable httpd
[root@hzz ~]# systemctl disable httpd

#重启服务/查看服务状态
[root@hzz ~]# systemctl restart httpd
[root@hzz ~]# systemctl status httpd

服务配置

#手动设置站点主页
[root@hzz ~]# cd /var/www/html/
[root@hzz html]# vim index.html
hello world!

#重启服务
[root@hzz ~]# systemctl restart httpd
  • 更改网站默认存放路径
#创建网站存放目录,编辑主页内容
[root@hzz ~]# mkdir /var/www/hzz
[root@hzz ~]# vim /var/www/hzz/index.html
hzz

#修改配置文件,将站点指向新创建的目录
[root@hzz ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/hzz"

#重启服务,加载配置
[root@hzz ~]# systemctl restart httpd
  • 修改默认网站主页文件名
#修改配置文件,修改默认网页文件名
[root@hzz ~]# vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
    DirectoryIndex hzz.html
</IfModule>

#编辑一个新的网页,输入网页内容
[root@hzz ~]# vim /var/www/hzz/hzz.html
hzz.html

#重启服务,加载配置
[root@hzz ~]# systemctl restart httpd

注意:最好使用默认的网页文件名;所以我们还需再修改回index.html。
  • 修改httpd服务监听端口号
#修改配置文件,监听8080端口
[root@hzz ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080

#重启服务,加载配置
[root@hzz ~]# systemctl restart httpd

#实验结束还原默认监听端口。

注意:网站存放的目录的权限,能够决定httpd服务的主页能否被访问。

6.2 虚拟主机配置

httpd服务在实际应用中有这样一种场景;我们有一台服务器,但是想挂多个网站,按照上面的配置方式就无法实现。那么我们就可以通过配置虚拟主机的方式实现一个服务器上运行多个网站,每个网站都是一个虚拟主机;虚拟主机其实就是通过httpd服务访问同一个服务器上的不同站点。

虚拟主机有三类:

  • 相同IP不同端口
  • 不同IP相同端口
  • 相同IP相同端口不同域名

注意:虚拟主机的配置可以写在主配置文件;也可以将配置写在扩展配置文件,扩展配置文件需要自行创建。

相同IP不同端口

#创建第一个网站目录,写入网页内容
[root@hzz ~]# mkdir /var/www/vhost1
[root@hzz ~]# vim /var/www/vhost1/index.html
vhost1

#创建扩展配置文件,配置虚拟主机为相同IP不同端口
[root@hzz ~]# vim /etc/httpd/conf.d/httpd-vhosts.conf
#虚拟主机1
Listen 8080
<VirtualHost 192.168.52.156:8080>
    ServerAdmin root@localhost                         #用户邮箱
    ServerName www.hzz.com                             #绑定的域名
    ServerAlias www.hzz1.com                           #别名,绑定多个域名
    DocumentRoot "/var/www/vhost1/"                    #网站存放目录
    ErrorLog "/var/log/httpd/error_log"                #错误日志存放位置
    CustomLog "/var/log/httpd/access_log" combined     #网站访问日志存放方法及位置,这里是组合日志方式
    <Directory "/var/www/vhost1/">                     #指定网站目录访问控制,默认不允许访问
        <RequireAll>                                   #Require访问控制指令
            Require all granted
            Require not ip 192.168.1.1
        </RequireAll>
    </Directory>
</VirtualHost>

#创建第二个网站目录,写入网页内容
[root@hzz ~]# mkdir /var/www/vhost2/
[root@hzz ~]# vim /var/www/vhost2/index.html
vhost2

#同样继续编辑虚拟主机配置文件,在后面接着写第二个虚拟主机的配置
[root@hzz ~]# vim /etc/httpd/conf.d/httpd-vhosts.conf
#虚拟主机2
Listen 8800
<VirtualHost 192.168.52.156:8800>
    ServerAdmin root@localhost
    ServerName www.zzh.com
    ServerAlias www.zzh1.com
    DocumentRoot "/var/www/vhost2/"
    ErrorLog "/var/log/httpd/error_log"
    CustomLog "/var/log/httpd/access_log" common        #通用日志方式
    <Directory "/var/www/vhost2/">
        <RequireAll>
            Require all granted
            Require not ip 192.168.1.1
        </RequireAll>
    </Directory>
</VirtualHost>

#重启服务,加载配置
[root@hzz ~]# systemctl restart httpd

不同IP相同端口

#给网卡添加IP地址
[root@hzz ~]# ip a add 192.168.52.157/24 dev ens33
[root@hzz ~]# ip a add 192.168.52.158/24 dev ens33

#编辑虚拟主机配置文件,配置虚拟主机为不同IP相同端口,同时给默认站点添加虚拟主机配置
[root@hzz ~]# vim /etc/httpd/conf.d/httpd-vhosts.conf
#默认站点
<VirtualHost 192.168.52.156:80>
    DocumentRoot "/var/www/html"
</VirtualHost>

#虚拟主机1
<VirtualHost 192.168.52.157:80>
    ServerAdmin root@localhost
    ServerName www.hzz.com
    ServerAlias www.hzz1.com
    DocumentRoot "/var/www/vhost1/"
    ErrorLog "/var/log/httpd/error_log"
    CustomLog "/var/log/httpd/access_log" combined
    <Directory "/var/www/vhost1/">
         <RequireAll>
            Require all granted
            Require not ip 192.168.52.134
         </RequireAll>
    </Directory>
</VirtualHost>

#虚拟主机2
<VirtualHost 192.168.52.158:80>
    ServerAdmin root@localhost
    ServerName www.zzh.com
    ServerAlias www.hzz1.com
    DocumentRoot "/var/www/vhost2/"
    ErrorLog "/var/log/httpd/error_log"
    CustomLog "/var/log/httpd/access_log" common
    <Directory "/var/www/vhost2/">
         <RequireAll>
            Require all granted
            Require not ip 192.168.52.134
         </RequireAll>
    </Directory>
</VirtualHost>

#重启服务,加载配置
[root@hzz ~]# systemctl restart httpd

相同IP相同端口不同域名

#编辑虚拟主机配置文件,配置虚拟主机为相同IP相同端口不同域名
[root@hzz ~]# vim /etc/httpd/conf.d/httpd-vhosts.conf
#虚拟主机1
<VirtualHost 192.168.52.156:80>
    ServerAdmin root@localhost
    ServerName www.hzz.com
    ServerAlias www.hzz1.com
    DocumentRoot "/var/www/vhost1/"
    ErrorLog "/var/log/httpd/error_log"
    CustomLog "/var/log/httpd/access_log" combined
    <Directory "/var/www/vhost1/">
         <RequireAll>
            Require all granted
            Require not ip 192.168.52.134
         </RequireAll>
    </Directory>
</VirtualHost>

#虚拟主机2
<VirtualHost 192.168.52.156:80>
    ServerAdmin root@localhost
    ServerName www.zzh.com
    ServerAlias www.hzz1.com
    DocumentRoot "/var/www/vhost2/"
    ErrorLog "/var/log/httpd/error_log"
    CustomLog "/var/log/httpd/access_log" common
    <Directory "/var/www/vhost2/">
         <RequireAll>
            Require all granted
            Require not ip 192.168.52.134
         </RequireAll>
    </Directory>
</VirtualHost>

#重启服务,加载配置
[root@hzz ~]# systemctl restart httpd

注意:客户端需要添加域名解析。

Require访问控制法则

名称 功能
Require all granted 允许所有主机访问
Require all deny 拒绝所有主机访问
Require ip IPADDR 授权指定来源地址的主机访问
Require not ip IPADDR 拒绝指定来源地址的主机访问
Require host HOSTNAME 授权指定来源主机名的主机访问
Require not host HOSTNAME 拒绝指定来源主机名的主机访问
IPADDR的类型 HOSTNAME的类型
IP:192.168.1.1
Network/mask:192.168.1.0/255.255.255.0
Network/Length:192.168.1.0/24
Net:192.168.0.0
FQDN:特定主机的全名
DOMAIN:指定域内的所有主机

6.3 https配置

https(全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 http 通道,在 http 的基础上通过传输加密和身份认证保证了传输过程的安全性。

mod_ssl模块

mod_ssl 模块可以实现https加密认证。

#安装mod_ssl模块
[root@hzz ~]# yum -y install mod_ssl

mod_ssl 模块安装后,并未使用,需要我们手动添加启用。
启用模块:编辑/etc/httpd/conf.modules.d/00-base.conf文件,添加下面这行,如果已经有了但是注释了,则取消注释即可。

LoadModule ssl_module modules/mod_ssl.so

证书类型

https的证书:

  • SSLCertificateFile:服务器证书文件;
  • SSLCertificateKeyFile:服务器证书私钥文件;
  • SSLCertificateChainFile:服务器证书链文件;
  • SSLCACertificateFile:CA机构证书公钥文件。

证书类型可以在 /etc/httpd/conf.d/ssl.conf 配置文件中设置;也可在虚拟主机中配置。

ssl配置

#生成密钥(私钥)
[root@hzz ~]# mkdir ssl
[root@hzz ~]# cd ssl/
[root@hzz ssl]# openssl genrsa -out server.key 2048

#生成证书请求文件
[root@hzz ssl]# openssl req -new -key server.key -out server.csr
············
Country Name (2 letter code) [XX]:cn    #国家代码
State or Province Name (full name) []:hubei    #省份
Locality Name (eg, city) [Default City]:wuhan    #城市
Organization Name (eg, company) [Default Company Ltd]:hzz    #机构名称
Organizational Unit Name (eg, section) []:    #域名
Common Name (eg, your name or your server's hostname) []:*.hzz.com #这里填域名
Email Address []:    #邮箱地址
A challenge password []:    #可选密码,不填
An optional company name []:    #可选公司名称

#生成证书crt
[root@hzz ssl]# openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

#复制证书到指定位置
[root@hzz ssl]# cd /etc/httpd/
[root@hzz httpd]# cp -r /root/ssl/ /etc/httpd/

#ssl.conf配置文件导入证书,默认站点使用此配置文件
[root@hzz ~]# vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/ssl/server.crt
SSLCertificateKeyFile /etc/httpd/ssl/server.key

#编辑虚拟主机配置文件,配置虚拟主机为https使用443端口
[root@hzz ~]# vim /etc/httpd/conf.d/httpd-vhosts.conf
<VirtualHost 192.168.52.156:443>
    ServerAdmin root@localhost
    ServerName www.hzz.com
    ServerAlias www.hzz1.com
    SSLEngine on
    SSLCertificateFile "/etc/httpd/ssl/server.crt"
    SSLCertificateKeyFile "/etc/httpd/ssl/server.key"
    ErrorLog "/var/log/httpd/error_log"
    CustomLog "/var/log/httpd/access_log" common
    DocumentRoot "/var/www/vhost1/"
    <Directory "/var/www/vhost1/">
         <RequireAll>
            Require all granted
            Require not ip 192.168.52.134
         </RequireAll>
    </Directory>
</VirtualHost>

#重启服务,加载配置
[root@hzz ca]# systemctl restart httpd

注意:因为是自己给自己颁发证书,所以使用https访问时会出现警告说证书不安全。

http重定向至https

站点配置为https后,在浏览器访问网站时如果不添加https协议,默认还是http,所以需要将访问http站点的请求转发至https。

<VirtualHost 192.168.52.156:80>
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://www.hzz.com$1 [L,R]
</VirtualHost>

<VirtualHost 192.168.52.156:443>
    ServerAdmin root@localhost
    ServerName www.hzz.com
    ServerAlias www.hzz1.com
    SSLEngine on
    SSLCertificateFile "/etc/httpd/ssl/server.crt"
    SSLCertificateKeyFile "/etc/httpd/ssl/server.key"
    ErrorLog "/var/log/httpd/error_log"
    CustomLog "/var/log/httpd/access_log" common
    DocumentRoot "/var/www/vhost1/"
    <Directory "/var/www/vhost1/">
         <RequireAll>
            Require all granted
            Require not ip 192.168.52.134
         </RequireAll>
    </Directory>
</VirtualHost>