1. 前言
本文将会详细介绍Linux httpd(apache)的作用、原理及配置,apache应用极为普遍和广泛,小到一个小网页,小网站,大到一个门户网站或者大型的动态页面,openstack,zabbix,k8s等等的大型复杂的应用前端界面默认也是使用apache作为网页服务器。
本文将会以CentOS7.6为例作示范。
2. Apache简介
Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源代码的网页服务器软件,可以在大多数电脑操作系统中运行,由于其跨平台和安全性(尽管不断有新的漏洞被发现,但由于其开放源代码的特点,漏洞总能被很快修补。因此总合来说,其安全性还是相当高的)。被广泛使用,是最流行的Web服务器软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。
软件图标
3. 安装Apache
CentOS系统上对应的软件包叫httpd
[root@zcwyou ~]# yum -y install httpd
删除默认欢迎页面,因为默认情况下使用http协议访问服务器已经有一个默认的页面了。
[root@zcwyou ~]# mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.bak
4. 配置httpd
本节演示最简单的网页服务器配置
修改httpd服务的配置文件
[root@zcwyou ~]# vi /etc/httpd/conf/httpd.conf
改变管理员的邮箱地址,不是必需,但建议改为你的
ServerAdmin root@test.com
定义域名信息
ServerName www.example.com:80
5. 创建一个HTML测试页
[root@zcwyou ~]# vi /var/www/html/index.html
复制以下内容
<html>
<body>
<div style="width: 100%; font-size: 40px; font-weight: bold; text-align: center;">
Welcome access www.example.com,This is Test Page!
</div>
</body>
</html>
:wq
退出vi
6. 启动服务
[root@zcwyou ~]# systemctl start httpd
[root@zcwyou ~]# systemctl enable httpd
7. 防火墙允许HTTP/HTTPS服务
https采用TCP443端口,随后会有配置指引,强烈建议加密
CentOS 7 firewalld:
[root@zcwyou ~]# firewall-cmd --add-service=http --permanent
[root@zcwyou ~]# firewall-cmd --add-service=https --permanent
[root@zcwyou ~]# firewall-cmd --reload
CentOS 6 iptables:
[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 443 -j ACCEPT
[root@zcwyou ~]# service iptables save
[root@zcwyou ~]# service iptables reload
8. 在其它电脑上浏览器访问,假设你服务器的IP为192.168.1.100
http://192.168.1.100
如果你想使用域名访问,需要在测试电脑上修改hosts文件,Windows的hosts文件位置C:\Windows\System32\drivers\etc\hosts
用记事本打开增加以下内容,如果权限问题,把文件复制到桌面修改完后再放回原位
192.168.1.100 www.example.com
需要做以上操作的原因是没有申请公网的域名,也没有申请公网的IP,所以需要本地模拟一下域名与IP的映射关系。
在浏览器上打开www.example.com
9. 使用http协议分享文件
Step1:创建共享文件夹并设置权限
[root@zcwyou ~]# mkdir /myweb
[root@zcwyou ~]# chmod 755 /myweb
[root@zcwyou ~]# touch /myweb/test.txt
Step2:修改/etc/httpd/conf/httpd.conf
[root@zcwyou ~]# vi /etc/httpd/conf/httpd.conf
定义网站根目录
把
DocumentRoot "/var/www/html"
改为
DocumentRoot "/myweb"
在
<Directory />
AllowOverride none
Require all denied
</Directory>
下面增加
<Directory "/myweb">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
Require all granted
</Directory>
并确保配置文件的有这行解决乱码问题,默认有的:
AddDefaultCharset utf-8
Step3:关闭SElinux,或者自行解决权限
[root@zcwyou ~]# vi /etc/selinux/config
把
SELINUX=enforcing
改为
SELINUX=disable
:wq
退出vi
执行命令:
setenforce 0
Step4:设置防火墙
如果之前设置过,就不需要再设置
CentOS 7 firewalld:
[root@zcwyou ~]# firewall-cmd --add-service=http --permanent
[root@zcwyou ~]# firewall-cmd --add-service=https --permanent
[root@zcwyou ~]# firewall-cmd --reload
CentOS 6 iptables:
[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 443 -j ACCEPT
[root@zcwyou ~]# service iptables reload
Step5:重启httpd
[root@zcwyou ~]# systemctl restart httpd
Step6:在其它电脑上用浏览器试试
应该可以看到刚刚创建的test.txt
以后把文件放在/myweb里就可以通过浏览器分享了
10. 利用HTTPS加密网页内容
安装SSL模块
[root@zcwyou ~]# yum -y install mod_ssl
利用OpenSSL来产生一张自我签署的证书。要创建证书,你必须是 root 用户,或在指令前面使用sudo
产生私钥
[root@zcwyou ~]# openssl genrsa -out ca.key 2048
产生 CSR
[root@zcwyou ~]# openssl req -new -key ca.key -out ca.csr
会有以下交互设置
国家
Country Name (2 letter code) [XX]:CN
省
State or Province Name (full name) []:GuangDong
市
Locality Name (eg, city) [Default City]:GuangZhou
公司名
Organization Name (eg, company) [Default Company Ltd]:IBM
部门
Organizational Unit Name (eg, section) []:TECH
名字,一般用域名,比如example.com
Common Name (eg, your name or your server’s hostname) []:XXXX
邮件
Email Address []:XX@qq.com
以下不设置,回车
A challenge password []:
以下不设置,回车
An optional company name []:
产生自我签署的金钥
[root@zcwyou ~]# openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
复制文件到对应位置
[root@zcwyou ~]# cp ca.crt /etc/pki/tls/certs
[root@zcwyou ~]# cp ca.key /etc/pki/tls/private/ca.key
[root@zcwyou ~]# cp ca.csr /etc/pki/tls/private/ca.csr
警告:如果你采用 SELinux,请确保你复制这些文件而不是迁移它们。否则这些文件将不符合SELinux政策,程序无法读取这些证书文件。
假如你迁移了这些文件而不是复制它们,你可以用以下的指命来适应SELinux策略
[root@zcwyou ~]# restorecon -RvF /etc/pki
更新Apache SSL的配置
[root@zcwyou ~]# vi +/SSLCertificateFile /etc/httpd/conf.d/ssl.conf
指定相关证书路径
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key
:wq
退出vi
重启Apache
[root@zcwyou ~]# systemctl restart httpd
用浏览器测试,看看有没有提示证书问题,如果有提示,就证明设置成功。
https://XXXXXXX
由于证书是自我签署的,浏览器不会信任。如果想要申请一个浏览器信任的SSL证书,请到正规SSL证书颁发机构申请。
11. 强制跳转HTTPS
[root@zcwyou ~]# vi /etc/httpd/conf/httpd.conf
加入Rewrite开头的三行参数,/myweb代表网站目录#
<Directory "/myweb">
Options Indexes FollowSymLinks #如果是搭建共享文件服务器,加入这行
AllowOverride None
Order allow,deny
Allow from all
Require all granted
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</Directory>
:wq
退出vi
重启Apache
[root@zcwyou ~]# systemctl restart httpd
用浏览器输入:
http://XXXXXXXX
看看会不会自动跳转到https
12. 使用虚拟主机
一个网页服务虚拟出多个网站有三种方法:
只有一张网卡多个IP,每个网站占用一个IP。比如A站用192.168.1.1,B站用192.168.1.2
只有一张网卡一个IP,每个网站占用一个独立端口。比如A站8080,B站8081
一张网卡一个IP,每个网站独立域名。比如a.com,b.com,都是相同IP相同端口,但浏览器看到的是两个网站。
第一种方式,需要多个公网IP。
第二种方式,最终用户使用不方便,打开网站时需要输入端口号。比如www.sitea.com:8080
第三种方式,是比较折衷的方法。
以下演示第三种方式,其它方式大同小异,下面也有配置模版
/etc/httpd/conf/httpd.conf
是全局定义,如果你只有一个网站,在这里指定即可,如果你有多个站点,建议你分开单独的配置文件定义不同的虚拟网站。
[root@zcwyou ~]# vi /etc/httpd/conf/httpd.conf
定义监听端口,默认已经设置好,请检查
Listen 80
安全设置,禁止访问根目录,保留以下设置,请检查
<Directory />
AllowOverride none
Require all denied
</Directory>
注释全局设置,即前面加
ServerName www.example.com:80
注释掉全局设置,即前面加
DocumentRoot "/var/www/html"
注释其它以
#<Directory "XXXX">
#Options Indexes FollowSymLinks
#AllowOverride None
#Order allow,deny
#Allow from all
#</Directory>
完成以上设置后,我们需要另行配置文件定义各个网站
新建一个站点文件sitea.conf:
[root@zcwyou ~]# vi /etc/httpd/conf.d/sitea.conf
以www.sitea.com,公网地址以192.168.1.100为例
强烈建议你的
NameVirtualHost *:80
<VirtualHost 192.168.1.100:80>
ServerName www.sitea.com
ServerAdmin root@sitea.com
DocumentRoot "/var/www/sitea"
AddDefaultCharset UTF-8
ErrorLog "logs/www.sitea.com_error.log"
CustomLog "logs/www.sitea.com_access.log" combined
<Directory "/var/www/sitea">
AllowOverride None
Order allow,deny
Allow from all
#Options Indexes FollowSymLinks#如果搭建文件服务器,要删除前面的符号#
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
<Files ".ht*">
Require all denied
</Files>
</VirtualHost>
以同样的方法建立/etc/httpd/conf.d/siteb.conf配置,只需要把所有的sitea处改为siteb即可,其它不变。
确保sitea和siteb都有相关的网页文件用于测试,比如写两个不同的index.html测试页,上面有方法。
在服务器上修改hosts文件,假设当前服务器的IP地址为192.168.1.100,两个网址中间有空格
[root@zcwyou ~]# vi /etc/hosts
最后一行加入以下内容
192.168.1.100 www.sitea.com www.siteb.com
如果你决定要使用SELinux,执行以下命令
[root@zcwyou ~]# chcon -R -t httpd_sys_content_t /var/www/sitea
[root@zcwyou ~]# chcon -R -t httpd_sys_content_t /var/www/siteb
重启HTTP服务
[root@zcwyou ~]# systemctl restart httpd
设置防火墙
如果之前设置过,就不需要再设置
CentOS 7 firewalld:
[root@zcwyou ~]# firewall-cmd --add-service=http --permanent
[root@zcwyou ~]# firewall-cmd --add-service=https --permanent
[root@zcwyou ~]# firewall-cmd --reload
CentOS 6 iptables:
[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@zcwyou ~]# iptables -A INPUT -p tcp --dport 443 -j ACCEPT
[root@zcwyou ~]# service iptables save
[root@zcwyou ~]# service iptables reload
在其它电脑上同样要修改hosts文件,Windows的hosts文件位置C:\Windows\System32\drivers\etc\hosts
用记事本打开增加以下内容,如果权限问题,把文件复制到桌面修改完后再放回原位
192.168.1.100 www.sitea.com
192.168.1.100 www.siteb.com
先确保能ping 通192.168.1.100
先确保能ping 通www.sitea.com
先确保能ping 通www.siteb.com
然后在浏览器上分别打开
www.sitea.com
www.siteb.com
应该可以打开刚才定义的两个不同内容的网站
两个网站启用HTTPS协议
[root@zcwyou ~]# vi /etc/httpd/conf.d/ssl.conf
确保以下两个开关打开:
Listen 443 https
NameVirtualHost *:443
在文件最后加入sitea和siteb的配置
注意两个SSL证书.crt和.key的存放位置,先申请好两份证书,把这些文件放到相应的文件夹
sitea配置
<VirtualHost 192.168.1.100:443>
DocumentRoot "/var/www/sitea"
ServerName www.sitea.com:443
ServerAdmin root@sitea.com
AddDefaultCharset UTF-8
SSLEngine on
SSLCertificateFile "/etc/pki/tls/certs/sitea.crt"
SSLCertificateKeyFile "/etc/pki/tls/private/sitea.key"
ErrorLog "logs/www.sitea.com443_error.log"
CustomLog "logs/www.sitea.com443_access.log" combined
<Directory "/var/www/sitea">
AllowOverride None
Order allow,deny
Allow from all
#Options Indexes FollowSymLinks#如果搭建文件服务器,要删除前面的符号#
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
<Files ".ht*">
Require all denied
</Files>
</VirtualHost>
注意,sitea和sateb的数字证书是不一样的!请申请两张不同的ssl证书
<VirtualHost 192.168.1.100:443>
DocumentRoot "/var/www/siteb"
ServerName www.siteb.com:443
ServerAdmin root@siteb.com
AddDefaultCharset UTF-8
SSLEngine on
SSLCertificateFile "/etc/pki/tls/certs/siteb.crt"
SSLCertificateKeyFile "/etc/pki/tls/private/siteb.key"
ErrorLog "logs/www.siteb.com443_error.log"
CustomLog "logs/www.siteb.com443_access.log" combined
<Directory "/var/www/siteb">
AllowOverride None
Order allow,deny
Allow from all
#Options Indexes FollowSymLinks#如果搭建文件服务器,要删除前面的符号#
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
<Files ".ht*">
Require all denied
</Files>
</VirtualHost>
重启HTTP服务
[root@zcwyou ~]# systemctl restart httpd
用浏览器试试打开
http://www.sitea.com
https://www.sitea.com
http://www.siteb.com
https://www.siteb.com
强制跳转到https
[root@zcwyou ~]# vi /etc/httpd/conf.d/sitea.conf
在 前面加入Rewrite开头的内容
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</Directory>
</VirtualHost>
以同样的方式修改siteb配置
[root@zcwyou ~]# vi /etc/httpd/conf.d/siteb.conf
重启HTTP服务
[root@zcwyou ~]# systemctl restart httpd
用浏览器试试打开,应该可以强制跳转到https
http://www.sitea.com
http://www.siteb.com
13. 虚拟站点三种方式
虚拟站点三种方式配置方式:
13.1 基于IP,即一个网站一个单独IP
sitea示例配置
<VirtualHost 172.16.58.25:80>
ServerName www.sitea.com
DocumentRoot "/var/www/sitea"
</VirtualHost>
sitea示例配置
<VirtualHost 172.16.58.12:80>
ServerName www.siteb.com
DocumentRoot "/var/www/siteb"
</VirtualHost>
13.2 基于端口,即同一IP不同端口
Sitea示例配置
<VirtualHost 172.16.58.25:80>
ServerName www.sitea.com
DocumentRoot "/var/www/sitea"
</VirtualHost>
Siteb示例配置
<VirtualHost 172.16.58.25:8080>
ServerName www.siteb.com
DocumentRoot "/var/www/siteb"
</VirtualHost>
13.3 基于域名,即同一IP同一端口
Sitea配置示例
<VirtualHost 172.16.58.25:80>
ServerName www.sitea.com
DocumentRoot "/var/www/sitea"
</VirtualHost>
Siteb配置示例:
<VirtualHost 172.16.58.25:80>
ServerName www.siteb.com
DocumentRoot "/var/www/siteb"
</VirtualHost>
14. Apache(httpd)部分配置解释
添加只能使用目录名称访问的文件名
根据你网站首面的文件
把这行改为DirectoryIndex index.html index.cgi index.php等等
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
禁止用户浏览 .htaccess 和 .htpasswd文件
<Files ".ht*">
Require all denied
</Files>
统一编码,防止乱码
AddDefaultCharset UTF-8
15. Apache(httpd)服务Forbidden 403问题解决方法
原因1:apache配置文件中没有对站点目录的权限许可,这通常是在初始安装apache后,更改了默认的apache站点目录时所至(重要,常发生):
如将站点目录更改为:/var/blog,则在apache配置文件中如果不加下面的配置 就会返回403错误。
<Directory "/var/blog">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
原因2:站点目录下无首页文件(index文件),而apache的配置又禁止了目录浏览,就会提示403错误,配置如下(偶尔发生):
<Directory "/var/blog">
Options Indexes FollowSymLinks#需要加这行允许浏览目录
AllowOverride None
Order allow,deny
Allow from all
</Directory>
原因3:还是Directory权限问题(不常发生)
如下文:拒绝10.0.0.0/24整段访问。这样被拒绝的主机访问就会出现403错误
<Directory "/var/blog">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
#Allow from all
Deny from 10.0.0.0/24
原因4:站点目录权限问题(不常发生)。
站点目录需要apache的用户有访问权限,否则就会报403错误。
[root@zcwyou var]# cd /var/
[root@zcwyou var]# chown -R root.root blog/
[root@http-server var]# chmod 700 blog
[root@http-server var]# ll -d blog/
drwx—— 3 root root 4096 Jun 4 22:11 blog/
原因5:不符合SElinux策略
16. 总结
Apache(httpd)这项服务应用非常广泛,实用,而且现在主流的软件前端都在使用它,比如openstack dashboard,zabbix等等。运维人员必须学会如何去配置管理它。
评论前必须登录!
注册