Apache相关知识与配置

Web服务器--Apache

  1. Apache是进行传输超文本的媒介,Html ,超文本是指页面内包含图片,链接甚至音乐,程序等非文本元素。传输超文本的协议叫超文本传输协议,httphttp使用统一资源定位符URL来建立连接和传输数据。URI,统一资源标志符,但是更宽泛,包含URL
  2. Apache概述与工作模式

概述: 世界第一使用量的web服务器软件,可以运行在几乎所有计算机平台。快速可靠,通过简单的API扩充将各种解释器编译到服务器中。不适合多处理器环境,进程消耗比线程多。

处理流程: 守护进程->工作进程->产生线程(处理请求)

客户端通过随机端口连接到Apache80端口,服务器开启线程进程请求处理,匹配用户的请求是动态还是静态的:

静态 服务器直接回传页面给客户端(html

动态 需要解析器,服务器找到PHP处理后的页面回传给客户端。(是否需要连接数据库)

Apache工作模式: 3种稳定的MPM模式(MPM:多进程处理模块)分别是:

preforkworkerevent

prefork工作模式:

Apache在启动之前,就预先fork一些子进程,然后等待请求进来、之所以这样做。是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点,只能处理一个请求。

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

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

worker 工作模式:

使用多进程和多线程的混合模式。它也预先fork一些子进程(数量少),然后每个子进程创建一些线程,包括一个监听线程。该监听线程监听接入请求并将其传递给服务线程处理和应答。线程相比进程更轻量,消耗资源更少。因为线程通常会共享父进程的内存空间,所以占用资源更少。在高并发的场景下,相比prefork有更多的可用线程,处理能力会更强。

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

缺点: 必须考虑线程安全问题,一个线程死亡,整个线程所在的子进程上所有线程都会死亡

event 工作模式:

worker模式类似,最大的区别在于,解决了keep-alive(早期http申请资源需要不停地进行TCP连接与断开,浪费资源。所以有了keep-alivekeep-alive设置了keepalive_timeout,会在http守护进程发送完一个响应后等待一个keepalive_timeout时间,超过时间才会断开。但是长时间的使用等待可能会更加浪费资源)长时间占用线程的浪费问题,有一个专门的线程来管理这些keep-alive类型的线程增强高并发下的请求处理能力。

查看方式: http -V | grep -i “server mpm” 

指定方式: 在编译时指定选项 --with-mpm=xxx

  3.Apache的配置详解

开始配置:

1. 安装

[root@apache ~]# yum install -y httpd httpd-manual

[root@apache ~]# rpm -ql httpd

/etc/httpd/conf.d/autoindex.conf

/etc/httpd/conf.d/userdir.conf

/etc/httpd/conf.d/welcome.conf

/etc/httpd/conf.modules.d

/etc/httpd/conf.modules.d/00-base.conf

/etc/httpd/conf.modules.d/00-dav.conf

/etc/httpd/conf.modules.d/00-lua.conf

/etc/httpd/conf.modules.d/00-mpm.conf

/etc/httpd/conf.modules.d/00-proxy.conf

/etc/httpd/conf.modules.d/00-systemd.conf

/etc/httpd/conf.modules.d/01-cgi.conf

子配置文件

/etc/httpd/conf/httpd.conf

主配置文件

日志

/var/log/httpd/

错误日志:记录apache-server出过哪些错误

访问日志:记录哪些客户端访问过当前的web-server

/etc/logrotate.d/httpd

日志轮转

/var/log/httpd/*log {

    missingok

    notifempty

    sharedscripts

    delaycompress

    postrotate

        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true

## 重新加载apache的配置文件

## 正确输出和错误输出全部进入黑洞文件

## ||  前面的命令执行失败,执行后面的命令

&& 前面的命令执行成功,执行后面的命令

## true 永远返回一个真值

面试题:为什么要做这个操作?

日志文件轮转以后,旧文件的inode没有变化,如果不重新加载配置文件,新的日志依然写入旧的日志文件,轮转失效。

    endscript

}

/usr/lib64/httpd/modules

##apache的模块

/usr/share/doc/httpd-2.4.6

##配置帮助

/var/www

##页面发布目录

[root@apache ~]# systemctl start httpd

浏览器访问:http://172.16.0.31/manual/

[root@apache ~]# grep "apache" /etc/passwd

apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

2. 解读配置文件

[root@apache /etc/httpd/conf]# vim httpd.conf

##目录容器,定义一个访问的虚拟路径

<Directory /> ##没有""包起来,这是虚拟路径

    AllowOverride none

    Require all denied

</Directory>

DocumentRoot "/var/www/html"

##定义默认的访问路径

<Directory "/var/www"> ##""包起来的,实体路径

    AllowOverride None

    # Allow open access:

    Require all granted

</Directory>

<Directory "/var/www/html">

    Options Indexes FollowSymLinks

##目录容器的配置选项

#Indexes 支持索引

#FollowSymLinks 支持软链接

    AllowOverride None

##是否使用验证

#None表示不使用

    Require all granted

##访问控制列表,允许哪些客户端访问本机apache

#all granted 允许所有的客户端访问

</Directory>

(1)安装后,直接启动,访问结果,错误测试页

[root@apache /etc/httpd/conf.d]# vim welcome.conf

<LocationMatch "^/+$">

    Options -Indexes

    ErrorDocument 403 /.noindex.html

</LocationMatch>

<Directory /usr/share/httpd/noindex>

    AllowOverride None

    Require all granted

</Directory>

##测试页,不存在,直接返回403错误

Alias /.noindex.html /usr/share/httpd/noindex/index.html

##访问的页面是 /.noindex.html

# cd /var/www/html/

[root@apache /var/www/html]# ls

[root@apache /var/www/html]# echo "test" > index.html

[root@apache /var/www/html]# cp /etc/passwd .

[root@apache /var/www/html]# cp /etc/group  .

#有默认测试页的情况下,其他文件不能被访问

[root@apache /var/www/html]# rm -f index.html

[root@apache /var/www/html]# ls

group  passwd

[root@apache /etc/httpd/conf.d]# vim welcome.conf

##注释这个文件的所有配置

[root@apache /etc/httpd/conf.d]# systemctl restart httpd

(2)Indexes

展示页面发布目录下的文件

[root@apache /etc/httpd/conf]# vim httpd.conf

    #Options Indexes FollowSymLinks

    Options Indexes

[root@apache /etc/httpd/conf]# systemctl restart httpd

(3)FollowSymLinks

在页面展示目录下,是否支持软链接

[root@apache /var/www/html]# ln -s /etc/fstab .

[root@apache /var/www/html]# ll

total 8

lrwxrwxrwx 1 root root   10 Aug 14 14:35 fstab -> /etc/fstab

-rw-r--r-- 1 root root  481 Aug 14 14:10 group

-rw-r--r-- 1 root root 1031 Aug 14 14:10 passwd

[root@apache /etc/httpd/conf]# vim httpd.conf

    Options Indexes FollowSymLinks

[root@apache /etc/httpd/conf]# systemctl restart httpd

(4)访问验证

[root@apache /etc/httpd/conf]# vim httpd.conf

    AllowOverride All ##在目录容器里面

AccessFileName .htaccess ##在目录容器外面

<Files ".ht*"> ##文件容器,约束 ".ht" 以.ht开头命名的文件

    Require all denied ##拒绝所有人访问

</Files>

[root@apache /var/www/html]# vim .htaccess

AuthName "access-test" ##验证的名字

AuthType Basic ##验证的类型,基本验证

AuthUserFile "/var/www/html/.htpasswd" ##保存合法用户的文件

Require valid-user ##只有合法的用户才可以访问

[root@apache /var/www/html]# htpasswd -c /var/www/html/.htpasswd h1

-c 创建用户文件

New password:

Re-type new password:

Adding password for user h1

[root@apache /var/www/html]# cat .htpasswd

h1:$apr1$qO3Rhva5$3RgNncMHN2npNWt7CDQVW.

[root@apache /var/www/html]# htpasswd /var/www/html/.htpasswd h2

New password:

Re-type new password:

Adding password for user h2

[root@apache /var/www/html]# cat .htpasswd

h1:$apr1$qO3Rhva5$3RgNncMHN2npNWt7CDQVW.

h2:$apr1$gSEFk0Ia$vLtp05wisooWhrMEfIZZ60

[root@apache /etc/httpd/conf]# systemctl restart httpd

(5)访问控制

Require all granted ##允许所有的客户端访问

Require all denied ##拒绝所有的客户端访问

白名单:允许哪些客户端访问本机的web-server

应用在网站的后台web-server,只允许公司的业务人员访问。

Require all denied

require ip ip地址列表

[root@apache /etc/httpd/conf]# vim httpd.conf

    Require all denied

    Require ip 172.16.0.230AuthName "access-test" ##验证的名字

AuthType Basic ##验证的类型

[root@apache /etc/httpd/conf]# systemctl restart httpd

黑名单:拒绝哪些客户端访问本机的web-server

应用在网站的前台web-server,允许来自互联网的所有用户,拒绝的非法访问。

如何确认用户是非法的?

分析apache的访问日志。

  <RequireAll>

require not ip ip地址列表

Require all granted

  </RequireAll>

[root@apache /etc/httpd/conf]# vim httpd.conf

  <RequireAll>

    Require not ip 172.16.0.230

    Require all granted

  </RequireAll>

[root@apache /etc/httpd/conf]# systemctl restart httpd

--------------------------------------------------------

##定义默认的测试页的文件名

<IfModule dir_module>

    DirectoryIndex index.html

</IfModule>

##访问日志

##定义访问日志的格式

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

    LogFormat "%h %l %u %t \"%r\" %>s %b" common

172.16.0.230 - - [10/Jun/2019:18:44:48 +0800] "GET / HTTP/1.1" 200 690 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)"

172.16.0.230 客户端的IP

- - 两个占位符

[10/Jun/2019:18:44:48 +0800] 访问时间,时区

GET / HTTP/1.1 访问方式,协议

200 状态码

-------------------

web-server的状态码:

1xx 消息

2xx 访问成功

200 OK

3xx 重定向

4xx 客户端错误

5xx 服务器错误

-------------------

690 server给client传输了多大的文件,byte

后面是客户端信息

    TypesConfig /etc/mime.types

##web-server在浏览器上支持的文件格式

猜你喜欢

转载自www.cnblogs.com/plutozzl/p/11355533.html