本文主要通过几个有关apache中httpd.conf文件设置的小练习,来熟悉一些基本的apache功能实现。
Test1
Deny the Deny the ip address to request some special page
此功能的实现主要通过加入Order Allow,Deny顺序进行实现。有两种方式。
方式一
在httpd.conf中加入一个Directory字段
<Directory />
Order Allow,Deny
Allow from all
Deny from xxx.xxx.xxx.xxx #阻止一个ip访问
Deny from xxx.xxx.xxx.xxx/xxx #阻止一个ip段访问
</Directory>
这个字段表示,对于对本服务器所有的访问请求,先允许,后拒绝,允许的范围是所有,然后再拒绝特定字段ip,当然,我们还可以反着写,来实现只允许特定ip访问的功能,如下
<Directory />
Order Deny,Allow
Deny from all
Allow from xxx.xxx.xxx.xxx #允许一个ip访问
Allow from xxx.xxx.xxx.xxx/xxx #允许一个ip段访问
</Directory>
上面就实现了先拒绝再允许指定ip的操作。
方式二
如果服务器开了多个虚拟主机,也可以在VirtualHost字段添加Location字段实现这个功能,如下
<VirtualHost *:8000>
DocumentRoot /usr/local/httpd/htdocs
DirectoryIndex 002.gif
ServerName localhost:8000
<Location />
Order Allow,Deny
Allow from all
Deny from all
</Location>
</VirtualHost>
禁止通过IP访问功能
通过以上练习,我们可以用虚拟主机加这个方法,实现禁止用户通过我们的IP访问我们的网站,而只能通过域名访问的功能。如下
<VirtualHost *:8000>
ServerName localhost:8000
<Location />
Order Allow,Deny
Allow from all
Deny from all
</Location>
</VirtualHost>
<VirtualHost *:8000>
DocumentRoot /usr/local/httpd/htdocs
DirectoryIndex 002.gif
ServerName www.mengze.wang:8000
</VirtualHost>
如上,其实实现方法就是我们给一个网站添加了两个虚拟主机,一个servername用IP表示,一个用域名表示。我们先禁止了通过IP的虚拟主机的所有访问,然后不限制通过域名的访问,就达到了这个目的。
Test 2
User authentication
此功能主要通过apache自带的htpassed工具进行密码创建,然后通过指定目录下的AllowOverride设置来实现。
首先用htpassed工具创建账户密码,htpassed在bin目录下。
#cd /usr/local/httpd/bin
#./htpassed -bc /usr/local/httpd/mima/.mima1 ben lym1993512
-b代表密码明文写在后米,不加b的话,命令后面不能直接接密码,输入命令之后会要求输入两遍密码。
-c代表新建密码文件,第一次建立需要,之后向其中添加账户就不需要。
然后编辑httpd.conf文件
#vim $conf (为了方便我设置了环境变量conf="usr/local/httpd/conf/httpd.conf")
<Directory "/usr/local/httpd/htdocs">
Options Indexes FollowSymLinks
AllowOverride Authconfig
AuthType Basic
AuthName "Enter your passwd"
AuthUserFile /usr/local/httpd/mima/.mima1
Require user ben
</Directory>
之后重启httpd服务就好用了,会提示输入用户名密码。
Test 3
Maps web paths into filesystem paths and is used to
此功能主要通过aliasmod实现,在httpd.conf文件中打开相关mod,然后在需要指定别名的目录字段之前加上Alias字段即可。举例如下
LoadModule alias_module modules/mod_alias.so
Alias /readme "/usr/local/httpd/htdocs/add"
<Directory "/usr/local/httpd/htdocs/add">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
</Directory>
这样就可以在浏览器里直接通过hostname/readme访问服务器中/usr/local/httpd/htdocs/add目录下的内容。
proxy代理功能的实现
用多个域名直接访问服务器的多个端口
这就是之前我自己琢磨做的一个小功能,有这个需求是因为我租了一个服务器和一个域名,域名解析到服务器IP,之后在上面搭建了一个博客。搭建博客我用的是一个叫hexo的专门用来做博客的软件,不是用httpd,博客搭建好后,用hexo监听80端口开启服务,在浏览器输入我租用的域名,就可以访问博客了。
之后我又租了两个域名,但是不知道做什么用,就想都解析到之前租用的服务器IP上,用httpd服务做两个小网站。
但是问题来了,在浏览器里输入域名,访问网站,默认都是访问80端口,但是我服务器的80端口已经被hexo软件占用,来访问博客了,其他的域名解析到我的服务器IP后,直接输入域名也只会访问到我的博客,不能到新的网站。
当然我可以在httpd里多开两个端口监听,比如5000,8000端口,然后新建两个VirtualHost对应到5000,8000端口,servername填我之后申请的两个域名,但是这样做的话,我每次在浏览器输入域名之后都要加上“:端口号”,这样很不方便。
或者就是关了hexo软件,把博客迁移到httpd里来,开三个VirtualHost,都对应到80端口,Servername填三个域名,对应不同的根目录,但是hexo还是很方便的,我不想关软件。
总之,我想要实现的是,在hexo软件不关闭的情况下,httpd服务也开启,三个域名分别能直接访问我的博客和其他两个网站。
实现的方法就是用Proxy代理功能。首先在httpd.conf里开启几个mod
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
然后监听三个端口
Listen 80 #用来代理
Listen 5000 #网站1端口
Listen 8000 #网站2端口
hexo服务我开了4000端口,作为博客访问的端口
hexo s -p 4000
然后新开两个VirtualHost作为新网站
<VirtualHost *:5000>
DocumentRoot /usr/local/httpd/htdocs
DirectoryIndex 001.jpg
ServerName localhost:5000 #写localhost或者域名都可以,因为都解析到IP,下同
</VirtualHost>
<VirtualHost *:8000>
DocumentRoot /usr/local/httpd/htdocs
DirectoryIndex 002.gif
ServerName www.mengze.wang:8000
</VirtualHost>
然后加对应的代理VirtualHost
<VirtualHost *:80>
ServerName www.luyiminggonnabeok.cn #博客
ServerAlias www.luyiminggonnabeok.cn
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://123.207.249.242:4000/
ProxyPassReverse / http://123.207.249.242:4000/
</VirtualHost>
<VirtualHost *:80>
ServerName www.zoeswan.wang #网站1
ServerAlias www.zoeswan.wang
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://123.207.249.242:5000/
ProxyPassReverse / https://123.207.249.242:5000/
</VirtualHost>
<VirtualHost *:80>
ServerName www.mengze.wang #网站2
ServerAlias www.mengze.wang
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://www.mengze.wang:8000/
ProxyPassReverse / http://mengze.wang:8000/
</VirtualHost>
这样通过代理,就可以把同是80端口的请求转发到对应的不同端口上,实现了需求。