欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Apache学习

程序员文章站 2022-06-26 11:34:31
...

一、背景

最近想用php写一个数据展示的小项目用于平时的工作,然后就想使用集成环境phpstudy(自己懒,嫌配置apache、mysql、php有点麻烦),但是在启动phpstudy的时候却一直报错“[mpm_winnt:crit] [pid 1248:tid 392] AH02538: Child: Parent process exited abruptly. Child process is ending”

我一脸懵逼,之前使用phpstudy都是挺好的,这次为什么主进程会被自动kill掉呢?(apache主进程pid保存在文件logs/httpd.pid中,该pid用于识别主进程),然后开始了慢慢分析:主进程被kill了,说明apache在加载配置的时候失败,对于apache的配置文件,我只绑定过虚拟域名,所以开始查看conf/vhost.conf文件中关于虚拟域名的配置:

Apache学习

然而粗心的我并没发现其中的配置有问题,还以为是apache在加载vhost.conf的时候和其他配置文件有冲突导致的主进程自己被kill掉了(脑回路比较大).由此,开始了apache的小小的学习之路,在这里记录一下。


二、Apache httpd.conf配置文件参数说明

ServerRoot : Apache的主目录

Listen:apache监听的端口号

LoadModule:加载动态模块

User/Group:apache进程执行者

ServerAdmin:服务器返回客户端的错误信息中会包含该邮件地址,所以推荐写邮箱地址

ServerName:服务器域名,无需配置

DocumentRoot:网站根目录(apache运行项目的根地址)

Apache学习

Option指令是Apache配置文件中比较常见的指令,该指令可以在Apache服务器核心配置(server config)、虚拟主机配置(virtual host)、特定目录配置(directory)以及.htaccess文件中使用,该指令主要作用是控制特定目录启动哪些服务器特性

Options +Indexes :加上该指令可以在网页上查看项目某个目录下的所有文件,例如访问/index 等同访问 index.php或index.html

Options +FollowSymLinks:服务器允许在此目录中使用符号链接。如果该配置项位于<Location>配置段中,将会被忽略掉

Options +All:默认设置,开启除MultiViews之外的特性

Options +None:不启动任何服务器特性

Options +ExceCGI:允许使用mod_cgi木块执行CGI脚本

Options +MultiViews:允许使用mod_negotiation模块提供内容协商的“多重视图”,即自动选择最匹配客户端要求的文件

Options +SymLInksIfOwnerMatch:只有当符号连接和符号连接指向的目标文件或目录的所有者是同一用户时,才会使用符号连接。如果该配置选项位于<Location>配置段中,将会被忽略

Options +includes:允许使用mod_include模块提供的服务器端包含功能

“+”的选项将强制覆盖当前的可选项设置

“-”的选项将强制从当前可选项设置中除去

Allow from all

Require all granted :允许所有有权限的人访问apache的运行目录

AllowOverride None/all:禁止(允许)用户对目录配置文件(.htaccess)修改,不建议开启

Order allow,deny :apache会按照Order中的最后一条规则为准,如果allow all 但是deny 某个ip,最后会deny 某个ip

<IfModule>容器作用于模块,如果该模块载入的话就会执行里面的内容

DirectoryIndex index.html index.php :#优先级从左往右一次递减(会优先访问index.html)

<Files >:提供基于文件名的访问控制. 该段将根据他们在配置文件中出现的顺序被处理:在<directory>段和.htaccess文件被处理之后,但是在<Location>段之前,<Files>能嵌入到<Directory>段中来限制作用的文件范围。也可以用于.htaccess文件中,允许用户在文件层面上控制对文件的访问

Apache学习

上面一行是错误日志的存放位置

下面一行是分割日志的操作

Apache学习

LogLevel :用于调整记录在错误日志中的信息的详细程度:

emerg:紧急(系统无法使用)

alert:必须立即采取措施

crit:致命情况

error:错误情况

warn:警告情况

notice:一般重要情况

info:普通信息

debug:调试信息

(当指定了某个级别的时候,高于它级别的信息会被记录)

LogFormat:定义文件的记录方式,其中各个代表的指令如下:

Apache学习

ErrorDocument:批示当遇到错误的时候服务器将返回客户端什么样的回答,例如

ErrorDocument 404 /missing.html

当服务器返回的错误码是404的时候,服务器返回客户端这个missing.html页面

EnableMMAP:指示httpd在递送中如果读取一个文件的内容,是否可以使用内存映射(会带来性能的提高,有时会有问题)

EnableSendfile:控制httpd是否可以使用操作系统内核的sendfile支持来将该文件发送到客户端(sendfile机制避免了分开的读和写操作以及缓冲区分配,但是在一些平台上会引发问题)

Include : 在服务器配置文件中引入其他的配置文件

*****写apache配置时,千万不能出现拼写错误,不然服务器会一直重启失败的******

ps:当我写下这句话的时候,我突然意识到一定是我的vhost.conf文件配置错了,想想都觉得搞笑......


三、问题解决

后来又重新去看了下vhost.conf文件,发现是DocumentRoot后面的地址我多加了一个\导致apache一直启动失败....内心一万个

顺便在这里记录下在使用phpstudy遇到的其他问题

1.报错:Parse error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in

解决:需要升级php的使用版本(建议至少使用5.6的版本)

2.


四、浅谈apache工作模式

1.perfork模式

常见配置如下:

<IfModule mpm_prefork_module>

StartServers 5

MinSpareServers 5

MaxSpareServers 10

MaxClients 150

MaxRequestsPerChild 0

</IfModule>

StartServers : 当开启apache时开启的子进程数

MinSpareServers: 服务器中最小数量的空闲进程数

MaxSpareServers: 服务器中最大数量的空闲进程数

MaxClients: apache能同时并发处理的最大请求

MaxRequestsPerChild: 每个子进程能处理的最大请求数(0表示无限,即一直不死亡)

当使用apache的perfork模式的时候,apache会开启$startServers个进程,接着apache的空闲进程数会保持在$MinSpareServers和$MaxSpareServers之间,当站点负载比较高的时候,可以考虑同时增大这两个值来提高apache服务的性能;另外,MaxClients是apache能同时处理的最大请求,之前在某段时间,gerrit在晚上十点后经常卡住,那个时候设置的MaxClients数是56,后来将这个值增加为102(具体设置和当时的DB能相应的请求有关),理论上这个值越大越好,但是apache默认的限制是256,适当增加这个值也能提高性能;$MaxRequestsPerChild看上面的介绍就行了

***profork是单一线程的进程,所以每个进程在同一时间里仅能处理一个请求(也就是一个请求一个进程)******该模式比较吃资源,对于内存的使用比较大;但优点是比较稳定***

2.work模式

常见配置如下:

<IfModule mpm_worker_module>

StartServers 2

MaxClients 150

MinSpareThreads 25

MaxSpareThreads 75

ThreadsPerChild 25

MaxRequestsPerChild 0

</IfModule>

StartServers: 当开启apache服务时产生的子进程数

MaxClients: 最大数量的工作线程数量

MinSpareThreads: 最小数量的空闲线程数

MaxSpareThreads: 最大数量的空闲线程数

ThreadsPerChild: 每个子进程能产生的线程数量

MaxRequestsPerChild: 每个子进程能处理的最大请求数(0表示无限,即一直不死亡)

当使用apache的work模式的时候,apache会开启$startServers个进程,该值的最大缺省值是16,加大时 也需要显式声明ServerLimit(最大值是20000).接着每个进程会产生$ThreadsPerChild个线程,当现有的线程数无法承受负载时,控制进程将产生新的子进程.$MinSpareThreads和$MaxSpareThreads的值对apache的性能影响并不大,因此可以适当调整一下就好.在此模式下,对apache性能影响比较大的是$ThreadsPerChild,默认最大缺省值是64,如果64不够用,这时要显式使用 ThreadLimit指令,它的最大缺省值是20000;

*** worker是一种基于线程的模型,一个进程内部可以启动N个线程(最大20000个),每个线程处理一个客户请求。理论上线程的开销要小于进程,但是由于Linux本身对多线程特性的支持并不是太好,所以可能会导致多线程程序运行出问题的几率比单线程程序要大的多,而且一旦一个线程出现问题,可能会导致整个进程出现问题。***

3.event模式

event模型是一个基于线程的、更高级的事件驱动模型,可以实现一个线程处理N个请求

***在apache的早期版本2.0默认prefork,2.2版本是worker,2.4版本是event.***


五、Apache性能提升

这个之后再更新,对于apache源码的学习应该不会进行了,因为不太想去学习C.

 

 

 

如果文章有错误,欢迎指出。

原文地址:https://zhuanlan.zhihu.com/p/40587123