1 Apache(web服务器)简介
1.1 什么是Apache?
Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。可以说,Web是建立在HTTP协议上通信的。
1.2 Apache服务的基本信息
默认发布目录:/var/www/html/
默认发布文件:/var/www/html/index.html (使用html语言)
主配置文件所在: /etc/httpd/conf —> httpd.conf
子配置目录:/etc/httpd/conf.d
子配置文件:/etc/httpd/conf.d/*.conf
默认监听端口:80
默认安全上下文:httpd_sys_content_t
程序开启默认用户:acaphe
apache日志:/etc/httpd/logs/ *
1.3 Apache的安装部署
为保证接下来安装部署的正确性,先将准备当作服务端的虚拟机重置
1.reset desktop
2.改主机名:hostnamectl set-hostname acaphe-server.westos.com
3.改ip地址 重启网络
4.打开selinux,selinux对服务会有影响,具体会介绍怎么处理影响
服务器的下载:
yum install httpd httpd-manual(手册) -y
systemctl start httpd
systemctl enable httpd
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
1.4 Apache服务的测试
cd /var/www/html
vim index.html
<font color=red>test's page
浏览器中访问:
http://172.25.254.172 不加具体访问文件,为访问默认发布文件
http://172.25.254.172/manual 指定访问文件manual
2 Apache的配置修改
2.1 端口号的修改
ss -anutlpe | grep httpd
vim /etc/httpd/conf/httpd.conf
Listen 8080 在主配置文件的第42行,修改为8080端口
systemctl restart httpd
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
以上是当selinux为enforcing时,设置端口号为selinux允许的端口号,没有问题,直接重启即可
当设置端口号为其不包含的端口时,需要以下设置:
semanage port -l | grep http 查看允许使用的端口号
第一步:setenforce 0 #在selinux为permissive的情况下
semanage port -l | grep http
semanage port -a -t http_port_t -p tcp 6666
第二步:setenforce 1
systemctl restart httpd
第三步:firewall-cmd --permanent --add-port=6666/tcp
firewall-cmd --reload
测试:http://172.25.254.172:6666
当设置为不允许的端口号时:
2.2 默认发布文件的修改
默认发布文件就是访问acaphe时没有指定文件名称时默认访问的文件
这个文件可以指定多个,有访问顺序,谁在前先访问谁,当前面的文件不存在时,才会访问下一个
vim /etc/httpd/conf/httpd.conf
164行 DirectoryIndex test.html index.html
systemctl restart httpd
2.3 修改默认发布目录
mkdir /demo/html -p
情况一:在selinux关闭的情况下:
vim /etc/httpd/conf/httpd.conf
119行 DocumentRoot "/demo/html"
在企业7需要对改修改的目录授权,企业6不需要
<Directory "/demo/html">
Require all granted
</Directory>
systemctl restart httpd
将修改的默认发布目录下面建立的文件不是index.html,则添加到164行
情况二:在selinux开启的状态下:
查看安全上下文:ls -Zd /var/www/
ls -Zd /demo/html/
修改上下文:semanage fcontext -a -t httpd_sys_content_t '/demo/html(/.*)?'
restorecon -RvvF /demo/html
这样,就可以访问了
情况一:在selinux关闭的情况下:
情况二:在selinux开启的状态下:
2.4 acaphe虚拟主机的访问
希望不同站点访问不同的目录与文件,假如我有www.westos.com ,news.westos.com music.westos.com 三个站点,则三个站点希望分别访问不同的页面
则配置如下:
第一步:mkdir -p /var/www/vhost/news
vim /var/www/vhost/news/index.html
mkdir -p /var/www/vhost/music
vim /var/www/vhost/music/index.html
第二步:在要访问这三个站点的浏览器的本地解析文件写上解析
vim /etc/hosts
172.25.254.172 www.westos.com news.westos.com music.westos.com
第三步:cd /etc/httpd/conf.d 子配置文件目录
vim vhost.conf (名字可以任意)
<VirtualHost _default_:80>
DocumentRoot /var/www/html
CustomLog logs/default.log combined (表示所有类型的日志都放在该日志文件下)
</VirtualHost>
<VirtualHost *:80>
ServerName news.westos.com
DocumentRoot /var/www/vhost/news
CustomLog logs/news.log combined
</VirtualHost>
<Directory "/var/www/vhost/news">
Require all granted
</Directory>
<VirtualHost *:80>
ServerName music.westos.com
DocumentRoot /var/www/vhost/music
CustomLog logs/music.log combined
</VirtualHost>
<Directory "/var/www/vhost/music">
Require all granted
</Directory>
最后:
systemctl restart httpd
2.5 acaphe访问控制
2.5.1 基于ip的访问控制
cd /etc/httpd/conf.d
vim vhost.conf #写入对目录的控制,也可以在主配置文件中写入
黑名单:
<Directory "/var/www/html">
Order Allow,Deny #控制读取顺序,先读allow,再读deny
Allow from All
Deny from 172.25.254.72
</Directory>
白名单:
<Directory "/var/www/html">
Order Deny,Allow 控制读取顺序,先读deny,再读allow
Allow from 172.25.254.72
Deny from All
</Directory>
2.5.2 基于用户的访问控制
cd /etc/httpd
建立用户认证文件:htpasswd -cm .apache_auth admin -m表示hd5加密,-c表示创建
输入密码 完成建立
当建立第二个文件htpasswd -m .apache_auth lee 若加入参数-c则会把之前的内容覆盖掉
cd /etc/httpd/conf.d
vim vhost.conf
<Directory "/var/www/html">
AuthUserFile /etc/httpd/.apache_auth
AuthType basic (最基本的认证方式,用户名和密码)
AuthName "Please input username and password"
Require user admin 只允许admin访问
</Directory>
<Directory "/var/www/html">
AuthUserFile /etc/httpd/.apache_auth
AuthType basic (最基本的认证方式,用户名和密码)
AuthName "Please input username and password"
#Require user admin 只允许admin访问
Require valid-user 允许所有人访问
</Directory>
2.6 acaphe支持的四种语言
将上一步的用户访问控制注释掉,
httpd支持的四种语言:
第一:html,以上设置中默认发布文件中使用的语言都是html,所以不再说明
第二:php
cd /var/www/html
vim index.php
<?php
phpinfo();
?>
将index.php写到主配置文件的发布目录当中
yum install php -y
systemctl restart httpd 会自动加载php到httpd中
在/var/httpd/conf.d 中会生成php.conf文件
第三:perl
cgi是将网页的内容加载到数据库的插件,里面的语言就是用perl语言写的
cd /var/www/html
mkdir cgi
cd cgi/
vim index.cgi
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print 'date';
chmod +x index.cgi
命令行中输入: ./index.cgi 可以看到执行的结果
在浏览器中输入172.25.254.133/cgi/index.cgi可以看到裸露的代码。。因为Httpd只负责展示,并没有告诉它要执行
1.当selinux=permassive,
vim /etc/httpd/conf.d/vhost.conf
<Directory "/var/www/html/cgi">
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>
测试:172.25.254.135/cgi/ 可以执行
2.当selinux=enforcing,
以上是在防火墙为permassive的情况下可以执行
当防火墙改为enforcing时,
semanage fcontext -a -t httpd_sys_script_exec_t '/var/www/html/cgi(/.*)?'
restorecon -RvvF /var/www/html/cgi/index.cgi
测试:172.25.254.135/cgi/
第四:python
PythonWeb服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是Python应用程序或框架和Web服务器之间的一种接口
第一步:cd /var/www/cgi-bin
vim webapp.wsgi
#!/usr/bin/env python
import time
def application (environ, start_response):
response_body = 'UNIX EPOCH time is now: %s\n' % time.time()
status = '200 OK'
response_headers = [('Content-Type', 'text/plain'),
('Content-Length', '1'),
('Content-Length', str(len(response_body)))]
start_response(status, response_headers)
return [response_body]
第二步:yum install mod_wsgi.x86_64
systemctl restart httpd
第三步:vim /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
ServerName wsgi.westos.com
WSGIScriptAlias / /var/www/cgi-bin/webapp.wsgi
</VirtualHost>
systemctl restart httpd
第四步:最后,本地解析文件/etc/hosts中写上wsgi.westos.com 的对应解析
3 HTTPS
在HTTP协议中可能存在信息窃听或身份伪装等安全问题。使用HTTPS通信机制可以有效地防止这些问题
3.1 HTTP的缺点
- )通信使用明文(不加密),内容可能会被窃听
- )不验证通信方的身份,因此有可能遭遇伪装
- )无法证明报文的完整性,所以有可能已遭篡改
3.2 HTTPS=HTTP+加密+认证+完整性保护
为了解决上述问题,需要在HTTP上再加入加密处理和认证等机制。我们把添加了加密及认证机制的HTTP称为HTTPS(HTTP secure).使用HTTPS通信时,不再用http://,而是改用https://。另外,当浏览器访问Https通信有效的web网站时,浏览其的地址栏内会出现一个带锁的标记。
HTTPS并非是一种信协议。只是HTTP通用接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。
通常,HTTP直接和TCP通信。当使用SSL时,则变为先和SSL通信,再由SSL和TCP通信了。简单来说,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。
3.3 https方式访问服务器全过程描述:
1.客户机通过https访问web服务器,web服务器向客户机出示自己的证书
2. 客户机验证证书的有效性,包括发证时间,发证机关,执行者标识。
3.如果客户机验证证书通过,客户机随机产生128位的key,再利用证书文件传递的public key对该随即key机进行加密。
4.加密后传送至服务器端,服务器再利用自己的public key 对加密的key进行解密,得到客户机的随机key值。
5.这时两端的key值相同,利用该key进行加密通讯。
3.4 https方式访问服务器的实现:
yum install mod_ssl -y
在conf.d中会生成ssl.conf
systemctl restart httpd
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
客户端访问https://172.25.254.172 添加认证和钥匙 是别的公司的
选择perferences--> certificates 清空证书
现在我们自己生成公开密钥证书
yum install crypto-utils.x86_64
genkey acaphe-server.westos.com
vim /etc/httpd/conf.d/ssl.conf
101行与108行,将密钥和证书都改成自己生成的
systemctl restart httpd
客户端访问https://172.25.254.172 添加认证和密匙 是自己生成的
可以查看证书的具体信息
使用别的公司的认证访问:
自己生成公开密钥证书
3.5 https虚拟主机的设定与网页重写:
3.5.1 https虚拟主机的设定:
第一步:vim /etc/httpd/conf.d/vhost_https.conf
<VirtualHost *:443>
ServerName login.westos.com
DocumentRoot /var/www/vhost/login
CustomLog logs/login.log combined
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/acaphe.westos.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/acaphe.westos.com.key
</VirtualHost>
<Directory "/var/www/vhost/login">
Require all granted
</Directory>
systemctl restart httpd
第二步:mkdir -p /var/www/vhost/login
vim /var/www/vhost/login/index.html
第三步:vim /etc/hosts
172.25.254.172 login.westos.com
3.5.2 https的网页重写:
现在,我们在浏览器上输入http://login.westos.com,默认访问80端口,http方式访问默认发布目录/var/www/html下的默认文件index.html,输入https://login.westos.com会根据我们上面一步的设定访问/var/www/vhost/login目录下的/var/www/vhost/login/index.html文件,而我们想要当我们输入http://访问时自动转到https://加密访问,这就是https网页重写。
在 /etc/httpd/conf.d/vhost_https.conf配置文件中加入跳转语句
vim /etc/httpd/conf.d/vhost_https.conf
<VirtualHost *:443>
ServerName login.westos.com
DocumentRoot /var/www/vhost/login
CustomLog logs/login.log combined
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/acaphe.westos.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/acaphe.westos.com.key
</VirtualHost>
<Directory "/var/www/vhost/login">
Require all granted
</Directory>
<VirtualHost *:80>
ServerName login.westos.com
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301]
</VirtualHost>
systemctl restart httpd
<font color=blue [redirect=301] >注: ^(/.*)$表示客户端在浏览器中输入的所有字符
https:// 表示强制客户加密访问
%{HTTP_HOST}表示客户请求主机
$1,$1标示^(/. *) $的值
[redirect=301] 永久重写,302临时
但是HTTPSS虽然安全可靠,但所有的web网站不会一直使用HTTPS。其中一个原因是,与纯文本通信相比,加密通信会消耗更多的cpu及内存资源。如果每次通信都加密,会消耗很多的资源,平摊到一台计算机上时,能够处理的请求数量必定也会随之减少。
除此之外,想要节约购买证书的开销也是原因之一。