apache简介
Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行
Apache是世界使用排名第一的Web服务器软件,它可以运行在几乎所有广泛使用的计算机平台上
由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一,也叫网页服务器软件
它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中 http协议 HTTP协议是Hyper Text
Transfer Protocol(超文本传输协议)的缩写 是用于从万维网(WWW:World Wide Web
)服务器传输超文本到本地浏览器的传送协议 HTTP是基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统
HTTP协议工作于客户端-服务端架构为上,浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求
Web服务器根据接收到的请求后,向客户端发送响应信息
HTTP 请求/响应的步骤:
1、客户端连接到Web服务器一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn。
2、发送HTTP请求通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3、服务器接受请求并返回HTTP响应 Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4、释放连接TCP连接 若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5、客户端浏览器解析HTML内容,客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
apache的基础信息 | |
---|---|
主配置目录 | /etc/httpd/conf |
主配置文件 | /etc/httpd/conf/httpd.conf |
子配置目录 | /etc/httpd/conf.d/ |
子配置文件 | /etc/httpd/conf.d/*.conf |
默认发布目录 | /var/www/html |
默认发布文件 | index.html |
默认端口 | 80 |
默认安全上下文 | httpd_sys_content_t |
程序开启默认用户 | apache |
apache日志 | /etc/httpd/logs/* |
前期准备
desktop-172.25.70.100 | 服务端 |
server2-172.25.70.200 | 客户端 |
环境搭建
desktop
yum install httpd -y
systemctl start httpd #开启apache服务
systemctl enable httpd #开机自启动
netstat -antlupe | grep httpd #(查看httpd的服务端口80是否开启
firewall-cmd --permanent --add-service=http #在火墙里面添加http服务
firewall-cmd --reload #使该服务生效
yum install httpd-manual #安装apache手册
rpm -qc httpd 查看主配置文件
vim /var/www/html/index.html #编写发布文件(即其他主机访问时显示的信息)
<h1> hello world </h1>
systemctl restart httpd
修改配置
修改端口
vim /etc/httpd/conf/httpd.conf #编辑httpd的主配置文件
80----->8080
systemctl restart httpd
firewall-cmd --permannet --add-port=8080/tcp
firewall-cmd --reload
测试 curl 172.25.70.100
修改发布文件
vim /etc/httpd/conf/httpd.conf #把端口改回80
vim /var/www/html/text.html #新建一个发布文件
<h1> text </h1>
vim /etc/httpd/conf/httpd.conf
165 添加
text.html #(要在最前面,不然访问的还是原来的文件)
修改发布目录
mkdir -p /westos/html 新建一个目录
vim /westos/index.html
<h1>westos </h1>
vim /etc/httpd/conf/httpd.conf
<Directory "/westos/html">
Require all granted
</Directory>
systemctl restart httpd
访问控制
设置黑白名单
#还原初始配置
vim /etc/httpd/conf/httpd.conf
#把真机加入黑名单(如果是白名单,更改Allow和Deny顺序)
systemctl restart httpd
vim /etc/httpd/conf/httpd.conf 添加如下内容
<Directory "/var/www/html/test">
Order Allow,Deny ##列表读取顺序,后读取的列表会覆盖前面列表内容的重复部分
Allow from All
Deny from 172.25.254.111
</Directory>相当于黑名单
如果修改allow和deny的位置,则会允许所有主机访问,设置deny没有意义
测试
curl 172.25.70.100
用户认证
cd /etc/httpd
htpasswd --help
htpasswd -cm westosuser admin #建立admin用户,
输入密码123
cat westosuser #查看该文件
htpasswd -m westosuser lee #继续建立lee用户,-c会重新建立用户认证文件,覆盖之前的admin用户,入密码会覆盖之前的用户
cat westosuser
vim /etc/httpd/conf/httpd.conf
systemctl restart httpd
vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html">
AuthUserFile /etc/httpd/westosuser #认证文件类型
AuthType basic # 认证类型,基本
AuthName "Please input username and password" #认证名字
Require user admin #只允许admin用户通过认证访问共享目录
#Require valid-user 允许所有用户访问
</Directory>
多站点
cd /etc/httpd/conf.d/
vim vhost.conf #(编辑虚拟主机的配置文件,主配置文件里面有要求,必须以.conf结尾)
mkdir -p /var/www/vhost/news #给news建立子默认发布目录
mkdir -p /var/www/vhost/music
vim /var/www/vhost/news/index.html
<h1>news</h1>
vim /var/www/vhost/music/index.html
<h1>music</h1>
vim news.conf
vim music.conf
vim /etc/hosts #做本地解析(使用哪里的浏览器进行测试就在哪里做解析)
172.25.254.111 www.westos.com news.westos.com music.westos.com
systemctl restart httpd #重启才会生效
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>
vim news.conf 写入news这个虚拟站点的基本信息和授权信息
,vim music.conf 写入news这个虚拟站点的基本信息和授权信息
apache支持的语言
清空以上实验的残留
php
#PHP:超文本预处理器,是一种通用开源脚本语言。
vim /var/www/html/index.php
yum install php -y #安装php服务
vim /etc/httpd/conf/httpd.conf
systemctl restart httpd
vim /var/www/html/index.php
<?php
phpinfo();
?>
vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
DirectoryIndex index.php,index.html
</IfModule>
CGI
CGI 通用网关接口,是外部应用程序(CGI程序)与WEB服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的过程,是网站上放置动态内容的最简单的方法。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。在物理上是一段程序,运行在服务器上,提供同客户端HTML页面的接口。编程语言Perl是一个广泛被用来编写CGI程序的语言,但CGI程序可以用任何脚本语言或者完全独立编程语言实现,只要此语言可以在这个系统上运行。
CGI脚本可用于许多目的,但是谨慎控制使用哪个CGI脚本以及允许谁添加和运行这些脚本十分重要。编写质量差的CGI脚本可能为外部攻击者提供了破坏网站及内容安全性的途径。故,在web服务器级别和SELinux策略级别,都存在用于限制CGI脚本使用的设置。
特点:一般每次的CGI请求都需要新生成一个程序的副本来运行,这样大的工作量会很快将服务器压垮!因此一些更有效的技术像mod_perl,可以让脚本解释器直接作为模块集成在Web服务器(例如:Apache)中,这样就能避免重复载入和初始化解释器。
172.25.254.126/manual/查看apache服务手册,看设置cgi语言都需要在配置文件里面写入哪些内容
mkdir /var/www/html/cgi #先建立cgi目录
cd /var/www/html/cgi
vim index.cgi
chmod +x index.cgi #脚本要给一个可以执行的权限
./index.cgi #可以看到时间调用脚本,看能否看到时间
cd /etc/httpd/conf.d/
vim vhost.conf
systemctl restart httpd
vim index.cgi
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print `date`;
vim vhost.conf #添加如下内容
<Directory "/var/www/html/cgi">
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>
浏览器中输入 172.25.254.126/cgi/index.cgi
wsgi
https加密访问
cd /var/www/cgi-bin/
vim webapp.wsgi
yum search wsgi
yum install mod_wsgi -y
vim /etc/httpd/conf.d/vhost.conf
systemctl restart httpd
vim /etc/hosts #添加wsgi.westos.com到本地解析
vim webapp.wsgi
#!/usr/binenv python
import time
def application (environ,start_response):
response_body = 'UNIX EPOCH time is now: %\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]
vim /etc/httpd/conf.d/vhost.conf #添加如下内容
<VirtualHost *:80>
ServerName wsgi.westos.com
WSGIScriptAlias / /var/www/cgi-bin/webapp.wsgi
</VirtualHost>
HTTPS加密
TTPS和HTTP的区别
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密
如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。
为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS和HTTP的区别主要为以下四点: 一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
yum install mod_ssl -y #apache服务器上面安装锁
yum install crypto-utils -y #安装自己的加密
genkey --help
genkey apache_server.westos.com #生成自签名证书
vim /etc/httpd/conf.d/ssl.conf
systemctl restart httpd
netstat -antlupe | grep httpd #查看https的端口443是否开启
firewall-cmd --permanent --add-service=https #在火墙里面添加https服务
firewall-cmd --reload
vim /etc/httpd/conf.d/ssl.conf #添加这两行
SSLCertificateFile /etc/pki/tls/private/apache_server.westos.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/apache_server.westos.com.key
此时,浏览器输入 https://172.25.254.126,会发现:授权本部门没有授权(没有备案),认为不安全,所以警示! 解决方法:
Advice(高级选项)–>Get Certificate(下载证书),Confirm确定就可以看到信息!
是否要向CA申请(要不要CA提供但服务,付费),否
然后,需不需要对私钥加密(根据需求,这里不加密),否则每次都需要输入密码
点击右上角–>Preferences–>Advanced–>Network–>Settings–>Manual proxy
configuration,输入相应内容。
网页重写
vim /etc/httpd/conf.d/vhost_https.conf
vim /etc/httpd/conf.d/ssl.conf
mkdir -p /var/www/vhost/login #建立默认发布目录
vim /var/www/vhost/login/index.html #建立默认发布文件
vim /var/www/vhost/login/index.html
<h1>log</h1>
vim /etc/httpd/conf.d/vhost_https.conf
<VirtualHost *:443> #建立一个443端口虚拟主机,https需要开启443端口
ServerName login.westos.com
DocumentRoot /var/www/vhost/login #建立默认发布目录
CustomLog logs/login.log combined
SSLEngine on开启这个功能
SSLCertificateFile /etc/pki/tls/certs/www.westos.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/www.westos.com.key
</VirtualHost>
<Directory "/var/www/html/vhost/login">
Require all granted
</Directory>
<VirtualHost *:80> #建立一个80端口的虚拟主机
ServerName login.westos.com
RewriteEngine on #将网页重写的功能开启
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301] #(永久重定向:永久跳转)
#客户端输入的内容 客户端主机
</VirtualHost>
字符 含义
^(/.*)$ | 客户在浏览器地址栏中输入的所有字符 |
https:// | 强制客户加密访问 |
%{HTTP_HOST} | 客户请求主机 |
$1 | 1"表示(/.∗)的值 |
[redirect=301] | 永久重写,302临时 |
未完