Apache配置对站点目录的认证

前言:

有的时候需要对站点中的某个目录进行保护,只有输入指定的账号密码才可以浏览。这当然可以通过动态网站设计语言来实现,但通过对Apache本身的配置来实现似乎要更方便一些。

配置方法:

一、Apache配置编辑及站点创建

创建一个站点配置文件。

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

内容如下:

<Directory "/tmp/html/auth/">      // 要启用认证的目录
    AuthName "请认证身份"           // 服务器返回的认证对话框的标题
    AuthType Basic                 // 认证类型
    AuthUserFile /tmp/html/auth/.htpasswd      // 密码配置文件路径
    require valid-user             // 允许通过认证的所有用户访问,如果改为某一用户名则只允许此用户访问
</Directory>
<VirtualHost *:80>                 // 创建一个简单的虚拟主机用于测试
    DocumentRoot /tmp/html/
</VirtualHost>

创建站点运行目录及要开启认证的站点子目录。

[root@hostname ~]# mkdir -p /tmp/html{,/auth}

查看此时的站点目录结构。

[root@hostname ~]# tree /tmp/html/
/tmp/html/
└── auth

在站点子目录下创建首页文件。

[root@hostname ~]# echo 'Hello,world!' > /tmp/html/auth/index.html

二、生成用户密码配置文件

创建新文件,并向其中添加一个用户认证信息。

[root@hostname ~]# htpasswd -cb /tmp/html/auth/.htpasswd user1 123456     //-c参数用于创建新文件,若文件已存在则无需使用-c参数,-b参数用于指定在命令行中直接键入密码,而不是用交互模式。user1为用户名,123456为密码。
Adding password for user user1   //提示成功添加了user1的用户密码

增加一个新的认证用户。

[root@hostname ~]# htpasswd -b /tmp/html/auth/.htpasswd user2 123456
Adding password for user user2   //成功添加

修改用户的密码。

[root@hostname ~]# htpasswd -mb /tmp/html/auth/.htpasswd user1 654321
Updating password for user user1 //密码更新成功

删除认证用户。

[root@hostname ~]# htpasswd -D /tmp/html/auth/.htpasswd user2
Deleting password for user user1 //删除成功

测试:

使用浏览器访问http://URL/auth(URL是你网站的域名或IP)就会看到要求认证的对话框啦!

这里我为了方便,使用的是Linux下的Links浏览器进行测试的。

正确输入账号密码后,即可看到网页内容。

为Apache配置虚拟目录

虚拟目录简介:

虚拟目录就是将原本不存在于网站根目录下的目录映射到一个别名上,这样Apache就可以通过“http(s)://网址/别名”的形式访问他啦!

配置方法:

先配置一个简单的虚拟主机。

[root@localhost ~]# vim /etc/httpd/conf.d/a.conf
<VirtualHost *:80>
       DocumentRoot /tmp/html/
</VirtualHost>

在虚拟主机中定义虚拟目录。

Alias /dir /tmp/html1

最终的虚拟机配置文件的内容是这样的。

<VirtualHost *:80>
       DocumentRoot /tmp/html/
       Alias /dir /tmp/html1
</VirtualHost>

创建站点目录及网页。

[root@localhost ~]# mkdir /tmp/html /tmp/html1
[root@localhost ~]# echo one > /tmp/html/index.html
[root@localhost ~]# echo two > /tmp/html1/index.html

在保证selinux和防火墙均关闭的情况下启动Apache。

[root@localhost ~]# service httpd start

测试:

可以选择在Windows的浏览器上测试,这里我为了方便,直接在CentOS下的文本浏览器中测试。

安装浏览器。

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

使用浏览器打开站点首页,这里的192.168.1.100是我的Apache服务器的IP地址。

[root@localhost ~]# links 192.168.1.100

按q退出后,重新打开带虚拟目录的站点URL,可以看到,成功输出了虚拟目录中的首页文件的内容,至此,虚拟目录配置完成。

[root@localhost ~]# links 192.168.1.100/dir

Apache配置HTTPS访问

介绍:

HTTPS协议是加密后的HTTP协议,浏览器和服务器间的通信被加密传输,有效的防止了网页劫持并保护了用户的数据安全。HTTPS加密会使用到SSL证书,本例中使用OpenSSL这个开源软件来生成SSL证书做测试用。网站正式上线后需去专门的CA机构申请SSL证书,自己生成的证书是不被浏览器信任的。

安装软件:

[root@localhost ~]# yum install -y openssl       //安装OpenSSL软件包用于生成SSL证书,此软件包通常已随系统默认安装。
[root@localhost ~]# yum install -y httpd         //安装Apache。
[root@localhost ~]# yum install -y mod_ssl       //安装Apache的SSL加密模块。

生成证书:

使用OpenSSL在/etc/httpd/ssl目录下生成一个自签名证书(存储位置随意)。

[root@localhost ~]# mkdir /etc/httpd/ssl       //创建SSL存储文件夹
[root@localhost ~]# openssl req -newkey rsa:2048 -nodes -keyout /etc/httpd/ssl/ssl.key -x509 -days 365 -out /etc/httpd/ssl/ssl.crt       //生成SSL证书文件

随后程序会依次要求输入所在的国家、地区、城市等等的信息,因为我们是做测试用的,这里全部直接回车即可。但是在下图中红色箭头所指的位置上要填上启用HTTPS的站点的域名,否则客户端浏览器可能会因为签名域名和站点实际域名不同而断开链接。

查看刚刚生成的证书。

[root@localhost ~]# ls /etc/httpd/ssl/

其中,.crt文件是证书文件,.key文件是私钥文件。

Apache配置部分:

配置Apache的ssl.com子配置文件,此配置文件必须是安装过mod_ssl模块才会有。

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

我看到网上很多教程说,在修改/etc/httpd/conf.d/ssl.conf子配置文件前还要在/etc/httpd/conf/httpd.conf主配置文件中引入mod_ssl模块。这里特殊说明一下,在CentOS 6.5下/etc/httpd/conf.d/ssl.conf子配置文件中就已经引入了mod_ssl模块,不需要再另外引入,另外,此配置文件中也默认开启了对443端口(HTTP使用80端口传输,HTTPS使用443端口传输)的监听。

本例中修改成如下图所示,“*”代表监听所有IP地址,虚拟主机所使用的域名必须使用DNS服务器解析到Apache服务器的IP上。

在105行和112行找到下图中的选项,将这辆个选项的参数修改为证书文件及私钥文件的存储位置。

创建网站首页文件。

[root@localhost ~]# echo 'hello,world!' > /var/www/html/index.html

如果在启用HTTPS访问的同时还要禁止HTTP访问可以做如下修改。

编辑Apache主配置文件。

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

方法1:暴力修改法。

转到第136行左右位置将监听80端口的选项直接禁用掉,这将会影响主配置文件中所有的虚拟主机。

修改后如图。

方法2:将需要禁用HTTP访问的虚拟主机配置信息删掉即可,如下图就是一个监听80端口(HTTP使用80端口)的虚拟主机配置信息。

最后,保存配置文件,并在保证防火墙及selinux均已关闭的情况下重启Apache。

[root@localhost ~]# service httpd restart

测试:

此时,通过HTTP协议已无法访问网站。

HTTPS协议正常访问网站,但浏览器会提示证书错误,因为是自签证书所以并不会被浏览器所信任,此处可不予理会。

Apache配合MySQL做访问认证

介绍:
默认情况下,任何用户都可以访问由Apache所承载的网站,但如果网站管理员想要只有通过身份认证的用户才能访问网站要怎样做呢?
当然,这个需求可以使用动态网页设计语言来实现,但本篇文章中我来介绍下如何使用Apache内置的身份认证来满足此需求。
安装软件包:

# yum install -y mysql-server         //安装MySQL数据库,用于存放用户身份信息
# yum install -y httpd                //安装Apache
# yum install -y mod_auth_mysql       //为Apache安装mod_auth_mysql模块,使其可以使用MySQL中存放的用户信息做认证

MySQL配置部分:
启动mysql服务器。

# service mysqld start

修改默认root密码(此root用户是MySQL的管理员账户,而非Linux系统的root用户)。

# mysqladmin -u root -p password 123456

之后会弹出提示,要求输入原root密码,安装MySQL后默认为空,直接回车即可。
若是MySQL5.6及以上版本,默认root密码不为空而是一个随机字符串,存放在~/.mysql_secret文件中。
使用root用户登录MySQL服务器,回车后会要求键入root密码。

# mysql -u root -p

随后转到MySQL的命令提示符下,如下图。

创建一个数据库:auth_db。

mysql>create database auth_db;

选中数据库。

mysql>use auth_db;

在其中新建一个数据表:user,其表结构如下图。

mysql>create table user(ID int,Name varchar(10),Birthday datetime,Sex char(8),Password char(64),primary key(ID));

查看刚刚添加的数据表的表结构。

mysql>desc user;


向表中添加两位用户的数据,要求如下。

 
两位用户的口令与用户名相同。

mysql>insert into user values(0,'myuser1','1996-7-1','male','myuser1');
mysql>insert into user values(1,'myuser2','1997-9-1','female','myuser2');

查看刚刚添加的数据。

mysql>select * from user;


加密密码字段。

mysql>update user set password=encrypt(password);

查看加密后的密码字段。

至此,MySQL配置部分完成。
Apache配置部分:
编辑Apache主配置文件,添加一个虚拟主机。

# vim /etc/httpd/conf/httpd.conf

转到最后一行,可以看到如下内容,取消其前方的注释,并删除多余行(是否删除看具体需求,此处为了演示方便,除了必要选项之外全部删除),同时对选项的参数进行适当修改。

处理完后,如下。

上图中,DocumentRoot选项配置网站主目录,ServerName选项配置网站域名。注:此处的域名需使用DNS服务器解析到Apache服务器的IP上,否则无法使用域名访问。
创建网站首页文件。

# echo 'hello,world!' > /var/www/html/index.html

编辑Apache的auth_mysql.conf子配置文件,此配置文件必须是安装过mod_auth_mysql模块才会有。

# vim /etc/httpd/conf.d/auth_mysql.conf

转到第26行左右位置,可以看到如下内容,去掉其前方注释,并按实际情况修改各选项的参数。

本例中,修改后如下图。

保存并退出后,在保证防火墙和selinux均关闭的情况下重启Apache服务,使配置文件生效。

# service httpd restart

在客户机验证配置,访问网站域名后弹出认证提示框:

正确输入账号名和密码后成功访问网站:

httpd服务器配置

启动httpd服务器:service httpd start/restart重启/stop关闭/
验证httpd服务器:
首先关闭防火墙:service iptables stop
然后访问服务器ip地址即可看到apache的默认页面
创建httpd配置文件:
cd /etc/httpd/conf.d/
新建一个配置文件:
vim a.conf(文件后缀必须是conf)
listen 89监听端口
listen 90
<VirtualHost *:89>指定以任意地址加89端口访问
DocumentRoot /www/89/设置网站根目录
</VirtualHost>
<VirtualHost *:90>
DocumentRoot /www/90/
</VirtualHost>
改动httpd配置文件之后必须重启服务:
service httpd restart
以上配置文件是创建了两个通过端口号来区分的虚拟主机,现在要为两个虚拟主机添加首页文件并创建目录。
mkdir /www/
mkdir /www/89
mkdir /www/90
在/www/89和/www/90中分别添加一个首页文件index.html内容自定义。
最后通过客户机浏览器可以访问到网站既是配置成功。