Apache
企业中常用的web服务,用来提供http://(超文本传输协议)
LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写:
LAMP=Linux+Apache+MySql+PHP/Perl/Python
LNMP=Linux+Nginx+MySql+PHP/Perl/Python
由操作系统,网页服务器,数据库服务器,脚本语言组成。
curl命令使用了libcurl库来实现,libcurl库常用在C程序中用来处理HTTP请求,-I/仅返回头部信息,使用HEAD请求。
curl -I 163.com
curl -I taobao.com
Apache的安装部署
- 准备工作:修改网络配置,主机名称,搭建yum源。
- 安装httpd,设置开机自启动,防火墙允许http服务。
yum search httpd
yum install httpd.x86_64 -y ##Apache的软件
yum install httpd-manual.noarch -y ##httpd没有man手册,我们需要单独下载一个说明手册
systemctl start httpd
systemctl enable httpd
firewall-cmd --permanent --add-service=http ##永久允许http
firewall-cmd --reload ##火墙重新加载策略
firewall-cmd --list-all ##列出火墙信息
Apache的基础信息
主配置目录: /etc/httpd/conf
主配置文件: /etc/httpd/conf/httpd.conf
子配置目录: /etc/httpd/conf.d/ ##子配置目录中,以.conf结尾的文件都会被读取,他们是子配置文件。
子配置文件: /etc/httpd/conf.d/*.conf
默认发布目录: /var/www/html
默认发布文件: index.html
默认端口: 80
默认安全上下文: httpd_sys_content_t
程序开启默认用户: apache
apache日志: /etc/httpd/logs/*
- 我们在默认发布目录中新建默认发布文件
vim /var/www/html/index.html,在其中写入<h1>hello even!</h1>,重启服务systemctl restart httpd.service: - 测试:在浏览器中输入
http://172.25.254.124/访问:
可以看到我们并没有指定文件,默认访问的就是默认发布目录下的默认发布文件index.html - 默认端口的查看
netstat -antlupe | grep http - 配置文件的查看
rpm -ql httpd ##查看安装文件路径
rpm -qc httpd ##查看配置文件名称
rpm -qd httpd ##查看帮助文件
修改默认配置
开始实验之前,我们在http主机的selinux设置为enforcing。
修改默认端口:
- 已有的端口:通过命令semanage port -l | grep http查看
- 在主配置文件
/etc/httpd/conf/httpd.conf中,修改默认的端口为8080,并重启http服务systemctl restart httpd.service,通过命令netstat -antlupe | grep http查看有没有修改成功。 - 在浏览器端测试:此时不能使用8080端口,这是因为防火墙没有开8080端口。
- 我们需要在防火墙列表添加新端口8080:
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
firewall-cmd --list-all
- 再次在浏览器端进行测试:
- 没有的端口: - 我们通过命令
semanage port -l | grep http可以看到没有8888这个端口,在selinux为enforcing时,我们修改主配置文件,将8888这个端口写入,httpd服务会启动失败,这是因为selinux规定了http不用随便用端口,规定了使用端口的范围,如果设置了没有的端口httpd会启动失败。但将状态改为permissive服务就可以成功启动了。 - 我们添加8888端口到列表里,并查看有没有添加成功:
semanage port -a -t http_port_t -p tcp 8888 ##-a 添加 -t类型 -p 端口号
semanage port -l | grep http
-
此时在selinux为enforcing的状态下,httpd服务也能成功重启了。
-
我们将新添加的端口8888写到主配置文件中,以及加入到防火墙列表中,在浏览器中测试。
vim /etc/httpd/conf/httpd.conf
firewall-cmd --permanent --add-port=8888/tcp
firewall-cmd --reload
firewall-cmd --list-all
做完实验恢复默认端口为80。
另外,修改完配置文件后访问结果可能没有变化,这是因为浏览器有可能有缓存,需要刷新或清理缓存。ctrl+shift+delete
修改默认发布文件:
默认发布文件就是访问apache时没有指定文件名称时默认访问的文件,这个文件可以指定多个,有访问顺序。
- 我们在默认发布目录下新建文件
/var/www/html/test.html,写入以下内容<h1>love linux!</h1>,修改主配置文件/etc/httpd/conf/httpd.conf,重启服务后在浏览器中测试:
注意:因为我指定了优先访问test.html,当test.html不存在时,会访问index.html。
修改默认发布目录:
-
首先,建立你要改的发布目录,
mkdir -p /zhang/html,并在此目录下新建测试文件index.html,将该目录指定到主配置文件中: -
重启服务,在浏览器端访问:
-
此时访问到的是测试页,这是因为我们在主配置文件中没有给发布目录授权,我们修改主配置文件并重启服务:
-
此时在selinux为permissive的状态下就能访问到我们指定的发布目录下的默认发布文件了:
-
但是当我们将selinux的状态设为enforcing之后又访问不到了,我们需要更改我们指定目录的安全上下文,重启服务,测试:
setenforce 1 ##selinux设置为enforcing
ls -Zd /var/www/html/ 查看默认发布目录的安全上下文
semanage fcontext -a -t httpd_sys_content_t '/zhang/html(/.*)?' ##永久更改这个目录的安全上下文,和/var/www/html一致
restorecon -RvvF /zhang/html/
systemctl restart httpd
做完实验注释掉刚刚的设置,重启服务。
Apache的虚拟主机
- 在一个Apache服务器上可以配置多个虚拟主机,实现多个站点,不同的站点访问不同的页面,其实就是访问同一个服务器上的不同目录。
- 我们这里是基于域名配置和基于端口配置。
- 因为默认情况下只有一个发布目录,所以我们要在子配置目录下新建文件,以.conf结尾,除了指定之外的默认都访问default。
- 首先建立目录和文件,并在文件中写入下面的内容:
mkdir -p /var/www/vhost/news
mkdir -p /var/www/vhost/music
vim /var/www/vhost/news/index.html
写入: <h1>love news!</h1>
vim /var/www/vhost/music/index.html
写入:<h1>love music!</h1>
- 我们在子配置目录下新建一个vhost文件,
vim /etc/httpd/conf.d/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>
- 在测试端做好本地解析,本地解析文件中指定要访问的ip和对应的域名,并在浏览器中访问:
vim /etc/hosts
172.25.254.124 www.westos.com news.westos.com music.westos.com
注意:1.默认看的是目录下的index.html文件,如果你的文件叫其他名字.html在访问时需要在浏览器端指定。
2.系统中默认的日志由三种:access_log,default.log,error_log,下面的music.log和news.log是我们刚在vhost.conf文件中写入的,他们俩保存了当有客户端访问时的记录。
Apache内部的访问控制
针对与主机的访问控制
缺点:安全性差,只要客户端修改了ip就可以访问。
- 在
/etc/httpd/conf.d/vhost.conf文件中加入以下内容,重启服务:
<Directory "/var/www/html">
Order Allow,Deny
Allow from All
Deny from 172.25.254.124
</Directory>
Order是读取顺序,意思是先加载allow,在加载deny。
这里设置的是黑名单,意思是除ip为172.25.254.124的主机外其他主机都可以访问默认发布目录下的index.html文件
- 测试:
- 白名单的设置同理:
<Directory "/var/www/html">
Order Deny,Allow
Allow from 172.25.254.10
Deny from All
</Directory>
默认先读Deny,再读Allow,即只有172.25.254.10主机可访问。
修改完成重启服务测试
用户方式的访问控制
cd /etc/httpd/ ##在配置目录下生成三个用户
htpasswd -cm .apache_auth zhang ##-c创建 -m设定加密md5
htpasswd -m .apache_auth even ##第二次再用-cm会覆盖之前的生成的用户
htpasswd -m .apache_auth study
cat .apache_auth ##查看生成的用户
vim /etc/httpd/conf.d/vhost.conf
<Directory "/var/www/html">
AuthUserFile /etc/httpd/.apache_auth ##指定读取的文件
AuthType basic ##基础类型,即输入用户名和密码
AuthName "Please input username and password" ##跳出的框中显示的话
Require user zhang 中间可用空格隔开多个用户,表示谁可以通过认证
</Directory>
systemctl restart httpd.service
如果把文件修改为这样则表示所有生成的用户都可以访问
#Require user zhang even 这两个人可以访问
Require valid-user 所有生成的用户都可访问
如果有缓存就不用再次认证,我们需要清理缓存,ctrl+shift+delete清除缓存
Apache支持的语言
- html
刚刚的实验都是写的.html文件,此处不再赘述。 - php
实验步骤:
1.安装php,重启http服务,httpd对php进行在线加载,会出现php.conf。
yum install php -y
systemctl restart httpd
2.vim /var/www/html/index.php 中写入,重启服务systemctl restart httpd
<?php
phpinfo();
?>
3.在浏览器中输入http://172.25.254.124/index.php访问:
- cgi
实验步骤:
1.在默认发布目录下新建cgi目录,mkdir /var/www/html/cgi并新建文件vim /var/www/html/cgi/index.cgi,通过访问httpd的manual手册,我们可以给文件中写入以下内容,并给文件加执行权限:
vim /var/www/html/cgi/index.cgi
#!/usr/bin/perl
print "Content-type: text/html\n\n"; ##转换成文本模式,text->html
print `date`;
chmod +x /var/www/html/cgi/index.cgi
ls -l /var/www/html/cgi/index.cgi
systemctl restart httpd
此时我们通过访问可以看到我们写入的内容并没有执行,而是裸露出来的。
我们需要在/etc/httpd/conf.d/vhost.conf中加入以下内容,并重启服务:
<Directory "/var/www/html/cgi">
Options +ExecCGI
AddHandler cgi-script .cgi ##执行所有以.cgi为结尾的脚本
</Directory>
在selinux为permissive时可以直接访问:
但是当selinux为enforcing会出现500的报错:
我们需要修改var/www/html/cgi/目录的安全上下文:
semanage fcontext -l | grep httpd
semanage fcontext -a -t httpd_sys_script_exec_t '/var/www/html/cgi(/.*)?'
restorecon -RvvF /var/www/html/cgi/
ls -Zd /var/www/html/cgi/
- wsgi
首先,进入/var/www/cgi-bin目录,且在/var/www/cgi-bin下获得 webapp.wsgi文件
cd /var/www/cgi-bin/
yum install lftp -y
lftp 172.25.254.10
get webapp.wsgi
然后,安装mod_wsgi
yum search wsgi
yum install mod_wsgi.x86_64 -y
在/etc/httpd/conf.d/vhost.conf中写入以下内容,并重启服务systemctl restart httpd:
<VirtualHost *:80>
ServerName wsgi.westos.com ##访问的域名
WSGIScriptAlias / /var/www/cgi-bin/webapp.wsgi ##脚本文件的路径
</VirtualHost>
在测试端的本地解析文件/etc/hosts中加入wsgi.westos.com,访问测试:
vim /var/www/cgi-bin/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]
Https
- HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
- HTTPS主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性,凡是使用了 https 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过 CA 机构颁发的安全签章来查询。
- 加密是在客户端,因为企业可以确定服务器的安全性而不能确定客户端的安全性。
- Https的端口是443。
- 实验步骤:
首先,安装https对应的包,重启httpd服务,在/etc/httpd/conf.d/目录下查看有没有出现配置文件ssl.conf。
将https服务加入防火墙允许的列表中。
yum install mod_ssl.x86_64 -y
systemctl restart httpd.service
vim /etc/httpd/conf.d/ssl.conf
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
firewall-cmd --list-all
然后,安装加密工具,并生成证书和钥匙:
yum install crypto-utils.x86_64 -y
genkey +servername
genkey apache_server.westos.com
完成之后将生成的证书和钥匙指定到配置文件/etc/httpd/conf.d/ssl.conf中,重启服务systemctl restart httpd.service
SSLCertificateFile /etc/pki/tls/certs/apache_server.westos.com.crt ##证书
SSLCertificateKeyFile /etc/pki/tls/private/apache_server.westos.com.key ##钥匙
然后在测试端的浏览器中先清除之前的CA证书和缓存。
在浏览器端测试:
生成的证书:
设定https虚拟主机并设定网页重写
新建你要指定访问的目录和文件:
mkdir -p /var/www/vhost/login
vim /var/www/vhost/login/index.html ##中写入:
<h1>Hey,Welcome to Login!</h1>
vim /etc/httpd/conf.d/login.conf 中写入:
<VirtualHost *:443>
ServerName login.westos.com
DocumentRoot /var/www/vhost/login
CustomLog logs/login.log combines
SSLEngine on ##/etc/httpd/conf.d/ssl.conf 70行
SSLCertificateFile /etc/pki/tls/certs/apache_server.westos.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/apache_server.westos.com.key
</VirtualHost>
<Directory "/var/www/vhost/login"> ##授权
Require all granted
</Directory>
<VirtualHost *:80>
ServerName login.westos.com
RewriteEngine on ##在http的manual手册中
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301]
</VirtualHost>
参数含义解释:
^(/.*)$ ##客户在浏览器地址栏中输入的所有字符
https:// ##强制客户加密访问
%{HTTP_HOST} ##客户请求主机
$1 ###"$1"标示 ^(/.*)$的值
[redirect=301] ##永久重写 302临时
重启服务systemctl restart httpd.service,在测试端修改本地解析文件vim /etc/hosts。
测试:
manual手册的说明:
因为刚刚设置的原因,我在访问除指定的login.westos.com之外的其他网页时也会自动加https,这是跟我vhost.conf和login.conf文件名的字母排序有关,这影响了解析顺序,恢复正常可以将login.conf文件改名为zlogin.conf,然后完全清理缓存,清理加密证书,再次访问就不会变为https了。