Apache HTTP服务器搭建

1.HTTP协议简介

1.1客户端与服务器建立连接

客户端与服务器建立链接就是SOCKET连接。因此要指定极其名称、资源名称和端口号,可以通过URL来提供这些信息。

1.2客户向服务器提出请求

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行、请求头部、空行和请求数据四个部分组成,下图给出了请求报文的一般格式

1.请求行

请求行分为三个部分:请求方法、请求地址和协议版本

(1)请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法。HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法;HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法

常用的HTTP请求方法如下表

HTTP方法

描述

OPTIONS

返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。

GET

从服务器向客户端发送命名资源

PUT

将来自客户端的数据存储到一个命名的服务器资源中去

DELETE

从服务器中删除命名资源

POST

将客户端数据发送到一个服务器网关应用程序

TRACE

回显服务器收到的请求,主要用于测试或诊断

CONNECT

HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器

HEAD

仅发送命名资源响应中的HTTP头部

(2)请求地址

URL(统一资源定位符),对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址

基本URL结构:<协议>://<主机>/<路径>:<端口>

(3)协议版本

格式位:HTTP/主版本号.次版本号,常用的由HTTP/1.0和HTTP/1.

2.请求头部

请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分割。

注:请求头部最后会有一个空行,表示请求头部结束,接下俩为请求数据,这一行非常重要,必不可少

常见请求头部如下:

请求头部

说明

Host

接受请求的服务器地址,可以是IP:端口号,也可以是域名

User-Agent

有关发出请求的应用程序名称

Connection

指定与连接想关的属性,如Connection,Keep-Alive

Accept-Charset

通知服务端可以发送的编码格式

Accept-Encoding

通知服务端可以发送的数据压缩格式

Accept-Language

通知服务端可以发送的语言

3.请求数据

可选部分,比如GET请求就没有请求数据

1.3服务器对请求做出应答

HTTP响应也由四个部分组成,分别是:状态行、响应头部、空行以及相应数据组成

1.状态行

状态行由三部分组成,分别为协议版本、状态码、状态码描述

(1)状态码

状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用,总共由以下五种类型

1**

服务器收到请求,需要请求者继续执行操作

2**

成功,操作被成功接收并处理

3**

重定向,西药进一步的操作以完成请求

4**

客户端错误,请求包含语法错误或无法完成请求

5**

服务器错误,服务器在处理请求的过程中发生了错误

2.响应头部

与请求头部类似,位响应报文添加了一些附加信息。常见的响应头部如下:

响应头部

说明

Server

服务器应用程序软件的名称和版本

Content-Type

响应正文的类型(是图片还是二进制字符串)

Content-Length

响应正文的长度

Content-Charset

响应正文使用的编码

Content-Encoding

响应正文使用的数据压缩格式

Content-Language

响应正文使用的语言

Allow

服务器支持哪些请求方法

3.响应数据

用于存放需要返回给客户端的数据信息

代理服务器:S和C之间的访问实体

缓存服务器:特殊的代理服务器

网关服务器:一个HTTP/FTP网关服务器

4.关闭客户与服务器之间的连接

此步主要关闭客户端与服务器的连接,详细过程请参考TCP/IP协议的关闭过程

 

1.4网站架构

LAMP(Linux+Apache+Mysql+Python/PHP/Perl)

LNMP(Linux+Nginx+Mysql+ Python/PHP/Perl)

 

2.apache的安装、配置和启动

2.1源码安装

[root@RedHat~]#wget http://mirrors.hust.edu.cn/apache//apr/apr-1.6.5.tar.bz2

[root@RedHat~]#wget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.1.tar.bz2

[root@RedHat~]#wget http://mirrors.hust.edu.cn/apache//apr/apr-1.6.5.tar.bz2

 

[root@RedHat ~]# cd apr-1.6.5/

[root@RedHat apr-1.6.5]# ./configure --prefix=/usr/local/apr   #配置编译选项

[root@RedHat apr-1.6.5]# make -j 4     4核编译

[root@RedHat apr-1.6.5]# make install  #安装

 

[root@RedHat ~]# cd apr-util-1.6.1/

[root@RedHat apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-utils

[root@RedHat apr-util-1.6.1]# make -j 4  

[root@RedHat apr-util-1.6.1]# make install

 

[root@RedHat ~]# cd httpd-2.4.37/

[root@RedHat httpd-2.4.37]# ./configure --prefix=/usr/local/apache2 --enable-so --enable-rewrite --enable-ssl --with-ssl=/usr/local/ssl --with-mpm=prefork

[root@RedHat httpd-2.4.37]# make -j 4

[root@RedHat httpd-2.4.37]# make install

2.2网页默认放置的路径

cgi-bin是一种特殊的目录,在进行交互式的www访问(如填写在线表格)时,需要对服务器上有响应程序对访问输入的信息进行处理,这里的程序就是cgi程序,而这些文件只能存放在/var/www/cgi-bin这个目录

2.3Apache的主配置文件

Apache主配置文件位于conf目录中,名为httpd.conf

httpd.conf配置文件主要由三个部分组成:全局环境、主服务器配置、虚拟主机。每部分都有相应的配置语句,该文件所有配置语句的语法为“配置参数名称 参数值”的形式。

httpd.conf的配置语句除了选项的参数值以外,所有选项指令均不区分大小写,可以在每一行前用“#”号或“;”号表示注释

主配置目录:/etc/httpd/conf

子配置目录:/etc/httpd/conf.d

下面为主配置文件httpd.conf中主要的一些参数说明

ServerRoot "/etc/httpd"

设置配置文件的默认目录

Listen 12.34.56.78:80

指定用户侦听请求的端口和可能的IP地址

Listen 80

Include conf.modules.d/*.conf

添加其他配置文件的内容

User apache

指定Apache在本地系统上运行的用户名

Group apache

指定Apache在本地系统上运行的组名

ServerAdmin root@localhost

设置管理电子邮件地址

ServerName www.example.com:80

设置服务器用于辨识自己的主机名和端口号

AllowOverride none  

支持从.htaccess文件中重写前面的指令

Require all denied

给所有用户或特定的用户/组授予或拒绝绝对目录的访问

DocumentRoot "/var/www/html"

指定网站的根目录

Options Indexes FollowSymLinks

指定与web目录相关的特性,例如ExecCGI、FollowSymLinks、Includes、Indexes、MultiViews和SysLinksIFOwnerMatch

DirectoryIndex index.html

指定导航到目录时查找的文件,默认设置为 index.html

ErrorLog "logs/error_log"

定位错误日志文件

LogLevel warn

指定日志的级别

LogFormat "%h %l %u %t \"%r\" %>s %b" common

设置日志文件里包含的信息

CustomLog "logs/access_log" combined

采用现有日志格式创建自定义日志文件

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

将web路径映射到DocumentRoot之外的系统位置

TypesConfig /etc/mime.types

定位mime.type,指定与扩展名相关的文件类型

AddType application/x-compress .Z

将文件名扩展名映射到指定内容类型

AddOutputFilter INCLUDES .shtml

将文件名扩展名映射到指定过滤器

AddDefaultCharset UTF-8

设置默认字符集

MIMEMagicFile conf/magic

确定文件的MIME类型

EnableSendfile on

使用sendfile系统调用,把静态文件发送给客户端,以获得更好的性能

IncludeOptional conf.d/*.conf

加载/etc/httpd/conf.d子配置文件

2.3Apahce的启动以及关闭

systemctl start|stop|status|enable|disable|restart|reload

或apachectl configtest|fullstatus|graceful|help|restart|start|status|stop

3.Apache服务器的搭建

3.1基于IP的虚拟主机配置

Apache配置虚拟主机支持3种方式:基于IP的虚拟主机配置,基于端口的虚拟主机配置,基于域名的虚拟主机配置。

如果同一台服务器有多个IP,可以使用基于IP的虚拟主机配置,将不同的服务绑定在不同的IP上。

建立虚拟主机存放网页的根目录,并创建首页文件index.html

[root@RedHat hello]# mkdir /hello

[root@RedHat ~]# echo "hello"> /hello/index.html

 

修改配置文件vhost.conf

<Directory /hello>

        AllowOverride none

        Require all granted

</Directory>

<VirtualHost 192.168.206.163:80>

        ServerAdmin [email protected]

        DocumentRoot /hello

        ServerName 192.168.206.163

        ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"

        CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common

</VirtualHost>

 

重启服务[root@RedHat ~]# systemctl restart httpd

 

测试

3.2基于端口的虚拟主机配置

建立虚拟主机存放网页的根目录,并创建首页文件index.html

[root@RedHat hello]# mkdir 8888

[root@RedHat hello]# echo this is html > 8888/index.html

 

修改配置文件vhost.conf

<Directory /hello>

        AllowOverride none

        Require all granted

</Directory>

Listen 8888

Listen 8999

<VirtualHost 192.168.206.163:8999>

        ServerAdmin [email protected]

        DocumentRoot /hello

        ServerName 192.168.206.163

        ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"

        CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common

</VirtualHost>

 

<VirtualHost 192.168.206.163:8888>

        ServerAdmin [email protected]

        DocumentRoot /hello/8888

        ServerName 192.168.206.163

        ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"

        CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common

</VirtualHost>

 

重启服务[root@RedHat ~]# systemctl restart httpd

测试

3.3基于域名的虚拟主机配置

修改配置文件vhost.conf

<Directory /hello>

        AllowOverride none

        Require all granted

</Directory>

<VirtualHost 192.168.206.163:80>

        ServerAdmin [email protected]

        DocumentRoot /hello

        ServerName www.hello.com

        ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"

        CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common

</VirtualHost>

 

<VirtualHost 192.168.206.163:80>

        ServerAdmin [email protected]

        DocumentRoot /hello/8888

        ServerName www.8888.com

        ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"

        CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common

</VirtualHost>

 

修改/etc/hosts,添加IP到域名的映射

重启http服务

测试

4.Apache安全认证与控制

4.1 虚拟目录

 

在一台计算机上创建多个web站点,并为每个web站点设置不同的主目录和虚拟子目录,每个web站点作为各自独立的网站分别分配给不同的公司或部门。

多个公司或部门的网站就可以共用同一台计算机,而用户感觉每个公司和部门都由各自独立的网站。多个没有实力在Internet上假设自己专用服务器的中小公司可以联合租用一台web服务器,对外提供各自的web服务而互不影响

web服务器上的每个web站点必须设置由不同的标识信息,web浏览器发出的连接和请求信息中包含web站点的标识信息,web站点的标识信息:IP地址、端口号、主机名

 

4.2 SSL认证(HTTPS)

HTTP和TCP之间插入了(TSL(安全传输层协议)/SSL(安全套接层))

超文本传输协议HTTP协议被用在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,姐可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密

 

4.3 HTTPS和HTTP的区别

HTTPS

HTTP

需要用到CA申请证书

不需要

明文传输

具有安全性的SSL加密传输协议

端口号:443

端口号:80

由SSL+HTTP协议构建的可进行加密传输、认证的网络协议

连接很简单,是无状态的

 

 

4.4 SSL建立过程

三次握手---协商算法---服务器发送证书给客户端---客户端生成对称密钥---客户端发送HTTP请求---服务器通过对称密钥加密后吧网页送到客户端

 

4.5 SSL配置

[root@RedHat ~]# yum -y install mod__ssl

Enter pass phrase: #密码

Verifying - Enter pass phrase: #确认密码

Enter pass phrase for haha.key: #输入刚才的密码

Country Name (2 letter code) [XX]: #国家

State or Province Name (full name) []: #省份

Locality Name (eg, city) [Default City]: #城市

Organization Name (eg, company) [Default Company Ltd]: #公司名称

Organizational Unit Name (eg, section) []: #部门

Common Name (eg, your name or your server's hostname) []: #真实域名

Email Address []: #邮箱

 

 

 

 

<Directory /www>

        AllowOverride none

        Require all granted

</Directory>

<VirtualHost 192.168.206.163:443>

        SSLEngine on #引擎打开

        SSLProtocol all -SSLv2 #支持除了SSLv2外的所有协议

        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA #密码套件 客户端和服务端协商

        SSLCertificateFile /etc/pki/tls/certs/haha.crt #指定证书路径

        SSLCertificateKeyFile /etc/pki/tls/certs/haha.key #指定密钥 文件路径

        DocumentRoot /www/haha

        Alias /haha /www/haha

        ServerName 192.168.206.163

</VirtualHost>

<Directory /www/xixi>

        AuthType Basic

        AuthName "Please Login"

        AuthUserFile /etc/httpd/userfile

        Require user wangxin

</Directory>

<VirtualHost 192.168.206.163:80>

        ServerName 192.168.206.163

        DocumentRoot /www/xixi

        Alias /xixi /www/xixi

</VirtualHost>

 

 

4.6 Apache安全控制

要进行Apache的访问控制首先要了解Apache的虚拟目录。虚拟目录可以用指定的指令设置,设置虚拟目录的好处在于便于访问之外,还可以增强安全性,类似软链接的概念,客户端并不知道文件的实际路径。虚拟目录的格式如下

<Diretory 目录的路径>   

目录相关的配置参数和指令

</Diretory>

 

每个Diretory段以<Diretory>开始,以</Diretory>结束,段作用于<Diretory>中指定的目录及其里面的所有文件和子目录。在段中可以设置与目录相关的参数和指令,包括访问控制和认证

4.7 Apache认证

除了可以使用以上介绍的指令控制特定的目录访问之外,如服务器中有敏感信息需要授权的用户才能访问,所以Apache提供了认证与授权机制,当用户访问使用此机制控制的目录时,会提示用户输入用户名密码,只有输入正确用户名和密码的主机才可以正常访问该资源。

Apache的认证类型分为两种:基本(Basic)认证和摘要(Digest)认证两种。摘要认证比基本认证更加安全,但是并非所有的浏览器都支持摘要认证,所以本节只针对基本认证进行介绍。基本认证方式其实相当简单,当Web浏览器请求经此认证模式保护的URL时,将会出现一个对话框,要求用户输入用户名和口令。用户输入后,传给Web服务器,Web服务器验证它的正确性。如果正确,则返回页面;否则将返回401错误。

要使用用户认证,首先要创建保存用户名和口令的认证口令文件。在Apache中提供了htpasswd命令用于创建和修改认证口令文件,该命令在<Apache安装目录>/bin目录下。关于该命令完整的选项和参数说明可以通过直接运行htpasswd获取。

[root@RedHat ~]# htpasswd -c /etc/httpd/userfile wangxin #创建口令文件并添加用户

[root@RedHat ~]# htpasswd /etc/httpd/userfile wang #添加用户

    参数

说明

AuthName

设置了使用认证的域

AuthType

主要用于选择一个目录的用户认证类型,目前只有两种认证方式可以选择,Basic和Digest分别代表基本认证和摘要认证

AuthUserFile

用于设定一个纯文本文件的名称,其中包含用于认证的用户名和密码的列表

Require

用于设置哪些认证用户允许访问指定的资源

 

5.动态网站搭建

[root@RedHat ~]# yum -y install mod_wsgi

 

 

Listen 8888

<Directory /var/www/alt>

        AllowOverride none

        Require all granted

</Directory>

<VirtualHost 192.168.206.168:8888>

        WSGIScriptAlias / /var/www/alt/webinfo.wsgi

</VirtualHost>

 

vim /var/www/alt/webinfo.wsgi

猜你喜欢

转载自blog.csdn.net/weixin_43265596/article/details/86484105