LANMP常用配置.md

httpd 配置

MPM

prefork

  • StartServers # 服务器启动时建立的子进程数量。

  • MinSpareServers # 空闲子进程的最小数量;如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。

  • MaxSpareServers #空闲子进程的最大数量;如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程会杀死多余的子进程。

  • ServerLimit #最大活动进程数。

  • MaxClients #限定服务器同一时间内客户端最大接入的请求数量;任何超过了 MaxClients限制的请求都要进入等待队列,一旦一个个连接被释放,队列中的请求才将得到服务,如果要增大这个数值,必须先增大 ServerLimit。

  • MaxRequestsPerChild #每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。 这里建议设置为非零。

worker

  • StartServers #服务器启动时建立的子进程数量。

  • MaxClients #限定服务器同一时间内客户端最大接入的请求数量。

  • MinSpareThreads #空闲子进程的最小数量,默认25

  • MaxSpareThreads #空闲子进程的最大数量,默认75

  • ThreadsPerChild #每个子进程产生的线程数量,默认是25

  • MaxRequestsPerChild # 每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。 这里建议设置为非零,

持久连接

KeepAlive

是否打开持续连接。

MaxKeepAliveRequests

在持续连接期间允许的最大请求数,设置为0允许无限量。

KeepAliveTimeout

同一个客户端在同一个连接上最大请求的时间。

资源

DocumentRoot

DoucmentRoot指向的路径为URL路径的起始位置,其相当于站点URL的根路径;系统默认的根目录为/var/www/html,若想更改为别处则在配置文件中更改此选项。

文件系统路径

<Directory  "">
...
</Directory>

<File  "">
...
</File>

<FileMatch  "PATTERN">
...
</FileMatch>

URL路径

<Location  "">
...
</Location>

<LocationMatch "">
...
</LocationMatch>

Options

  • Indexes:缺少指定的默认页面时,允许将目录中的所有文件已列表形式返回给用户:危险:慎用

  • FollowsymLinks:允许跟随符号链接所指向的原始文件

  • ExecCGI:允许使用mod_cgi模块执行CGI脚本

  • Includes:允许使用mod_include模块实现服务器端包含(SSI)

  • IncludesNOEXEC:允许包含但不允许执行脚本

  • MultiViews:允许使用mod_negotiation实现内容协商

  • SymLinksIfOwnerMatch:在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号连接所指向的原始文件

  • None:全部禁用。

  • All:全部启用。

DirectoryIndex

定义站点主页面。

Alias

定义路径别名

格式:Alias  /URL/  "/PATH/TO/SOMEDIR/"

当我们访问 http://www.example.com/image/1.jpg 这个资源,我们可以这么配置 Alias /image/ "/opt/image/" 那么在访问是就会访问到系统中的/opt/image/1.jpg 的资源。配置时一定要注意 / 一定要前后一致!

禁用Apache网站服务器签名

ServerSignature Off
ServerTokens Prod

第一行‘ServerSignature Off’使得Apache2网站服务器在所有错误页面上隐藏Apache版本信息。
然而,若没有第二行的‘ServerTokens Prod’,Apache服务器将仍然在HTTP回应头部包含详细的服务器标记,这会泄漏Apache的版本号。
第二行‘ServerTokens Prod’所要做的是在HTTP响应头中将服务器标记压缩到最小。
因此,同时放置两行时,Apache将不会在页面中或者HTTP响应头中泄漏版本信息。

http://www.cnblogs.com/cuchadanfan/p/6084097.html
http://www.178linux.com/64272

nginx 配置

main段配置的优化

user

Syntax: user user [group];
Default: user nobody nobody;
Context: main

如果nginx 启动配置文件没有指定用户则其会以nobody的用户启动。在实际使用中需要创建启动nginx 的用户,一般可以是nginx。

worker_processes

Syntax: worker_processes number | auto;
Default: worker_processes 1;
Context: main

nginx 运行是是以master和worker进程的方式进行运行,其中master 负责接受请求,而worker 复制处理并响应请求。在nginx 运行是是需要指定worker 运行进程的数量,这个可以设置成系统CPU数量减一个。在1.10以后的版本这个参数可以设置成auto,有nginx 进行自己检测并启动worker 进程。

worker_cpu_affinity

Syntax: worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
Default: —
Context: main

绑定worker进程至指定的CPU上运行;例如四核CPU则是:0001、0010、0100、1000。几核CPU就有几个状态位,如果想要在指定的CPU核心运行则在其置位为1,注意cpumask上不能同时出现两个1。

worker_rlimit_nofile

Syntax: worker_rlimit_nofile number;
Default: —
Context: main

更改worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有“too many open files”问题了。

thread_pool

Syntax: thread_pool name threads=number [max_queue=number];
Default: thread_pool default threads=32 max_queue=65536;
Context: main
This directive appeared in version 1.7.11.

定义用于多线程读取和发送文件的命名线程池,而不阻塞worker进程。

events 段配置的优化

accept_mutex

Syntax: accept_mutex on | off;
Default: accept_mutex off;
Context: events

各worker接收用户的请求的负载均衡锁;启用时,表示用于让多个worker轮流地、序列化地响应新请求;关于此参数是否开启可以看下面的文章:

http://huoding.com/2013/08/24/281

accept_mutex_delay

Syntax: accept_mutex_delay time;
Default: accept_mutex_delay 500ms;
Context: events

如果启用accept_mutex,则指定如果另一个worker进程当前正在接受新连接,worker进程将尝试重新启动接受新连接的最长时间。

multi_accept

Syntax: multi_accept on | off;
Default: multi_accept off;
Context: events

multi_accept可以让nginx worker进程尽可能多地接受请求。它的作用是让worker进程一次性地接受监听队列里的所有请求,然后处理。如果multi_accept的值设为off,那么worker进程必须一个一个地接受监听队列里的请求。

use

Syntax: use method;
Default: —
Context: events

指定要使用的连接处理方法。 通常不需要明确指定它,因为nginx将默认使用最有效的方法。

worker_connections

Syntax: worker_connections number;
Default: worker_connections 512;
Context: events

每个worker进程所能够响应的最大并发请求数量;应该记住,这个数字包括所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接。 另一个考虑是同时连接的实际数量不能超过打开文件的最大数量的当前限制,可以通过worker_rlimit_nofile更改。
在nginx中设置的最大连接数为:
worker_proceses * worker_connections

http 段之I/O配置

sendfile

Syntax: sendfile on | off;
Default: sendfile off;
Context: http, server, location, if in location

当一个程序需要传输文件时,Linux内核首先将文件数据缓冲,然后将文件数据传送给程序缓冲,最后程序将文件数据传输到目的地。Sendfile方法是一种数据传输的更高效的方法,数据在内核中的文件描述符之间传输,而不需要将数据传输给程序缓冲。这种方法的结果是改善了对操作系统资源的利用。
详细介绍:
http://xiaorui.cc/2015/06/24/扯淡nginx的sendfile零拷贝的概念/
http://calmness.iteye.com/blog/378463

sendfile_max_chunk

Syntax: sendfile_max_chunk size;
Default: sendfile_max_chunk 0;
Context: http, server, location

当设置为非零值时,限制可以在单个sendfile()调用中传输的数据量。 如果没有限制,一个快速连接可以完全占用工作进程。

directio

Syntax: directio size | off;
Default: directio off;
Context: http, server, location
This directive appeared in version 0.7.7.

通常,Linux内核会尝试优化和缓存读写请求。数据缓存在内核里,将来任何的读取相同数据的请求会变得更快,因为不需要从缓慢的硬盘中读取数据。
Direct I/O是文件系统的一个功能,它允许程序绕过内核缓存,直接在硬盘上读写数据,这可以充分利用CPU频数,改善缓存的有效性。Directo I/O适用于访问率少的数据。这些数据不需要缓存在任何位置。我们可以用directio directive来启用这一功能,在http, server和location当中定义。
例如:

location /video/ {
 directio 4m;
 }

在上面的设置中,任何大于4M的文件都将以Direct I/O的形式直接从硬盘读取。默认directio没有启用。
如果某个请求是通过directo I/O,那么这个请求不能使用sendfile功能。

directio_alignment

Syntax: directio_alignment size;
Default: directio_alignment 512;
Context: http, server, location
This directive appeared in version 0.8.11.

设置方向的对齐方式。 在大多数情况下,512字节的对齐就足够了。 但是,在Linux下使用XFS时,需要将其增加到4K。

aio

Syntax: aio on | off | threads[=pool];
Default: aio off;
Context: http, server, location
This directive appeared in version 0.8.11.

要使aio生效需把directio设置为打开状况,并且如果aio生效,那么将自动不使用sendfile(),这在linux下这是显然的,要么利用aio读到缓存区,要么利用sendfile()直接发送出去,两者不可兼用。
aio可以指定线程数,这个多线程功能只在Linux发行版上才可用,并且只能在epoll, kqueue 或 eventport方法下可用。
为了使用多线程,在编译Nginx时要添加–with-threads选项。然后在/etc/nignx/nignx.conf文件中使用一个全局设置。

thread_pool io_pool threads=16;
 http {
 ....
 location /data {
 sendfile on;
 aio threads=io_pool;
 }
 }

详细参考:
http://www.lenky.info/archives/2013/01/2184

aio_write

Syntax: aio_write on | off;
Default: aio_write off;
Context: http, server, location
This directive appeared in version 1.9.13.

如果启用了aio,请指定是否用于写入文件。 目前,这仅在使用aio线程时有效,并且仅限于使用从代理服务器接收的数据编写临时文件。

output_buffers

Syntax: output_buffers number size;
Default: output_buffers 2 32k;
Context: http, server, location

设置用于从磁盘读取响应报文的缓冲区的数量和大小。
Notes:在1.9.5版之前,默认值为1 32k。

网络连接相关的配置

tcp_nodelay

Syntax: tcp_nodelay on | off;
Default: tcp_nodelay on;
Context: http, server, location

TCP/IP网络有一个“小数据包”的问题,如果一条信息中只有一个字符,那么网络可能会堵塞。这样的数据包大小为41字节,其中TCP信头40字节,内容为1字节。像这种小数据包,它们的开销是4000%。大量的小数据包可以迅速让网络饱和。
John Nagle发明了Nagle算法,它在一定的时间段,将小数据包暂存,将这些小数据包集合起来,整合为一个数据包发送,在下一个时间段又是如此。这改善了网络传输的效率。时间段通常为200ms。

tcp_nopush

Syntax: tcp_nopush on | off;
Default: tcp_nopush off;
Context: http, server, location

除了Nagle算法外,Linux内核提供了一个TCP_CORK选项,也可以解决小数据包问题。TCP_CORK告诉TCP栈将数据包附加在另外一个数据包,当数据包饱和时或程序明确地指示发送时再发送。在FreeBSD和Mac OS系统上,TCP_NOPUSH选项相当于TCP_CORK。
上面的两个directives负责不同的任务。tcp_nodelay可以降低网络延迟,而tcp_nopush可以优化发送的数据包。同时启用tcp_nopush和sendfile可以确保在传输文件时,内核总是生成最大量的完整TCP数据包以供传输,而最后一个TCP数据包可以是不完整的。
详细参考:
http://blog.csdn.net/zmj_88888888/article/details/9169227
http://xiaomaimai.blog.51cto.com/1182965/1557773
https://www.linuxdashen.com/nginx服务器性能优化

keepalive_timeout

Syntax: keepalive_timeout timeout [header_timeout];
Default: keepalive_timeout 75s;
Context: http, server, location

第一个参数设定keepalive连接的超时时长;0表示禁止长连接;默认为75s;可选的第二个参数在“Keep-Alive:timeout = time”响应报文header字段中设置一个值。 两个参数可能不同。“Keep-Alive:timeout = time”头字段由Mozilla和Konqueror识别。 MSIE在大约60秒内关闭保持连接。

keepalive_disable

Syntax: keepalive_disable none | browser ...;
Default: keepalive_disable msie6;
Context: http, server, location

指明禁止为何种浏览器使用keepalive功能; 浏览器参数指定将影响哪些浏览器。设置成msie6则在收到POST请求时禁用与旧版本的MSIE的保持活动连接。设置成safari则禁用与Mac OS X和Mac OS X类操作系统上的Safari浏览器的保持连接。设置成none则启用与所有浏览器的保持活动连接。

keepalive_requests

Syntax: keepalive_requests number;
Default: keepalive_requests 100;
Context: http, server, location
This directive appeared in version 0.8.0.

在keepalived连接上所允许请求的最大资源数量;默认为100;在发出最大数量的请求后,将关闭连接。

client 报头设置

client_body_buffer_size

Syntax: client_body_buffer_size size;
Default: client_body_buffer_size 8k|16k;
Context: http, server, location

设置用于读取客户机请求报文body的缓冲区大小。 在请求主体大于缓冲区的情况下,整个主体或仅其部分被写入临时文件。 默认情况下,缓冲区大小等于两个内存页。 这在x86,其他32位平台和x86-64上是8K。 在其他64位平台上通常为16K。

client_body_in_single_buffer

Syntax: client_body_in_single_buffer on | off;
Default: client_body_in_single_buffer off;
Context: http, server, location

确定nginx是否应将整个客户端请求正文保存在单个缓冲区中。

client_body_temp_path

Syntax: client_body_temp_path path [level1 [level2 [level3]]];
Default: client_body_temp_path client_body_temp;
Context: http, server, location

定义用于存储保存客户端请求正文的临时文件的目录。 在指定的目录下最多可以使用三级子目录层次结构。

client_body_timeout

Syntax: client_body_timeout time;
Default: client_body_timeout 60s;
Context: http, server, location

定义读取客户端请求报文body的超时时间。 超时时间仅设置在两个连续读取操作之间的时间段,而不是用于传输整个请求体。 如果客户端在此时间内未发送任何内容,则会将408(请求超时)错误返回给客户端。

client_header_buffer_size

Syntax: client_header_buffer_size size;
Default: client_header_buffer_size 1k;
Context: http, server

设置读取客户端请求报文header的缓冲区大小。 对于大多数请求,1K字节的缓冲区就足够了。 但是,如果请求包括长Cookie,或来自WAP客户端,它可能不适合1K。 如果请求行或请求头字段不适合该缓冲区,则分配由large_client_header_buffers指令配置的较大缓冲区。

client_header_timeout

Syntax: client_header_timeout time;
Default: client_header_timeout 60s;
Context: http, server

定义读取客户端请求报文header的超时。 如果客户端在此时间内未传输整个头,则会向客户端返回408(请求超时)错误。

client_max_body_size

Syntax: client_max_body_size size;
Default: client_max_body_size 1m;
Context: http, server, location

设置在“Content-Length”请求头字段中指定的客户机请求报文body的最大允许大小。 如果请求中的大小超过配置的值,则会将413(请求实体过大)错误返回给客户端。 请注意,浏览器无法正确显示此错误。 将大小设置为0将禁用对客户机请求正文大小的检查。

large_client_header_buffers

Syntax: large_client_header_buffers number size;
Default: large_client_header_buffers 4 8k;
Context: http, server

设置用于读取大型客户端请求报文header的缓冲区的最大数量和大小。 请求行不能超过一个缓冲区的大小,超过则会显示414(Request-URI Too Large)错误返回到客户端。 请求报文header字段也不能超过一个缓冲区的大小,超过则会显示400(Bad Request)错误返回到客户端。 缓冲区仅在需要时分配。 默认情况下,缓冲区大小等于8K字节。 如果在请求处理结束之后连接被转换到保持活动状态,则释放这些缓冲器。

http 段其他配置

send_timeout

Syntax: send_timeout time;
Default: send_timeout 60s;
Context: http, server, location

指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx就会关闭连接。

limit_conn

Syntax: limit_conn zone number;
Default: —
Context: http, server, location

设置共享内存区域和给定键值的最大允许连接数。 当超出此限制时,服务器将返回503(服务临时不可用)错误以回复请求。 例如,指令每次只允许每个IP地址一个连接。

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
    location /download/ {
        limit_conn addr 1;
    }

limit_conn_log_level

Syntax: limit_conn_log_level info | notice | warn | error;
Default: limit_conn_log_level error;
Context: http, server, location
This directive appeared in version 0.8.18.

设置服务器限制连接数时所需的日志记录级别。

limit_conn_status

Syntax: limit_conn_status code;
Default: limit_conn_status 503;
Context: http, server, location
This directive appeared in version 1.3.15.

设置要响应拒绝的请求返回的状态代码。

limit_conn_zone

Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http

设置将保持各种键的状态的共享内存区域的参数。特别地,该状态包括当前连接数。键可以包含文本,变量及其组合。不计入具有空键值的请求。
Notes:在版本1.7.6之前,键可以只包含一个变量。
用法示例:

limit_conn_zone $binary_remote_addr zone=addr:10m;

这里,客户端IP地址用作密钥。注意,不是$remote_addr,这里使用$binary_remote_addr变量。 $remote_addr变量的大小可以从7到15个字节。存储状态在32位平台上占用32或64字节的内存,在64位平台上始终占用64字节。 $binary_remote_addr变量的大小对于IPv4地址始终为4字节,对于IPv6地址为16字节。存储状态在32位平台上始终占用32或64字节,在64位平台上始终占64字节。一兆字节区域可以保持大约32000个32字节状态或大约16000个64字节状态。如果区域存储已用尽,服务器将向所有后续请求返回503(临时不可用服务)错误。

limit_req

Syntax: limit_req zone=name [burst=number] [nodelay];
Default: —
Context: http, server, location

设置共享内存区域和请求的最大突发大小。 如果请求速率超过为区域配置的速率,则它们的处理被延迟,使得以定义的速率处理请求。 过多的请求被延迟,直到它们的数量超过最大突发大小,在这种情况下,请求以错误503(服务临时不可用)结束。 默认情况下,最大突发大小等于零。 例如,指令允许平均每秒不超过1个请求,突发不超过5个请求。

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    location /search/ {
        limit_req zone=one burst=5;
    }

如果不希望在请求受限时延迟过多的请求,则应使用参数nodelay:

limit_req zone=one burst=5 nodelay;

limit_req_log_level

Syntax: limit_req_log_level info | notice | warn | error;
Default: limit_req_log_level error;
Context: http, server, location
This directive appeared in version 0.8.18.

为服务器由于速率超过或拒绝请求处理而拒绝处理请求的情况设置所需的日志记录级别。 延迟的日志级别比拒绝的日志级别低一个点; 例如,如果指定了“limit_req_log_level notice”,则会使用信息级别记录延迟。

limit_req_status

Syntax: limit_req_status code;
Default:
limit_req_status 503;
Context: http, server, location
This directive appeared in version 1.3.15.

设置要响应拒绝的请求返回的状态代码。

limit_req_zone

Syntax: limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http

设置将保持各种键的状态的共享内存区域的参数。 特别地,该状态存储当前的过多请求数。 键可以包含文本,变量及其组合。 不计入具有空键值的请求。
Notes:在版本1.7.6之前,键可以只包含一个变量。
用法示例:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

这里,状态保持在10兆字节的区域“1”中,并且该区域的平均请求处理速率不能超过每秒1个请求。
客户端IP地址用作密钥。注意,不是$remote_addr,这里使用$binary_remote_addr变量。 $binary_remote_addr变量的大小对于IPv4地址始终为4字节,对于IPv6地址为16字节。存储状态在32位平台上始终占用64个字节,在64位平台上始终占128个字节。一兆字节区域可以保持大约16,000个64字节状态或大约8千128个字节的状态。如果区域存储已用尽,服务器将向所有后续请求返回503(临时不可用服务)错误。
速率在每秒请求数(r /s)中指定。如果需要每秒小于一个请求的速率,则在每分钟请求中指定(r /m)。例如,每秒半请求为30r/m。

limit_except

Syntax: limit_except method ... { ... }
Default: —
Context: location

对指定范围之外的其它的方法进行访问控制; 方法参数可以是以下之一:GET,HEAD,POST,PUT,DELETE,MKCOL,COPY,MOVE,OPTIONS,PROPFIND,PROPPATCH,LOCK,UNLOCK或PATCH。 允许GET方法也允许HEAD方法。

limit_rate

Syntax: limit_rate rate;
Default: limit_rate 0;
Context: http, server, location, if in location

限制客户端每秒钟所能够传输的字节数,默认为0表示无限制; 速率以字节/秒指定。这是对每个请求设置限制,因此如果客户端同时打开两个连接,则总速率将是指定限制的两倍。
在根据一定条件限制费率的情况下,速率限制也可以在$ limit_rate变量中设置。

server_tokens

Syntax: server_tokens on | off | string;
Default: server_tokens on;
Context: http, server, location

启用或禁用在错误消息和“Server”响应头字段中发出nginx版本。

gzip 设置

gzip

Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location, if in location

启用或停用响应的压缩。

gzip_buffers

Syntax: gzip_buffers number size;
Default: gzip_buffers 32 4k|16 8k;
Context: http, server, location

设置用于压缩响应的缓冲区的数量和大小。 默认情况下,缓冲区大小等于一个内存页。 这是4K或8K,取决于平台。
直到版本0.7.28,默认情况下使用四个4K或8K缓冲区。

gzip_comp_level

Syntax: gzip_comp_level level;
Default: gzip_comp_level 1;
Context: http, server, location

设置响应的gzip压缩级别。 可接受的值介于1到9之间。

gzip_disable

Syntax: gzip_disable regex ...;
Default: —
Context: http, server, location
This directive appeared in version 0.6.23.

禁用对“User-Agent”标头字段与任何指定的正则表达式匹配的请求的响应进行gzipping。

gzip_min_length

Syntax: gzip_min_length length;
Default: gzip_min_length 20;
Context: http, server, location

设置将被gzip压缩的响应的最小长度。 长度仅根据“Content-Length”响应头字段确定。

gzip_http_version

Syntax: gzip_http_version 1.0 | 1.1;
Default: gzip_http_version 1.1;
Context: http, server, location

设置压缩响应所需的请求的最小HTTP版本。

gzip_proxied

Syntax: gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
Default: gzip_proxied off;
Context: http, server, location

根据请求和响应启用或禁用代理请求的响应的gzipping。 请求被代理的事实由“Via”请求头字段的存在来确定。 该伪指令接受多个参数:

  • off:禁用所有代理请求的压缩,忽略其他参数;

  • expired:如果响应头包括具有禁用缓存的值的“Expires”字段,则启用压缩;

  • no-cache:如果响应头包括具有“no-cache”参数的“Cache-Control”字段,则用压缩;

  • no-store:如果响应头包括具有“no-store”参数的“Cache-Control”字段,则用压缩;

  • private:如果响应头包括具有“private”参数的“Cache-Control”字段,则启压缩;

  • no_last_modified:如果响应头不包括“Last-Modified”字段,则启用压缩;

  • no_etag:如果响应报头不包括“ETag”字段,则启用压缩;

  • auth:如果请求头包括“授权”字段则启用压缩;

  • any:启用对所有代理请求的压缩。

gzip_types

Syntax: gzip_types mime-type ...;
Default: gzip_types text/html;
Context: http, server, location

除了“text / html”之外,还允许为指定的MIME类型应用“gzipping”响应。 特殊值“*”匹配任何MIME类型(0.8.29)。 对“text / html”类型的响应总是压缩。

gzip_vary

Syntax: gzip_vary on | off;
Default: gzip_vary off;
Context: http, server, location

如果指令gzip,gzip_static或gunzip处于活动状态,则启用或禁用插入“Vary:Accept-Encoding”响应头字段。

php-fpm配置

pm string

设置进程管理器如何管理子进程。可用值:static,ondemand,dynamic。必须设置。

  • static - 子进程的数量是固定的(pm.max_children)。

  • ondemand - 进程在有需求时才产生(当请求时,与 dynamic 相反,pm.start_servers 在服务启动时即启动。

  • dynamic - 子进程的数量在下面配置的基础上动态设置:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers。

pm.max_children int

pm 设置为 static 时表示创建的子进程的数量,pm 设置为 dynamic 时表示最大可创建的子进程的数量。必须设置。
该选项设置可以同时提供服务的请求数限制。类似 Apache 的 mpm_prefork 中 MaxClients 的设置和 普通PHP FastCGI中的 PHP_FCGI_CHILDREN 环境变量。

pm.start_servers in

设置启动时创建的子进程数目。仅在 pm 设置为 dynamic 时使用。默认值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2。

pm.min_spare_servers int

设置空闲服务进程的最低数目。仅在 pm 设置为 dynamic 时使用。必须设置。

pm.max_spare_servers int

设置空闲服务进程的最大数目。仅在 pm 设置为 dynamic 时使用。必须设置。

pm.max_requests int

设置每个子进程重生之前服务的请求数。对于可能存在内存泄漏的第三方模块来说是非常有用的。如果设置为 '0' 则一直接受请求,等同于 PHP_FCGI_MAX_REQUESTS 环境变量。默认值:0。

request_terminate_timeout mixed

设置单个请求的超时中止时间。该选项可能会对 php.ini 设置中的 'max_execution_time' 因为某些特殊原因没有中止运行的脚本有用。设置为 '0' 表示 'Off'。可用单位:s(秒),m(分),h(小时)或者 d(天)。默认单位:s(秒)。默认值:0(关闭)。

request_slowlog_timeout mixed

当一个请求该设置的超时时间后,就会将对应的 PHP 调用堆栈信息完整写入到慢日志中。设置为 '0' 表示 'Off'。可用单位:s(秒),m(分),h(小时)或者 d(天)。默认单位:s(秒)。默认值:0(关闭)。

slowlog string

慢请求的记录日志。默认值:#INSTALL_PREFIX#/log/php-fpm.log.slow。

rlimit_files int

设置文件打开描述符的 rlimit 限制。默认值:系统定义值。

https://www.zybuluo.com/phper/note/89081
http://www.4wei.cn/archives/1002061
https://www.kancloud.cn/digest/php-src/136260

php.ini

资源相关设置

max_execution_time

max_execution_time integer

这设置了 PHP 脚本在解析器将它终止前,该脚本可以运行的最长时间,单位是秒。这有助于防止一些脚本对服务器进行捆绑,比如有一个死循环,在没有人为干扰下,如果没有设置超时时间,那么服务器将永无休止的运行这个死循环。max_execution_time 默认设置为 30秒,即一个脚本最常执行时间为30秒,如果超过这个时间解析器则会将它终止掉。而在命令行运行 PHP 时,默认设置为 0,即没有超时时间,不管一个 PHP 脚本运行多久,PHP 解析器都会去执行它,注意,在命令行的时候才这样。

upload_tmp_dir

upload_tmp_dir string

用于指定 PHP 文件上传时的临时存储目录。任何用户来运行 PHP 时,都必须保证该目录是可写的。如果不指定该目录的值, PHP 将使用系统的默认值。此外如果指定的目录,在这里是不可写,PHP 会自动采用原来系统的默认临时目录。

file_uploads

file_uploads boolean or integer

是否允许HTTP文件上传。默认值为On允许HTTP文件上传,此选项不能设置为Off。

max_input_time

max_input_time integer

此变量可以以秒为单位对通过POST、GET以及PUT方式接收数据时间进行限制,默认60秒。当我们上传大文件时,可以将这个值设置的较大些。 如果设置为0,则表示无时间限制。

max_input_vars

max_input_vars integer

此功能是从 PHP 5.3.9 后新增的,设定了通过 GET/POST/COOKIE 输入的变量可能被接受的个数。 max_input_vars 默认值为 1000, 正常情况下够用,但当提交表单数超过1000个则要将 php.ini 的 max_input_vars 值调大,否则表单数据就提交不上去。

max_file_uploads

max_file_uploads integer

该参数是设置每次最大上传文件数量(Maximum number of files that can be uploaded via a single request),超出该数量的文件将被丢弃。默认值为 20,比如在上传文件或图片的时候,一次性上传不能超过20个,如果超过20个也只能成功20个。不过你可以将该值调大。

post_max_size

post_max_size intager

您可以设置 post 提交数据时的大小,默认值 8 MB,但你还可以增加它。此设置还会影响文件上传。上传大文件时,该值必须大于 upload_max_filesize。如果您配置脚本启用内存限制,则 memory_limit 也会影响文件上传。

upload_max_filesize

upload_max_filesize integer

允许上传的文件的最大尺寸。

enable_post_data_reading

enable_post_data_reading boolean

它是 php.ini 下一个重要的设置,自 PHP 5.4.0 后可用。禁用则会导致 $_POST,$_FILES 数据不能被填充,即不能正常读取数据,这时候只能通过 php://input 来获取提交的数据。这对代理请求非常有用,或者可以通过内存有效的方式发送数据。

memory_limit

memory_limit integer

脚本可能消耗的最大内存量(128MB)

allow_url_fopen

allow_url_fopen boolean

本选项激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象例如文件。默认的封装协议提供用 ftp 和 http 协议来访问远程文件,一些扩展库例如 zlib 可能会注册更多的封装协议。
Note:出于安全性考虑,此选项只能在 php.ini 中设置。

allow_url_include

allow_url_include boolean

此选项允许有以下功能使用URL识别的fopen封装:包括,include_once,require,require_once。此设置要求allow_url_fopen选项要开启。

default_socket_timeout

default_socket_timeout integer

基于 socket 的流的默认超时时间(秒)。

安全和日志相关

html_errors

html_errors boolean

当 PHP 显示或记录一个错误时,它可以使用 HTML 格式来显示错误消息,以便于阅读。此指令控制了是否设置 HTML 格式来显示错误消息。

track_errors

track_errors boolean

如果开启,最后的一个错误将永远存在于变量 $php_errormsg 中。

doc_root

doc_root string

PHP的"CGI根目录"。仅在非空时有效。在web服务器的主文档目录(比如"htdocs")中放置可执行程序/脚本被认为是不安全的,比如因为配置错误而将脚本作为普通的html显示。因此很多系统管理员都会在主文档目录之外专门设置一个只能通过CGI来访问的目录,该目录中的内容只会被解析而不会原样显示出来。如果设置了该项,那么PHP就只会解释doc_root目录下的文件,并确保目录外的脚本都不会被PHP解释器执行(user_dir除外)。如果编译PHP时没有指定FORCE_REDIRECT,并且在非IIS服务器上以CGI方式运行,则必须设置此指令(参见手册中的安全部分)。替代方案是使用的cgi.force_redirect指令。

short_open_tag

short_open_tag boolean

决定是否允许使用 PHP 代码开始标志的缩写形式()。如果要和 XML 结合使用 PHP,可以禁用此选项以便于嵌入使用 。否则还可以通过 PHP 来输出,例如:。如果禁用了,必须使用 PHP 代码开始标志的完整形式()。
Note:本指令也会影响到缩写形式 <?=,它和 <? echo 等价。使用此缩写需要 short_open_tag 的值为 On。 从 PHP 5.4.0 起, <?= 总是可用的。

display_errors

display_errors string

开启后,则在屏幕上可以显示错误,一般常用在开发模式,但是很多应用在正式环境中也忘记了关闭此选项。错误显示可以暴露出非常多的敏感信息,为攻击者下一步攻击提供便利。推荐关闭此选项。

open_basedir

open_basedir string

使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了phpshell的危害,我们一般可以设置为只能访问网站目录。
用 open_basedir 指定的限制实际上是前缀,不是目录名。也就是说“open_basedir = /dir/incl”也会允许访问“/dir/include”和“/dir/incls”,如果它们存在的话。如果要将访问限制在仅为指定的目录,用斜线结束路径名。例如:“open_basedir = /dir/incl/”。

disable_functions

disable_functions string

如果打开了安全模式,那么函数禁止是可以不需要的,但是我们为了安全还是考虑进去。比如,我们觉得不希望执行包括system()等在那的能够执行命令的php函数,或者能够查看php信息的phpinfo()等函数,那么我们就可以禁止它们:

disable_functions = system,passthru,exec,shell_exec,popen,phpinfo

如果你要禁止任何文件和目录的操作,那么可以关闭很多文件操作

disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown

以上只是列了部分不叫常用的文件处理函数,你也可以把上面执行命令函数和这个函数结合,就能够抵制大部分的phpshell了。

expose_php

expose_php boolean

是否暴露PHP被安装在服务器上的事实(在http头中加上其签名)。它不会有安全上的直接威胁,但它使得客户端知道服务器上安装了PHP。

error_reporting

error_reporting string

设置错误报告的级别。该参数可以是一个任意的表示二进制位字段的整数,或者常数名称。错误级别和常数是在 预定义常量定义的,在 php.ini 之中也有专门的说明。在程序运行时,还可以通过 error_reporting() 函数进行设置。请查看 display_errors 了解详情。

显示所有错误, 除了提示以及代码标准警告以外
error_reporting = E_ALL & ~E_NOTICE
显示所有错误,除了提示以外
error_reporting = E_ALL & ~E_NOTICE | E_STRICT
只显示错误
error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
显示出了提示以及代码标准警告之外的错误
error_reporting = E_ALL & ~E_NOTICE

error_log

error_log string

设置脚本错误将被记录到的文件。该文件必须是web服务器用户可写的。如果特殊值 syslog 被设置,则将错误信息发送到系统日志记录器。在Unix以及类似系统上,使用的是 syslog(3) ,而在 Windows NT 类系统上则为事件日志。Windows 95上不支持系统日志记录。参见: syslog(). 如果该配置没有设置,则错误信息会被发送到 SAPI 错误记录器。例如,出现在Apache的错误日志中,或者在CLI中发送到 stderr。

log_errors

log_errors boolean

设置是否将脚本运行的错误信息记录到服务器错误日志或者error_log之中。注意,这是与服务器相关的特定配置项。
Note:在生产系统中,强烈建议你使用错误日志记录web站点上显示的错误信息。

log_errors_max_len

log_errors_max_len integer

设置 log_errors 的最大字节数. 在 error_log 会添加有关错误源的信息。默认值为1024,如果设置为0表示不限长度。该长度设置对记录的错误,显示的错误,以及 $php_errormsg都会有限制作用。
当使用 integer 时, 其值以字节来衡量。还可以使用在FAQ中描述的速记符。

MySQL

[mysqld]

socket

socket = /tmp/mysql.sock

为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(Linux下默认是/var/lib/mysql/mysql.sock文件)。

port

port             = 3306 

指定MsSQL侦听的端口。

skip-name-resolve

skip-name-resolve 

禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项, 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求。

key_buffer

key_buffer       = 384M 

key_buffer是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写)。索引被所有的线程共享,key_buffer的大小视内存大小而定。

table_open_cache

table_open_cache      = 512 

MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值64, 假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上。

max_allowed_packet

max_allowed_packet = 4M 

接受的数据包大小;增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或MySQLd必须返回大的结果行时MySQLd才会分配更多内存。 该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。

sort_buffer_size

sort_buffer_size = 2M  

MySQL执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。如果不能,可以尝试增加sort_buffer_size变量的大小。

read_buffer_size

read_buffer_size = 2M 

读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。 如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。

join_buffer_size

join_buffer_size = 2M 

联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。

query_cache_size

query_cache_size = 32M

指定MySQL查询结果缓冲区的大小。

read_rnd_buffer_size

read_rnd_buffer_size    = 2M 

随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。

myisam_sort_buffer_size

myisam_sort_buffer_size =64M 

MyISAM表发生变化时重新排序所需的缓冲

thread_concurrency

thread_concurrency      = 8

最大并发线程数,取值为服务器逻辑CPU数量×2

thread_cache

thread_cache            = 8

该值表示可以重新利用保存在缓存中线程的数量,当断开连接时若缓存中还有空间,那么客户端的线程将被放到缓存中,如果线程重新被请求,那么请求将从缓存中读取,若果缓存中是空的或者是新的请求,那么线程将被重新创建。设置规律为:1G内存设置为8,2G内存设置为16,4G以上设置为64。

max_connections

max_connections = 1000

MySQL的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。可以过'conn%'通配符查看当前状态的连接数量,以定夺该值的大小。

max_connect_errors

max_connect_errors = 6000 

对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行:FLUSH HOST。

open_files_limit

open_files_limit = 65535

MySQL打开的文件描述符限制,默认最小1024

skip-locking

skip-locking

避免MySQL的外部锁定,减少出错几率增强稳定性。

wait_timeout

wait_timeout  = 8

表示空闲的连接超时时间,默认是28800s,这个参数是和interactive_timeout一起使用的,也就是说要想让wait_timeout 生效,必须同时设置interactive_timeout

long_query_time

long_query_time = 1 

慢查询日志的超时时间

log_slow_queries

log_slow_queries = /path/to/slow_queries 

慢查询日志路径,必须配合上面的参数一同使用

原文地址:https://www.cnblogs.com/cuchadanfan/p/6434963.html