学习笔记之HTTPD

Posted Ghost_02

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记之HTTPD相关的知识,希望对你有一定的参考价值。

1.HTTP的基础知识

    1.HTTP:(超文本传输协议)。早期仅仅是实现了再不同文本(仅ASCII码)之间的跳转。随着后期的不断改进最终形成了如今的HTTPD

    2. 说到HTTPD就必须说到Apache这个世界排名第一的Web服务器, 一个网页的浏览需要一个服务器端和一个客户端。服务器端可以用Apache,IIS,Nignx,thttpd(小巧的轻量级Web server)

   3.客户端用什么来访问网页呢,是用浏览器来访问网站。经常见到的Web浏览器有Chrome,Firefox,IE,QQ浏览器。

   4.服务器提供的最重要数据是超文本标记语言html(Hyper Text Markup Language),超媒体文件。

   5.什么是静态网页或是动态网页呢,我之前一直以为网页有动画就叫动态网页,网页只有静态的文字就是静态网页。其实这是不对的。动态网页是服务器接受到访问请求,这时就需生成一个子进程将php,或者Java呀的什么的语言交给解释器运行一遍,再将运行结果返回给Web进程。所以凡是结合了HTML以外的高级语言和数据库技术进行的网页编程生成的网页都是动态网页。

   6.httpd的状态码。我们经常访问网站时出现错误404.知道这是什么吗,其实这是状态码

1xx :通常是纯信息。很少见

2xx :(成功类) 如200,请求成功

3xx  :   (重定向 )   如301,请求被永久重定向。302 请求被暂时重定向

4xx :(客户端错误) 如400请求参数错误。403 服务端也理解请求,但拒绝服务 。404 请求资源不存在

5xx :(服务器端错误)如502(Bad Gateway)作为网关或代理服务器藏是请求时。从上游服务器收到无效的响应


2.HTTPD的配置文件

配置前是不是需要安装httpd呀,其实安装过程是十分简单的。只需要一个命令就OK了。(我用的是CentOS7)

[root@www etc]# yum -y install httpd
Loaded plugins: fastestmirror, langpacks
adobe-linux-x86_64                                                                         |  951 B  00:00:00     
c7-media                                                                                   | 3.6 kB  00:00:00  

httpd 的配置文件主要在/etc/httpd这个文件下,主要要用到的在conf下

[root@www conf]# pwd
/etc/httpd/conf

CentOS7的配置文件中好像有一小点的改动。和其他版本的不一样(/etc/httpd/conf/httpd.conf)



1.配置文件的结构

分为三部分 分别是  全局环境的配置 ,主服务的配置,虚拟主机的配置

网页的首页及其目录相关的权限设置(DocumentRoot与Directory)

Doucument定义了www默认的首页是放在/var/www/html这个目录中。对可被浏览的目录进行权限的相关设置就是<Directory>在起作用。


配置文件的配置语法是否正确可以使用httpd -t检查配置文件的正确与否

[root@www conf]# httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:fec6:3cee. Set the 'ServerName' directive globally to suppress this message
Syntax OK


2.开始主要的server端的配置吧

1.ServerAdmin (注意,在86行定义,可能随着更改有小许偏差,下面不再说明)

定义了服务器的管理员的邮箱地址

86 ServerAdmin root@localhost


2.ServerName 

定义了服务器的主机名

 95 #ServerName www.example.com:80

3.DocumentRoot

文档根目录,网页文件存放的位置。对网站来说,/就指向了/var/www/html.  URL路径就是相对DocumentRoot而言的

119 DocumentRoot "/var/www/html"


如果想要加一些权限就可以加一个<Directory  "/var/www/html">来限定这个路径该如何被访问

访问选项

如下

131 <Directory "/var/www/html">
。。。    省略       。。。。
144     Options Indexes FollowSymLinks
。。。    省略       。。。。
151     AllowOverride None
。。。    省略       。。。。
156     Require all granted
157 </Directory>

默认的定义 Options 定义网页被访问的属性。每个属性被空格隔开。

Options 部分 :

Indexes 如果在此目录下找不到首页文件,就显示整个目录下的所有文件(最好关了,除非是下载站点)如下图

FollowSymLinks  若这个目录下有一个软连接。假如软连接连接的是/etc。就可以访问符号连接的文件(最好关了,不安全)

Includes 允许执行服务端包含的(Server-Side Include 程序)(最好关了)

SyminksifOwnerMatch 允许执行符号连接,但所属组必须是httpd (前面那个都最好关了,这个还开着干啥?)

ExecCGI   是否允许运行DGI脚本 (开着吧)

MultViews  可判断客户端来源,来显示不同的语言(不是国际化网站就别开着装逼了)

ALL  以上全开

None 以上全关


AllowOverride  部分:

允许的覆盖参数功能

让下面的参数不生效了,

ALL 全部的权限都可以被覆盖

AuthConfig 仅有网页认证可覆盖

Indexes  仅允许Indexes方面的覆盖

Limits 允许利用Allow,Deny与Order管理可浏览的权限

None 不可覆盖


举个栗子吧(基于用户和组的访问控制)

让用户提供帐号密码才可以访问网站(在/etc/httpd/conf/httpd.conf中的这里作出以下配置,大概150行左右)

AllowOverride AuthConfig
AuthType Basic
AuthName "Restricted Site..."
AuthUserFile "/etc/httpd/conf/htpasswd"
Require valid-user

(还可以基于组的认证,AuthGroup)

组的认证在创建文件,文件内容

myusers: kail suse

好了,创建一个用户和密码( -c 首次创建 -m 使用md5 加密)

[root@www conf]# htpasswd -c -m /etc/httpd/conf/htpasswd kail
New password: 
Re-type new password: 
Adding password for user kail
[root@www conf]# htpasswd -m /etc/httpd/conf/htpasswd suse
New password: 
Re-type new password: 
Adding password for user suse

重启服务

[root@www conf]# systemctl restart httpd

登陆网页(要求输入用户名和密码)

我要是不输入呢(就报告如下错误)



Order 部分: (能够定义基于主机的访问功能,IP,的控制访问的记住)

(tips:allow和deny谁在前,谁的优先级就高)

Order  allow,deny

Allow from 192.168.1.0/24

Deny from  192.168.2.0/24


4.DirectoryIndex

默认不指定访问页面时,默认的页面名称

169     DirectoryIndex index.html


5.Files

176 <Files ".ht*">
177     Require all denied
178 </Files>
.ht的文件不准被访问


6.TypesConfig 支持传输的二进制文件类型

271     TypesConfig /etc/mime.types


288     AddType application/x-compress .Z
289     AddType application/x-gzip .gz .tgz

7.ErrorLog(服务错误日志的所在位置)

187 ErrorLog "logs/error_log"

194 LogLevel warn

8.LogFormat(日志的格式)

%h 是客户端地址 %l远端主机的登陆名称  %u认证的用户 %t 时间 %r请求报文的首行  %>s 状态码 %b响应报文的大小%Refereri网站访问时通过哪里来的 %User-Agenti 客户访问时使用的浏览器。。。  combined 是混合模式

201     LogFormat "%h %l %u %t \\"%r\\" %>s %b \\"%Refereri\\" \\"%User-Agenti\\"" combined
202     LogFormat "%h %l %u %t \\"%r\\" %>s %b" common

222     CustomLog "logs/access_log" combined
通过日志就可以看到你网站的访问量

PV: Page View 页面访问量

UV:   User View 每天独立IP的访问量


9.Alias (路径别名)



3.虚拟主机

     什么时虚拟主机呢?举个栗子。你搭建的网站每天只有1,2个人访问。但时你搭建网站时需要服务于不同的站点,那你还那一堆子主机来搭建一个网络集群码??没必要吧,投入太大了,所以就提出了虚拟主机的概念。

    但是对与一个主机而言。IP是很稀有的资源。端口在TCP上就只有一个。那怎么来设置虚拟主机呢。这就需要基于域名来设置虚拟主机。就是每个站点的主机名不一样。

   HTTP的首部表明了Host,哪怕IP和端口都一样也可以访问不同的Host,

为了配置一个虚拟主机,下面的选项是需要有的


ServerName:

DocumentRoot:  /www/a.com

<Directory "/www/a.com">

...                  ...

</Directory>


ErrorLog

Customlog

<Location "/images">       

</Location>



虚拟主机的定义:

<VirualHost HOST>

</VirtualHost>

                                       

1.开始设定虚拟主机吧(IP方法)

1.注释中心主机

119 #DocumentRoot "/var/www/html"

2.在其他地方再创建一个虚拟主机的配置文件

[root@www conf]# vim ../conf.d/virtual.conf

文件内容如下

<VirtualHost 192.168.1.192:80>
        ServerName music.double2.com
        DocumentRoot "/www/double2.com"
</VirtualHost>


<VirtualHost 192.168.1.191:80>
        ServerName news.double2.com
        DocumentRoot "/www/news.double2.com"
</VirtualHost>

好了,但是DocumentRoot所指定的目录是没有的。

将那2个目录创建

[root@www conf.d]# mkdir -pv /www/double2.com,news.double2.com
并给这两个目录中都存放一个index.html文件

3.添加IP地址(配置文件所写的那个IP)

[root@www conf.d]# ip addr add 192.168.1.191/24 dev eth0
[root@www conf.d]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:c6:3c:ee brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.192/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.1.191/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fec6:3cee/64 scope link 
       valid_lft forever preferred_lft forever

OK(有个很坑的问题就是Apache 2.4 将Directory / 设置成了Require denied 。导致我怎么都访问403错误,所以用CentOS 7 的小伙伴们记得把这里该过来)

103 <Directory />
104     AllowOverride none
105     Require all granted
106 </Directory>

好了,可以访问了,如果还是不能访问的话,请检查Selinux,还有火墙。是否重启httpd服务等等


2.虚拟主机的基于端口设置实现

其实很简单。首先再/etc/httpd/conf/httpd.conf中加上监听8080端口

 42 Listen 80
 43 Listen 8080


然后再在虚拟主机的那个配置文件中加上

<VirtualHost 192.168.1.192:8080>
        ServerName www.b.net
        DocumentRoot "/www/music"
</VirtualHost>
~                 

OK啦~(注意创建DocumentRoot所指示的那个目录)

3.虚拟主机的基于主机名的设置实现

这个其实也十分的简单,在那个virtual.conf这个文件的开头加上这样的一段话表明启用主机名的虚拟主机

NameVirtualHost 192.168.1.192:80

在加上最后4行(有2个192.168.1.192:80 ??是不是搞错了,没有!!!)

NameVirtualHost 192.168.1.192:80

<VirtualHost 192.168.1.192:80>
        ServerName www.double2.com
        DocumentRoot "/www/double2.com"
</VirtualHost>


<VirtualHost 192.168.1.191:80>
        ServerName news.double2.com
        DocumentRoot "/www/news"
</VirtualHost>

<VirtualHost 192.168.1.192:8080>
        ServerName www.b.net
        DocumentRoot "/www/music"
</VirtualHost>

<VirtualHost 192.168.1.192:80>
        ServerName ftp.double2.com
        DocumentRoot "/www/ftp"
</VirtualHost>

好了,这下需要以主机名来访问了(自动略过建立net的目录过程,自己建吧)

怎么访问呢。用DNS啦,我之前自己搭建了一个DNS服务器

看见了没。我还有个别名(CNAME)叫作ftp呢。关于DNS服务器的搭建。我以前也写过点击打开链接


其实修改hosts文件也可以。hosts文件的修改就不说了


4.日志文件在一起

但是有一个问题不知道大家注意到了没。所有的日志信息都到了/etc/httpd/log那里的同一个日志文件了,这时就需要将日志信息分开管理了

日志怎么改呢?

在那里加一行就够了

<VirtualHost 192.168.1.191:80>
        ServerName news.double2.com
        DocumentRoot "/www/news"
        CustomLog /var/log/httpd/double2.com/access_log combined
</VirtualHost>

在创建那个目录

[root@www conf.d]# mkdir  /var/log/httpd/double2.com
改下权限

[root@www conf.d]# mkdir  /var/log/httpd/double2.com
[root@www conf.d]# chgrp apache !*
chgrp apache /var/log/httpd/double2.com
[root@www conf.d]# chmod 770 /var/log/httpd/double2.com/

其实这里就已经差不多了,但是还可以加一些东西,比如某个页面需要输入帐号密码才能访问。某个页面屏蔽某些IP都和上面所说的一模一样


4.HTTPS

1.https的概念

       首先https是安全httpd,使用SSL(安全套接字层)加密。也就是在应用层和传输层之间加一层安全加密。这样就可以安全的通信了。普通的HTTP是明文传输的,这极不安全,因为像淘宝这种网页输入密码如果别人抓包了就完蛋了(其实安全套接层也不安全,黑客攻击并发现安全套接层的漏洞,心脏出血就是有名的案例)

       HTTPS他不再间听在80端口了,而是监听在443端口。

    https建立流程

1.客户端先发起SYN的TCP连接请求。3次握手

2.完了之后,客户端与服务器端协商加密算法。协商成功后。服务器端发送自己的证书给客户端

3.客户端验证完成后,就生成一个对成密钥,并发送给服务器端。客户端这时发送访问的页面请求

4.服务器端通过公钥加秘并返回给客户端


所以说必须要一个第三方机构给服务器端颁发证书,而客户端也需要信任这个第三方机构。(实际生活中,找第三方机构申请证书是需要钱的)


举个生动的栗子。我想去某个餐馆吃饭,但我并不知道卫生不卫生,那我就问老板要看工商营业执照。由于我信任党和国家,所以这个参观老板只要提供出工商营业执照。我就放心的在这个餐馆里吃饭。


那我们先创建一个私有CA证书吧。有关openssl的内容,我之前写过。点击打开链接


客户端生成一个自签证书,服务器端找客户端申请证书。


因为SSL会话只能支持IP的主机,也就是说当使用虚拟主机时就只能为一个主机提供加密服务


2.安装httpd 的安全模块

注意以下操作的主机名为www时服务器端,ns的时客户端

[root@www conf.d]# yum -y install mod_ssl
Loaded plugins: fastestmirror, langpacks
adobe-linux-x86_64                                                                                                             |  951 B  00:00:00     
c7-media                                                                     


来看看都安装了哪些东西

[root@www conf.d]# rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf
/etc/httpd/conf.modules.d/00-ssl.conf
/usr/lib64/httpd/modules/mod_ssl.so
/usr/libexec/httpd-ssl-pass-dialog
/var/cache/httpd/ssl


客户端

在客户端下创建密钥(必须在CA这个目录)

[root@ns CA]# pwd
/etc/pki/CA
[root@ns CA]# openssl genrsa -out private/cakey.pem 2048;chmod 600 private/cakey.pem
Generating RSA private key, 2048 bit long modulus
...................................................+++
.....+++
e is 65537 (0x10001)
生成证书

[root@ns CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 7
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [Shannxi]:
Locality Name (eg, city) [Xian]:
Organization Name (eg, company) [Xiyou]:
Organizational Unit Name (eg, section) [Tech]:
Common Name (eg, your name or your server's hostname) []:ca.double2.com
Email Address []:admin@double2.com

准备相关目录

[root@ns CA]# mkdir certs crl newcerts
文件

[root@ns CA]# touch index.txt
[root@ns CA]# echo 01 > serial

服务器端

做一个密钥匙

[root@www conf.d]# cd /etc/httpd/conf
[root@www conf]# mkdir ssl
[root@www conf]# cd ssl
[root@www ssl]# openssl genrsa 1024 > httpd.key;chmod 600 httpd.key
Generating RSA private key, 1024 bit long modulus
..................++++++
..........++++++
e is 65537 (0x10001)
做一个证书申请书(注意。Common Name 填写你要给哪个主机申请个证书)

[root@www ssl]# openssl req -new -key httpd.key -out httpd.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shannxi
Locality Name (eg, city) [Default City]:Xian
Organization Name (eg, company) [Default Company Ltd]:Xiyou
Organizational Unit Name (eg, section) []:Tech
Common Name (eg, your name or your server's hostname) []:www.double2.com
Email Address []:mail@mail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:  
An optional company name []:

将证书给客户端去申请

[root@www ssl]# scp httpd.csr root@192.168.1.234:/tmp/
The authenticity of host '192.168.1.234 (192.168.1.234)' can't be established.
ECDSA key fingerprint is f4:7b:49:a0:d0:c9:e0:27:07:49:9d:5c:24:78:c9:b3.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.192' (ECDSA) to the list of known hosts.
root@192.168.1.192's password: 
httpd.csr                                                                                                           100%  692     0.7KB/s   00:00 

客户端签署证书

[root@ns CA]# openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 7
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Nov 19 12:13:59 2016 GMT
            Not After : Nov 26 12:13:59 2016 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Shannxi
            organizationName          = Xiyou
            organizationalUnitName    = Tech
            commonName                = www.double2.com
            emailAddress              = mail@mail.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                C8:1A:CE:EB:39:A8:C8:66:56:B3:C4:71:54:4C:CF:86:E1:4A:36:DF
            X509v3 Authority Key Identifier: 
                keyid:5B:BF:77:C7:2C:C5:7B:94:68:F3:AD:0E:ED:8A:C2:4D:0F:67:A2:2D

Certificate is to be certified until Nov 26 12:13:59 2016 GMT (7 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

将证书给服务器端

[root@www ssl]# scp root@192.168.1.234:/tmp/httpd.crt .
root@192.168.1.234's password: 
httpd.crt                                                                                                           100% 3849     3.8KB/s   00:00   

3.服务器端启用证书

来,改配置文件

[root@www conf.d]# pwd
/etc/httpd/conf.d
[root@www conf.d]# ls
autoindex.conf  manual.conf  README  ssl.conf  userdir.conf  virtual.conf  welcome.conf
[root@www conf.d]# cp ssl.conf ssl.conf.bak
[root@www conf.d]# vim ssl.conf

指定使用加密传输的那个主机

 56 <VirtualHost 192.168.1.192:443>
 57 
 58 # General setup for the virtual host, inherited from global configuration
 59 #DocumentRoot "/var/www/html"
 60 #ServerName www.example.com:443
 61 DocumentRoot "/www/double2.com"
 62 ServerName www.double2.com


指定加密的钥匙和CA证书

102 SSLCertificateFile /etc/httpd/conf/ssl/httpd.crt
103 
104 #   Server Private Key:
105 #   If the key is not combined with the certificate, use this
106 #   directive to point at the key file.  Keep in mind that if
107 #   you've both a RSA and a DSA private key you can configure
108 #   both in parallel (to also allow the use of DSA ciphers, etc.)
109 SSLCertificateKeyFile /etc/httpd/conf/ssl/httpd.key

检查配置文件,重启服务。看端口是否打开

[root@www conf.d]# httpd -t
AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/httpd/conf.d/virtual.conf:1
Syntax OK
[root@www conf.d]# systemctl restart httpd

[root@www conf.d]# nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2016-11-19 20:30 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 994 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
80/tcp   open  http
443/tcp  open  https
631/tcp  open  ipp
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 2.37 seconds


但是看看好像不能查看网站


是因为我的浏览器不会接受CA颁发机构阿,因为颁发机构是我自己。那把ca证书加载到浏览器就好了

现在将私有CA给浏览器一份吧,让浏览器信任我这个CA颁发机构


第一步

[root@ns CA]# ls
cacert.pem  certs  crl  index.txt  index.txt.attr  index.txt.attr.old  index.txt.old  newcerts  private  serial  serial.old
[root@ns CA]# cp cacert.pem /mnt/cacert.crt 
第二步

在浏览器的右上角有个Options.点击



点击查看CA证书

点击导入CA证书

选择ca所在路径

全都添加上

在CA列表里可以看见CA证书了,是西邮颁发的


好了,万事大吉







以上是关于学习笔记之HTTPD的主要内容,如果未能解决你的问题,请参考以下文章

Android学习笔记技巧之给文本加边框

学习笔记之shell的文本处理工具

XML学习笔记之XML的简介

java学习笔记之xml

MongoDB 学习笔记之 TTL索引,部分索引和文本索引

httpd服务学习笔记