使用Apache搭建网页服务
第一章:HTTP基本配置
一、Apache简介
Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源代码的网页服务器软件,可以在大多数电脑操作系统中运行,由于其跨平台和安全性(尽管不断有新的漏洞被发现,但由于其开放源代码的特点,漏洞总能被很快修补。因此总合来说,其安全性还是相当高的)。被广泛使用,是最流行的Web服务器软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。
软件图标
二、安装Apache
#安装 httpdyum -y install httpd
#删除默认欢迎页面mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.bak
三、配置httpd
vi /etc/httpd/conf/httpd.conf
#改变管理员的邮箱地址,不是必需,但建议改为你的ServerAdmin root@test.com
#改变域名信息ServerName www.example.com:80
四、创建一个HTML测试页
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
五、启动服务
systemctl start httpd systemctl enable httpd
六、防火墙允许HTTP/HTTPS服务
https采用TCP443端口,随后会有配置指引,强烈建议加密
firewalld:
firewall-cmd --add-service=http --permanent firewall-cmd --add-service=https --permanent firewall-cmd --reload
iptables:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT service iptables save service iptables reload
七:在其它电脑上浏览器访问,假设你服务器的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
在浏览器上打开www.example.com
第二章:使用http协议分享文件
Step1:创建共享文件夹并设置权限
mkdir /myweb chmod 755 /myweb touch /myweb/test.txt
Step2:修改/etc/httpd/conf/httpd.conf
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,或者自行解决权限
vi /etc/selinux/config
把SELINUX=enforcing
改为SELINUX=disable
:wq
退出vi
执行命令:setenforce 0
Step4:设置防火墙
#如果之前设置过,就不需要再设置
firewalld:
firewall-cmd --add-service=http --permanent firewall-cmd --add-service=https --permanent firewall-cmd --reload
iptables:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT service iptables save service iptables reload
Step5:重启httpd
systemctl restart httpd
Step6:在其它电脑上用浏览器试试
应该可以看到刚刚创建的test.txt
以后把文件放在/myweb里就可以通过浏览器分享了
第三章:利用HTTPS加密网页内容
安装SSL模块
yum -y install mod_ssl
利用OpenSSL来产生一张自我签署的证书。要创建证书,你必须是 root 用户,或在指令前面使用sudo
产生私钥
openssl genrsa -out ca.key 2048
产生 CSR
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 []:
产生自我签署的金钥
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
复制文件到对应位置
cp ca.crt /etc/pki/tls/certs cp ca.key /etc/pki/tls/private/ca.key cp ca.csr /etc/pki/tls/private/ca.csr
警告:如果你采用 SELinux,请确保你复制这些文件而不是迁移它们。否则这些文件将不符合SELinux政策,程序无法读取这些证书文件。
假如你迁移了这些文件而不是复制它们,你可以用以下的指命来适应SELinux策略
restorecon -RvF /etc/pki
更新Apache SSL的配置
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
systemctl restart httpd
用浏览器测试,看看有没有提示证书问题,如果有提示,就证明设置成功。
https://XXXXXXX
!!由于证书是自我签署的,浏览器不会信任。如果想要申请一个浏览器信任的SSL证书,请到正规SSL证书颁发机构申请。
第四章:强制跳转HTTPS
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
systemctl restart httpd
用浏览器输入:http://XXXXXXXX
看看会不会自动跳转到https
第五章:使用虚拟主机
一个网页服务虚拟出多个网站有三种方法:
只有一张网卡多个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是全局定义,如果你只有一个网站,在这里指定即可,如果你有多个站点,建议你分开单独的配置文件定义不同的虚拟网站。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”>开头,以结尾的所有字段的配置,即前面加#
#<Directory "XXXX"> # Options Indexes FollowSymLinks # AllowOverride None # Order allow,deny # Allow from all #</Directory>
#完成以上设置后,我们需要另行配置文件定义各个网站
#新建一个站点文件sitea.conf:vi /etc/httpd/conf.d/sitea.conf
##以www.sitea.com,公网地址以192.168.1.100为例
##强烈建议你的<Directory “XXXXXXX”>要和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,两个网址中间有空格vi /etc/hosts
#最后一行加入以下内容192.168.1.100 www.sitea.com www.siteb.com
#如果你决定要使用SELinux,执行以下命令
chcon -R -t httpd_sys_content_t /var/www/sitea chcon -R -t httpd_sys_content_t /var/www/siteb
#重启HTTP服务systemctl restart httpd
#设置防火墙
#如果之前设置过,就不需要再设置
firewalld:
firewall-cmd --add-service=http --permanent firewall-cmd --add-service=https --permanent firewall-cmd --reload
iptables:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT service iptables save 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协议
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服务systemctl restart httpd
#用浏览器试试打开
http://www.sitea.com https://www.sitea.com http://www.siteb.com https://www.siteb.com
#强制跳转到https
vi /etc/httpd/conf.d/sitea.conf
#在</Directory>
前面加入Rewrite
开头的内容
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} </Directory> </VirtualHost>
以同样的方式修改siteb配置
vi /etc/httpd/conf.d/siteb.conf
重启HTTP服务
systemctl restart httpd
用浏览器试试打开,应该可以强制跳转到https
http://www.sitea.com http://www.siteb.com
虚拟站点三种方式配置方式:
#基于IP,即一个网站一个单独IP
#示例
#######Sitea#######
<VirtualHost 172.16.58.25:80> ServerName www.sitea.com DocumentRoot "/var/www/sitea" </VirtualHost>
#######Siteb#######
<VirtualHost 172.16.58.12:80> ServerName www.siteb.com DocumentRoot "/var/www/siteb" </VirtualHost>
#基于端口,即同一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>
#基于域名,即同一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>
#########部分配置解释###########
#添加只能使用目录名称访问的文件名
#根据你网站首面的文件
#把这行改为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
Apache服务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@http-server var]# pwd /var [root@http-server 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策略
有道云笔记 https://note.youdao.com/ynoteshare/index.html?id=d6b0f58cf6cd259ead0e404bd1523bb8