【Linux】WWW服务器的原理与基本配置

简介:

       www是world wide web的缩写,也就是全球信息广播的意思。通常说的上网就是使用www来查询用户所需要的信息。www可以结合文字、图形、影像以及声音等多媒体,并通过可以让鼠标单击超链接的方式将信息以Internet传递到世界各处去。

       与其他服务器类似,当你连接上www网站,该网站会提供一些数据,而你的客户端则必须要使用可以解析这些数据的软件来处理,那就是浏览器。www服务器与客户端浏览器之间的连接图

 

(1)www所用的协议: 浏览器怎样向web服务器请求数据以及服务器怎样把文档传送给浏览器呢?这就是由http协议来定义的,(Hyper Text Transport Protocol,HTTP,超文本传输协议)。

(2)www服务器需要提供可让客户端浏览的平台。目前最主流的Web服务器是Apache、Microsoft的Internet信息服务器(Internet Information Services,IIS)和unix nginx。

(3)服务器所提供的最主要数据是超文本标记语言(Hyper Text Markup Language,HTML)、多媒体文件(图片、影像、声音、文字等,都属于多媒体或称为超媒体),HTML只是一些纯文本数据,通过所谓的标记来规范所要显示的数据格式。

(4)客户端收到服务器的数据之后需要软件解析服务器所提供的数据,最后将效果呈现在用户的屏幕上。那么著名的浏览器就有内建在Windows操作系统内的IE浏览器了,还有Firefox浏览器和Google的chrome浏览器。

网址的意义:

web服务器提供的这些数据大部分都是文件,那么我们需要在服务器端先将数据文件写好,并且放置在某个特殊的目录下面,这个目录就是我们整个网站的首页,在redhat中,这个目录默认在/var/www/html。浏览器是通过你在地址栏中输入你所需要的网址来取得这个目录的数据的。

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

<协议>://<主机地址或主机名>[:port]/<目录资源,路径>

浏览器常支持的协议有:http、https、ftp等。

主机地址或者主机名:主机地址就是服务器在因特网所在的IP地址。如果是主机名的话,那么就需要域名解析了。

端口号:http为80。https为443。

        IANA:互联网数字分配机构

        0-1023:众所周知,永久地分配给固定的应用程序使用,特权端口(只有管理员有权限启用并让进程监听);

       1024-41951:亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用:3306/TCP

        41952-60000:客户端程序随机使用的端口,动态端口,或私有端口;

浏览器与服务器之间传递数据的方法:

状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

1xx:指示信息 —— 表示请求已接收,继续处理。

2xx:成功 —— 表示请求已被成功接收、理解、接受。

3xx:重定向 —— 要完成请求必须进行更进一步的操作。

4xx:客户端错误 —— 请求有语法错误或请求无法实现。

5xx:服务器端错误 —— 服务器未能实现合法的请求。

常见状态代码、状态描述的说明如下。

200 OK:客户端请求成功。

400 Bad Request:客户端请求有语法错误,不能被服务器所理解。

401 Unauthorized:请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用。

403 Forbidden:服务器收到请求,但是拒绝提供服务。

404 Not Found:请求资源不存在,举个例子:输入了错误的URL。

500 Internal Server Error:服务器发生不可预期的错误。

503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

 www服务器的类型:

(1)仅提供用户浏览的单向静态网页

单纯是由服务器单向提供数据给客户端,Server不需要与client端有互动,所以你可以到该网站上去浏览,但是无法进行数据的上传。

(2)提供用户互动接口的动态网站

这种类型的网站可以让服务器与用户互动,常见的例如留言板,博客。这种类型的网站需要通过“网页程序语言”来实现与用户互动的行为。常见的例如:PHP网页程序语言,配合数据库系统来进行数据的读、写。当你在向服务器请求数据时,其实是通过服务器端同一个网页程序在负责将数据读出或写入数据库,变动的是数据库的内容,网页程序并没有任何改变。

另外一种交互式的动态网页主要是在客户端实现。服务端将可执行的程序代码(JavaScript)传送给客户端,客户端的浏览器如果提供JavaScript的功能,那么该程序就可以在客户端的计算机上面工作了;另外一种可在客户端执行的就是flash动画格式,在这种动画格式内还可以进行程序设计。

搭建动态网站的需求:

1、可支持的操作系统:让所有需要的软件都能够进行安装。

2、可运行的www服务器:例如Apache。

3、网页程序语言:Perl(Practical Extraction and Report Language,实用报表提取语言)、PHP(Hypertext Preprocessor,超文本预处理器,是一种通用开源脚本语言)、JSP(Java Server Pages,java服务器页面)、CGI(Common Gateway Interface,公共网关接口)、ASP(Active Server Pages,动态服务器页面)。

4、数据存储的数据库系统 :MySQL、MSSQL、Oracle等。

也就是我们平时所说的LAMPlinux+Apache+MySQL+PHP

Apache:主要提供www的服务器平台

MySQL:传统的文件读取是很麻烦的,如果你只要读取该文件当中的一小部分,系统还是会将整个文件读出来,若又有人同时读取同一个文件时,那就会造成效率与系统上的问题,所以才会有数据库系统的推出。数据库其实是一种特殊格式的文件,这种文件要通过特殊接口(数据库软件)来进行读写。由于这个特殊接口已经针对数据的查询、写入做过优化设计,因此很适合多人同时写入与查询工作。

PHP:PHP可以被用来建立动态网页,PHP程序代码可以直接在HTML网页当中嵌入,就像编辑HTML网页一样简单。PHP是一种“程序语言”,这种程序语言可以直接在网页当中编写,不需要经过编译即可执行。

www服务器基本配置

(1)基于http协议的静态网站

服务器端:在linux上面实现网页服务器需要Apache这套服务器软件,httpd提供Apache主程序。

http://httpd.apache.org/docs/2.4/

安装软件:

[root@localhost ~]# yum install httpd -y     安装所需要的包

[root@localhost httpd]# tree /etc/httpd        与协议相关的一些文件

1./etc/httpd/conf/httpd.conf 主要的配置文件 。

2./etc/httpd/conf.d/*.conf 额外的参数文件。如果你不想要修改原始配置文件httpd.conf的话,那么你可以将你自己的额外参数文件独立出来,例如你想要有自己的额外设置值,可以将它写入/etc/httpd/conf.d/zhuji.conf(注意,扩展名一定是.conf),而启动Apache时,这个文件就会被读入主要配置文件当中了。

3./var/www/html/这就是默认的首页所在目录,当输入网址时所显示的数据,就是放在这个目录当中的首页文件(默认为index.html)。

4./var/www/cgi-bin/默认给一些可执行的CGI(网页程序)程序放置的目录,当输入网址/cgi-bin/时所显示的数据所在。

5./var/log/httpd/默认的Apache日志文件都放在这里,对于流量比较大的网站来说,一个星期的日志文件的数据可以达到1GB左右。

 

主配置文件内容:

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf     //这里是主配置文件

31   ServerRoot "/etc/httpd"             //http服务的顶级目录为/etc/httpd

42 Listen 80                                     //监听在80端口,80为web服务器的默认端口

56 Include conf.modules.d/*.conf    //包括/etc/httpd/conf.modules.d/*.conf的所有文件

66 User apache                               //服务的用户(ps -ef | grep httpd,先以root用户把/usr/sbin/httpd服务启动起来)。启动服务后转换的身份,在启动服务时通常以root身份,然后转换身份,这样增加系统安全

67 Group apache

86 ServerAdmin root@localhost        //你的邮箱,如果有什么问题给你发邮件

95 #ServerName www.example.com:80    //ServerName 0.0.0.0:80匹配任意IP地址,监听端口在80端口

默认是不需要指定的,服务器通过名字解析过程来获得自己的名字,但如果解析有问题(如反向解析不正确),或者没有DNS名字,也可以在这里指定ip地址,当这项不正确的时候服务器不能正常启动。解决办法就是取消注释将  www.ex      ample.com:80修改为自己的域名或者直接修改为localhost

102 <Directory />                    //目录为根,<>为起始标志,</>为结束标志

103     AllowOverride none          //不允许这个目录下的访问控制文件来改变这里的配置,这也意味着不用查看这个目录下的访问控制文件。

104     Require all denied               //拒绝访问根

105 </Directory>                            //和<Directory />是一组标签,目录控制容器

119 DocumentRoot "/var/www/html"                   //网页文件存放的目录

124 <Directory "/var/www">

125     AllowOverride None

126     # Allow open access:

127     Require all granted

128 </Directory>

131 <Directory "/var/www/html">

144     Options Indexes FollowSymLinks            //索引,跟踪软链接

151     AllowOverride None

156     Require all granted

157 </Directory>

163 <IfModule dir_module>                  //加载一个目录模块

164     DirectoryIndex index.html

165 </IfModule>

171 <Files ".ht*">                                //不能访问

172     Require all denied

173 </Files>

182 ErrorLog "logs/error_log"

189 LogLevel warn

191 <IfModule log_config_module>              //日志配置模块 /var/log/httpd,日志模块:通过时间节点去记录(man date)

196     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{    Referer}i\" \"%{User-Agent}i\"" combined

197     LogFormat "%h %l %u %t \"%r\" %>s %b" com    mon

198

199     <IfModule logio_module>

201       LogFormat "%h %l %u %t \"%r\" %>s %b \"    %{Referer}i\" \"%{User-Agent}i\" %I %O" combi    nedio

202     </IfModule>

217     CustomLog "logs/access_log" combined

218 </IfModule>

220 <IfModule alias_module>                         //别名模块

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

248

249 </IfModule>

cgi              //(通用网关接口)是web服务器运行时外部程序的规范,按cgi编写的程序可以扩展服务器的功能。cgi应用程序能与浏览器进行交互,还可通过数据库API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据

255 <Directory "/var/www/cgi-bin">

256     AllowOverride None

257     Options None

258     Require all granted

259 </Directory>

261 <IfModule mime_module>    多用途互联网邮件扩展模块

266     TypesConfig /etc/mime.types

283     AddType application/x-compress .Z

284     AddType application/x-gzip .gz .tgz

305     AddType text/html .shtml

306     AddOutputFilter INCLUDES .shtml

307 </IfModule>

mime多用途互联网邮件扩展类型,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

316 AddDefaultCharset UTF-8  默认字符集

318 <IfModule mime_magic_module>

324     MIMEMagicFile conf/magic

325 </IfModule>

348 EnableSendfile on

353 IncludeOptional conf.d/*.conf

注:以上为主配置文件,前面的序号是行号;对一些比较重要的进行注释;还有红色标注的需注意,那些是搭建WWW服务器的重要部分。

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

[root@localhost ~]#systemctl status httpd | less              查看状态

Aug 31 03:35:09 localhost.localdomain httpd[7374]: 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:无法使用localhost.localdomain可靠地确定服务器的完全限定域名。 全局设置“ServerName”指令以禁止显示此消息

[root@localhost ~]#systemctl stop firewalld                     关闭防火墙,这里为了排除防火墙的影响,直接关闭

[root@localhost certs]# setenforce 0                                如果无法显示页面还需要这条命令,道理同防火墙

编辑httpd的主配置文件:

[root@localhost ~]#vim /etc/httpd/conf/httpd.conf

将ServerName 改成0.0.0.0:80

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

通过在浏览器上输入配置的IP,如果用Windows浏览器,务必关闭防火墙;之后就可以访问到Apache的主页面。

搭建一个web服务器,访问该服务器时显示“hello world”欢迎界面。

[root@localhost ~]# echo hello world > /var/www/html/index.html           默认访问的主页目录是/var/www/html/index.html

这时在浏览器上输入IP地址就可以显示,你的文件 

(2)基于HTTPS协议的静态网站

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道。HTTPS并不是一个新协议,而是HTTP+SSL(TLS)。原本HTTP先和TCP(假定传输层是TCP协议)直接通信,而加了SSL后,就变成HTTP先和SSL通信,再由SSL和TCP通信,相当于SSL被嵌在了HTTP和TCP之间。

SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪90年代中期,由网景公司设计的。到了1999年,SSL 应用广泛,已经成为互联网上的事实标准。IETF 就把SSL 标准化。标准化之后SSL被改为 TLS(Transport Layer  Security传输层安全协议)。

SSL协议分为两层:

(1)SSL记录协议 (SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能。

(2)SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

SSL协议提供的服务:

(1)认证用户和服务器,确保数据发送到正确的客户机和服务器

(2)加密数据以防止数据中途被窃取

(3)维护数据的完整性,确保数据在传输过程中不被改变。

 

如何证明公开密钥本身是货真价实的公开密钥?如,正准备和某台服务器建立公开密钥加密方式下的通信时,如何证明收到的公开密钥就是原本预想的那台服务器发行的公开密钥。或许在公开密钥传输过程中,真正的公开密钥已经被攻击者替换掉了。这个时候就需要第三方公证单位来帮忙。

CA就是一个公认的公证单位,你可以自行产生一把密钥且制作出必要的证书数据并向CA单位注册,那么当客户端的浏览器在浏览时,该浏览器会主动向CA单位确认该证书是否为合法注册过,如果是,那么该次连接才会建立,如果不是,浏览器会发出警告信息,告知用户应避免建立连接。所以说,如此一来WWW服务器不但有公证单位的证书,用户在建立连接时也比较有保障。

 

当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信:

(1)客户端浏览器向服务器端发送如下信息:

1、客户端支持的SSL /TLS协议的版本号。

2、Cipher Suite(密钥算法套件)。

3、客户端产生的随机数,稍后用于生成"对话密钥"。

(2)服务器端向客户端发送如下信息:

1、确认使用的加密通信协议版本,如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。

2、确认使用的加密方法。

3、服务器证书。

要使数字证书有用,它的结构必须采用一种可理解且可靠的形式,以便人们可以轻松地检索并理解证书内的信息。例如,护照采用这样一种结构:人们可以轻松地理解以前从未见过的那一类护照中的信息。同样,只要数字证书是标准化的,则无论颁发该证书的是哪个机构,人们都可以阅读并理解该证书。

S/MIME 标准规定:用于 S/MIME 的数字证书应遵守国际电信同盟 (ITU) X.509 标准。S/MIME 版本 3 明确要求数字证书应遵循 X.509 的第 3 版。由于 S/MIME 依赖于已建立的数字证书结构公认标准,因此 S/MIME 标准建立在该标准的发展之上,从而提高了它的认可度。

X.509 标准规定数字证书应包含标准化信息。具体地说,X.509 版本 3 证书包含下列字段:

版本号 证书所遵循的 X.509 标准的版本。

序列号 唯一标识证书且由证书颁发机构颁发的编号。

签名算法 CA用于对证书进行数字签名的hash算法。

颁发者名称 实际颁发该证书的证书颁发机构的标识。

有效期 数字证书保持有效的时间段,并包含起始日期和过期日期。

使用者名称 数字证书所有者的姓名。

使用者公钥信息 与数字证书所有者关联的公钥以及与该公钥关联的特定公钥算法。

颁发者唯一标识符 可以用来唯一标识数字证书颁发者的信息。

使用者唯一标识符 可以用来唯一标识数字证书所有者的信息。

扩充信息 与证书的使用和处理有关的其他信息。

证书颁发机构的数字签名 使用指纹算法中指定的HASH算法以及证书颁发机构的私钥进行加密的数字签名。

4、服务器生成的随机数,稍后用于生成"对话密钥"。

(3)客户端利用服务器传过来的信息验证服务器的合法性。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,则可以知道认证服务器的公开密钥的是真实有效的数字证书认证机构,并且服务器的公开密钥是值得信赖的。(此处认证机关的公开密钥必须安全地转交给客户端。使用通信方式时,如何安全转交是一件很困难的事,因此,多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。)

(4)客户端随机产生一个用于后面通讯的对称密钥,然后用服务器的公钥对其加密,然后将加密后的对称密钥传给服务器。

 

HASH是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。Hash算法特别的地方在于它是一种单向算法,用户可以通过hash算法对目标信息生成一段特定长度的唯一hash值,却不能通过这个hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

常见的HASH算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1。

共享密钥加密(对称密钥加密):加密和解密使用相同密钥。

对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES。

公开密钥加密(非对称密钥加密):公开密钥加密使用一对非对称的密钥。一把叫做私有密钥,一把叫做公开密钥。私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。使用此加密方式,发送密文的一方使用公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听盗走。

常见的非对称加密算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)。

但由于公开密钥比共享密钥要慢,所以我们就需要综合一下他们两者的优缺点,使他们共同使用,而这也是HTTPS采用的加密方式。在交换密钥阶段使用公开密钥加密方式,之后建立通信交换报文阶段则使用共享密钥加密方式。

HTTPS的安全通信机制:

工作流程可大致分为三个阶段:

认证服务器:浏览器内置一个受信任的CA机构列表,并保存了这些CA机构的证书。第一阶段服务器会提供经CA机构认证颁发的服务器证书,如果认证该服务器证书的CA机构,存在于浏览器的受信任CA机构列表中,并且服务器证书中的信息与当前正在访问的网站(域名等)一致,那么浏览器就认为服务端是可信的,并从服务器证书中取得服务器公钥,用于后续流程。否则,浏览器将提示用户,根据用户的选择,决定是否继续。当然,我们可以管理这个受信任CA机构列表,添加我们想要信任的CA机构,或者移除我们不信任的CA机构。

协商会话密钥:客户端在认证完服务器,获得服务器的公钥之后,利用该公钥与服务器进行加密通信,协商出两个会话密钥,分别是用于加密客户端往服务端发送数据的客户端会话密钥,用于加密服务端往客户端发送数据的服务端会话密钥。在已有服务器公钥,可以加密通讯的前提下,还要协商两个对称密钥的原因,是因为非对称加密相对复杂度更高,在数据传输过程中,使用对称加密,可以节省计算资源。另外,会话密钥是随机生成,每次协商都会有不一样的结果,所以安全性也比较高。

加密通讯:此时客户端服务器双方都有了本次通讯的会话密钥,之后传输的所有Http数据,都通过会话密钥加密。这样网路上的其它用户,将很难窃取和篡改客户端和服务端之间传输的数据,从而保证了数据的私密性和完整性。 

mod_ssl是一种以openssl 的工具箱为基础专门为apache webserver 提供密码保护的软件。

搭建一个基于HTTPS服务的静态网站

[root@localhost ~]# yum install mod_ssl -y

[root@localhost ~]# cd /etc/pki/tls/certs/              //我们装了mod的包后会出现这个文件

[root@localhost certs]# make jiami.crt                 //这里我们编译一个证书文件

首先我们需要设置密码,基于安全,编写证书会让我们输入密码,按照顺序编写完成后,会生成私钥,和公钥的一些信息如图 ;

key是私钥文件。

csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名。

crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息。

/etc/httpd/conf.d/ssl.conf   之后会生成证书的主配置文件

(1)先写网站的主配置文件:

[root@localhost certs]# vim /etc/httpd/conf.d/host.conf

(2)在编写网站的目录文件:

[root@localhost certs]# mkdir -pv /www/jiami
mkdir: 已创建目录 "/www"
mkdir: 已创建目录 "/www/jiami"
[root@localhost certs]# echo this is jiami> /www/jiami/index

(3)然后重启服务:

[root@localhost certs]# systemctl restart httpd
Enter SSL pass phrase for 192.168.1.131:443 (RSA) : ******              //这里会让你输入你刚才的设置的密码
[root@localhost certs]# systemctl stop firewalld.service 
[root@localhost certs]# setenforce 0                                                    //同样,这里是为了排除防火墙的影响 

(2)最后在浏览器上输入IP,注意这里因为是基于HTTPS的,所以需要在前面加上协议;格式为https://IP地址 

这里我们需要点击【我已充分了解可能的风险】 ,进去后确认;

这时我们就可以看到我们编写的内容。 

发布了43 篇原创文章 · 获赞 50 · 访问量 7965

猜你喜欢

转载自blog.csdn.net/weixin_43997530/article/details/102613083
今日推荐