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>