欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 22_01 _httpd虚拟主机 有大用

                Allow

                Deny

        基于用户

                基本认证

                摘要认证

虚拟主机

HTTPS

PHP-MySQL


apache虚拟主机:

apache: 不考虑虚拟主机,安装apache后,它本身提供一个站点平台给我们.它本身不是一个个的站点,它只是一个运行的服务器,

服务器,叫 Host , 物理主机,通常就是这台服务器本身能够运行的一个站点.

要想实一个web站点,能够在互联网上被访问,首先它得能够运行在一个操作系统上,而且操作系统能够运行在物理主机上,

在互联网上能够被访问,需要一个主机,一个ip地址,需要一个实时在线的服务器,

对于很小的网站站点来讲,或者是某种特殊情况下,我们需求来讲,压根用不上一台服务器,每天可能3,5个人访问,它只是需要在线而已,如果我们为了这一点点的投入,或一点点的需求投入这么大的资源去运行这么一个站点的话,是非常浪费的,我们期望像虚拟的OS一样,(或者说像虚拟的PC一样,)能够在一台物理主机上虚拟出来多个可以同时运行的站点(主机),因此,我们把它叫作虚拟主机


虚拟主机:

apache服务(apache进程): 当apache服务器本身,服务器进程运行起来以后,

        它能够服务于多个不同的站点:

        意味着通过同一台主机,访问多个不同的站点,它们所打开展示给我们的web资源是不尽相同的,而且对于终端用户来讲,他们并不能意识到这是个虚拟主机,甚到他们能够完全认为这是一个站点,运行在一台独立的物理服务器上的,所以称之为虚拟主机.    

apache:

        中心主机(核心主机) (不使用虚拟主机)

        虚拟主机(此时就不用中心主机了)

这两种主机一般不能同时使用,而且如果此前有中心主机的话,那就只能把中心主机也就 给定义成一个虚拟主机来使用(如果想保留原来的站点的话)

        IP  80 它们都是有限的

                基于IP    每一个主机使用不同的IP地址,但是它们的端口号是相同的 80  (IP地址很稀缺,IP地址一年使用费很高,对于小站点来讲,完全没有必要基于IP地址)

                    IP1:80

                    IP2:80

                基于端品    IP同一个,但是端口发生变化了 (访问对方服务器的时候,都是假设使用默认端口,一旦换了端口,就不知道是哪一个了) (固然简单,但是在互联网上没法使用,除非在自己公司内部使用,或者是在网页间通过某个链接跳转的时候使用,)

                    IP:80

                    IP:8080

                基于域名  IP地址相同,端口也相同,但是每一个不同的站点,它的主机名不一样

                    www.magedu.com

                    www.a.org

                    www.b.net

                                这三个名称都解析到同一个IP地址上,但是它们的主机名却不相同,


IP地址是同一个,为什么打开的站点不同呢

http协议里面有标明了请求的主机,里面有域名 (比如Host: www.a.com) 来判定用户最终请求的是哪个网站

image.png


apache 2.2 的时候,需要一个特殊指令来启用基于主机名的虚拟主机

    NameVirtualHost

apache 2.4 的时候,不需要一个特殊指令来启用基于主机名的虚拟主机

2.4的时候,三种不同的虚拟主机,我们只需要各自定义就可以,想使用什么方式就定义什么方式



一个站点最核心需要哪几个东西

    1)ServerName

              如果基于IP的虚拟主机,IP应该不同,如果基于端口的,端口应该不同,如果基于主机名的,主机名应该不同

    5)ServerAlias        (服务器别名 主机别名)这个站点还有一个别名 www2.a.org

    2) DocumentRoot        /www/a.org/          

    3) <Directory "">        # 我们要为这个站点定义 Directory 这个容器来定义这个站点该如何被访问,或者说它的目录访问的时候,应该具有什么属性        这个里面封装的是本地文件系统路径

                         <Directory "/www/a.org">            # 里面跟中心主机的定义是一样的

                                    Option

                                    AllowOverride

                                     .......

                                     .......

                         </Directory>

     4) Alias  (路径别名)

            http://www.a.org/images     目录 本来就相当于/www/a.org/ 下面的images目录

假设期望它的目录为 /www/test目录,就要使用别名了Alias 

    6)ErrorLog

    7)CustomLog

    8) <Location "">        # Location容器 和 Directory 容器一样,(Directory用来定义封装定义访问某一个本地文件系统目录下的文件的时候,(当然它可以有一定的映射关系),应该具有什么样的访问属性)    Location容器 是用来定义url,跟在域名后面的路径, http://www.a.org/images),访问这里面的资源的时候,它应该具有什么样的权限,或者可以使用什么样的方法等等,对于中心主机和虚似主机来讲都是可以用的  用在虚拟主机里面,明确说明对于当前这个虚拟主机来讲,它的某一个Location 应该倒底该怎么样被使用  比如说这个

                <Location "/images">            # 比如说这个目录下面的所有文件只允许你使用GET方法,其它任何方法都不能使用

                </Location

    9) ScriptAlias 这是允许执行cgi脚本的目录的     #中心服务器和一个虚拟主机里面都可以使用它 (若是虚拟主机里面配置 ScriptAlias  ,明确说明当前虚拟主机允许执行cgi脚本的目录在哪里)


每一个虚拟主机可以定义的属性有很多,每一个属性怎么来判定,标明它就是属于某一个虚拟主机的呢,只要我们想实现某一个属性只对某一个局部有效的话,就使用一个容器给它封装起来就OK了,


虚拟主机的定义:

<VirtualHost HOST>        #HOST,就是主机  三种不同的方式,写法不一样


</VirtualHost>


虚拟主机与中心主机不能同时使用,得先取消中心主机,注释中心主机的DocumentRoot即可,(为什么我没有注释,却可以使用虚拟主机呢)

基于IP,HOST写法

        IP1:80

        IP2:80

基于端口,HOST写法

        IP:80

        IP:8080

基于主机名(域名),HOST写法

        IP:80  (所有IP均监听,使用 *:80 )

        ServerName 要不同



CGI: Common Gateway Interface 通用网关接口,这是实现动态网站的一种早期的技术,有了CGI技术,我们服务器上的apache进程,就能够通过 CGI协议启动另外一个新的进程(调用一个外部的解释器或者运行一个执行环境,去运行一段程序),这个新的进程能够执行一段脚本,或者程序,并且执行的程序的结果通过CGI协议能够返回给apache进程,apache将执行的结果(以纯静态的结果)返回给客户端    这种叫服务端动态(脚本)


客户端动态(脚本) 就是用户把程序源码下载到用户本地,然后在用户本地执行(执行以后结果,对于不同的用户来讲,访问的结果可能是不一样的?)  (客户端动态(脚本) 坏处,如果人家在网站里放一个恶意指令,就是让客户端格式化自己的磁盘,下载到本地执行,结果机器冒烟了)(所以客户端动态有着极大的不安全性)(客户端动态的适用性不强,我开发了一个java脚本,客户端没有安装java运行环境,这个脚本就不能运行了,所以我们没法控制客户端)

image.png


image.png

因客户端动态的种种不好,所以要我们使用服务端动态

使用服务端动态,借助于cgi技术,动态是需要执行程序的,但apache自身只能解析纯文本文件(html text),额外的脚本只能由自己的解释器去运行

bash a.sh 此时bash就扮演了a.sh的解释器

a.c-->编译成  a.out -->a.out自己本身就能执行起来(只要本身所依赖的各种库文件都存在,它就能自我运行,不需要额外的解释器)

image.png

image.png

html文件直接返回给用户

sh文件,在服务器上调用合适的解释器把sh文件运行起来,把运行的结果返回给apache,再返回给用户,这才叫动态网站

image.png

image.png

`id -un` 输出当前用户的用户名 (不同的用户登录的时候,结果当然就不一样)

如果这个动态进程是由apache发起的,apache调用这个进程发起的这个脚本的话,那么很显然这个用户显示的是apache用户

`date` 用户访问的时间不同,结果不一样

a.sh执行后,都是一些简单的文本信息,它们没有字体格式,

下面的 sh脚本  echo "<h1>`date`</h1>"

显示的格式和数据在一起

如何把显示(格式)和业务(数据)分开

MVC可以实现分开显示和业务  

(动态技术到底该怎么实现,讲到php的时候,会重新讲一遍,还涉及到其它技术)

image.png


用户假设访问的是b.out ,连解释器也不需要,直接运行b.out,运行后的内容通过CGI返回给apache,apache再返回给用户

image.png



[root@localhost ~]# vim /var/www/html/index.html

<h1>title</h1>

~

http://192.168.0.55/   显示大标题

image.png


 

基于ip地址的虚拟主机的写法

1)取消中心主机

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

     # DocumentRoot "/var/www/html"  注释掉它

2)在httpd.conf下添加VirtualHost

或者 vim /etc/httpd/conf.d/virtual.conf 建一个文件就可以了

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

<VirtualHost 192.168.0.55:80>

    ServerName hello.mageedu.com         #ServerName 相不相同,有没有都可以

    DocumentRoot  "/www/magedu.com" #根目录,DocumentRoot的位置

</VirtualHost>

<VirtualHost 172.168.0.57:80>

    ServerName www.a.org         #ServerName 相不相同,有没有都可以 无所谓的,不靠主机名来区别的

    DocumentRoot  "/www/a.org" #根目录,DocumentRoot的位置

</VirtualHost>


[root@localhost ~]# httpd -t    检测apache的配置文件的语法

Warning: DocumentRoot [/www/magedu.com] does not exist

Warning: DocumentRoot [/www/a.org] does not exist

Syntax OK

[root@localhost ~]#

[root@localhost ~]# mkdir -pv /www/{magedu.com,a.org}            #创建虚拟主机目录

mkdir: 已创建目录 “/www”

mkdir: 已创建目录 “/www/magedu.com”

mkdir: 已创建目录 “/www/a.org”


[root@localhost ~]# cd /www/magedu.com/

[root@localhost magedu.com]# vim index.html        #建首页

<title>MageEdu</title>

<h1>magedu.com</h1>


[root@localhost magedu.com]# cd /www/a.org/        #建首页

[root@localhost a.org]# vim index.html

<title>A</title>

<h1>a.org</h1>


[root@localhost a.org]# httpd -t         检测apache的配置文件的语法

Syntax OK

[root@localhost a.org]#

[root@localhost a.org]# service httpd restart

停止 httpd:                                               [确定]

启动 httpd:                                               [确定]

[root@localhost a.org]#




[root@localhost a.org]# ifconfig   #没有192.168.0.57这个地址

image.png


[root@localhost a.org]# ip addr add 192.168.0.57/24 dev eth0        # 在第一个网卡加192.168.0.57地址 

[root@localhost a.org]# ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

    link/ether 00:0c:29:a7:3a:72 brd ff:ff:ff:ff:ff:ff

    inet 192.168.0.55/24 brd 192.168.0.255 scope global eth0

    inet 192.168.0.57/24 scope global secondary eth0

    inet6 fe80::20c:29ff:fea7:3a72/64 scope link

       valid_lft forever preferred_lft forever

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

    link/ether 00:0c:29:a7:3a:7c brd ff:ff:ff:ff:ff:ff

    inet 192.168.0.149/24 brd 192.168.0.255 scope global eth1

    inet6 fe80::20c:29ff:fea7:3a7c/64 scope link

       valid_lft forever preferred_lft forever

4: sit0: <NOARP> mtu 1480 qdisc noop

    link/sit 0.0.0.0 brd 0.0.0.0

[root@localhost a.org]#


此时访问 http://192.168.0.55    http://192.168.0.57  都可以了   

image.png        image.png


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

<VirtualHost 192.168.0.55:80>

  ServerName hello.magedu.com

  DocumentRoot "/www/magedu.com"

</VirtualHost>

<VirtualHost 192.168.0.57:80>

  ServerName www.a.org

  DocumentRoot "/www/a.org"

</VirtualHost>

<VirtualHost 192.168.0.55:8080>

  ServerName www.b.net

  DocumentRoot "/www/b.net"

</VirtualHost>


[root@localhost conf.d]# mkdir /www/b.net

[root@localhost conf.d]# vim /www/b.net/index.html

<title>B</title>

<h1>b.net</h1>



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

image.png  增加一个 8080端口 

Listen 80

Listen 8080


[root@localhost conf.d]# service httpd restart  (或者 reload也可以)

停止 httpd:                                               [确定]

启动 httpd:                                               [确定]

[root@localhost conf.d]#


此时  此时访问 http://192.168.0.55:8080  也可以访问

image.png


基于主机名的虚拟主机 必段要在 /etc/httpd/conf/httpd.conf  (或子配置文件 比如 /etc/httpd/conf.d/virtual.conf )里面启用 

NameVirtualHost *:80    并指定在哪个地址上( 监听在这个地址上的主机将会使用 NameVirtualHost  )

这里 星号(*)表示所有地址



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

NameVirtualHost 192.168.0.57:80


<VirtualHost 192.168.0.55:80>

  ServerName hello.magedu.com

  DocumentRoot "/www/magedu.com"

</VirtualHost>

<VirtualHost 192.168.0.57:80>

  ServerName www.a.org

  DocumentRoot "/www/a.org"

</VirtualHost>

<VirtualHost 192.168.0.57:80>

  ServerName www.d.gov

  DocumentRoot "/www/d.gov"

</VirtualHost>

<VirtualHost 192.168.0.55:8080>

  ServerName www.b.net

  DocumentRoot "/www/b.net"

</VirtualHost>


[root@localhost conf.d]# vim /www/d.gov/index.html

<title>D</title>

<h1>d.gov</h1>


[root@localhost conf.d]# service httpd restart

停止 httpd:                                               [确定]

启动 httpd:                                               [确定]

[root@localhost conf.d]#


解析主机名,最简单的方式就是编辑本机hosts文件

也可以自己建个DNS服务器,把 www.a.org  www.d.gov  解析到我们的主机上来

编辑windows本机的hosts文件 (马哥的杀毒软件是不允许编辑hosts文件的,马哥把杀毒软件关掉了)

马哥  的hosts 文件看不到 马哥如下处理 能够让hosts文件显示出来

image.png

在本机的windows的hosts文件里面添加如下两行

192.168.0.57  www.a.org 

192.168.0.57  www.d.gov 


先ping 下  ping www.a.org  

ping www.d.gov 

都没问题

[root@localhost conf.d]# service httpd restart

停止 httpd:                                               [确定]

启动 httpd:                                               [确定]

[root@localhost conf.d]#

在浏览器里输  http://192.168.0.57  http://www.a.org  http://www.d.gov 

http://192.168.0.57  显示的是第一个 www.a.org 的页面  (使用ip时,它将返回符合基于名称虚拟主机中的第一个 )

image.png   

image.png   image.png

一个文件( /etc/httpd/conf.d/virtual.conf )里面溶合了三种不同的虚拟主机,


[root@localhost conf.d]# tail -2 /var/log/httpd/access_log

image.png

[root@localhost conf.d]# tail -2 /var/log/httpd/error_log

image.png

所有的访问日志的所有的错误日志都在上面两个文件里

想让不同的站点使用不同的日志,在虚拟主机里面各自定义就可以了



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

NameVirtualHost 192.168.0.57:80


<VirtualHost 192.168.0.55:80>

  ServerName hello.magedu.com

  DocumentRoot "/www/magedu.com"

  CustomLog  /var/log/httpd/magedu.com/access_log combined  #当然目录得创建出来,要让apache用户对它有写权限,combined 是日志格式

</VirtualHost>

<VirtualHost 192.168.0.57:80>

  ServerName www.a.org

  DocumentRoot "/www/a.org"

  CustomLog  /var/log/httpd/a.org/access_log combined

</VirtualHost>

<VirtualHost 192.168.0.57:80>

  ServerName www.d.gov

  DocumentRoot "/www/d.gov"

  CustomLog  /var/log/httpd/d.gov/access_log combined

</VirtualHost>

<VirtualHost 192.168.0.55:8080>

  ServerName www.b.net

  DocumentRoot "/www/b.net"            #这一个不给它提供日志了,使用默认的了

</VirtualHost>

~


[root@localhost conf.d]# service httpd restart            (报错,因为日志目录不存在)

停止 httpd:                                               [确定]

启动 httpd:                                               [失败]

[root@localhost conf.d]# httpd -t  (检测没问题)

Syntax OK

[root@localhost conf.d]#


[root@localhost conf.d]# tail /var/log/messages

(没看到报错原因)

image.png


root@localhost conf.d]# tail /var/log/httpd/error_log

(提示 没有/var/log/httpd/d.gov/access_log ,不能打开 /var/log/httpd/d.gov/access_log 这个文件)

image.png


[root@localhost conf.d]# ll -d /var/log/httpd/  (/var/log/httpd/目录的属主属组是root root)

drwx------ 2 root root 4096 03-13 18:42 /var/log/httpd/

[root@localhost conf.d]#


[root@localhost httpd]# mkdir a.org magedu.com d.gov

[root@localhost httpd]#

[root@localhost httpd]# service httpd restart

停止 httpd:                                               [失败]

启动 httpd:                                               [确定]

[root@localhost httpd]# 

马哥报错了 好像是因为 没有 d.gov/access_log 文件,不能打开  d.gov/access_log 文件

(但是我没有报错,换句话说  var/log/httpd/d.gov 的目录的属主属组是root:root 应该也没有问题)


# service http restart       ( 马哥的操作 )

# tail /var/log/httpd/error_log    ( 马哥的操作 )

image.png

# getenforce  (马哥的操作,确保selinux没有影响)

image.png


# chown apache:apache a.org/  d.gov/ magedu.com/   (马哥的操作,改属主属组试试)

# service http restart  ( 马哥的操作, 重启 仍然不行 )

image.png

# !tail    ( 马哥的操作, 还是没有 d.gov/access_log 文件,不能打开  d.gov/access_log 文件 )

image.png


马哥的下面的操作 还是报错

# touch d.gov/access_log

# service http restart 

# tail /var/log/httpd/error_log

image.png


# vim /etc/httpd/conf.d/virtual.conf  (马哥的操作)

 image.png


马哥的操作 此时好了 

# service httpd restart   ( 马哥的操作 )

# service httpd restart   ( 马哥的操作 )

image.png


[root@localhost httpd]# cd /var/log/httpd/

[root@localhost httpd]# tree        (看到了,只要有权限,会自动创建这些文件的 /var/log/httpd/a.org  /var/log/httpd/d.gov  /var/log/httpd/magedu.com 这个目录的属主属组是root:root 应该也无所谓)

.

|-- a.org

|   `-- access_log

|-- access_log

|-- d.gov

|   `-- access_log

|-- error_log

|-- magedu.com

|   `-- access_log

|-- ssl_access_log

|-- ssl_error_log

`-- ssl_request_log


3 directories, 8 files

[root@localhost httpd]#

浏览器打开  http://www.a.org/ 多刷新几次

[root@localhost httpd]# pwd

/var/log/httpd

[root@localhost httpd]# tail a.org/access_log        (可以看到日志了)

192.168.0.117 - - [23/Mar/2019:21:52:14 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"

192.168.0.117 - - [23/Mar/2019:21:52:14 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"

192.168.0.117 - - [23/Mar/2019:21:52:15 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"

[root@localhost httpd]#

当然了,也可以使用独立的错误日志了


拒绝某个ip的访问 (需要定义里面的Directory, Directory 里面再定义 deny)

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

NameVirtualHost 192.168.0.57:80


<VirtualHost 192.168.0.55:80>

  ServerName hello.magedu.com

  DocumentRoot "/www/magedu.com"

  CustomLog  /var/log/httpd/magedu.com/access_log combined

</VirtualHost>

<VirtualHost 192.168.0.57:80>

  ServerName www.a.org

  DocumentRoot "/www/a.org"

  CustomLog  /var/log/httpd/a.org/access_log combined

</VirtualHost>

<VirtualHost 192.168.0.57:80>

  ServerName www.d.gov

  DocumentRoot "/www/d.gov"

  CustomLog  /var/log/httpd/d.gov/access_log combined

  <Directory "www/d.gov">

      Options none

      AllowOverride none

      Order deny,allow

      Deny from 192.168.0.117   # 仅仅这个虚拟主机只拒绝这一个ip访问

  </Directory>

</VirtualHost>

<VirtualHost 192.168.0.55:8080>

  ServerName www.b.net

  DocumentRoot "/www/b.net"

</VirtualHost>


[root@localhost ~]# httpd -t

Syntax OK

[root@localhost ~]#

[root@localhost ~]# service httpd restart

停止 httpd:                                               [确定]

启动 httpd:                                               [确定]

[root@localhost ~]#


windows 访问  http://www.d.gov/  下面是到  welcome的页面,就是一旦有错误,就给出的页面

image.png我们 

[root@localhost ~]# mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf-bak


重启

[root@localhost ~]# service httpd restart                                       停止 httpd:                                               [确定]

启动 httpd:                                               [确定]

[root@localhost ~]#

windows 再访问 http://www.d.gov/

image.png


自己访问看看

[root@localhost ~]# vim /etc/hosts        (先添加hosts解析)

# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1               localhost.localdomain localhost

::1             localhost6.localdomain6 localhost6

192.168.0.55 www.d.gov

192.168.0.55 www.a.org

[root@localhost ~]# elinks http://www.d.gov    自己可以访问的

image.png

image.png


需要提供账号密码才可以访问 www.a.org

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

NameVirtualHost 192.168.0.57:80


<VirtualHost 192.168.0.55:80>

  ServerName hello.magedu.com

  DocumentRoot "/www/magedu.com"

  CustomLog  /var/log/httpd/magedu.com/access_log combined

</VirtualHost>

<VirtualHost 192.168.0.57:80>

  ServerName www.a.org

  DocumentRoot "/www/a.org"

  CustomLog  /var/log/httpd/a.org/access_log combined

  <Directory "/www/a.org">

    Options none

    AllowOverride authconfig

    AuthType Basic

    AuthName "Restrict area"

    AuthUserFile "/etc/httpd/.htpasswd_a.org"

    Required valid-user     # 仅仅这个虚拟主机需要提供用户名密码访问

  </Directory>

</VirtualHost>

<VirtualHost 192.168.0.57:80>

  ServerName www.d.gov

  DocumentRoot "/www/d.gov"

  CustomLog  /var/log/httpd/d.gov/access_log combined

  <Directory "www/d.gov">

      Options none

      AllowOverride none

      Order deny,allow

      Deny from 192.168.0.117    # 仅仅这个虚拟主机只拒绝这一个ip访问

  </Directory>

</VirtualHost>

<VirtualHost 192.168.0.55:8080>

  ServerName www.b.net

  DocumentRoot "/www/b.net"

</VirtualHost>


[root@localhost ~]# httpd -t

Syntax error on line 17 of /etc/httpd/conf.d/virtual.conf:

Invalid command 'Required', perhaps misspelled or defined by a module not included in the server configuration

把 Required 改成  Require

[root@localhost ~]#

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

NameVirtualHost 192.168.0.57:80


<VirtualHost 192.168.0.55:80>

  ServerName hello.magedu.com

  DocumentRoot "/www/magedu.com"

  CustomLog  /var/log/httpd/magedu.com/access_log combined

</VirtualHost>

<VirtualHost 192.168.0.57:80>

  ServerName www.a.org

  DocumentRoot "/www/a.org"

  CustomLog  /var/log/httpd/a.org/access_log combined

  <Directory "/www/a.org">

    Options none

    AllowOverride authconfig

    AuthType Basic

    AuthName "Restrict area"

    AuthUserFile "/etc/httpd/.htpasswd_a.org"

    Require valid-user

  </Directory>

</VirtualHost>

<VirtualHost 192.168.0.57:80>

  ServerName www.d.gov

  DocumentRoot "/www/d.gov"

  CustomLog  /var/log/httpd/d.gov/access_log combined

  <Directory "www/d.gov">

      Options none

      AllowOverride none

      Order deny,allow

      Deny from 192.168.0.117   # 只拒绝这一个ip访问

  </Directory>

</VirtualHost>

<VirtualHost 192.168.0.55:8080>

  ServerName www.b.net

  DocumentRoot "/www/b.net"

</VirtualHost>


[root@localhost ~]# httpd -t

Syntax OK

[root@localhost ~]#

创建 /etc/httpd/.htpasswd_a.org 文件

[root@localhost ~]# htpasswd -h

Usage:

        htpasswd [-cmdpsD] passwordfile username

        htpasswd -b[cmdpsD] passwordfile username password


        htpasswd -n[mdps] username

        htpasswd -nb[mdps] username password

 -c  Create a new file.

 -n  Don't update file; display results on stdout.

 -m  Force MD5 encryption of the password.

 -d  Force CRYPT encryption of the password (default).

 -p  Do not encrypt the password (plaintext).

 -s  Force SHA encryption of the password.

 -b  Use the password from the command line rather than prompting for it.

 -D  Delete the specified user.

On Windows, NetWare and TPF systems the '-m' flag is used by default.

On all other systems, the '-p' flag will probably not work.

[root@localhost ~]#

建两个用户

[root@localhost ~]# htpasswd -c -m /etc/httpd/.htpasswd_a.org tom

New password:

Re-type new password:

Adding password for user tom

[root@localhost ~]# htpasswd  -m /etc/httpd/.htpasswd_a.org jerry

New password:

Re-type new password:

Adding password for user jerry

[root@localhost ~]#

[root@localhost ~]# httpd -t

Syntax OK

[root@localhost ~]#


[root@localhost ~]# service httpd restart

停止 httpd:                                               [确定]

启动 httpd:                                               [确定]

[root@localhost ~]#


windows 访问  http://www.a.org/   此时需要输用户名密码了

image.png

输入 用户名 密码后  可以访问了

image.png

其它站 不受影响  http://192.168.0.55/

image.png


每一个指令具体用法

官方提供 manual 手册  http://www.apache.org/ ? 



[root@localhost ~]# yum -y install  httpd-manual      ( 或者在本机安装 manual 手册 )

Loaded plugins: product-id, security, subscription-manager

This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.

file:///media/cdrom/Server/repodata/repomd.xml: [Errno 5] OSError: [Errno 2] 没有那个文件或目录: '/media/cdrom/Server/repodata/repomd.xml'

Trying other mirror.

Setting up Install Process

Package httpd-manual-2.2.3-82.el5_9.i386 already installed and latest version

Nothing to do

上面 说明已安装

[root@localhost ~]#


安装后如何访问? 加上  /manual

http://www.a.org/manual/   (如果没有定义的话,manual加在哪个域名或ip地址 后面都行)

每一个指令都有说明的


image.png


image.png


image.png


VirtualDocumentRootIP /www/hosts/%0/docs
VirtualScriptAliasIP /www/hosts/%0/cgi-bin

(% 百分号 就是 宏 )不在 IDC 工作 很少用得上

它能够展开成n个虚拟主机,而且能够 %0是展开成主机名的

(比如第一段 www    第二段  www.org  之类的,或者前三段,后两段 等等,通过这种方式来进行展开,我们用不着它,就不用管它)

image.png


image.png



定义默认的虚拟主机 apache 有点麻烦 nginx 很简单 

使用ip地址直接访问, (或者使用ip解析不存在的主机名) 可以使用默认的虚拟主机,而不是某一个特定的虚拟主机

设定默认的虚拟主机

<VirtualHost _default_:80>  # 监听的位置写上 _default_  (下短横default下短横)

    DocumentRoot /www/default80

    #...

</VirtualHost>

或者 

<VirtualHost _default_:*>

    DocumentRoot /www/default

    #...

</VirtualHost>

但是也必须写在 虚拟主机的第一个才生效,写在基于名称的虚拟主机的第一个


看看 Location

<Location /status>  # Directory 定义的是本地文件系统路径  Location 定义的是Url (网络路径)(网址路径)

  SetHandler server-status   # 执行一个动作 ( server-status 是 apache内置的一个Handler ,所有的hanlder 就在 http://www.a.org/manual/handler.html 里面可以看到 (www.a.org 是自己配置的虚拟主机的名称)  )

  Order Deny,Allow

  Deny from all

  Allow from .foo.com  # 只有来自 .foo.com 的 才能访问对应的url

</Location>


看指令

image.png


点下 S 开头的

image.png

image.png

Set Handler 它能够实现让所有的匹配到的文件都能够有一个处理器来进行处理

这是一个web程序,我们的 Handler 一般来讲 使用web程序?

image.png


A Handler 是 apache 内部的一个动作,调用某个文件的时候,它可以在内部执行一个动作

具体的执行什么动作 对于不同的  Handler 来讲 是不一样的


image.png




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

............

#<Location /server-status>

#    SetHandler server-status

#    Order deny,allow

#    Deny from all

#    Allow from .example.com

#</Location>

............


改成 

<Location /server-status>

    SetHandler server-status

    Order allow,deny

    Allow from all        # 此时所有的用户都被允许

</Location>


[root@localhost ~]# httpd -t

Syntax OK

[root@localhost ~]#

[root@localhost ~]# service httpd restart

停止 httpd:                                               [确定]

启动 httpd:                                               [确定]

[root@localhost ~]#



访问 http://192.168.0.55/server-status

..........................................................................................................................................................................................

每一个点代表可启用的进程,我当前主机上工作了 image.png 这几个进程  只有这一个W进程处于work状态

image.png当前进程中处于哪个阶段

一共允许256个请求同时进来,所以这里应该是256个位

server-status 应该不允许所有人来查看的,这就是为什么要定义 allow from ,deny from的原因,将来应该是限定主机访问的

image.png 一个请求,7个处于空闲状态

如果作压力测试的话,下面的点会急剧的发生变化(很多进程都启动起来了) (压力测试后面再说)

image.png

普通分类: