代码改变世界

apache实验

2020-11-17 18:33  叶子y  阅读(257)  评论(0)    收藏  举报

 


Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上, 由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简 单的API扩充,将Perl/Python/php等解释器编译到服务器中。 Apache有多种产品,可以支持SSL技术,支持多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时, 通常是增加服务器或扩充群集节点而不是增加处理器。到目前为止Apache仍然是世界上用的最多的 Web服务器,市场占有率达60%左右。


提示:以下是本篇文章正文内容,下面案例可供参考

一、工作模式

 

  • prefork 工作模式

预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景

优点:稳定

缺点:慢,占用资源,不适用于高并发场景

在这里插入图片描述





  • worker工作模式

是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发。

优点:相比prefork 占用的内存较少,可以同时处理更多的请求

缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)
在这里插入图片描述



  • event工作模式

Apache中最新的模式,属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力,event只在有数据发送的时候才开始建立连接,连接请求才会触发工作线程,即使用了TCP的一个选项,叫做延迟接受连接TCP_DEFER_ACCEPT,加了这个选项后,若客户端只进行TCP连接,不发送请求,则不会触发Accept操作,也就不会触发工作线程去干活,进行了简单的防攻击(TCP连接)

优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放

缺点:没有线程安全控制
在这里插入图片描述



  • 查看httpd的工作模式
#查看apache工作模式
httpd -V
  • 1
  • 2

在这里插入图片描述



  • 修改工作模式
    在这里插入图片描述



二、配置文件详解

在这里插入图片描述




三、Apache实验

实验准备:
CentOS7虚拟机一台
安装apache 安装命令 yum -y install httpd

一.目录别名

在一些情况下,我们的资源文件都在 非 /var/www/html目录下,例如/var/www/html/test。这样的话我们在输入网址的时候就需要在网站根目录下再输入完整的目录。所以我们可以定义一个别名来替代这个路径。可以简写网站的网址。

1.实验准备

在 /var/www/html/test 目录下创建一个 index.html 文件。文件内容自定义。

	#创建目录
	mkdir /var/www/html/test
	#创建网页文件,内容自定义
	vi /var/www/html/test/index.html
  • 1
  • 2
  • 3
  • 4

2.修改配置文件
现在需要将这个目录定义一个别名为test

	vi /etc/httpd/conf/httpd.conf
  • 1

配置文件最后添加如下内容
在这里插入图片描述


3.测试
重启httpd服务

systemctl restart httpd.service
  • 1

直接在宿主机用浏览器访问
在这里插入图片描述





二.Apache的用户认证

有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全。比如我们的个人网站,一般都是有一个管理后台的,虽然管理后台本身就有密码,但我们为了更加安全,可以再设置一层用户身 份认证。

了解:.htaccess是什么

.htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

1.启用.htaccess文件

修改httpd.conf配置文件,上一个实验我们添加的代码

vi /etc/httpd/conf/httpd.conf
  • 1

在这里插入图片描述

	<Directory "/var/www/html/test">
   		 AllowOverride All
   		 Options None
   		 Require all granted
	</Directory>
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述


2.创建.htaccess文件

	#哪个目录需要访问权限,就在哪个目录下创建.htaccess文件
	vi /var/www/html/test/.htaccess
  • 1
  • 2

.htaccess文件内容如下

	AuthName "welcome to sohu."
	AuthType basic
	AuthUserFile /var/www/html/test/test.passwd
	require valid-user
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述


3.创建密码文件
密码文件路径在上一步.htaccess文件配置,我这里是/var/www/html/test/test.passwd

#使用htpaswwd命令创建密码文件
htpasswd -c /var/www/html/test/test.passwd user1
#-c添加第一个用户;-m添加更多用户时使用
htpasswd -m /var/www/html/test/test.passwd user1
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述


4.测试
重启httpd服务

systemctl restart httpd.service
  • 1

在这里插入图片描述




三.虚拟主机(重点)

所谓虚拟主机,也叫“网站空间”就是把一台运行在互联网上的服务器划分成多个“虚拟”的服务器,每一个虚拟主机都具有独立的域名和完整的Internet服务器(支持WWW、FTP、E-mail等)功能。一台服务器上的不同虚拟主机是各自独立的,并由用户自行管理。但一台服务器主机只能够支持一定数量的虚拟主机,当超过这个数量时,用户将会感到性能急剧下降。

Apache虚拟主机的实现方式有3种:

基于IP的虚拟主机
基于端口的虚拟主机
基于域名的虚拟主机(本次实验方式)

1.实验准备

  • 准备两个域名 www.test.com 和 www.testtest.com

  • 在/var/www/html/下创建2个目录,作为虚拟主机(网站空间)

    cd /var/www/html
    #创建两个目录分别为test testtest
    mkdir test testtest
    
    • 1
    • 2
    • 3
  • 在两个目录下分别创建网页文件index.html 内容自定义


2.修改配置文件

vi /etc/httpd/conf/httpd.conf
  • 1

添加如下内容(去掉注释)

<VirtualHost *:80>
DocumentRoot "/var/www/html/test"
ServerName www.test.com
    <Directory "/var/www/html/test/">
     Options Indexes MultiViews FollowSymlinks
     AllowOverride None
     Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "/var/www/html/testtest"
ServerName www.testtest.com
    <Directory "/var/www/html/testtest/">
     Options Indexes MultiViews FollowSymlinks
     AllowOverride None
     Require all granted
    </Directory>
</VirtualHost>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

3.测试

  • 修改/etc/hosts文件
    vi /etc/hosts
    在这里插入图片描述

  • 重启apache服务
    systemctl restart httpd.service

  • 使用curl命令测试
    curl www.testtest.com




四.域名跳转

一个站点难免会有多个域名,而多个域名总得有一个主次,比如我的网站可以用两个域名访问: www.sohu.cn 和 www.sohu.com但大家发现不管我用哪个域名访问,最终都会跳转到 www.sohu.com 上来。这个行为就叫做域名跳转,状态码:301 是永久跳转,302 是临时跳转,网站上一定要设置为 301, 这样对搜索引擎是比较友好的。

实验目的:将www.test.com跳转到www.testtest.com

1.修改配置文件

vi /etc/httpd/conf/httpd.conf
  • 1
  • 修改 AllowOverride 为 All
<VirtualHost *:80>
DocumentRoot "/var/www/html/test"
ServerName www.test.com
    <Directory "/var/www/html/test/">
     Options Indexes MultiViews FollowSymlinks
     AllowOverride All   #修改这里!!!!其他不变
     Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "/var/www/html/testtest"
ServerName www.testtest.com
    <Directory "/var/www/html/testtest/">
     Options Indexes MultiViews FollowSymlinks
     AllowOverride None
     Require all granted
    </Directory>
</VirtualHost>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

2.创建.htaccess文件
在 /var/www/html/test 网站空间创建规则文件

	#哪个目录需要访问规则,就在哪个目录下创建.htaccess文件
	vi /var/www/html/test/.htaccess
  • 1
  • 2

.htaccess文件内容如下(去掉注释)

RewriteEngine on #让url重写生效
RewriteCond %{HTTP_HOST} ^www.test.com  #跳转条件
RewriteRule ^(.*)$ http://www.testtest.com/$1 [R=301,L]   #跳转目标
  • 1
  • 2
  • 3

3.测试

  • 重启apache服务
    systemctl restart httpd.service
  • 使用curl命令测试
    curl www.test.com
    在这里插入图片描述



五.Appache+openssl实现https(重点)

HTTPS(全称:Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的 HTTP通道,简单讲是 HTTP 的安全版。即 HTTP下加入 SSL 层,用于安全的 HTTP 数据传输。这个系统被内置于浏览器中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

计算机网络上,OpenSSL是一个开放源代码软件包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。

1.实验准备

  • 为apache安装ssl模块
    yum -y install mod_ssl

  • 安装完之后/etc/httpd/conf.d目录下会出现一个ssl.conf文件

  • 配置httpd.conf主配置文件 导入 ssl.conf配置文件
    vi /etc/httpd/conf/httpd.conf

    #将/etc/httpd/conf.d目录下的ssl.conf文件关联到主配置httpd.conf文件中
    #默认httpd.conf文件中已经配置
    Include conf.d/*.conf
    
    • 1
    • 2
    • 3

2.CA证书制作

  • 生成私钥
    openssl genrsa -out ca.key 1024

  • 生成证书签名请求(CSR)
    openssl req -new -key ca.key -out test.csr
    -new:表示生成一个新的证书签署请求;
    -x509:专用于生成CA自签证书;
    -key:指定生成证书用到的私钥文件;
    -out FILNAME:指定生成的证书的保存路径;
    -days:指定证书的有效期限,单位为day,默认是365天;

  • 生成的 csr 文件交给 CA 签名后形成服务端自己的证书
    openssl x509 -req -days 365 -sha256 -in test.csr -signkey ca.key -out test.crt
    使用 CA 服务器签发证书,设置证书的有效期等信息
    注意 1:生成完秘钥和证书文件后,将文件存放在/var/www/html/certs目录下
    注意 2:在生产环境中必须要在 https 证书厂商注册(否则浏览器不识别)


3.修改ssl.conf配置文件
找到 SSLCertificateFile 和 SSLCertificateKeyFile
SSLCertificateFile 指定CA签名后的证书
SSLCertificateKeyFile 指定服务器自己的私钥
在这里插入图片描述


4.编辑配置文件httpd.conf
添加如下内容

<VirtualHost *:443>
DocumentRoot "/var/www/html/testtest"
ServerName www.testtest.com:443
SSLCertificateFile /var/www/html/certs/test.crt #ssl.conf中配置的证书位置
SSLCertificateKeyFile /var/www/html/certs/ca.key
SSLCertificateChainFile /var/www/html/certs/test.crt
</VirtualHost>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5.测试

  • 重启apache服务
    systemctl restart httpd.service
  • 在宿主机浏览器输入,会有一个证书。
    https:// www.testtest.com
    在这里插入图片描述



六.强制跳转https

有些时候为了安全,网站不允许使用 http 访问,仅允许使用 https 访问,目的是为了更加安全

实验目的:浏览器输入www.testtest.com 自动跳转 为https://www.testtest.com

1.修改配置文件
vim /etc/httpd/conf/httpd.conf
开启testtest的目录访问规则
在这里插入图片描述


在这里插入图片描述


2.创建.htaccess文件
cd /var/www/html/testtest
vi .htaccess

定义.htaccess文件内容,实现跳转规则

RewriteEngine on
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L]
  • 1
  • 2
  • 3

3.测试

  • 重启apache服务
    systemctl restart httpd.service
  • 浏览器输入www.testtest.com
    在这里插入图片描述



七.Apache日志切割

Apache提供了不把日志直接写入文件,而是通过管道发送给另外一个程序的能力。这样就大大加强了对日志进行处理的能力。这个通过管道得到的程序可以是任意程序,如日志分析、压缩日志等。要实现将日志写到管道的操作,只需要将配置中日志文件部分的内容替换为"|程序名"即可。

使用Apache自带的轮循工具rotatelogs来对日志文件进行轮循。rotatelogs基本是按时间或大小来控制日志的。

如果使用yum方式安装的apache,则rotatelogs所在目录为/usr/sbin/rotatelogs


1.httpd.conf配置文件中关于日志的讲解
分别找到配置文件中的 ErrorLog 和 CustomLog
在这里插入图片描述


2.修改配置文件
本次实验按日期的方式来切割日志

ErrorLog "|/usr/sbin/rotatelogs /etc/httpd/logs/error.%Y-%m-%d.log 86400 480"
CustomLog "|/usr/sbin/rotatelogs /etc/httpd/logs/access.%Y-%m-%d.log 86400 480" 
  • 1
  • 2

在这里插入图片描述


3.测试

  • 重启apache服务
    systemctl restart httpd.service
  • 查看目录/etc/httpd/logs
    在这里插入图片描述



八.日志过滤

如果一个网站访问量特大,那么访问日志就会很多,但有一些访问日志我们其实是可以忽略掉的,比如网站的一些图片,还有 js、css 等。而这些文件的访问往往是巨量的,而且即使记录这些日志也没有什么用。

1.开启目录访问规则
编辑httpd.conf配置文件
在这里插入图片描述


2.创建规则文件
vi /var/www/html/test/.htaccess

SetEnvIf Request_URI ".*\.gif$" image-request
SetEnvIf Request_URI ".*\.jpg$" image-request
SetEnvIf Request_URI ".*\.png$" image-request
SetEnvIf Request_URI ".*\.bmp$" image-request
SetEnvIf Request_URI ".*\.swf$" image-request
SetEnvIf Request_URI ".*\.js$" image-request
SetEnvIf Request_URI ".*\.css$" image-request
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.修改日志配置
再次编辑配置文件httpd.conf
找到 CustomLog

CustomLog "|/usr/sbin/rotatelogs /etc/httpd/logs/access.%Y-%m-%d.log 86400 480" combined env=!image-request
  • 1

在这里插入图片描述


4.测试

  • 我们在/var/www/html/test目录下放一张图片 test.jpg
  • 重启apache服务
    systemctl restart httpd.service
  • 使用浏览器访问 www.test.com/test.jpg
  • 查看日志
  • 取消上面步骤三的操作再次进行测试



九.静态资源缓存

所说的静态文件指的是图片、js、css 等文件,用户访问一个站点,其实大多数元素都是图片、js、 css 等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,提高了用户体验。但这些静态文件总不能一直缓存,它总有一些时效性,那么就得设置这个过期时间。

1.编辑配置文件
添加如下内容

#按G定位末行
<IfModule mod_expires>
	ExpiresActive on
	ExpiresByType image/jpeg "access plus 1 days"
	ExpiresByType image/gif "access plus 1 days"
	ExpiresByType image/png "access plus 1 days"
	ExpiresByType image/webp "access plus 1 days"
	ExpiresByType image/svg+xml "access plus 1 days"
	ExpiresByType image/x-icon "access plus 1 days"
</IfModule>
#wq保存退出
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.测试

  • 重启服务
    systemctl restart httpd.service
  • 使用以下命令验证
    curl -x127.0.0.1:80 'www.test.com/test.jpg' -I
    在这里插入图片描述



十.补充

在这里插入图片描述