Mutex 指令
描述: | 为所有或指定的互斥配置互斥机制并锁定文件目录 |
---|---|
句法: | Mutex mechanism[default|mutex-name]...[OmitPID] |
默认: | Mutex default |
内容: | 服务器配置 |
状态: | 核心 |
模组: | 核心 |
兼容性: | 在Apache HTTP Server 2.3.4和更高版本中可用 |
该Mutex
指令设置httpd和模块用来序列化对资源的访问的机制以及锁定文件的位置(可选)。指定default
作为第二个参数来更改所有互斥锁的设置。指定互斥量名称(请参见下表)作为第二个参数,以仅覆盖该互斥量的默认值。
该Mutex
指令通常在以下特殊情况下使用:
- 当APR选择的默认机制出现功能或性能问题时,更改互斥机制
- 当默认目录不支持锁定时,更改基于文件的互斥对象使用的目录
支持的模块
该伪指令仅配置已使用ap_mutex_register()
API 在核心服务器上注册的互斥锁。与httpd捆绑在一起的所有模块均支持该Mutex
指令,但第三方模块可能不支持。请查阅第三方模块的文档,该文档必须指示如果支持此伪指令可以配置的互斥量名称。
可以使用以下互斥机制:
default | yes
这将选择由APR确定的默认锁定实现。通过
httpd
使用该-V
选项可以显示默认的锁定实现。none | no
这有效地禁用了互斥锁,并且只有在模块指示这是一个有效的选择时才允许该互斥锁。有关更多信息,请查阅模块文档。
posixsem
这是基于Posix信号量的互斥体变体。
警告
如果进程中的某个线程持有互斥段错误,则信号所有权将无法恢复,从而导致Web服务器挂起。
sysvsem
这是基于SystemV IPC信号量的互斥体变体。
警告
如果进程在删除信号之前崩溃,则有可能“泄漏” SysV信号。
安全
信号量API允许任何在与Web服务器相同的uid下运行的CGI(即,所有CGI,除非您使用诸如
suexec
或cgiwrapper
)来拒绝服务攻击。sem
这将选择“最佳”可用信号量实现,并按此顺序在Posix和SystemV IPC信号量之间进行选择。
pthread
这是基于跨进程Posix线程互斥量的互斥体变体。
警告
在大多数系统上,如果子进程在持有使用此实现的互斥锁的同时异常终止,则服务器将死锁并停止响应请求。发生这种情况时,服务器将需要手动重启才能恢复。
Solaris和Linux是显着的例外,因为它们提供了一种机制,该机制通常允许子进程在持有互斥锁异常终止后恢复互斥锁。
如果您的系统兼容POSIX或实现了该
pthread_mutexattr_setrobust_np()
功能,则可以pthread
安全地使用该选件。fcntl:/path/to/mutex
这是互斥体的变体,其中物理(锁定)文件和
fcntl()
函数用作互斥体。警告
如果在多线程,多进程环境中使用基于此机制的多个互斥锁,则
fcntl()
对于不知道线程的有效互斥锁操作,可以报告死锁错误(EDEADLK),例如在Solaris上。flock:/path/to/mutex
这类似于该
fcntl:/path/to/mutex
方法,不同之处在于该flock()
函数用于提供文件锁定。file:/path/to/mutex
这将选择“最佳”可用文件锁定实现,
fcntl
并在和之间flock
按该顺序进行选择。
大多数机制仅在基础平台和APR支持的选定平台上可用。并非在所有平台上都可用的机制是posixsem,sysvsem,sem,pthread,fcntl,flock和file。
使用基于文件的机制fcntl和flock,该路径(如果提供)是将在其中创建锁定文件的目录。默认目录是httpd相对于的运行时文件目录ServerRoot
。始终将本地磁盘文件系统用于/path/to/mutex
NFS或AFS文件系统上的目录,而切勿使用。文件的基本名称将是互斥体类型,模块提供的可选实例字符串,并且除非OmitPID
指定了关键字,否则将附加httpd父进程的进程ID以使文件名唯一,从而避免在多个httpd时发生冲突。实例共享一个锁文件目录。例如,如果互斥名称为mpm-accept
且锁定文件目录为/var/httpd/locks
,父进程ID为12345的httpd实例的锁定文件名将为/var/httpd/locks/mpm-accept.12345
。
安全最好避免将互斥文件放在世界可写的目录中,例如,
/var/tmp
因为有人可能会创建拒绝服务攻击,并通过创建与服务器尝试创建的文件具有相同名称的锁文件来阻止服务器启动。
下表记录了httpd和捆绑的模块使用的互斥锁的名称。
互斥体名称 | 模组 | 受保护的资源 |
---|---|---|
mpm-accept | prefork 和worker MPM | 传入的连接,以避免打雷的牧群问题;有关更多信息,请参考性能调整文档。 |
authdigest-client | mod_auth_digest | 共享内存中的客户端列表 |
authdigest-opaque | mod_auth_digest | 共享内存中的计数器 |
ldap-cache | mod_ldap | LDAP结果缓存 |
rewrite-map | mod_rewrite | 与外部映射程序进行通信,以避免来自多个请求的混合I / O |
ssl-cache | mod_ssl | SSL会话缓存 |
ssl-stapling | mod_ssl | OCSP装订响应缓存 |
watchdog-callback | mod_watchdog | 特定客户端模块的回调函数 |
该OmitPID
关键字抑制除了从锁定的文件名的httpd父进程ID的。
在以下示例中,MPM接受互斥的互斥机制将从默认编译更改为fcntl
,并在directory中创建了关联的锁定文件/var/httpd/locks
。所有其他互斥锁的互斥锁机制将从默认编译为sysvsem
。
Mutex sysvsem default Mutex fcntl:/var/httpd/locks mpm-accept