Apache httpd是应用最广的http服务器,它的基本安装配置也很简单。
Contents
–参考文档–
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安装
[cc lang=”text”]
[root@server1 ~]# yum install httpd -y
[/cc]
完事了。
设置iptables和SELinux
[cc lang=”text”]# vim /etc/sysconfig/iptables
-A INPUT -p TCP –dport 80 -j ACCEPT # 在Reject的条目前加上这一行
# /etc/init.d/iptables restart
[/cc]
[cc lang=”text”]
# setsebool -P httpd_can_network_connect=1
[/cc]
如果httpd的资料目录不是/var/www/html,那么需要修改该目录的selinux context.
[cc lang=”text”]
chcon -reference /var/www/html /httpd
[/cc]
测试
无需修改配置,直接启动httpd,即可访问。
[cc lang=”text”]
[root@server1 ~]# /etc/init.d/httpd restart
[/cc]
在物理机上,在浏览器上输入虚拟机的IP地址192.168.122.108,即可看到测试页面。
要更改网页的内容,直接修改DocumentRoot目录下(/var/www/html)的内容即可。
在/var/www/html/下建立一个index.html文件.
[cc lang=”text”]
# vim /var/www/html/index.html
Hello World.
[/cc]
保存。
在物理机的浏览器上刷新一下页面,就能看到Hello World!字样啦。
–SSL–
增加https访问功能,可以更好地保护数据安全。
一般来说,网站的SSL证书都应该由权威机构签发。这里,我们用自己签发的证书来做实验。
安装ssl模块
[cc lang=”text”]
[root@server1 ~]# yum install mod_ssl -y
[/cc]
自签证书
[cc lang=”text”]
[root@server1 ~]# cd /etc/pki/tls/certs
[root@server1 certs]# make test.crt
[/cc]
一路enter。执行以下命令去除key的密码,启动httpd的时候就不用再输入密码了。
[cc lang=”text”]
[root@server1 certs]# cp test.key test.key.org
[root@server1 certs]# openssl rsa -in test.key.org -out test.key
[/cc]
修改配置
修改/etc/httpd/conf.d/ssl.conf
找到
[cc lang=”text”]
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
[/cc]
修改为
[cc lang=”text”]
SSLCertificateFile /etc/pki/tls/certs/test.crt
SSLCertificateKeyFile /etc/pki/tls/certs/test.key
[/cc]
重启httpd
[cc lang=”text”]
[root@server1 /]# /etc/init.d/httpd restart
[/cc]
开放iptables 443端口,在/etc/sysconfig/iptables加上一行,重启iptables。
[cc lang=”text”]
-A INPUT -p TCP –dport 443 -j ACCEPT
[/cc]
测试
用物理机的浏览器访问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 文件路径 用户名”
[cc lang=”text”]
[root@server1 ~]# htpasswd -cm /var/www/html/secret/.htpasswd feichashao
New password:
Re-type new password:
Adding password for user feichashao
[/cc]
修改配置
修改/etc/httpd/conf/httpd.conf
加上需认证的目录的配置。(不要加在其他diretive的势力范围中)
[cc lang=”text”]
AuthType Basic
AuthName “Secret Zone”
AuthBasicProvider file
AuthUserFile /var/www/html/secret/.htpasswd
Require valid-user
[/cc]
重启httpd
[cc lang=”text”]
# /etc/init.d/httpd restart
[/cc]
测试
在/var/www/html/secret/下建一个测试页面
[cc lang=”text”]
# vim /var/www/html/secret/index.html
This is Secret Zone.
[/cc]
在物理机上用浏览器访问http://192.168.122.108/secret/
嗯,这时候应该提示要输入用户密码了。
[cc lang=”text”]
[root@host ~]# curl -u feichashao:redhat http://192.168.122.108/secret/index.html
[/cc]
–用户目录 Userdir–
我们在虚拟机上搭建http服务器,如果想让虚拟机上每一位用户都有自己的个人页面,并且可以让外界通过浏览器访问,那“用户目录”就能派上用场啦。
比如说,虚拟上有用户a和b,配置了用户目录后,我们可以通过http://192.168.122.108/~a来访问a的个人主页,通过http://192.168.122.108/~b来访问b的个人主页。
建立用户目录
建立一个用于测试的用户
[cc lang=”text”]
# useradd testuser1
# echo redhat |passwd testuser1 –stdin
[/cc]
用户目录下建立文件,用于访问;
[cc lang=”text”][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/
[/cc]
修改配置
在/etc/httpd/conf/httpd.conf中找到
[cc lang=”text”]
[/cc]
将里面内容修改为
[cc lang=”text”]
UserDir public_html
[/cc]
重启httpd服务
[cc lang=”text”]
/etc/init.d/httpd restart
[/cc]
SELinux放行
[cc lang=”text”]
[root@server1 ~]# setsebool -P httpd_enable_homedirs=1
[/cc]
测试
在物理机上用浏览器访问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端口,声明虚拟主机(主机域名和根目录)
[cc lang=”text”]
NameVirtualHost *:80
DocumentRoot /var/www/html/a
ServerName a.example.com
DocumentRoot /var/www/html/b
ServerName b.example.com
DocumentRoot /var/www/html/c
ServerName c.example.com
[/cc]
默认虚拟主机
设置Name-based虚拟主机后,如果用户用没有设定的域名访问该http服务器,会默认使用第一台虚拟主机。
所以,最好在最开始设置一台虚拟主机,作为默认的虚拟主机。
测试
分别建立三个域名对应的根目录 /var/www/html/{a,b,c},然后分别在里面建立index.html文件。
[cc lang=”text”]
[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
[/cc]
然后,修改物理机的/etc/hosts记录。
[cc lang=”text”]
192.168.122.108 a.example.com
192.168.122.108 b.example.com
192.168.122.108 c.example.com
[/cc]
在物理机上分别用a.example.com, b.example.com, c.example.com访问。
–访问控制–
访问控制可用于设定某些IP(网段)或者Domain能否访问网页数据。
这里我们直接限制/var/www/html目录的访问。
比如,我只想让192.168.122.0/24这个网段的用户访问,可以这样配置。(先把虚拟主机那部分注释掉)
[cc lang=”text”]
order deny,allow
deny from all
allow from 192.168.122.0/24
[/cc]
–Troubleshooting–
防火墙
如果虚拟机的httpd已经正确启动,物理机浏览器连接虚拟机失败,有可能是虚拟机上防火墙的影响(可能是防火墙设置不当)。
可以先关闭iptables和selinux进行测试。
[cc lang=”text”]
# iptables -F
# setenforce 0
[/cc]
权限
用户目录需要755权限里面的内容才能被访问;
未建立用户目录
用户目录一般情况下要自行建立。