前言
在这篇文章中服务器搭建记录 · WordPress的安装中,我们仅仅只是安装了Nginx,还需要对其进行一些优化,才能使其变得更加流畅。今天介绍的就是我对于优化Nginx和PHP的一些心得。
Nginx配置优化
主配置文件是
nginx.conf
,这个配置文件一共由三部分组成,分别为全局块、events块和http块。在http块中,又包含全局块和多个server块。每个server块中,可以包含全局块和多个location块。在同一配置块中嵌套的配置块,各个之间不存在次序关系。配置文件支持大量可配置的指令,绝大多数指令不是特定属于某一个块的。同一个指令放在不同层级的块中,其作用域也不同,一般情况下,高一级块中的指令可以作用于自身所在的块和此块包含的所有低层级块。如果某个指令在两个不同层级的块中同时出现,则采用 “就近原则”,即以较低层级块中的配置为准。比如,某指令同时出现在http全局块中和server块中,并且配置不同,则应该以server块中的配置为准。
全局块
全局块是默认配置文件从开始到events块之间的一部分内容,主要设置一些影响服务器整体运行的配置指令,因此,这些指令的作用域是全局服务器。
user www-data;
指定可以运行服务的用户和用户组,默认是nginx
,这里修改成了PHP默认用户www-data
。只能在全局块配置。注释掉,或者配置成nobody
,所有用户都可以运行。在Windows上不生效。
worker_processes auto;
指定工作线程数,可以制定具体的进程数,当设置成auto
,将自动启动与CPU数量相同的worker
进程,只能在全局块配置。
查看当前进程数:
ps -aux | grep nginx |grep -v grep
worker_cpu_affinity auto;
运行CPU亲和力,与worker_processes
对应。
可手动配置:
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;
指定进程可以打开的最大描述符,理论值应该是最多打开文件数(ulimit -n
)与Nginx进程数相除,但是Nginx分配请求并不是那么均匀,所以最好与ulimit -n
的值保持一致。因为调度时分配请求到进程并不均衡。
worker_priority -5;
指明worker进程的优先级。优先级高的进程会占用更多的系统资源,这里配置的是进程的静态优先级,取值范围-20到+19,-20级别最高。因此可以把这个值设置小一点,但不建议比内核进程的值-5低。
pid /var/run/nginx.pid;
指定PID文件存放的路径,只能在全局块配置。
error_log /var/log/nginx/error.log notice;
error_log [path] [debug | info | notice | warn | error | crit | alert | emerg];
指定错误日志的路径和日志级别。此指令可以在全局块、http块、server块以及location块中配置。其中debug
级别的日志需要在编译时使用--with-debug
编译才能使用。
event块
events块涉及的指令主要影响Nginx服务器与用户的网络连接。常用到的设置包括是否开启对多
worker process
下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型处理连接请求,每个worker process
可以同时支持的最大连接数等。这一部分的指令对Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整。
use epoll;
use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
Nginx针对不同的操作系统,有不同的事件模型。Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,Nginx会选择select或poll。以下几种是高效事件模型:
- epoll:Linux 2.6以上版本内核中的高性能网络I/O模型。
- Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X。如果跑在FreeBSD上面,就用
kqueue
模型。使用双处理器的MacOS X系统使用kqueue
可能会造成内核崩溃。 - Epoll:使用于Linux内核2.6版本及以后的系统。
- /dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
- Eventport:使用于Solaris 10。为了防止出现内核崩溃的问题,有必要安装安全补丁。
work_connections 65535;
设置允许每一个worker process
同时开启的最大连接数,当每个工作进程接受的连接数超过这个值时将不再接收连接。当所有的工作进程都接收满时,连接进入logback
,logback
满后连接被拒绝。只能在events块中进行配置。
注意:这个值不能超过超过系统支持打开的最大文件数,也不能超过单个进程支持打开的最大文件数,具体可以参考这篇文章。
accept_mutex on;
当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。开启的时候,将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢。默认开启,只能在events块中进行配置。
multi_accept on;
告诉Nginx收到一个新连接通知后接受尽可能多的连接,默认是on,此时多个worker
按串行方式来处理连接,也就是一个连接只有一个worker
被唤醒,其他的处于休眠状态,设置为off后,多个worker
按并行方式来处理连接,也就是一个连接会唤醒所有的worker
,直到连接分配完毕,没有取得连接的继续休眠。默认关闭,只能在event块配置。当你的服务器连接数不多时,开启这个参数会让负载有一定的降低,但是当服务器的吞吐量很大时,为了效率,可以关闭这个参数。
如果使用kqueue连接方法,那么这条指令会被忽略,因为这个方法会报告在等待被接受的新连接的数量。
http块
http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中。可以在http全局块中配置的指令包括文件引入、MIME-Type定义、日志自定义、是否使用
sendfile
传输文件、连接超时时间、单连接请求数上限等。
include /etc/nginx/mime.types;
MIME Type是网络资源的媒体类型。浏览器中可以显示的内容有HTML、XML、GIF及Flash等资源,为了区分这些资源,需要使用MIME Type。
include用于包含其他的配置文件,可以放在任何地方,但是一定要符合配置规范。
default_type application/octet-stream;
配置默认媒体类型。默认值为text/plain
。还可以在http块、server块或者location块中进行配置。
access_log path [format [buffer=size]];
记录Nginx提供服务过程应答前端请求的日志,可以在http块、server块或者location块中进行设置。使用off关闭。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
用于定义日志格式,只能在http块中进行配置。定义后,可以以main
的格式使用日志。
log_not_found off;
是否在error_log
中记录资源不存在的错误。默认为是。
日志格式设定:
- $remote_addr、$http_x_forwarded_for:记录客户端的ip地址
- $remote_user:记录客户端用户名称
- $time_local: 记录访问时间与时区
- $request: 记录请求的url与http协议
- $status: 记录请求状态
- $body_bytes_sent:记录发送给客户端文件主体内容大小
- $http_referer:记录从那个页面链接访问过来的
- $http_user_agent:记录客户浏览器的相关信息
通常服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过
$remote_add
拿到的IP地址是反向代理服务器的IP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for
,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
sendfile on;
开启高效文件传输模式,可以在http块、server块或者location块中进行配置。sendfile
指令指定Nginx是否调用sendfile
函数(zero copy
方式)来输出文件,对于普通应用设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
sendfile_max_chunk size;
设置sendfile
最大数据量。默认值为0,即无限制。可以在http块、server块或location块中配置。Nginx进程的每个worker process
每次调用sendfile()
传输的数据量最大不能超过这个值。
autoindex on;
开启目录列表访问,适合下载服务器,默认关闭。
tcp_nopush on;
必须在sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数量(将响应头和正文的开始部分一起发送,而不一个接一个的发送)。
tcp_nodelay on;
TCP/IP网络存在“小包”问题,其中单字符消息可能在高负载网络上导致网络拥塞。 可以禁用Nagle的缓冲算法,并在数据可用时立即发送。 可用于http块,server块和location块。
例如分组大小为41字节,其中40字节用于TCP报头,只有1字节是有用信息。 这些小包占用了大约4000%的巨大开销并且使得网络饱和。Nagle算法通过不立即发送小包来解决问题。 所有这样的分组被收集一定量的时间,然后作为单个分组一次发送。 这改进了底层网络的的效率。 因此,典型的TCP/IP协议栈在将数据包发送到客户端之前需要等待200毫秒。
超时时间
keepalive_timeout 60;
keepalive_timeout timeout [header_timeout];
客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接。默认值为75s。可以在http块、server块或location块中配置。header_timeout
,可选项,在发给用户端的应答报文头部的Keep-Alive
域设置超时时间。
keepalive_requests number;
限制了一个HTTP长连接最多可以处理完成的最大请求数,默认是100。当连接处理完成的请求数达到最大请求数后,将关闭连接。此指令可以在http块、server块或location块中配置。
server_names_hash_bucket_size 128;
服务器名字的Hash表大小。
client_header_buffer_size 4k;
客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。 分页大小可以用命令getconf PAGESIZE
取得。但也有client_header_buffer_size
超过4k的情况,但是client_header_buffer_size
必须设置为“系统分页大小”的整倍数。
large_client_header_buffers 4 64k;
客户请求头缓冲大小。默认会使用用client_header_buffer_size
,如果Header过大,会使用large_client_header_buffers
。
open_file_cache max=102400 inactive=20s;
为打开文件指定缓存,默认没有启用,max
指定缓存数量,建议和打开文件数一致,inactive
是指经过多长时间文件没被请求后删除缓存。
open_file_cache_valid 30s;
多长时间检查一次缓存的有效信息。
open_file_cache_min_uses 1;
open_file_cache
中的inactive
参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如果有一个文件在inactive
时间内一次没被使用,它将被移除。
client_header_timeout 15;
设置请求头的超时时间。如果超过这个时间没有发送任何数据,将返回request time out
的错误。
client_body_timeout 15;
设置请求体的超时时间。
reset_timedout_connection on;
关闭不响应的client
连接。这将会释放那个client
所占有的内存空间。
send_timeout;
响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,关闭连接。
server_tokens off;
关闭在错误页面中的版本数字。
client_max_body_size 4096m;
上传文件大小限制。
client_body_buffer_size 128k;
缓冲区代理缓冲用户端请求的最大字节数,默认为操作系统页面大小的两倍,即8k或者16k。设置过小时,当上传较大图片,会返回500 Internal Server Error。
FastCGI
fastcgi_connect_timeout 300;
指定连接到后端FastCGI的超时时间。
fastcgi_send_timeout 300;
向FastCGI传送请求的超时时间。
fastcgi_read_timeout 300;
指定接收FastCGI应答的超时时间。
fastcgi_buffer_size 64k;
指定读取FastCGI应答第一部分需要用多大的缓冲区,默认的缓冲区大小为fastcgi_buffers
中的每块大小。
fastcgi_buffers 4 64k;
指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。 如果一个PHP脚本所产生的页面大小为256KB
,那么会分配4个64KB
的缓冲区来缓存; 如果页面大小大于256KB
,那么大于256KB
的部分会缓存到fastcgi_temp_path
指定的路径中。 一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB
,那么可以把这个值设置为8 32K
、4 64k
等。
fastcgi_busy_buffers_size 128k;
繁忙时候的buffer
值,建议设置为fastcgi_buffers
的两倍。
fastcgi_temp_file_write_size 128k;
在写入fastcgi_temp_path
时将用多大的数据块,默认值是fastcgi_buffers
的两倍。 该数值设置小时若负载过大可能报502 Bad Gateway。
fastcgi_temp_path ;
缓存临时目录。
fastcgi_intercept_errors off;
指定是否传递4xx
和5xx
错误信息到客户端,或者允许Nginx使用error_page
处理错误信息。
fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128m inactive=1d max_size=10g;
缓存目录,可以设置目录层级,比如1:2
会生成16*256
个子目录,cache_fastcgi
是这个缓存空间的名字,cache
是用多少内存,inactive
表示默认失效时间,如果缓存数据在失效时间内没有被访问将被删除,max_size
表示最多用多少硬盘空间。
fastcgi_cache cache_fastcgi;
开启FastCGI缓存并为其指定一个名称。可以有效降低CPU的负载,并且防止502的错误。
fastcgi_cache_valid 200 302 1h;
用来指定应答代码的缓存时间,要和fastcgi_cache
配合使用。
fastcgi_cache_min_uses 1;
设置经过多少次请求的相同URL将被缓存。
Nginx的缓存功能有:
proxy_cache
和fastcgi_cache
。proxy_cache
的作用是缓存后端服务器的内容。proxy_cache
减少与后端通信的次数,节省了传输时间和后端宽带。fastcgi_cache
的作用是缓存FastCGI生成的内容。fastcgi_cache
缓存减少与PHP通信的次数,减轻了PHP和数据库的压力。
Gzip
使用Gzip压缩功能,可能为我们节约带宽,加快传输速度,也为我们节约成本。一般我们需要压缩的内容有:文本、js、html、css。
gzip on;
开启Gzip压缩。
gzip_min_length 1k;
设置允许压缩的页面最小字节数,页面字节数从header
头的Content-Length
中获取,默认值是0,即不管页面多大都进行压缩,建议设置成大于1K。
gzip_buffers 4 32k;
压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储压缩结果。
gzip_http_version 1.1;
压缩版本,用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持Gzip解压,使用默认即可。
gzip_comp_level 5;
压缩比例,用来指定Gzip压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。推荐设置为5。
gzip_types text/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml;
用来指定压缩的类型,text/html
类型总是会被压缩。
gzip_vary on;
因为有的浏览器支持压缩,有的不支持,为了避免浪费,不支持的也压缩,所以在客户端的HTTP头加个vary头来判断是否需要压缩。
gzip_proxied any;
开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含Via
的header
头。默认是off。
可选参数值:
- off 关闭所有压缩
- expired 启用压缩,如果包含
Expires
头 - no-cache 启用压缩,如果包含
Cache-Control:no-cache
头 - no-store 启用压缩,如果包含
Cache-Control:no-store
头 - private 启用压缩,如果包含
Cache-Control:private
头 - no_last_modified 启用压缩,如果不包含
Last-Modified
头 - no_etag 启用压缩 ,如果不包含
ETag
头 - auth 启用压缩 , 如果包含
Authorization
头 - any 无条件启用压缩
gzip_disable msie6;
禁用IE6的Gzip压缩。 IE6对Gzip的压缩支持很不好,会造成页面的假死。
Brotli
Brotli通过变种的LZ77算法、Huffman编码以及二阶文本建模等方式进行数据压缩,与其他压缩算法相比,它有着更高的压缩效率。(需自行安装)
brotli on;
开启Brotli压缩。
brotli_comp_level 6;
压缩比例,1压缩比最小,处理速度最快,11压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。默认值为6。
brotli_buffers 16 8k;
设置用于压缩响应的缓冲区number
和size
。默认情况下,缓冲区大小等于一个内存页面。 默认值:32 4k|16 8k
。
brotli_min_length 20;
设置length
要压缩的响应的最小值,长度仅由Content-Length
响应头字段确定。默认为20。
brotli_types text/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml;
用来指定压缩的类型,text/html
类型总是会被压缩。
nginx.conf
以下示例仅作参考,请根据具体情况自行修改:
user www-data;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 65535;
multi_accept on;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
reset_timedout_connection on;
send_timeout 30;
keepalive_timeout 300;
keepalive_requests 10240;
client_header_timeout 30;
client_body_timeout 30;
client_header_buffer_size 16k;
large_client_header_buffers 4 16k;
client_max_body_size 4096m;
open_file_cache max=10240 inactive=20;
open_file_cache_valid 60;
open_file_cache_min_uses 1;
fastcgi_intercept_errors on;
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffers 4 64k;
fastcgi_buffer_size 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path /etc/nginx/nginx_tmp;
fastcgi_cache_path /etc/nginx/fastcgi_cache levels=1:2 keys_zone=fastcgi_cache:128m inactive=1d max_size=1g;
fastcgi_cache fastcgi_cache;
fastcgi_cache_key https://$host$request_uri;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 4;
gzip_min_length 2k;
gzip_buffers 4 32k;
gzip_types text/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml;
include /etc/nginx/conf.d/*.conf;
}
server块
server块和“虚拟主机”的概念有密切联系。虚拟主机技术使得Nginx服务器可以在同一台服务器上只运行一组Nginx进程,就可以运行多个网站。每一个http块都可以包含多个server块,而每个server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务。
listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen指令只能在server块中配置。配置非常灵活,可以单独或同时指定IP和端口。其中参数如下:
- address:监听的IP地址(请求来源的IP地址),如果是IPv6的地址,需要使用“[]”括起来,比如
[fe80::1]
等。 - port:端口号,如果只定义了IP地址没有定义端口号,就使用80端口。多个虚拟主机可以同时监听同一个端口,但是
server_name
需要设置成不一样。 - default_server:假如通过Host没匹配到对应的虚拟主机,则通过这台虚拟主机处理。在没有显式定义
default server
时,Nginx会将配置的第一个server
作为default server
。 - backlog=number:设置监听函数
listen()
最多允许多少网络连接同时处于挂起状态,FreeBSD中默认为-1,其他平台默认为511。 - accept_filter=filter:设置监听端口对请求的过滤,被过滤的内容不能被接收和处理。本指令只在FreeBSD和NetBSD 5.0+平台下有效。可以设置为
dataready
或httpready
。 - bind:标识符,使用独立的
bind()
处理此address:port
;一般情况下,对于端口相同而IP地址不同的多个连接,Nginx服务器将只使用一个监听命令,并使用bind()
处理端口相同的所有连接。 - ssl:标识符,设置会话连接使用SSL模式进行,此标识符和Nginx服务器提供的HTTPS服务有关。
server_name myserver.com www.myserver.com
server_name用于配置虚拟主机的名称,支持使用通配符和正则表达式。可以只有一个名称,也可以由多个名称并列,之间用空格隔开。每个名字就是一个域名,由两段或者三段组成,之间由“.”隔开。规定第一个名称作为此虚拟主机的主要名称。
如果出现一个名称被多个虚拟主机的
server_name
匹配成功,则按照以下方式处理:对于匹配方式不同的,按照以下的优先级选择虚拟主机,排在前面的优先处理请求。如果被处于同一优先级的匹配方式多次匹配成功,则首次匹配成功的虚拟主机处理请求。
- ① 准确匹配
server_name
- ② 通配符在开始时匹配
server_name
成功- ③ 通配符在结尾时匹配
server_name
成功- ④ 正则表达式匹配
server_name
成功
location块
每个server块中可以包含多个location块。在整个Nginx配置文档中起着重要的作用,而且Nginx服务器在许多功能上的灵活性往往在
location
的配置中体现出来。主要作用是,基于Nginx服务器接收到的请求字符串(server_name/uri-string
),对除虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。许多第三方模块的配置也是在location块中提供功能。
location [ = | ~ | ~* | ^~ ] uri { ... }
uri是待匹配的请求字符串,可以是不含正则表达的字符串,如/myserver.php
等;也可以是包含有正则表达的字符串,如.php$
(表示以.php结尾的URL)等。
方括号里的部分,是可选项,用来改变请求字符串与uri的匹配方式。在不添加此选项时,Nginx服务器首先在server块的多个location块中搜索是否有标准uri和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个。然后,服务器再用location块中的正则uri和请求字符串匹配,当第一个正则uri匹配成功,结束搜索,并使用这个location块处理此请求;如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理此请求。规则如下:
- =:标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求。
- ^~:标准uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的
location
后,立即使用此location
处理请求,而不再使用location块中的正则uri和请求字符串做匹配。 - ~:表示uri包含正则表达式,并且区分大小写。它对uri中的这些符号将会进行编码处理。比如
/html/%20/data
可以匹配/html/ /data
。 - ~
*
:表示uri包含正则表达式,并且不区分大小写。注意如果uri包含正则表达式,就必须要使用~或者~*标识。
fastcgi_pass unix:/tmp/php-fpm.sock;
Nginx和php-fpm
的通信方式有两种,一种是Socket形式,一种是TCP形式。配置两种方式都可以,但是必须保证nginx.conf
和php-fpm.conf
配置的监听方式保持一致。
UNIX Domain Socket可用于两个没有亲缘关系的进程,是目前广泛使用的IPC机制。这种通信方式发生在系统内核里。UNIX Domain Socket和长连接都能避免频繁创建TCP短连接而导致
TIME_WAIT
连接过多的问题。UNIX Domain Socket:
Nginx <=> socket <=> PHP-FPM
TCP Socket(本地回环):
Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM
TCP Socket(不同服务器):
Nginx <=> socket <=> TCP/IP <=> 物理层 <=> 路由器 <=> 物理层 <=> TCP/IP <=> socket <=> PHP-FPM
proxy_intercept_errors on;
阻止HTTP应答代码为400或者更高的应答。
proxy_connect_timeout 90;
和后端服务器连接的超时时间。
proxy_send_timeout 90;
后端服务器数据回传超时时间。
proxy_read_timeout 90;
连接成功后,后端服务器响应时间。
proxy_buffer_size 4k;
设置代理服务器保存用户头信息的缓冲区大小。默认情况下这个值的大小为指令proxy_buffers
中指定的一个缓冲区的大小,不过可以将其设置为更小。
proxy_buffers 4 32k;
设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k。
proxy_busy_buffers_size 64k;
高负荷下缓冲大小。
proxy_temp_file_write_size 64k;
设置在写入proxy_temp_path
时数据的大小,预防一个工作进程在传递文件时阻塞太长。
expires缓存
缓存,主要针对于图片、CSS、JS等元素更改机会比较少的情况下使用。如:
location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
expires 30d;
#log_not_found off;
access_log off;
}
location ~* \.(js|css)$ {
expires 7d;
log_not_found off;
access_log off;
}
总结:expires可以降低网站购买的带宽,节约成本,同时提升用户访问体验,节约服务器成本。但是被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。
防盗链
防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,可以直接给予404的错误提示,如:
location ~*^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers noneblocked www.xxx.com xxx.com;
if($invalid_referer) {
#return 302 http://www.xxx.com/img/nolink.jpg;
return 404;
break;
}
access_log off;
}
root path;
用于设置请求寻找资源的根目录,可以在http块、server块或者location块中配置。
PHP优化
php.ini
memory_limit
设置用于设定单个PHP进程可以使用的系统内存最大值。默认值是128M,这对于大多数中小型PHP应用来说或许合适,不过,如果运行的是微型PHP应用,可以降低这个值,以便节省系统资源,反之,如果运行的是内存集中型PHP应用,可以增加这个值。这个值的大小由可用的系统内存决定。
file_uploads = 1
upload_max_filesize = 10M
max_file_uploads = 3
默认情况下,允许在单次请求中上传20个文件,最大为2MB。这个值不要设置太大,否则会出现超时。
max_execution_time = 5
设置单个PHP进程在终止之前最长可运行时间。默认是30秒。
output_buffering = 4096
implicit_flush = false
如果是在较少的块中发送更多数据,而不是在较多的块中发送较少的数据,那么网络的效率会更高,也就是说,在较少的片段中把内容传递给访问者的浏览器,能减少请求总数。默认缓冲4096字节的输出之后才会把内容发送给Web服务器,修改配置时确保使用的值是8的倍数。
safe_mode = on
打开安全模式,安全模式是个内嵌的非常重要的安全机制,能够控制一些函数执行,比如system()
调用系统命令函数。
safe_mode_gid = off
防止PHP程序对脚本执行有权限。
disable_functions = system,passthru,exec,shell_exec,popen,phpinfo
如果打开了安全模式,那么函数禁止是可以不需要的,但是为了安全还是可以关闭,特别是phpinfo()
。
disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandie,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_getcontents,fputs,fwrite,chgrp,chmod,chown
如果要禁止任何文件和目录的操作,那么可以关闭很多文件操作。
expose_php = off
关闭HTTP头中版本信息的显示。
magic_quotes_gpc = off
防止SQL注入。
magic_quotes_gpc = on
默认关闭,如果它打开将自动把用户提交对SQL的查询进行转换,防止注入,所以推荐打开。
display_errors = off
报错时会包含PHP脚本当前的路径信息或者查询的SQL语句信息,建议关闭错误提示。
allow_url_fopen = off
禁止打开远程地址。
cgi.fix_path = 0
防止Nginx文件解析错误漏洞。
session.save_handler = memcache
session.save_path = "tcp://10.0.0.8:1211"
调整会话共享信息存放位置。
Zend OPcache扩展:
opcache.memory_consumption = 64
为操作码缓存分配的内存,分配的内存量应该可以保存应用中所有PHP脚本编译得到的操作码,这个值根据应用的体量可以设置成不同大小的值。
opcache.interned_strings_buffer = 16
用来存储驻留字符串的内存量。PHP解释器在背后会找到相同字符串的多个实例,把这个字符串保存在内存中,如果再次使用相同的字符串,PHP解释器会使用指针,这么做的目的是节省内存。默认情况下,PHP 驻留字符串会隔离在各个PHP进程中,这个设置能让进程池把所有进程驻留字符串存储到共享的缓冲区中,以便在进程池中的多个进程之间引用驻留字符串,这样能节省更多内存。
opcache.max_accelerated_files = 4000
操作码缓存中最多能存储多少个脚本,这个值的区间是2000到100000之间,一定要比PHP应用中的文件数大。
opcache.validate_timestamps = 1
这个设置的值为1时,经过一段时间后PHP会检查脚本的内容是否有变化,检查的时间间隔由opcache.revalidate_freq
指定。如果设置为0,则不会检查,必须手动清除缓存的操作码。建议在开发环境中设置为1,生产环境中设置为0。
opcache.revalidate_freq = 0
设置多久检查一次脚本内容是否有变化。设置为0秒,则仅当opcache.validate_timestamps
设置为1时,才会在每次请求时都重新验证PHP文件,因此,在开发环境中每次都会重新验证PHP文件,在生产环境中则不验证。
opcache.fast_shutdown = 1
这么设置能让操作码使用更快的停机步骤,把对象析构和内存释放交给Zend Engine的内存管理器完成。
www.conf
pm = dynamic
对于专用服务器,可以设置为static
,以防止不必要的浪费。
pm.max_children = 16
如果选择static
,则由此项指定子进程最大数。
如果选择dynamic
,则由以下参数决定进程数:
pm.start_servers = 8
启动时的进程数。
pm.min_spare_servers = 2
保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程。
pm.max_spare_servers = 8
保证空闲进程数最大值,如果空闲进程大于此值,则进行清理。
pm.max_requests = 1000
每个子进程重新启动之前所能接受的请求数。默认为0,即一直接受请求。
参考资料: