web平台—apache
- 1. 学apache前需要知道的知识点
- 2. apache详解
- 2.1 概述
- 2.2 工作模式
- 2.3 启动apache网站整体流程
- 2.4 相关文件保存位置
- 2.5 配置文件详解
- 3. apache配置实验
- 实验1:设置apache的目录别名
- 实验2:apache的用户认证
- 实验3:虚拟主机 (重点)
- 实验4:域名跳转(重点)
- 实验5:apache+openssl实现https(重点)
- 实验6:apache日志轮替
- 实验7:不记录指定文件类型的日志
- 实验8:apache配置静态缓存
- 实验9:禁止解析php
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
apache启动之前就已经预先fork(在apache中是创建)一些子进程,等待请求进来。做这样的原因就是为了减少频繁创建进程和销毁进程。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
------------------------------------------------------------------
优点:这种模式相对来说是成熟稳定,可以兼容所有新老项目,是这几个模式最安全的
缺点:一个进程长期不销毁会占用更多的系统资源,消耗更多的内存。也不支持高并发请求
采用多进程和多线程模式混合。
这个也是预先创建几个子进程,然后每个子进程创建了监听线程和工作线程。
当每个用户在请求的时候,会被分配到一个线程来服务。
线程比进程更加轻量,线程是会共享父进程的内存空间,内存负重也会减少一些。
它比prefork更适合高并发的场景下
----------------------------------------------------------------
优点:每个线程占据了更少的内存,总体内存利用率提高了,高并发下表现更优秀。
缺点:必须考虑线程安全的问题。
它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。HTTP采用keepalive方式减少TCP连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁忙的服务器会消耗完所有的线程。Event MPM是解决这个问题的一种新模型,它把工作进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限制,此时Event MPM方式是最有效的。
在apache中什么是keep-alive场景
在Apache中,keep-alive场景是指当HTTP请求和响应在单个TCP连接上进行多次传输时的情况。这种情况下,客户端和服务器之间的TCP连接在请求完成后不会立即关闭,而是保持打开状态,以便后续请求可以继续在该连接上进行传输。
-----------------------------------------------------------------
具体来说,keep-alive场景的特点和优势包括:1.减少TCP连接建立和关闭的开销:对于每个HTTP请求,如果都需要建立一个新的TCP连接,那么在网络传输和服务器资源消耗上都会带来额外的开销。而keep-alive允许在同一个TCP连接上进行多次请求和响应,从而减少了这种开销。2.提高性能和响应速度:由于减少了TCP连接的建立和关闭,服务器可以更快速地响应客户端的请求。此外,在包含大量图片的HTML文档中,使用keep-alive可以显著提高加载速度,减少等待时间。
查看方式:
httpd -V | grep -i "server mpm"指定方式:
在编译时,在选项中指定,--with-mpm=xxx
./configure --help | grep mpm
2.3 启动apache网站整体流程
2.4 相关文件保存位置
配置文件位置
源码包安装: 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/
网页文件位置
源码包安装: PREFIX/htdocs/ rpm包安装: /var/www/html/
日志文件位置
源码包安装: PREFIX/logs/ rpm包安装: /var/log/httpd/
2.5 配置文件详解
针对主机环境的基本配置参数
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 #子配置文件中内容也会加载生效
主页目录即权限
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三种方法实现资源共享
1.将目录声明为默认网页目录:Document 2.软连接:FollowSymLinks 3.目录别名:alias_module 注意:不管哪种方式将目录作为网页共享目录,都要使用<Directory /dir>声明该目录的权限
3. apache配置实验
实验1:设置apache的目录别名
实验需求:如果想将一个不在DocumentRoot目录中的文件共享到网站上,并能够让它们留在本来位置而不需要进行移动的话,处理这种情况可以通过建立别名的方式将URL指向特定的目录
编辑主配置文件
[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf
编辑子配置文件
[root@localhost ~]# vim /usr/local/apache2/etc/extra/httpd-autoindex.conf
实验2:apache的用户认证
实验需求:一般情况下网站都是有一个管理后台的网页,而且管理后台就有密码,为了更加安全,可以添加用户认证
1.编辑主配置文件
vim /usr/local/apache2/etc/httpd.conf
2.指定目录下创建权限文件
cd /usr/local/apache2/htdocs/typecho/admin
#切换该目录下创建.htaccess,并添加以下内容
3.建立密码文件,加入允许访问的用户(这个用户和系统用户无关)
#建立密码文件,只有添加第一个用户时,采用-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服务
/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.修改主配置文件开启文件关联
[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf
2.编辑子配置文件,编写虚拟主机标签
[root@localhost htdocs]# vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
3.重启服务,验证结果
[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.开启重写模块
[root@localhost htdocs]# vim /usr/local/apache2/etc/httpd.conf #打开重写模块 LoadModule rewrite_module modules/mod_rewrite.so
2.修改虚拟主机配置文件
<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 AllRequire all granted </Directory> <VirtualHost 192.168.99.135:80>ServerAdmin luntan@discurz.comDocumentRoot "/usr/local/apache2/htdocs/discurz/"ServerName www.discurz.comServerAlias discurz.lcy.comErrorLog "logs/tan-error.log"CustomLog "logs/tan-access_log" common </VirtualHost>
3.创建规则匹配文件
[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.重启服务器并测试
/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启动
模块存放目录:/usr/local/apache2/modules
检查模块是否启用:[root@localhost modules]# /usr/local/apache2/bin/apachectl -M | grep ssl
实验步骤:
1.开启ssl模块功能
[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf
LoadModule ssl_module modules/mod_ssl.so #取消注释
Include etc/extra/httpd-ssl.conf #取消注释
2.ca证书申请
[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子配置文件
[root@localhost ~]# vim /usr/local/apache2/etc/extra/httpd-ssl.conf<VirtualHost _default_:443>DocumentRoot "/usr/local/apache2/htdocs"ServerName www.typechoblog.comServerAdmin you@example.comErrorLog "/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.confLoadModule socache_shmcb_module modules/mod_socache_shmcb.so
4.重启验证
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
5.强制跳转(只允许https访问,不允许http访问)
[root@localhost ~]# vim /usr/local/apache2/htdocs/typecho/.htaccessRewriteEngine 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访问记录
[root@localhost ssl]# vim /usr/local/apache2/etc/extra/httpd-ssl.confErrorLog "/usr/local/apache2/logs/type_ssl_error_log"TransferLog "/usr/local/apache2/logs/type_ssl_access_log"
2.设置apache分割
[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.重启服务并验证
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
实验7:不记录指定文件类型的日志
实验需求:当一个网站访问量特别大,访问日志就很多,通常是图片、html、css比较占资源,通过配置忽略、不记录一些不必要的日志文件
实验步骤:
配置日志不记录图片的访问
vim /usr/local/apache2/etc/httpd.confSetEnvIf Request_URI ".*\.gif$" image-requestSetEnvIf Request_URI ".*\.jpg$" image-requestSetEnvIf Request_URI ".*\.png$" image-requestSetEnvIf Request_URI ".*\.bmp$" image-requestSetEnvIf Request_URI ".*\.swf$" image-requestSetEnvIf Request_URI ".*\.js$" image-requestSetEnvIf Request_URI ".*\.css$" image-requestCustomLog "|/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、配置静态缓存
vim /usr/local/apache2/etc/httpd.conf
<IfModule mod_expires.c> #此模块默认未启用,请手动启用ExpiresActive onExpiresByType 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、重启服务器并验证
/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
实验步骤:
vim /usr/local/apache2/etc/httpd.conf
#配置禁止解析php
<Directory /usr/local/apache2/htdocs/data>php_admin_flag engine off <filesmatch "(.*)\.php$">Order deny,allowDeny from all </filesmatch>
</Directory>
#重启验证