web平台—apache

web平台---apache

1. 学apache前需要知道的知识点

HTML语言:超文本标记语言,使用html语言编写的文本叫超文本,"超文本"就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。

HTTP协议:超文本传输协议

HTTP使用统一资源标识符(URL)来建立连接和传输数据。是一个基于TCP/IP通信协议来传递数据的协议,属于应用层协议。

URL:统一资源定位符

统一资源定位符是一些数据或文件在互联网上的地址,以及客户需要访问的地址。是标准资源的地址。http://www.kernel.com:80/image/a.jpg

知识拓展:

**URI:**统一资源标志符,URI与URL都是定位资源位置的,就是表示这个资源的位置信息,就像经纬度一样可以表示你在世界的哪个角落。URI是一种宽泛的含义更广的定义,而URL则是URI的一个子集,就是说URL是URI的一部分。

虚拟机:通过创建虚拟硬件,完成系统安装环境部署的方式,必须依托宿主机完成

虚拟主机:web 服务器上的网站平台构建方式,一个网站平台可以同时独立运行多个网站的部署方式

实现虚拟主机的三种方式:

(1)基于 IP 地址(不推荐,因为 IPv4 不够用)

(2)基于 port 地址(不推荐,因为使用不方便)

(3)基于域名的虚拟主机(推荐使用)

2. apache详解

2.1 概述

​ apache具有跨平台和安全性被企业广泛使用,可以通过Perl、python和php等解释器快速编译到服务器中。

​ apache支持SSL技术、多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。现在web服务器市场使用率最高的是apache的60%,然后是nginx的28%,其次就是tomcat

2.2 工作模式

​ Apache一共有3种稳定的MPM模式(MPM:多进程处理模块),它们分别是prefork、worker、event

shell 复制代码
    apache启动之前就已经预先fork(在apache中是创建)一些子进程,等待请求进来。
    做这样的原因就是为了减少频繁创建进程和销毁进程。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
------------------------------------------------------------------
优点:这种模式相对来说是成熟稳定,可以兼容所有新老项目,是这几个模式最安全的
缺点:一个进程长期不销毁会占用更多的系统资源,消耗更多的内存。也不支持高并发请求
shell 复制代码
采用多进程和多线程模式混合。
这个也是预先创建几个子进程,然后每个子进程创建了监听线程和工作线程。
当每个用户在请求的时候,会被分配到一个线程来服务。
线程比进程更加轻量,线程是会共享父进程的内存空间,内存负重也会减少一些。
它比prefork更适合高并发的场景下
----------------------------------------------------------------
优点:每个线程占据了更少的内存,总体内存利用率提高了,高并发下表现更优秀。
缺点:必须考虑线程安全的问题。
shell 复制代码
    它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题。
    event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。
    HTTP采用keepalive方式减少TCP连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁忙的服务器会消耗完所有的线程。
    Event MPM是解决这个问题的一种新模型,它把工作进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限制,此时Event MPM方式是最有效的。

在apache中什么是keep-alive场景

shell 复制代码
	在Apache中,keep-alive场景是指当HTTP请求和响应在单个TCP连接上进行多次传输时的情况。
	这种情况下,客户端和服务器之间的TCP连接在请求完成后不会立即关闭,而是保持打开状态,以便后续请求可以继续在该连接上进行传输。
----------------------------------------------------------------- 
具体来说,keep-alive场景的特点和优势包括:
    1.减少TCP连接建立和关闭的开销:
        对于每个HTTP请求,如果都需要建立一个新的TCP连接,那么在网络传输和服务器资源消耗上都会带来额外的开销。
        而keep-alive允许在同一个TCP连接上进行多次请求和响应,从而减少了这种开销。

    2.提高性能和响应速度:
        由于减少了TCP连接的建立和关闭,服务器可以更快速地响应客户端的请求。
        此外,在包含大量图片的HTML文档中,使用keep-alive可以显著提高加载速度,减少等待时间。
shell 复制代码
查看方式:
httpd -V | grep -i "server mpm"

指定方式:
在编译时,在选项中指定,--with-mpm=xxx
./configure --help | grep mpm
2.3 启动apache网站整体流程
2.4 相关文件保存位置

配置文件位置

shell 复制代码
源码包安装:	PREFIX(安装路径)/etc/httpd.conf(主配置文件)
			PREFIX/etc/extra/*.conf(子配置文件)
rpm包安装:  /etc/httpd/conf/httpd.conf
		   /etc/httpd/conf.d/*.conf
		   /usr/share/doc/httpd-*.*.*
			复制上述文件到/etc/httpd/conf.d/

网页文件位置

shell 复制代码
源码包安装:	PREFIX/htdocs/
rpm包安装:	 /var/www/html/

日志文件位置

shell 复制代码
源码包安装:	PREFIX/logs/
rpm包安装:	 /var/log/httpd/
2.5 配置文件详解

针对主机环境的基本配置参数

shell 复制代码
ServerRoot		/usr/local/apache2 	#apache主目录
Listen			80		#监听端口{Listen 192.168.99.135:80}
LoadModule		php7				#加载的相关模块
User						#用户
Group						#组
ServerAdmin					#管理员邮箱
ServerName		#服务器名(没有域名解析时,使用临时解析。默认不开启)
ErrorLog "logs/error_log					#服务器错误日志
CustomLog "logs/access_log" common			#访问记录日志
DirectoryIndex index.html index.php		#默认网页文件名,优先级顺序
Include  etc/extra/httpd-vhosts.conf    #子配置文件中内容也会加载生效

主页目录即权限

shell 复制代码
DocumentRoot "/usr/local/apache2/htdocs"   #网页文件存放目录(默认)
<Directory "/usr/local/apache2/htdocs">    #定义指定目录的权限
	#定义指定目录没有任何额外权限
	Options Indexes FollowSymLinks None	
    #定义指定目录拥有所有权限(除去MultiViews以外)
	Options Indexes FollowSymLinks	All		
    #定义指定目录浏览权限(当此目录下没有默认网页文件时,显示目录内容)
	Options Indexes FollowSymLinks	Indexes				
	#没有Indexes这个选项,当被访问目录下没有首页文件时禁止显示文件列表
	
	#准许软链接到其他目录
	Options Indexes FollowSymLinks		
	#准许文件名泛匹配(需要手动开启模块才有效negotiation)
	Options Indexes MultiViews
    
    #定义是否允许目录下.htaccess文件中的权限生效
    #.htaccess中权限不生效
	AllowOverride None  
	#文件中所有权限都生效						
	AllowOverride	All	
    #文件中,只有网页认证的权限生效
	AllowOverride	AuthConfig					
	#设置用户访问控制列表
	Require all granted(denied)
</Directory>
	
<IfModule dir_module>	#此标签用来指定访问到指定目录的首页
    DirectoryIndex index.html index.php	#可以写多个,但是有优先级之分
</IfModule>

httpd三种方法实现资源共享

shell 复制代码
1.将目录声明为默认网页目录:Document
2.软连接:FollowSymLinks
3.目录别名:alias_module
注意:不管哪种方式将目录作为网页共享目录,都要使用<Directory /dir>声明该目录的权限

3. apache配置实验

实验1:设置apache的目录别名

实验需求:如果想将一个不在DocumentRoot目录中的文件共享到网站上,并能够让它们留在本来位置而不需要进行移动的话,处理这种情况可以通过建立别名的方式将URL指向特定的目录

​ 编辑主配置文件

shell 复制代码
[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf

​ 编辑子配置文件

shell 复制代码
[root@localhost ~]# vim /usr/local/apache2/etc/extra/httpd-autoindex.conf
实验2:apache的用户认证

实验需求:一般情况下网站都是有一个管理后台的网页,而且管理后台就有密码,为了更加安全,可以添加用户认证

​ 1.编辑主配置文件

shell 复制代码
vim /usr/local/apache2/etc/httpd.conf

​ 2.指定目录下创建权限文件

shell 复制代码
cd /usr/local/apache2/htdocs/typecho/admin 
#切换该目录下创建.htaccess,并添加以下内容

​ 3.建立密码文件,加入允许访问的用户(这个用户和系统用户无关)

shell 复制代码
#建立密码文件,只有添加第一个用户时,采用-c
[root@localhost admin]#  htpasswd  -c  /usr/local/apache2/htdocs/typecho/admin/apache.passwd  type
#添加多个用户使用-m参数
[root@localhost admin]#  htpasswd  -m  /usr/local/apache2/htdocs/typecho/admin/apache.passwd  type

​ 4.重启apache服务

shell 复制代码
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
实验3:虚拟主机 (重点)

实验需求:在一台服务器上实现多个多个虚拟主机(网站空间),来完成一个服务器上实现多个网站

实验准备

​ 1.准备两个域名 (www.typechoblog.com | www.discurz.com

​ 2.网站主页目录规划 (htdocs目录下的typecho和discurz )

实验步骤

​ 1.修改主配置文件开启文件关联

shell 复制代码
[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf

​ 2.编辑子配置文件,编写虚拟主机标签

shell 复制代码
[root@localhost htdocs]# vim /usr/local/apache2/etc/extra/httpd-vhosts.conf 


​ 3.重启服务,验证结果

shell 复制代码
[root@localhost htdocs]# /usr/local/apache2/bin/apachectl stop
[root@localhost htdocs]# /usr/local/apache2/bin/apachectl start
#注意在windows需要修改本机hosts文件,linux也是
192.168.99.135      www.typechoblog.com
192.168.99.135      www.discurz.com
实验4:域名跳转(重点)

实验需求:一个服务器难免会有多个域名,多个域名要分出主次,不管使用哪个域名最后都要回到主域名,这样就是域名跳转,状态码301是永久跳转,302是临时跳转

实验条件:虚拟主机能正常访问;打开主配置文件开启重写模块

实验步骤

​ 1.开启重写模块

shell 复制代码
[root@localhost htdocs]# vim /usr/local/apache2/etc/httpd.conf
#打开重写模块
LoadModule rewrite_module modules/mod_rewrite.so

​ 2.修改虚拟主机配置文件

shell 复制代码
<Directory "/usr/local/apache2/htdocs/typecho/">
        Options Indexes FollowSymLinks   ##准许软链接到其他目录
        AllowOverride All         #开启权限认证文件
        Require all granted        #设置用户访问列表
</Directory>
<VirtualHost 192.168.99.135:80>                  #虚拟主机标签
        ServerAdmin blog@typecho.com             #管理员邮箱    
        DocumentRoot "/usr/local/apache2/htdocs/typecho/"  #网站主目录
        ServerName www.typechoblog.com			#网站域名
        ServerAlias blog.lcy.com				#网站别名
        ErrorLog "logs/blog-error.log"			#错误日志
        CustomLog "logs/blog-access_log" common   #访问日志
</VirtualHost>

<Directory "/usr/local/apache2/htdocs/discurz/">
        Options Indexes FollowSymLinks     
        AllowOverride All
        Require all granted
</Directory>
<VirtualHost 192.168.99.135:80>
        ServerAdmin luntan@discurz.com
        DocumentRoot "/usr/local/apache2/htdocs/discurz/"
        ServerName www.discurz.com
        ServerAlias discurz.lcy.com
        ErrorLog "logs/tan-error.log"
        CustomLog "logs/tan-access_log" common
</VirtualHost>

​ 3.创建规则匹配文件

shell 复制代码
[root@localhost ~]# vim /usr/local/apache2/htdocs/typecho/.htaccess
RewriteEngine on
RewriteCond %{HTTP_HOST} ^blog.lcy.com
RewriteRule  ^(.*)$   http://www.typechoblog.com/$1 [R=permanent]
[root@localhost ~]# vim /usr/local/apache2/htdocs/discurz/.htaccess
RewriteEngine on
RewriteCond %{HTTP_HOST} ^discurz.lcy.com
RewriteRule  ^(.*)$   http://www.discurz.com/$1 [R=permanent,L]

​ 4.重启服务器并测试

shell 复制代码
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
实验5:apache+openssl实现https(重点)

实验需求:https是密文传输协议,比http安全的多。现在使用http+ssl实现https加密功能

实验条件:检查apache是否支持ssl,还有ssl是否安装,已安装就将ssl启动

shell 复制代码
模块存放目录:/usr/local/apache2/modules
检查模块是否启用:[root@localhost modules]# /usr/local/apache2/bin/apachectl -M | grep ssl

实验步骤

​ 1.开启ssl模块功能

shell 复制代码
[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf
LoadModule ssl_module modules/mod_ssl.so #取消注释
Include etc/extra/httpd-ssl.conf	#取消注释

​ 2.ca证书申请

shell 复制代码
[root@localhost ~]# cd /usr/local/apache2/etc/
[root@localhost etc]# mkdir ssl
[root@localhost etc]# cd ssl
[root@localhost ssl]# openssl genrsa -out blog.key 1024
#建立服务器私钥,生成RSA私钥
	
[root@localhost ssl]# openssl req -new -key blog.key -out blog.csr
#需要依次输入国家,地区,城市,组织,组织单位,Email等信息。最重要的是有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书

[root@localhost ssl]#  openssl x509 -req -days 365 -sha256 -in blog.csr -signkey blog.key -out blog.crt
#使用CA服务器签发证书,设置证书的有效期等信息

​ 3.修改etc/extra/httpd-ssl子配置文件

shell 复制代码
[root@localhost ~]# vim /usr/local/apache2/etc/extra/httpd-ssl.conf
    <VirtualHost _default_:443>
    DocumentRoot "/usr/local/apache2/htdocs"
    ServerName www.typechoblog.com
    ServerAdmin you@example.com
    ErrorLog "/usr/local/apache2/logs/type_ssl_error_log"
    TransferLog "/usr/local/apache2/logs/type_ssl_access_log"
    SSLCertificateFile "/usr/local/apache2/etc/ssl/blog.crt"
    SSLCertificateKeyFile "/usr/local/apache2/etc/ssl/blog.key"

#开启调用mod_socache_shmcb模块
[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf
    LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

​ 4.重启验证

shell 复制代码
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start

​ 5.强制跳转(只允许https访问,不允许http访问)

shell 复制代码
[root@localhost ~]# vim /usr/local/apache2/htdocs/typecho/.htaccess
    RewriteEngine on						#开启转发规则
    RewriteCond %{SERVER_PORT} !^443$		#检查访问端口只要目标不是443的
    RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [R=301,L]	#301永久跳转,302临时跳转,  L:当前行规则执行完,不在继续执行新的规则
#当使用旧域名访问时,规则会自动跳转到加密的新域名来访问
#若不是通过旧域名访问,会自动跳转到下一条规则
#若不是通过443端口进行访问,那么规则会自动添加https协议使其通过,如果是443端口,则继续使用原域名访问

#重启验证
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
实验6:apache日志轮替

实验需求: 设置成(每小时|每天|每周|每月)一个日志文件

实验步骤

​ 1.设置博客的ssl错误记录和博客的ssl访问记录

shell 复制代码
[root@localhost ssl]# vim /usr/local/apache2/etc/extra/httpd-ssl.conf
	ErrorLog "/usr/local/apache2/logs/type_ssl_error_log"
	TransferLog "/usr/local/apache2/logs/type_ssl_access_log"

​ 2.设置apache分割

shell 复制代码
[root@localhost ssl]# vim /usr/local/apache2/etc/extra/httpd-ssl.conf
#错误日志
ErrorLog "/usr/local/apache2/logs/type_ssl_error_log"
#访问日志
TransferLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/type_ssl_access_%Y%m%d.log 86400"

​ 3.重启服务并验证

shell 复制代码
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
实验7:不记录指定文件类型的日志

实验需求:当一个网站访问量特别大,访问日志就很多,通常是图片、html、css比较占资源,通过配置忽略、不记录一些不必要的日志文件

实验步骤

​ 配置日志不记录图片的访问

shell 复制代码
vim /usr/local/apache2/etc/httpd.conf
    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
    CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combined env=!image-request

#将指定的文件标记成image-request,然后在访问日志记录后面加上env=!image-request,表示每次日志轮替的时候都会过滤这些image-request标记好的文件

#重启验证
实验8:apache配置静态缓存

实验需求:为了提高用户访问速度,只有进行第一次访问加载网站是调用网站服务器,第二次在加载,是调用本地电脑缓存

实验步骤

1、配置静态缓存

shell 复制代码
vim /usr/local/apache2/etc/httpd.conf
<IfModule mod_expires.c>		#此模块默认未启用,请手动启用
  ExpiresActive on
  ExpiresByType image/gif "access plus 1 days"
  ExpiresByType image/jpeg "access plus 24 hours"
  ExpiresByType image/png "access plus 24 hours"
  ExpiresByType text/css "now plus 2 hours"
  ExpiresByType application/x-javascript "now plus 2 hours"
  ExpiresByType application/javascript "now plus 2 hours"
  ExpiresByType application/x-shockwave-flash "now plus 2 hours"
  ExpiresDefault "now plus 0 min"
</IfModule>

#或者使用 mod_headers 模块实现:该模块默认启用
<IfModule mod_headers.c>
  #htm,html,txt 类的文件缓存一个小时
  <filesmatch "\.(html|htm|txt)$">
     header set cache-control "max-age=3600"
  </filesmatch>
  #css, js, swf 类的文件缓存一个星期
  <filesmatch "\.(css|js|swf)$">
     header set cache-control "max-age=604800"
  </filesmatch>
  #jpg,gif,jpeg,png,ico,flv,pdf 等文件缓存一年
  <filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">
     header set cache-control "max-age=29030400"
  </filesmatch>
</IfModule>

说明: 上面使用的是mod_expires,而下面用的是 mod_headers,要想使用这些模块,必须要事先已经支持。如何查看是否支持,使用命令: /usr/local/apache2/bin/apachectl -M | grep mod_expires

2、重启服务器并验证

shell 复制代码
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
#验证:
curl  'http://www.typechoblog.com/image/a.jpg' -I
HTTP/1.1 200 OK
Date: Wed, 26 Oct 2016 03:51:26 GMT
Server: Apache/2.2.31 (Unix) PHP/5.5.38
Last-Modified: Tue, 31 May 2016 03:08:36 GMT
ETag: "46891b-16b-5341ab0597500"
Accept-Ranges: bytes
Content-Length: 363
Cache-Control: max-age=86400
Expires: Thu, 27 Oct 2016 03:51:26 GMT
Content-Type: image/jpg
实验9:禁止解析php

实验需求:做网站安全的时候,比如上传某些文件,避免上传的文件有木马或者遭到黑客攻击的时候,就可以执行禁止解析php

实验步骤

shell 复制代码
vim /usr/local/apache2/etc/httpd.conf
#配置禁止解析php
<Directory /usr/local/apache2/htdocs/data>
    php_admin_flag engine off 
    <filesmatch "(.*)\.php$">
        Order deny,allow
        Deny from all 
    </filesmatch>
</Directory>
#重启验证
相关推荐
Arenaschi3 分钟前
在Tomcat中部署应用时,如何通过域名访问而不加端口号
运维·服务器
小张认为的测试3 分钟前
Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表
linux·服务器·测试工具·自动化·php·excel·压力测试
waicsdn_haha11 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
打鱼又晒网11 分钟前
linux网络套接字 | 深度解析守护进程 | 实现tcp服务守护进程化
linux·网络协议·计算机网络·tcp
web1478621072314 分钟前
C# .Net Web 路由相关配置
前端·c#·.net
m0_7482478015 分钟前
Flutter Intl包使用指南:实现国际化和本地化
前端·javascript·flutter
飞的肖19 分钟前
前端使用 Element Plus架构vue3.0实现图片拖拉拽,后等比压缩,上传到Spring Boot后端
前端·spring boot·架构
良许Linux25 分钟前
0.96寸OLED显示屏详解
linux·服务器·后端·互联网
青灯文案126 分钟前
前端 HTTP 请求由 Nginx 反向代理和 API 网关到后端服务的流程
前端·nginx·http
m0_7482548831 分钟前
DataX3.0+DataX-Web部署分布式可视化ETL系统
前端·分布式·etl