欢迎各位兄弟 发布技术文章
这里的技术是共享的
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地址相同,端口也相同,但是每一个不同的站点,它的主机名不一样
这三个名称都解析到同一个IP地址上,但是它们的主机名却不相同,
IP地址是同一个,为什么打开的站点不同呢
http协议里面有标明了请求的主机,里面有域名 (比如Host: www.a.com) 来判定用户最终请求的是哪个网站
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运行环境,这个脚本就不能运行了,所以我们没法控制客户端)
因客户端动态的种种不好,所以要我们使用服务端动态
使用服务端动态,借助于cgi技术,动态是需要执行程序的,但apache自身只能解析纯文本文件(html text),额外的脚本只能由自己的解释器去运行
bash a.sh 此时bash就扮演了a.sh的解释器
a.c-->编译成 a.out -->a.out自己本身就能执行起来(只要本身所依赖的各种库文件都存在,它就能自我运行,不需要额外的解释器)
html文件直接返回给用户
sh文件,在服务器上调用合适的解释器把sh文件运行起来,把运行的结果返回给apache,再返回给用户,这才叫动态网站
`id -un` 输出当前用户的用户名 (不同的用户登录的时候,结果当然就不一样)
如果这个动态进程是由apache发起的,apache调用这个进程发起的这个脚本的话,那么很显然这个用户显示的是apache用户
`date` 用户访问的时间不同,结果不一样
a.sh执行后,都是一些简单的文本信息,它们没有字体格式,
下面的 sh脚本 echo "<h1>`date`</h1>"
显示的格式和数据在一起
如何把显示(格式)和业务(数据)分开
MVC可以实现分开显示和业务
(动态技术到底该怎么实现,讲到php的时候,会重新讲一遍,还涉及到其它技术)
用户假设访问的是b.out ,连解释器也不需要,直接运行b.out,运行后的内容通过CGI返回给apache,apache再返回给用户
[root@localhost ~]# vim /var/www/html/index.html
<h1>title</h1>
~
http://192.168.0.55/ 显示大标题
基于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这个地址
[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 都可以了
[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
增加一个 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 也可以访问
基于主机名的虚拟主机 必段要在 /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文件显示出来
在本机的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时,它将返回符合基于名称虚拟主机中的第一个 )
一个文件( /etc/httpd/conf.d/virtual.conf )里面溶合了三种不同的虚拟主机,
[root@localhost conf.d]# tail -2 /var/log/httpd/access_log
[root@localhost conf.d]# tail -2 /var/log/httpd/error_log
所有的访问日志的所有的错误日志都在上面两个文件里
想让不同的站点使用不同的日志,在虚拟主机里面各自定义就可以了
[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
(没看到报错原因)
root@localhost conf.d]# tail /var/log/httpd/error_log
(提示 没有/var/log/httpd/d.gov/access_log ,不能打开 /var/log/httpd/d.gov/access_log 这个文件)
[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 ( 马哥的操作 )
# getenforce (马哥的操作,确保selinux没有影响)
# chown apache:apache a.org/ d.gov/ magedu.com/ (马哥的操作,改属主属组试试)
# service http restart ( 马哥的操作, 重启 仍然不行 )
# !tail ( 马哥的操作, 还是没有 d.gov/access_log 文件,不能打开 d.gov/access_log 文件 )
马哥的下面的操作 还是报错
# touch d.gov/access_log
# service http restart
# tail /var/log/httpd/error_log
# vim /etc/httpd/conf.d/virtual.conf (马哥的操作)
马哥的操作 此时好了
# service httpd restart ( 马哥的操作 )
# service httpd restart ( 马哥的操作 )
[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的页面,就是一旦有错误,就给出的页面
我们
[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/
自己访问看看
[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 自己可以访问的
需要提供账号密码才可以访问 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/ 此时需要输用户名密码了
输入 用户名 密码后 可以访问了
其它站 不受影响 http://192.168.0.55/
每一个指令具体用法
官方提供 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地址 后面都行)
每一个指令都有说明的
VirtualDocumentRootIP /www/hosts/%0/docs
VirtualScriptAliasIP /www/hosts/%0/cgi-bin
(% 百分号 就是 宏 )不在 IDC 工作 很少用得上
它能够展开成n个虚拟主机,而且能够 %0是展开成主机名的
(比如第一段 www 第二段 www.org 之类的,或者前三段,后两段 等等,通过这种方式来进行展开,我们用不着它,就不用管它)
定义默认的虚拟主机 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>
看指令
点下 S 开头的
Set Handler 它能够实现让所有的匹配到的文件都能够有一个处理器来进行处理
这是一个web程序,我们的 Handler 一般来讲 使用web程序?
A Handler 是 apache 内部的一个动作,调用某个文件的时候,它可以在内部执行一个动作
具体的执行什么动作 对于不同的 Handler 来讲 是不一样的
[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
..........................................................................................................................................................................................
每一个点代表可启用的进程,我当前主机上工作了 这几个进程 只有这一个W进程处于work状态
当前进程中处于哪个阶段
一共允许256个请求同时进来,所以这里应该是256个位
server-status 应该不允许所有人来查看的,这就是为什么要定义 allow from ,deny from的原因,将来应该是限定主机访问的
一个请求,7个处于空闲状态
如果作压力测试的话,下面的点会急剧的发生变化(很多进程都启动起来了) (压力测试后面再说)