apache笔记

web服务-apache

一、概述

​ Apche是最流行的web服务器软件之一,由于其跨平台和安全性被广泛使用。

​ 支持ssl技术,支持多个虚拟主机;Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适用于多处理器环境;因此,在为web站点扩充时,通常是增加服务器或扩充集群节点而不是增加处理器

  • html语言:超文本标记语言,超文本就是指页面内可以包含图片、链接、甚至因为、程序等非文字元素

  • http协议:超文本传输协议,使用统一资源标识符(URL)来建立连接和传输数据,基于TCP/IP

  • URL:统一资源定位符,定位网上资源的位置和访问方法,是互联网上标准资源的地址

    ​ 格式:http://www.baidu.com:80/image/a.jpg

配置文件位置:

  • 源码包安装:PREFIX/etc/httpd.conf(主配置文件)

    ​ PREFIX/etc/extra/*.conf(子配置文件)

  • rpm包安装:/etc/httpd/conf/httpd.conf

网页文件位置:

  • 源码包安装:PREFIX/htdocs/
  • rpm包安装:/var/www/html

1.apache简单工作流程

1.客户端通过随机端口连接到apache的80端口

2.服务器开启工作进程处理请求,匹配用户的请求是静态还是动态

静态-----> 服务器直接传回页面给客户端

动态-----> 服务器—>php—>回传解析后的页面给客户端

2.工作模式

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

  • prefork模式

    ​ Apache在启动之初,就预先开启一些子进程,然后等待请求进来(总是保持一些备用的或空闲的子进程用于迎接新的请求);之所以这样做,是为了减少频繁创建和销毁进程的开销;每个子进程只有一个线程,在一个时间点内,只能处理一个请求

优点:成熟稳定,兼容所有新老模块;不需要担心线程安全问题

缺点:一个进程相对占用更多的系统资源,消耗更多的内存;不擅长处理高并发请求

  • worker

    ​ 使用了多进程和多线程的混合模式;也预先开启了几个子进程(数量少),然后每个子进程创建多个线程(包括一个管理线程和多个工作线程);每个请求过来,会被分配到1个线程来服务,线程比起进程会更轻量,因为线程通产会共享父进程的内存空间,因此,占用的内存会少一些;在高并发的场景下,因为比prefork又更多的可用线程,表现会更优秀

优点:占据更少的内存,高并发下表现更优秀

缺点:必须考虑线程安全的问题(当一个进程或线程出现问题,整个进程可能都会出现问题)

  • event

    ​ 和worker模式类似,最大的区别在于,解决了keep-alive场景下,长期被占用的线程资源浪费问题;event模式会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,断开之前的keep-alive线程,让它处理新的这个请求

3.配置文件详解

  • 针对主机环境的基本配置参数
ServerRoot "/usr/local/apache2"						#apache主目录
Listen 0.0.0.0:80									#监听端口
LoadModule php7_module modules/libphp7.so			#加载相关模块
User daemon											#用户
Group daemon										#组
ServerAdmin you@example.com							#管理员邮箱
ServerName localhost:80								#服务器名
ErrorLog "logs/error_log"							#错误日志
CustomLog "logs/access_log" common					#访问日志
DirectoryIndex index.php index.html index.html.var	#默认网页文件名,优先级
Include etc/extra/httpd-vhosts.conf					#包含的子配置文件
  • 主页目录及权限
DocumentRoot "/usr/local/apache2/htdocs"			#网页文件根目录
<Directory "/usr/local/apache2/htdocs">				#定义指定目录的权限
Options Indexes FollowSymLinks						#准许软连接到其他目录
AllowOverride None									#定义是否允许目录下.htaccess文件中的权限生效
Require all granted/denied							#访问控制列表
</Directory>

None:没有任何权限
All:所有权限
Indexes:浏览权限(当此目录下没有默认网页文件时,显示目录内容)

None:*.htaccess种权限不生效
All:文件中所有权限都生效
AuthConfig:文件中,只有网页认证的权限生效

二、服务搭建

1.目录别名

一个apache网站,在不同目录下有不同网站,但在同一个域名下,这时可以配置alias,这与多域名不一样

1.编辑主配置文件

vim etc/httpd.conf
	Include etc/extra/httpd-autoindex.conf

2.修改子配置文件

vim etc/extra/httpd-autoindex.conf
	Alias /icons/ "/usr/local/apache2/icons/"	#目录的结尾要有/
	
<Directory "/usr/local/apache2/icons">			
    Options Indexes MultiViews
    AllowOverride None
    Require all granted
</Directory>

2.用户认证

1.编辑配置文件,在需要进行登录认证的目录标签种加入如下配置

vim extra/httpd-autoindex.conf 
<Directory "/usr/local/apache2/htdocs/admin/">
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

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

vim .htaccess
	AuthName "Welcome to nm"									#提示信息
	AuthType basic												#加密类型
	AuthUserFile /usr/local/apache2/htdoc/admin/apache.passwd	#密码文件
	require valid-user											#允许密码文件中所有用户访问

3.建立密码文件

/usr/local/apache2/bin/htpasswd -c /usr/local/apache2/htdocs/admin/apache.passwd test1

3.虚拟主机

在一个Apache服务器上配置多个虚拟空间,实现一个服务器提供多站点服务,其实就是访问同一个服务器上的不同目录

  • 基于IP的虚拟主机:一台服务器,多个IP,搭建多个站点
  • 基于端口的虚拟主机:一台服务器,一个IP,搭建多个站点,每个网站使用不同端口访问
  • 基于域名的虚拟主机:一台服务器,一个IP,搭建多个站点,每个网站使用不同域名访问

1.准备两个域名,使用本地hosts文件解析

vim /etc/hosts
	127.0.0.1 www.abc.com www.cba.com

2.网站主页目录规划

在/htdocs/目录下分别创建sohu和sina两个目录,并在新建目录内创建index.html

3.修改主配之文件开启文件关联

vim httpd.conf
	Include etc/extra/httpd-vhosts.conf

4.编辑子配置文件

vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
<Directory "/usr/local/apache2/htdocs/sina">
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

<VirtualHost *:80>
    ServerAdmin abc.com
    DocumentRoot "/usr/local/apache2/htdocs/sina"
    ServerName www.abc.com
    ErrorLog "logs/sina-error_log"
    CustomLog "logs/sina-access_log" common
</VirtualHost>

4.域名跳转

当我们变更网站域名,或者申请多个域名指向一个网站的时候,这个时候我们就会用到域名跳转

1.虚拟主机可用正常访问

2.打开主配之文件开启重写模块

LoadModule rewrite_module modules/mod_rewrite.so

3.编辑虚拟主机文件

vim etc/extra/httpd-vhosts.conf
<Directory "/usr/local/apache2/htdocs/sina">
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

<VirtualHost *:80>
    ServerAdmin abc.com
    DocumentRoot "/usr/local/apache2/htdocs/sina"
    ServerName www.abc.com
    ErrorLog "logs/sina-error_log"
    CustomLog "logs/sina-access_log" common
</VirtualHost>

4.编辑.htaccess文件

vim htdocs/sina/.htaccess

RewriteEngine on											#开启rewrite功能
RewriteCond %{HTTP_HOST} ^www.cba.com						#开头内容复制给HTTP_HOST变量
RewriteRule ^(.*)$ http://www.abc.com/$1 [R=permanent,L]

^(.*)$			任何内容
$1 				把.*匹配的内容赋值到$1中
R=permanent		永久重定向301
L				指定该规则为最后一条生效的规则,再向下的不生效

5.https

1.CA证书申请

openssl genrsa -out apache.key 1024

openssl req -new -key apache.key -out apache.csr

openssl x509 -req -days 365 -sha256 -in apache.csr -signkey apache.key -out apache.crt

2.开启ssl模块

vim /usr/local/apache2/etc/httpd.conf
	LoadModule ssl_module modules/mod_ssl.so
	Include etc/extra/httpd-ssl.conf
	
vim /usr/local/apache2/etc/extra/httpd-ssl.conf
	SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
	SSLHonorCipherOrder on
	SSLProtocol all -SSLv3 -SSLv2
	SSLCertificateFile "/usr/local/apache2/cert/apache.crt"
	SSLCertificateKeyFile "/usr/local/apache2/cert/apache.key"

3.编写配置文件

<VirtualHost _default_:443>
    DocumentRoot "/usr/local/apache2/htdocs/"
    ServerName localhost:443
    SSLCertificateFile /usr/local/apache2/cert/apache.crt
    SSLCertificateKeyFile /usr/local/apache2/cert/apache.key
    SSLCertificateChainFile /usr/local/apache2/cert/apache.crt
</VirtualHost>

4.强制跳转https

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

6.日志切割

1.apache的日志记录格式

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

192.168.0.139 - - [24/Jan/2021:12:17:22 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"

%h    远端主机
%l    远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为"On",否则将得到一个"-"。
%u    空白(登录名):用于记录浏览者进行身份验证时提供的名字
%t    请求时间:用方括号包围,而且采用“公用日志格式”或者“标准英文格式”。 时间信息最后的“+0800”表示服务器所处时区位于UTC之后的8小时
%r    方法+资源+协议
%s    状态。对于内部重定向的请求,这个状态指的是原始请求的状态,---%>s则指的是最后请求的状态。
%b    传送的字节数,也就是当没有字节传送时显示'-'而不是0
\"%{Referer}i\" \"%{User-Agent}i\" 是发送到服务器的求情头和Referer链接

2.设置apache日志分割

CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combined

|管道符,意思是把产生的日志交给rotatelogs这个工具
-l的作用是校准市区为UTC,也就是北京时间
86400,单位是秒,正好是一天
combined,是日志记录格式里设置的名称

3.不记录指定文件类型的日志

如果一个网站访问量很大,那么日志就会很多,但有一些访问日志我们可以忽略,比如图片、js、css静态对象

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的定义,比如把gif、jpg等等结尾的全标记上,然后在日志后面取反

7.配置静态缓存

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

方法1:

LoadModule expires_module modules/mod_expires.so

<ifmodule mod_expires.c>
        expiresactive on
        expiresbytype image/png "access plus 1 days"
        expiresbytype image/jpeg "access plus 1 days"
        expiresbytype image/gif "access plus 1 days"
        expiresbytype text/css "access plus 1 days"
</ifmodule>

方法2:

LoadModule headers_module modules/mod_headers.so

<ifmodule mod_headers.c>
        <filesmatch "\.(html|htm|txt)$">
                header set cache-contol "max-age=3600"
        </filesmatch>

         <filesmatch "\.(css|js|swf)$">
                header set cache-contol "max-age=3600"
        </filesmatch>

        <filesmatch "\.(jpg|gif|jpeg|png|pdf)$">
                header set cache-contol "max-age=3600"
        </filesmatch>

</ifmodule>

curl -x192.168.0.165:80 'http://192.168.0.165/aa.html' -I	

8.禁止解析PHP

<Directory /usr/local/apache2/htdocs/>
	php_admin_flag engine off
		<filesmatch "(.*)php">
			order deny,allow
			deny from all
		</filesmatch>
</directory>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值