智传网优云课堂,专注分享IT技术
与IT技术爱好者一起共同学习进步

Linux apache httpd配置详解

1. 前言

本文将会详细介绍Linux httpd(apache)的作用、原理及配置,apache应用极为普遍和广泛,小到一个小网页,小网站,大到一个门户网站或者大型的动态页面,openstack,zabbix,k8s等等的大型复杂的应用前端界面默认也是使用apache作为网页服务器。

本文将会以CentOS7.6为例作示范。

2. Apache简介

Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源代码的网页服务器软件,可以在大多数电脑操作系统中运行,由于其跨平台和安全性(尽管不断有新的漏洞被发现,但由于其开放源代码的特点,漏洞总能被很快修补。因此总合来说,其安全性还是相当高的)。被广泛使用,是最流行的Web服务器软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。

软件图标

apache logo

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

Windows修改hosts文件

Windows本地DNS设置

需要做以上操作的原因是没有申请公网的域名,也没有申请公网的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

使用apache搭建文件分享服务器

以后把文件放在/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为例
强烈建议你的要和DocumentRoot一致,因为这段Directory是apache对该目录访问权限的设置,只有设置正确的目录,DocumentRoot才会生效。

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等等。运维人员必须学会如何去配置管理它。

赞(1)
未经允许不得转载:Linux入门学习到精通 » Linux apache httpd配置详解
分享到: 更多 (0)

学习QQ群:557371664

关注微信公众号自助视频学习

评论 抢沙发

评论前必须登录!