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服务器部署

Apache的安装部署

  • 准备工作:修改网络配置,主机名称,搭建yum源。
    Apache服务器部署
  • 安装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服务器部署

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
    Apache服务器部署
  • 测试:在浏览器中输入http://172.25.254.124/访问:
    可以看到我们并没有指定文件,默认访问的就是默认发布目录下的默认发布文件index.html
    Apache服务器部署
  • 默认端口的查看netstat -antlupe | grep http
    Apache服务器部署
  • 配置文件的查看
rpm -ql httpd    ##查看安装文件路径
rpm -qc httpd      ##查看配置文件名称
rpm -qd httpd      ##查看帮助文件

修改默认配置

开始实验之前,我们在http主机的selinux设置为enforcing。

修改默认端口:

- 已有的端口:通过命令semanage port -l | grep http查看
Apache服务器部署

  • 在主配置文件/etc/httpd/conf/httpd.conf中,修改默认的端口为8080,并重启http服务systemctl restart httpd.service,通过命令netstat -antlupe | grep http查看有没有修改成功。
    Apache服务器部署Apache服务器部署
  • 在浏览器端测试:此时不能使用8080端口,这是因为防火墙没有开8080端口。
    Apache服务器部署
  • 我们需要在防火墙列表添加新端口8080:
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload 
firewall-cmd --list-all

Apache服务器部署

  • 再次在浏览器端进行测试:
    Apache服务器部署
    - 没有的端口:
  • 我们通过命令semanage port -l | grep http可以看到没有8888这个端口,在selinux为enforcing时,我们修改主配置文件,将8888这个端口写入,httpd服务会启动失败,这是因为selinux规定了http不用随便用端口,规定了使用端口的范围,如果设置了没有的端口httpd会启动失败。但将状态改为permissive服务就可以成功启动了。
    Apache服务器部署
    Apache服务器部署
  • 我们添加8888端口到列表里,并查看有没有添加成功:
semanage port -a -t http_port_t -p tcp 8888     ##-a 添加 -t类型 -p 端口号
semanage port -l | grep http

Apache服务器部署

  • 此时在selinux为enforcing的状态下,httpd服务也能成功重启了。
    Apache服务器部署

  • 我们将新添加的端口8888写到主配置文件中,以及加入到防火墙列表中,在浏览器中测试。

vim /etc/httpd/conf/httpd.conf
firewall-cmd --permanent --add-port=8888/tcp
firewall-cmd --reload
firewall-cmd --list-all

Apache服务器部署Apache服务器部署
做完实验恢复默认端口为80。
另外,修改完配置文件后访问结果可能没有变化,这是因为浏览器有可能有缓存,需要刷新或清理缓存。ctrl+shift+delete

修改默认发布文件:

默认发布文件就是访问apache时没有指定文件名称时默认访问的文件,这个文件可以指定多个,有访问顺序。

  • 我们在默认发布目录下新建文件/var/www/html/test.html,写入以下内容<h1>love linux!</h1>,修改主配置文件/etc/httpd/conf/httpd.conf,重启服务后在浏览器中测试:
    Apache服务器部署
    Apache服务器部署
    Apache服务器部署
    Apache服务器部署
    注意:因为我指定了优先访问test.html,当test.html不存在时,会访问index.html。
修改默认发布目录:
  • 首先,建立你要改的发布目录,mkdir -p /zhang/html,并在此目录下新建测试文件index.html,将该目录指定到主配置文件中:
    Apache服务器部署
    Apache服务器部署

  • 重启服务,在浏览器端访问:
    Apache服务器部署

  • 此时访问到的是测试页,这是因为我们在主配置文件中没有给发布目录授权,我们修改主配置文件并重启服务:
    Apache服务器部署

  • 此时在selinux为permissive的状态下就能访问到我们指定的发布目录下的默认发布文件了:
    Apache服务器部署
    Apache服务器部署

  • 但是当我们将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服务器部署
做完实验注释掉刚刚的设置,重启服务。

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>

Apache服务器部署

  • 在测试端做好本地解析,本地解析文件中指定要访问的ip和对应的域名,并在浏览器中访问:
vim /etc/hosts
172.25.254.124   www.westos.com  news.westos.com   music.westos.com

Apache服务器部署
Apache服务器部署
Apache服务器部署
注意:1.默认看的是目录下的index.html文件,如果你的文件叫其他名字.html在访问时需要在浏览器端指定。
2.系统中默认的日志由三种:access_log,default.log,error_log,下面的music.log和news.log是我们刚在vhost.conf文件中写入的,他们俩保存了当有客户端访问时的记录。

Apache服务器部署
Apache服务器部署

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文件

Apache服务器部署

  • 测试:
    Apache服务器部署
    Apache服务器部署
  • 白名单的设置同理:
<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     ##查看生成的用户

Apache服务器部署

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

Apache服务器部署
Apache服务器部署
Apache服务器部署
Apache服务器部署

如果把文件修改为这样则表示所有生成的用户都可以访问
#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

Apache服务器部署
2.vim /var/www/html/index.php 中写入,重启服务systemctl restart httpd

 <?php
           phpinfo();
 ?>

3.在浏览器中输入http://172.25.254.124/index.php访问:
Apache服务器部署

  • cgi
    实验步骤:
    1.在默认发布目录下新建cgi目录,mkdir /var/www/html/cgi并新建文件vim /var/www/html/cgi/index.cgi,通过访问httpd的manual手册,我们可以给文件中写入以下内容,并给文件加执行权限:
    Apache服务器部署
    Apache服务器部署
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

此时我们通过访问可以看到我们写入的内容并没有执行,而是裸露出来的。
Apache服务器部署
我们需要在/etc/httpd/conf.d/vhost.conf中加入以下内容,并重启服务:

<Directory "/var/www/html/cgi">
        Options +ExecCGI
        AddHandler cgi-script .cgi       ##执行所有以.cgi为结尾的脚本
</Directory>

Apache服务器部署
Apache服务器部署
在selinux为permissive时可以直接访问:
Apache服务器部署
但是当selinux为enforcing会出现500的报错:
Apache服务器部署
我们需要修改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/

Apache服务器部署
Apache服务器部署
Apache服务器部署

  • 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>

Apache服务器部署
在测试端的本地解析文件/etc/hosts中加入wsgi.westos.com,访问测试:
Apache服务器部署Apache服务器部署

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

Apache服务器部署
Apache服务器部署
然后,安装加密工具,并生成证书和钥匙:

yum install crypto-utils.x86_64 -y
genkey +servername
genkey apache_server.westos.com

Apache服务器部署
Apache服务器部署
Apache服务器部署
Apache服务器部署
Apache服务器部署
Apache服务器部署
Apache服务器部署
完成之后将生成的证书和钥匙指定到配置文件/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      ##钥匙

Apache服务器部署
然后在测试端的浏览器中先清除之前的CA证书和缓存。
Apache服务器部署Apache服务器部署
在浏览器端测试:
Apache服务器部署
生成的证书:
Apache服务器部署
Apache服务器部署
Apache服务器部署

设定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临时

Apache服务器部署
重启服务systemctl restart httpd.service,在测试端修改本地解析文件vim /etc/hosts
Apache服务器部署
测试:
Apache服务器部署Apache服务器部署
manual手册的说明:
Apache服务器部署
因为刚刚设置的原因,我在访问除指定的login.westos.com之外的其他网页时也会自动加https,这是跟我vhost.conf和login.conf文件名的字母排序有关,这影响了解析顺序,恢复正常可以将login.conf文件改名为zlogin.conf,然后完全清理缓存,清理加密证书,再次访问就不会变为https了。

相关文章: