RHEL6: Apache httpd安装与配置(SSL, Userdir, Auth, VirtualHost)

Apache httpd是应用最广的http服务器,它的基本安装配置也很简单。

--参考文档--

1. httpd配置文档 http://httpd.apache.org/docs/2.2/configuring.html
2. 文档路径 http://httpd.apache.org/docs/2.2/urlmapping.html
3. 认证授权 http://httpd.apache.org/docs/2.2/howto/auth.html
4. 虚拟主机 http://httpd.apache.org/docs/2.2/vhosts/
5. 访问控制 http://httpd.apache.org/docs/2.2/howto/access.html
6. 鸟哥私房菜 http://linux.vbird.org/linux_server/0360apache.php

--实验环境--

在虚拟机上搭建服务器,用物理机来访问;
1. 虚拟机和物理机均使用RHEL 6.5;
2. 虚拟机安装Apache HTTPD 2.2;
3. 虚拟机IP 192.168.122.108;
4. 物理机IP 192.168.122.1;

--安装--

RHEL6.5的镜像自带了Apache httpd,推荐使用它。

yum安装

[root@server1 ~]# yum install httpd -y

完事了。

设置iptables和SELinux

# vim /etc/sysconfig/iptables
-A INPUT -p TCP --dport 80 -j ACCEPT  # 在Reject的条目前加上这一行

# /etc/init.d/iptables restart
# setsebool -P httpd_can_network_connect=1

如果httpd的资料目录不是/var/www/html,那么需要修改该目录的selinux context.

chcon -reference  /var/www/html  /httpd

测试

无需修改配置,直接启动httpd,即可访问。

[root@server1 ~]# /etc/init.d/httpd restart

在物理机上,在浏览器上输入虚拟机的IP地址192.168.122.108,即可看到测试页面。

要更改网页的内容,直接修改DocumentRoot目录下(/var/www/html)的内容即可。
在/var/www/html/下建立一个index.html文件.

# vim /var/www/html/index.html
Hello World.

保存。
在物理机的浏览器上刷新一下页面,就能看到Hello World!字样啦。

--SSL--

增加https访问功能,可以更好地保护数据安全。
一般来说,网站的SSL证书都应该由权威机构签发。这里,我们用自己签发的证书来做实验。

安装ssl模块

[root@server1 ~]# yum install mod_ssl -y

自签证书

[root@server1 ~]# cd /etc/pki/tls/certs
[root@server1 certs]# make test.crt

一路enter。执行以下命令去除key的密码,启动httpd的时候就不用再输入密码了。

[root@server1 certs]# cp test.key test.key.org
[root@server1 certs]# openssl rsa -in test.key.org -out test.key

修改配置

修改/etc/httpd/conf.d/ssl.conf
找到

SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

修改为

SSLCertificateFile /etc/pki/tls/certs/test.crt
SSLCertificateKeyFile /etc/pki/tls/certs/test.key

重启httpd

[root@server1 /]# /etc/init.d/httpd restart

开放iptables 443端口,在/etc/sysconfig/iptables加上一行,重启iptables。

-A INPUT -p TCP --dport 443 -j ACCEPT

测试

用物理机的浏览器访问https://192.168.122.108会出现证书提示。

--用户认证 Auth--

我们可以对某些目录进行限制,规定要输入用户名和密码才能访问。
在这里,我们规定http://192.168.122.108/secret/目录需要验证才能访问(对应虚拟机目录/var/www/html/secret/)。

用户认证信息

首先,添加用户信息(用户名和密码)。这些信息可以保存在/var/www/html/secret/.htpasswd文件里。
用 “ htpasswd -cm 文件路径 用户名”可以创建一个用户信息文件并添加一个用户。
如果文件已经存在,用“ htpasswd -m 文件路径 用户名”

[root@server1 ~]# htpasswd -cm /var/www/html/secret/.htpasswd  feichashao
New password: 
Re-type new password: 
Adding password for user feichashao

修改配置

修改/etc/httpd/conf/httpd.conf
加上需认证的目录的配置。(不要加在其他diretive的势力范围中)

<Directory "/var/www/html/secret">
AuthType Basic
AuthName "Secret Zone"
AuthBasicProvider file
AuthUserFile /var/www/html/secret/.htpasswd
Require valid-user
</Directory>

重启httpd

# /etc/init.d/httpd restart

测试

在/var/www/html/secret/下建一个测试页面

# vim /var/www/html/secret/index.html
This is Secret Zone.

在物理机上用浏览器访问http://192.168.122.108/secret/
嗯,这时候应该提示要输入用户密码了。

[root@host ~]# curl -u feichashao:redhat http://192.168.122.108/secret/index.html

--用户目录 Userdir--

我们在虚拟机上搭建http服务器,如果想让虚拟机上每一位用户都有自己的个人页面,并且可以让外界通过浏览器访问,那“用户目录”就能派上用场啦。
比如说,虚拟上有用户a和b,配置了用户目录后,我们可以通过http://192.168.122.108/~a来访问a的个人主页,通过http://192.168.122.108/~b来访问b的个人主页。

建立用户目录

建立一个用于测试的用户

# useradd testuser1
# echo redhat |passwd testuser1 --stdin 

用户目录下建立文件,用于访问;

[root@server1 ~]# mkdir /home/testuser1/public_html
[root@server1 ~]# chmod 755 /home/testuser1/public_html/
[root@server1 ~]# vim /home/testuser1/public_html/index.html
This is testuser1 page.
[root@server1 ~]# chmod 755 /home/testuser1/public_html/index.html
[root@server1 ~]# chmod 711 /home/testuser1/

修改配置

在/etc/httpd/conf/httpd.conf中找到

<ifmodule mod_userdir.c>
</ifmodule>

将里面内容修改为

<ifmodule mod_userdir.c>
    UserDir public_html
</ifmodule>

重启httpd服务

/etc/init.d/httpd restart

SELinux放行

[root@server1 ~]# setsebool -P httpd_enable_homedirs=1

测试

在物理机上用浏览器访问http://192.168.122.108/~testuser1/ 应该能看见用户的主页信息。

--虚拟主机 VirtualHost--

虚拟主机可以使得一台http服务器能为多个网站提供服务。
比如, a.example.com, b.example.com, c.example.com 都指向192.168.122.108。
在配置Name-based Virtual Host后,访问a.example.com会进入a的目录,访问b.example.com会进入b的目录,访问c.example.com会进入c的目录,造成了有3台不同主机的幻觉。

配置文件

在httpd.conf最后加入几行。
声明NameVirtualHost监听所有网卡的80端口,声明虚拟主机(主机域名和根目录)

NameVirtualHost *:80

<virtualhost *:80>
    DocumentRoot /var/www/html/a
    ServerName a.example.com
</virtualhost>

<virtualhost *:80>
    DocumentRoot /var/www/html/b
    ServerName b.example.com
</virtualhost>

<virtualhost *:80>
    DocumentRoot /var/www/html/c
    ServerName c.example.com
</virtualhost>

默认虚拟主机

设置Name-based虚拟主机后,如果用户用没有设定的域名访问该http服务器,会默认使用第一台虚拟主机。
所以,最好在最开始设置一台虚拟主机,作为默认的虚拟主机。

测试

分别建立三个域名对应的根目录 /var/www/html/{a,b,c},然后分别在里面建立index.html文件。

[root@server1 ~]# mkdir -p /var/www/html/{a,b,c}
[root@server1 ~]# vim /var/www/html/a/index.html
This is a.example.com
[root@server1 ~]# vim /var/www/html/b/index.html
This is b.example.com
[root@server1 ~]# vim /var/www/html/c/index.html
This is c.example.com

然后,修改物理机的/etc/hosts记录。

192.168.122.108 a.example.com
192.168.122.108 b.example.com
192.168.122.108 c.example.com

在物理机上分别用a.example.com, b.example.com, c.example.com访问。

--访问控制--

访问控制可用于设定某些IP(网段)或者Domain能否访问网页数据。
这里我们直接限制/var/www/html目录的访问。
比如,我只想让192.168.122.0/24这个网段的用户访问,可以这样配置。(先把虚拟主机那部分注释掉)

<Directory "/var/www/html/secret">
order deny,allow
deny from all
allow from 192.168.122.0/24
</Directory>

--Troubleshooting--

防火墙

如果虚拟机的httpd已经正确启动,物理机浏览器连接虚拟机失败,有可能是虚拟机上防火墙的影响(可能是防火墙设置不当)。
可以先关闭iptables和selinux进行测试。

# iptables -F
# setenforce 0

权限

用户目录需要755权限里面的内容才能被访问;

未建立用户目录

用户目录一般情况下要自行建立。