http协议和httpd

再来看http协议 & Web服务器httpd的初次会面

HTTP协议补充

虽然之前说过一大堆关于Http的东西了, 就是那一堆图解http阅读笔记, 虽然写了三个部分吧, 但是毕竟是很早的时候搞得, 那个时候的认知显然和现在不太一样, 所以这里就再来说一下, 但是不说原理, 补充一些当时没有写的.

来自未来: 之前写的http阅读笔记太垃圾了所以我删掉了 哈哈哈, 推荐直接去看书吧

早期我们的HTTP协议仅仅可以传输html文本, 也就是所谓超文本标记语言. 但是现在可不一样, 我们可以传输音乐, 图片, 视频等等. 这是怎么做的?

其实就是引入了MIME, 这个玩意是来自于邮件的, 为了能够发送不同类型的文件附件, 叫做多用途互联网邮件扩展. 基于这个HTTP就能够发送非文本的数据了.

至于HTTP的工作原理, 之前也说得差不多了. 其实也很简单, 就是HTTP请求和HTTP响应. 报文也主要就是这两种.

最简单的Web资源就是静态的文件, 而还有一些就是动态的资源, 这些资源会先在服务器主机上执行一遍.

那么在这里来提一个问题, 浏览器是怎么显示图片的? 有些浏览器根本就没有图片显示功能啊. 这里其实他是调用外部系统接口(比如Windows内置的图片查看器), 或者一些插件. 根据获得的资源的后缀名或, 编码, MIME 来判断使用什么来打开并且显示他们.

MIME也可以叫做媒体类型: 分为主类型/次类型, 比如:

  • text/html
  • text/plain
  • image/jpeg
  • image/gif

然后我们补充一下HTTP的几个版本更迭吧:

  • HTTP/0.9 原型版本 很多设计缺陷 不支持多媒体
  • HTTP/1.0 支持多媒体, 缓存机制设计存在问题
  • HTTP/1.1 增强了Cache功能
  • HTTP/2.0

Web服务器基础

说到服务器应用, 感觉还是要说一下http的完整请求啊…那就再来一遍吧, 这次我们站在服务器的角度来说.

( * ) 建立或处理连接 : 接受请求或者拒绝请求

( * ) 接受请求 : 就是接受来自网络的请求报文中的对某资源的一次请求的过程.

这里我们稍微多扯扯, 如果一个Web服务器的进程和一个主机的进程正在进行通信, 这个时候又来了一台主机, 他该怎么办呢, 这个处理模型, 也就是并发访问响应模型 (Web I/O结构): 常见的有数种:

单进程I/O结构 , 在没有处理完上一个的请求, 不会处理下一个, 被串行响应, 不能算作并行的结构.

多进程IO结构 , 启动多个进程, 是每个进程响应一个请求. 会造成大量的CPU进程切换, 以及大量的内存消耗.

I/O复用结构, 一个进程响应多个请求.(多线程模型, 生成N个线程(在Linux上几乎和多进程没什么区别). 事件驱动模型)

复用的多进程I/O结构, 启动多个进程, 每个进程响应多个请求.

( * ) 处理请求 : 对请求报文进行解析, 并获取请求的资源以及请求方法等信息

( * ) 访问资源 : 获取请求报文中请求的资源

这些资源通常放置于本地文件系统的某路径下, 此路径也被称为DocRoot, 也就是做根的映射.

web服务器的路径映射方式有多种:
​ (a) docroot

(b) alias别名

(c) 虚拟主机docroot映射

(d) 用户家目录映射

( * ) 构建响应报文 : 显式分类, 魔法分类, 协商分类来标记MIME类型. 或者重定向等

( * ) 发送响应报文

( * ) 记录日志

http服务器程序

先来数数常见的Web服务器程序吧, 最常见的http服务器程序就是: httpd(apache), Nginx, Lighttpd 第三个你可能没有听说过, 其实这也是我第一次听说, 这个玩意是德国开发的, 据说和Nginx的性能不相上下, 但是社区的活跃程度远远比不上Nginx.

上面的这三个服务器都是静态资源服务器, 在不借助组件的情况下, 只能处理静态资源. 除他们之外, 还有一些应用程序服务器, 这些服务器本身就有作为静态资源服务器的能力, 还可以进行动态资源的处理, 比如:IIS; tomcat, jetty, jboss, resin, webshpere, weblogic, oc4j. 最火的应该就是tomcat和jetty了.

httpd, 关于其Apache这个名字是有个历史的. 据说这个应用程序是美国的一个信息部为了开发一个完整的Web服务器软件而召集了很多技术优秀的工程师, 这些工程师在做完项目之后就都散到了各个互联网公司中, 但是由于对自己过去的这一个项目怀有感情, 所以就自发的在网上建立起了这个httpd项目, 大家一起维护, 做优化, 打补丁,打补丁, 一直打补丁. 所以就有人说这个httpd服务器是个: a patchy server == apache. 这也就是apache的名字由来.

后来Apache占用的市场份额越来越大, 于是成立了Apache软件基金会, 也就是ASF.

现在就把目光聚集到今天的主角: httpd身上吧. 先来说说他的几个特性.

httpd

httpd的几个特性:

  • 高度模块化, core + modules
  • 支持DSO(动态共享对象)
  • MPM: 多路处理模块, 实现不同的结构模型
    • prefork: 多进程模型, 每个进程响应一个请求. 一个主进程生成多个子进程, 子进程也被称为工作进程, 每个子进程处理一个用户请求, 即使没有用户请求, 也会预先生成几个空闲线程, 随时等待请求到达, 最大不能超过1024个. 但是这种模型主要是早期所采用的. 现在在高并发场景中几乎不再使用, 因为消耗的时间过长, 效率不高.
    • worker: 多线程模型 ( 多进程生成, 一个进程生成多个线程 ) 一个线程响应一个请求, 对于Linux而言, 这个模型的性能提升倒没有prefork多.
    • event: 事件驱动模型, 一个线程响应多个请求

现在就来看看如何进行httpd的安装和配置吧.

对于CentOS6和CentOS7来说, rpm包安装的httpd版本是不一样的, 在CentOS6上安装的是2.2版本, 而CentOS7上安装得是2.4版本. 一般我们有两种安装方式对嘛, rpm和编译安装. httpd相比其他的程序, 编译安装较为常见, 这是因为rpm安装的可能会缺少我们所希望的功能.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@WWW ~]# rpm -qc httpd
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/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
/etc/httpd/conf/magic
/etc/logrotate.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd

他的主配置文件是/etc/httpd/conf/httpd.conf 以及在/etc/httpd/conf.d/*.conf 的种种子配置文件.

上面的结果是CentOS7上实现的 ,想到版本不一致, 我们还是分版本来说这个吧.

CentOS6上的httpd 2.2

我们再使用rpm来查看一下他的httpd启动程序:

1
2
3
4
5
6
7
[root@localhost ~]# rpm -ql httpd | grep bin
/usr/sbin/apachectl
/usr/sbin/htcacheclean
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
...(omitted)

注意到这里的后缀名, 这就是可以根据具体的业务情况来选择不同模型的 如果是编译的时候只能选择其中一个, 默认选择的是prefork.

而服务脚本所在:

1
2
3
4
5
[root@localhost ~]# ls -l /etc/rc.d/init.d/httpd
-rwxr-xr-x. 1 root root 3371 Dec 9 2011 /etc/rc.d/init.d/httpd
# 该脚本的配置文件是
[root@localhost ~]# ls -l /etc/sysconfig/httpd
-rw-r--r--. 1 root root 947 Feb 9 2010 /etc/sysconfig/httpd

日志文件在:

1
2
[root@localhost ~]# ls -l /var/log/httpd/
total 0

httpd的日志记录有两种: access_log 访问日志 以及 error_log 错误日志

最重要的一个目录当属站点文档目录了: /var/www/html

来看一下他的配置文件的组成:

1
2
3
4
[root@localhost html]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts

一共有三段, 第一段就是全局的配置, 也就是类似日志记录位置, 程序配置等等, 后面两个一般不会一起使用, 一个是定义主服务器的文档根位置等一些设定, 而如果想要一台主机提供多个站点的话, 就需要配置第三个虚拟主机的配置.

默认的配置格式就是: directive value 前者不区分字母大小写, 后者作为路径时, 取决于文件系统.

接下来我们走进配置文件里面看看, 先备份一个:

1
2
[root@localhost conf]# cp httpd.conf{,.bak}
# 有没有感受到bash的神奇力量hhh

接下来就可以放心的进去了:

1
2
3
4
5
6
7
8
9
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, in addition to the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#
#Listen 12.34.56.78:80
Listen 80

这应该是最基本的配置了把, 这个listen指令可以出现多次, 不指定ip就表示所有IP.

另一个常用的配置就是持久连接(Persistent Connection), 建立连接, 每个资源获取完成之后不会断开连接, 而是等待其他的请求完成. 那么如何才断开呢? 首先就是数量的限制: 默认是100个资源, 还有时间限制: 这个可配置(建议不配置的太大, 2s-15s都有的, 对于并发访问较大的网站来说, 这个应该设置的小一点甚至关闭[因为可能会有用户得不到服务]) httpd2.4已经支持毫秒级的配置了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive Off

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15

这些就是持久连接的设置, 如果上面没有启动, 下面的两个参数就不会起到作用.

接下来我们可以做个试验, 使用telnet进行请求:

1
2
3
4
5
6
7
[root@localhost conf]# telnet 192.168.206.132 80
Trying 192.168.206.132...
Connected to 192.168.206.132.
Escape character is '^]'.
GET / HTTP/1.1
Host: 192.168.206.132

接着你就会收到一大堆的文本信息, 这个就是HTTP响应报文:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HTTP/1.1 403 Forbidden
Date: Sat, 19 Aug 2017 00:54:48 GMT
Server: Apache/2.2.15 (CentOS)
Accept-Ranges: bytes
Content-Length: 5039
Connection: close
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<head>
<title>Apache HTTP Server Test Page powered by CentOS</title>
...(omitted)
</body>
</html>
Connection closed by foreign host.

一个请求对应着一个连接, 请求处理完了. 链接就会close掉. 如果这个时候我们把上面的持久连接打开, 就可以持续发送请求, 直到你不动他到超时时间到.

接下来我们说之前说过的MPM, 多路处理模块. 这个其实有十几种, 这是为了满足不同的操作系统, 每个操作系统对于这个的支持是不一样的. 一次编译只能编译一个模块, 而rpm为了不同模式的支持, 就提供了三个二进制的. 默认就是prefork模型. 我们说过httpd的模块是动态的, 所以我们可以查看当前编译进核心的模块有哪些:

1
2
3
4
5
6
[root@localhost conf]# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c

剩余的功能可以动态的加载进去, 我们来查看所有加载的模块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost conf]# httpd -M
Loaded Modules:
core_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
auth_basic_module (shared)
...(omitted)
proxy_http_module (shared)
proxy_ajp_module (shared)
proxy_connect_module (shared)
cache_module (shared)
suexec_module (shared)
disk_cache_module (shared)
cgi_module (shared)
version_module (shared)
dnssd_module (shared)
Syntax OK

如果想要更换使用的httpd模式, 就在脚本文件里进行编辑就好:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost conf]# cat /etc/sysconfig/httpd 
# Configuration file for the httpd service.

#
# The default processing model (MPM) is the process-based
# 'prefork' model. A thread-based model, 'worker', is also
# available, but does not work with some modules (such as PHP).
# The service must be stopped before changing this variable.
#
#HTTPD=/usr/sbin/httpd.worker
HTTPD=/usr/sbin/httpd.XXXX

这样就行了. 重新restart之后就会起效果了.

配置文件里还提供了条件方式装载不同的MPM:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 8 # 子进程数量
MinSpareServers 5 # 最小空闲进程数
MaxSpareServers 20 # 最大空闲进程数
ServerLimit 256 # 为MaxClient提供的最大服务器数量 >= MaxClient
MaxClients 256 # 最大客户端请求
MaxRequestsPerChild 4000 # 子进程的最大处理量
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 4 # 请注意这里 服务器启动时启动的进程数量
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75 # 请注意这里 最大空闲线程
ThreadsPerChild 25 # 请注意这里 每个子进程的线程数 4 * 25 = 100, 但是75 < 100, so kill one child. ( 脑残一般的设定
MaxRequestsPerChild 0
</IfModule>

当然, httpd的命令要随着httpd的启动方式来决定.

httpd还有DSO的支持, 也就是动态的共享对象. 在/usr/lib64/httpd/modules这个目录下 大多数模块都在这里, 这些模块都是可以使用指令模块加载的:

LoadModule <mod_name> <mod_path> 这里的路径是相对于ServerRoot而言的.

可以进配置文件进行查看.

ServerRoot下的模块目录其实就是刚刚说的软件连接:

1
2
[root@localhost conf]# ls  -l /etc/httpd/modules
lrwxrwxrwx. 1 root root 29 Dec 16 2011 /etc/httpd/modules -> ../../usr/lib64/httpd/modules

那么简单看完了配置, 我们来定义server文档页面的路径吧.

DocumentRoot "/var/www/html" 这个就是文档的根, 所以我们在url中的/ 就是这个目录了.

注意一点, 这里的目录的权限是直接影响到用户的访问的.

httpd的访问控制有两种模式 , 一种就是基于文件系统目录结构的, 一种就是基于URL的 .而访问控制机制其实无非就是来源地址, 账号啥的.

我们来试试这个访问控制功能吧

  • Options 定义用户访问此目录下的资源的选项

    • # Possible values for the Options directive are "None", "All",
      # or any combination of:
      #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
      #
      # Note that "MultiViews" must be named *explicitly* --- "Options All"
      # doesn't give it to you.
      #
      # The Options directive is both complicated and important.  Please see
      # http://httpd.apache.org/docs/2.2/mod/core.html#options
      # for more information.
      #
          Options Indexes FollowSymLinks
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28

      * 设置的这两项就是最常见的两项, 一种就是访问根的时候(/), 默认返回的资源(Index). 其实这个选项十分危险, 但是如果是用作下载站之类的话, 这个倒是一个不错的选项. 而FollowSymLinks的意义就是跟踪符号链接, 如果你的目录下有一个符号链接,这个选项会进行跟踪并将其视作连接后的文件.

      * 接着还有一个选项是`AllowOverride` 此选项是说, 是否覆盖当前目录下的.htaccess文件的访问控制. .htaccess可以实现对单个目录的访问控制(一个目录一个隐藏文件.htaccess, 但是这种方式极度消耗资源)

      * 基于来源地址的访问控制机制:

      * Order: 检查次序, 可以理解黑名单和白名单的转换
      * Allow from + IP地址|网络地址{172.16|172.16.0.0|172.16.0.0/16|172.16.0.0/255.255.0.0}|FQDN
      * Deny from

      这些说完了, 我们再来看一下重要的日志, httpd的日志配置选项还是很标准的:

      ```bash
      # ErrorLog: The location of the error log file.
      # If you do not specify an ErrorLog directive within a <VirtualHost>
      # container, error messages relating to that virtual host will be
      # logged here. If you *do* define an error logfile for a <VirtualHost>
      # container, that host's errors will be logged there and not here.
      #
      ErrorLog logs/error_log

      #
      # LogLevel: Control the number of messages logged to the error_log.
      # Possible values include: debug, info, notice, warn, error, crit,
      # alert, emerg.
      #
      LogLevel warn

接着注意到有很多CustomLog但是有很多都被注释了, 只开启了一个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#CustomLog logs/access_log common

#
# If you would like to have separate agent and referer logfiles, uncomment
# the following directives.
#
#CustomLog logs/referer_log referer
#CustomLog logs/agent_log agent

#
# For a single logfile with access, agent, and referer information
# (Combined Logfile Format), use the following directive:
#
CustomLog logs/access_log combined

后面的combined是在定义日志格式的, 你会在上面看到:

1
2
3
4
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

有多种格式, 你也可以来自定义. 日志对于服务器来说非常重要, 因此来看看常见的日志format string:

  • %h remote host 远程主机的IP地址
  • %l 远程的登录名, 一般是空(-)
  • %u 远程登录的用户账号
  • %t 服务端收到请求的时间
  • %r 请求报文的首行信息(method url version)
  • %>s 响应状态码
  • %b 响应报文的大小(不包含首部, 只有主体)
  • %{Referer}i: 请求报文中的”Referer”首部的值

httpd还可以进行别名的设置, 就是说, 当你访问对应的位置的时候, 能够进行别的目录映射 就是这个意思:

DocumentRoot “/www/htdocs”

那么访问: http://yaoxuannn.com/index.html –> /www/htdocs/index.html

如果设置了别名(Alias), 比如:

Alias /bbs/ “/forum/bbs/“

那么访问: http://yaoxuannn.com/bbs/index.php –> /forum/bbs/index.php 了

上面说过了基于来源地址的访问控制, 现在我们来补充一下基于用户的访问控制, 其实这个访问控制方式就是进行我们熟悉的401质询, 请求用户输入账号和密码 关于这个认证的过程就省略了, 因为太简单了. 关于认证类型有两种: 明文(basic)和消息摘要(digest-MD5) 一般还是会选择basic方式, 虽然这么说…现在也没有谁会使用这种认证了.所以不细说了, 直接过一遍过程就行了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost htdocs]# htpasswd -cm /etc/httpd/conf.d/.htpasswd justin
New password:
Re-type new password:
Adding password for user justin
[root@localhost htdocs]# tail /etc/httpd/conf.d/.htpasswd
justin:$apr1$ce77yxIr$GLPzKPK8BOdCpBKAwA0VY0
---------
AuthType Basic
AuthName "Admin"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
Require valid-user

</Directory>
----------

接下来就剩一个虚拟主机的配置了.

对于httpd来说有三种实现方案:

  • 基于IP实现, (不太常用)
  • 基于端口实现, (不常用)
  • 基于主机实现, (使用较多)

其实也可以混合使用. 一般情况下, 我们都会禁用掉中心主机才使用虚拟主机. 一个虚拟主机都有专门的配置:

1
2
3
4
<VirtualHost "IP:PORT">
ServerName
DocumentRoot ""
</VirtualHost>

大多数用于中心主机的配置都可以使用, 配置起来也很简单, 就不说了

curl工具简明使用说明

这个curl可是很有名的, 功能很强大, 支持多种协议, 支持各种HTTP方法, 支持各种认证, 支持管道, 支持代理, 支持断点续传, 甚至支持IPv6.

curl [options][URL...]

他的常用选项有这些:

-A 指定user-agent 设置用户代理

-e 指定referer信息

-H 自定义头部

-I 仅显示响应报文首部信息

最后再说怎么实现httpd的https:

我们在之前的文章中扯过了怎么签发证书, 那么现在实现一个https的服务器就很简单了.

对于rpm安装的httpd, 默认是携带ssl模块的, 所以我们还要先进行安装

1
[root@localhost ssl]# yum install mod_ssl

接着就在/etc/httpd/conf.d/ssl.conf中进行配置就行了.

CentOS7上的httpd 2.4

新特性有哪些呢? 新版本的httpd使MPM支持DSO机制, 这样就不需要进行多次编译以得到不同的模式了, 而是按需加载.

另外支持event MPM, 支持异步读写, 日志级别可以每个目录自定, 表达式分析器得到增强, 支持毫秒级别的keepalive timeout还支持用户自定义变量.

还有增加了一些新模块: 例如proxy_fcgi, ratelimit, remoteip.

另外在配置机制上也有更改, 不再支持Order, Allow, Deny.

在配置文件的分布上, 一共有三个部分:

  • 主配置 /etc/httpd/conf/httpd.conf
  • 模块配置 /etc/httpd/conf.modules.d/*.conf
  • 辅助配置 /etc/httpd/conf.d/*.conf

通过修改模块配置文件来动态改变使用的MPM

1
LoadModule mpm_event_module modules/mod_mpm_event.so

通过注释和解注释来使用不同的模块.

对于控制IP和特定主机的访问控制, 可以使用Require关键字来进行:

Require ip ADDR

Require no ip ADDR

Require host HOSTNAME

Require no host HOSTNAME

但是需要注意的是, 这个访问控制需要放在一个单独的容器中执行. 例如:

1
2
3
4
<RequireAll>
Require not ip 192.168.56.1
Require all granted
</RequireAll>

补充 (2018-09-07)

随便扯一下

在看PHP的相关配置之前, 我们还是先来回忆一下关于LAMP中AMP的概念和一些相关的东西.

首先是我们的客户端通过HTTP协议的请求发送到我们的HTTP服务器, 然后我们的服务器通过CGI协议访问到和后台的应用服务器, 也就/是我们的PHP应用程序. 接着根据我们的应用代码, 通过应用程序的mysql协议或者说是驱动连接到我们后方的mysqld守护进程.

另外我们说httpd支持多种运行模式: prefork, event, worker. 而第一个prefork, 我们所使用的PHP模块叫做libphp5.so. 后面的两个所使用的叫做: libphp5-zts.so.

一般我们都可以通过使用PHP加速器来加速我们的执行过程, 常见的几种PHP加速器有: APC, eAccelerator, Xcache.

就这样随便说一下吧, 接下来就来看看PHP的一些配置吧.

PHP的配置

php的配置文件, 位置在/etc/php.ini/etc/php.d/*.ini.

官方关于配置文件的写法在这里.

需要说明的一个: 配置文件(php.ini)在 PHP 启动时被读取。对于服务器模块版本的 PHP,仅在 web 服务器启动时读取一次。对于 CGI 和 CLI 版本,每次调用都会读取.

在配置文件中, 我们可以进行关于是否启用解释器的设定, 是否使用短标签等等很多配置, 这里我们其实没有必要去了解, 大部分的配置其实都和开发人员所写的程序相关联的, 在这个文件中, 你可以直接指定MySQL链接的相关参数, 例如主机 端口, 用户名, 密码等等, 不过这并不是一个好的idea. 因为任何一个有PHP访问权限的用户, 都可以直接通过get_cfg_var()来获得.

更多比较长的一些配置属性都被丢在了/etc/php.d中, 例如mysql.ini. 里面其实就是配置了一个加载的模块.

对于PHP的配置, 和具体的业务应用程序关联度比较高, 所以还是到需要用的时候再进行查阅吧.