深度优化LNMP之Nginx [1]

Nginx基本安全优化

1.调整参数隐藏Nginx版本号信息
一般来说,软件的漏洞都和版本有关,因此我们应尽量隐藏或清除Web服务队访问的用户显示各类敏感信息(例如:Web软件名称及版本号等信息),这样恶意的用户就很难猜到他攻击的服务器所用的是否是特定漏洞的软件,或者是否有对应的漏洞存在。
修改Nginx版本信息

[root@web02 ~]# vim /application/nginx/conf/nginx.conf
http{
    server_tokens off;
}
#我们在http标签端开启即可

没修改之前
[root@web02 ~]# curl -I blog.etiantian.org
HTTP/1.1 200 OK
Server: nginx/1.6.3
Date: Mon, 30 May 2016 11:17:14 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.32
Link: <http://blog.etiantian.org/?rest_route=/>; rel="https://api.w.org/"
修改后结果(需要重启生效)
[root@web02 ~]# curl -I blog.etiantian.org
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 30 May 2016 11:21:33 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.32
Link: <http://blog.etiantian.org/?rest_route=/>; rel="https://api.w.org/"
修改为后浏览器访问404界面也不会出现版本信息
server_tokens参数的官方说明如下:
syntax    server_tokens on|off;   #此行为参数语法,on为开启,off为关闭
default    server_tokens on;        #此行意思是不配置该参数,软件默认情况的结果
context    http,server,location    #此行为server_tokens参数可以放置的位置
参数作用:激活或禁止Nginx的版本信息显示在报错信息里以及server的响应首部位置
Enables or disables emitting of nginx version in error messages and in the Server response header field   #此行是参数的作用原文
官方资料地址:http://nginx.org/en/docs/http/ngx_http_core_module.html

2.更改源码隐藏Nginx软件名及版本号

隐藏了Nginx版本号后,更进一步,可以通过一些手段把web服务软件的名称也给因此,或者更改为其他Web服务软件名迷惑黑客。Nginx模块不支持更改软件名,所以我们需要更改Nginx源代码才能解决。
1.第一步是一次修改3个Nginx源码文件
修改的第一个文件为nginx-1.6.3/src/core/nginx.h
[root@web02 ~]# cd /home/oldboy/tools/nginx-1.6.3/src/core/
[root@web02 core]# vim nginx.
#define NGINX_VERSION      "9.9.9"
#修改为想要的版本号
#define NGINX_VER          "ABCDOCKER/" NGINX_VERSION
#将nginx修改想要修改的软件名称
#define NGINX_VAR          "ABCDOCKER"
#将nginx修改为想要修改的软件名称。
#define NGX_OLDPID_EXT     ".oldbin"
2.第二步修改nginx-1.6.3/src/http/ngx_http_header_filter_module.c的第49行
[root@web02 nginx-1.6.3]# vim src/http/ngx_http_header_filter_module.
static char ngx_http_server_string[] = "Server: ABCDOCKER"    CRLF;
#修改本行,此处的文件是我们Curl 出来显示的名称
3.第三步修改nginx-1.6.3/src/http/ngx_http_special_response.c,对外页面报错时,它会控制是否展示敏感信息。修改28~30行
[root@web02 nginx-1.6.3]# vim src/http/ngx_http_special_response.
 21 static u_char ngx_http_error_full_tail[] =
 22 "<hr><center>"ABC(www.abcdocker.com)"</center>" CRLF
 23 "</body>" CRLF
 24 "</html>" CRLF
 25 ;
 26 
 27 
 28 static u_char ngx_http_error_tail[] =
 29 "<hr><center>ABC(www.abcdocker.com)</center>" CRLF
 30 "</body>" CRLF
 31 "</html>" CRLF
 5.修改完成之后需要重新编译nginx
查看原来编译的参数
[root@web02 nginx-1.6.3]# /application/nginx/sbin/nginx -V
nginx version: nginx/1.6.3
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/application/nginx-1.6.3/ --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
[root@web02 nginx-1.6.3]# ./configure --prefix=/application/nginx-1.6.3/ --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
提示:需要停止原来的nginx,从新进行编译。如果不想在覆盖原来的编译参数可以选择指定新的目录。
提示:最后还需要make  makeinstall 才会生效
测试:需要开启nginx
[root@web02 application]# curl -I blog.etiantian.org
HTTP/1.1 200 OK
Server: ABCDOCKER
Date: Mon, 30 May 2016 12:07:19 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.32
Link: <http://blog.etiantian.org/?rest_route=/>; rel="https://api.w.org/"
因为我优化了,所以Server:后面除了我设置的字母不会显示版本信息,修改配置文件server_tokens off;  修改为on即可
    重启nginx
[root@web02 application]# curl -I blog.etiantian.org
HTTP/1.1 200 OK
Server: ABCDOCKER/9.9.9
Date: Mon, 30 May 2016 12:09:05 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.32
Link: <http://blog.etiantian.org/?rest_route=/>; rel="https://api.w.org/"
 关闭server_tokens off;  可以显示我们设置的错误

 说明:
1.提示网站安全,要从最简单、最短板、最低点入手解决问题,门大开着,窗户安装再结实的护栏也没有意义。
2.向有经验的人及优秀的网站公司学习。
3.学习看官方文档,根据一手资料去分析
4.命令输出结果中含有需要过滤或者要保留的内容时,命令自身可能有参数直接实现。

3.更改Nginx服务的默认用户

为了Web服务更安全,我们要尽可能地改掉软件默认的所有配置,包括端口、用户等。
查看nginx服务对应的默认用户,查看默认配置文件
[root@web02 ~]# grep "#user" /application/nginx/conf/nginx.conf.default 
#user  nobody;
为了防止黑客猜到这个Web服务用户,我们需要更改成特殊的用户名,但这个用户必须是系统事先存在的
(1)为Nginx服务建立新用户
[root@web02 ~]# useradd nginx -s /sbin/nologin -M
[root@web02 ~]# id nginx
(2)配置Nginx服务,让其使用刚建立的nginx用户
更改ningx服务默认使用的用户方法有两种:
第一种为直接更改配置文件参数,将默认的#user nobody修改如下内容
user nginx nginx;
#在http标签即可
如果注释或不设置上述参数,默认即是nobody用户,不推荐使用。最好采用一个普通用户
第二种为直接在编译nginx软件时指定编译的用户和组
./configure --prefix=/application/nginx-1.6.3/ --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
提示:前文在编译nginx服务时,就是这样带着参数,因此配置文件中加不加参数默认都是nginx用户了。
通过上述修改后Nginx进程,可以看到worker processes进程对应的用户都变成了nginx

4.优化Nginx服务的worker进程个数

在高并发、访问量的Web服务场景,需要事先启动好更多的nginx进程,以保证快速响应并处理大量并发用户的请求.
优化Nginx进程对应nginx服务的配置参数如下:
worker_processes  1;
    上述参数调整的是Nginx服务的Worker进程数,Nginx有Master进程和Worker进程之分,Master为管理进程,worker是工作进程
下面介绍Linux服务CPU总核数的方法
[abcdocker@web02 ~]$ grep "processor" /proc/cpuinfo |wc -l
1
[abcdocker@web02 ~]$ grep -c processor /proc/cpuinfo 
1
#此处的1表示1颗1核的CPU
查看cpu总颗数
[abcdocker@web02 ~]$ grep "pysical id" /proc/cpuinfo |sort|uniq|wc -l
1  #对phsical id 去重计算,表示1颗CPU
执行top命令,然后按数字1,即可显示所有的cpu核数,如下
单核CPU显示如下:
有关worker_process参数的官方说明如下:
syntax    worker_processes number:#此行为参数语法,number为数量
default    worker_processes 1    #此行意思是不配置该参数,软件默认情况为1
context    main               #此行为worker_processes参数可以放置的位置
worker_processes为定义worker进程数的数量,建议设置为CPU的核数或者cpu核数*2的进程数,具体情况要根据实际业务来进行选择。除了要和CPU核数的匹配外,和硬盘存储的数据以及系统的负载也会有关,设置为CPU的个数或核数是一个好的起始配置

5.优化绑定不同的Nginx进程到不同CPU上

默认情况Nginx的多个进程有可能跑在某一个或某一核的CPU上,导致Nginx进程使用硬件的资源不均。可以分配不同的Nginx进程给不同的CPU处理,达到充分有效利用硬件的多CPU多核资源的目的。
worker_processes  1;
worker_cpu_affinity 0001 0010 0100 1000;
#worker_cpu_affinity就是配置nginx进程CPU亲和力的参数,即把不同的进程分给不同的CPU处理。这里0001 0010 0100 1000是掩码,分别代表1、2、3、4核cpu核心,由于worker_processes进程数为4,因此上述配置会把每个进程分配一核CPU处理,默认情况下进程不会绑定任何CPU,参数位置为main段
worker_cpu_affinity参数的官方说明如下:
syntax    worker_cpu_affinity cpumask.....#此行为cpu亲和力参数语法,cpumaskcpu掩码
default    ---                                            #默认不配置
context    main                            #此行为worker_cpu_affinty参数可以放置的位置
worker_cpu_affinity的作用是绑定不同的worker进程到一组CPU上。通过设置bitmask控制允许使用的CPUS,默认worker进程不会绑定到任何CPUS。
参考:
worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;
binds each worker process to a separate CPU, while
worker_processes    2;
worker_cpu_affinity 0101 1010;
binds the first worker process to CPU0/CPU2, and the second worker process to CPU1/CPU3. The second example is suitable for hyper-threading.The directive is only available on FreeBSD and Linux.
From : http://nginx.org/en/docs/ngx_core_module.html by oldboy 
    通过观察,我们发现配置后不同CPU的使用率相对平均,和测试前变化不大。可能是Nginx软件本身在逐渐变化,使其使用多核CPU时更为均衡。
 另外(taskset – retrieve or set a process’s CPU affinity)命令本身也有分配CPU的功能,(例如:taskset -c 1,2,3 /etc/init.d/mysqld start)。

 6.Nginx事件处理模型优化

Nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,在Linux下,Nginx使用epoll的I/O多路复用模型,在Freebsd中使用kqueue的I/O多路复用模型,在Solaris中使用/dev/poll方式的I/O多路复用模型,在Windows使用的是icop,等待。
要根据系统类型选择不同的事件处理模型,可供使用的选择的有“use [kqueue|rtsig|epoll|/dev/poll|select|pokk]”。
企业面试题Nginx epool和apache select有什么区别?
http://www.tuicool.com/articles/AzmiY3
宿管大妈的例子
具体配置如下:
events {
#events指令是设定Nginx的工作模式及连接数上限
use epoll
}
#use是个事件模块指定,用来指定Nginx的工作模式,Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作迷失,kqueue和epoll是高效工作模式,不同的是epoll用在Linux平台,而kqueue用在BSD系统中。对于Linux 2.6内核推荐使用epoll工作模式
根据Nginx的官方文档建议,也可以不指定事件处理模型,Nginx会自动选择最佳的事件处理模型服务。

7.调整Nginx单个进程允许的客户端最大连接数

调整Nginx单个进程允许客户端的最大连接数,这个控制连接数的参数为
    worker_connections  1024;
worker_connections的值要根据具体服务器性能和程序的内存使用量来指定(一个进程启动使用的内存根据程序确定)
events {
    worker_connections  20480;
}
#worker_connections 也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024.最大客户端连接数由worker_processes和worker_connections决定.
 并发=worker_process * worker_connections 
参考资料:http:nginx.org/en/docs/ngx_core_module.html

8.配置Nginx worker进程最大打开文件数

Nginx worker进程的最大打开文件数,这个控制连接数的参数为worker_rlimit_nofile。
worker_rlimit_nofile 65535
#最大打开文件数,可设置为系统优化有的ulimit-HSn的结果。
worker_rlimit_nofile number的官方说明如下:
参数语法:worker_rlimit_nofile number;
默认配置:无
放置位置:主标签段
说明:此参数的作用是改变worker processes能打开的最大文件数。
参考资料:http://nginx.org/en/docs/ngx_core_module.html

9.开启高效文件传输模式

1.设置参数:sendfile on;
sendfile参数用于开启文件的高效传输模式,同时将tcp_nopush和tcp_nodelay两个指定设为on,可防止网络及磁盘I/O阻塞,提升Nginx工作效率。
官方说明:
syntax    sendfile on|off  #参数语法
default    sendfile off    #参数默认大小
context    httpserverlocationif in location #可放置的标签段
参数作用:激活或者禁用sendfile()功能。sendfile()是作用于两个文件描述符之间的数据拷贝函数,这个拷贝操作是在内核之中,被称为“零拷贝”,sendfile()和read和write函数要高效很多,因为read和wrtie函数要把数据拷贝到应用层再进行操作。相关控制参数还有sendfile_max_chunk。
http://nginx.org/en/docs/http/ngx_http_core_module.html#sendfile

2.设置参数:tcp_nopush on;
Syntax:  tcp_nopush on | off;  #参数语法
Default: tcp_nopush off;      #参数默认大小
Context: http, server, location  #可以放置标签段
参数作用:激活或禁用Linux上的TCP_CORK socker选项,此选项仅仅开启sendfile时才生效,激活这个tcp_nopush参数可以运行把http response header和文件的开始放在一个文件里发布,减少网络报文段的数量。
http://nginx.org/en/docs/http/ngx_http_core_module.html#tcp_nodelay
3.设置参数:tcp_nodelay on;
用于激活tcp_nodelay功能,提高I/O性能
Syntax:    tcp_nodelay on | off;
Default: tcp_nodelay on;
Context: http, server, location
参数作用:默认情况下数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高I/O性能,但是,在每次只发送很少字节的业务场景,使用tcp_nodelay功能,等待时间会比较长。
参数生产条件:激活或禁用tcp_nodelay选项,当一个连接进入到keep-alive状态时生效
http://nginx.org/en/docs/http/ngx_http_core_module.html#tcp_nopush

10.优化Nginx连接参数调整连接超时时间

1、什么是连接超时?
这里的服务员相当于Nginx服务建立的连接,当服务器建立的连接没有接收到处理请求时,可在指定的事件内就让它超时自动退出。还有当Nginx和fastcgi服务建立连接请求PHP时,如果因为一些原因(负载高、停止响应)fastcgi服务无法给Nginx返回数据,此时可以通过配置Nginx服务参数使其不会四等。例如:可设置如果Fastcgi 10秒内不能返回数据,那么Nginx就终端本次请求。
2、连接超时的作用
1)设置将无用的连接尽快超时,可以保护服务器的系统资源(CPU、内存、磁盘)
2)当连接很多时,及时断掉那些已经建立好的但又长时间不做事的连接,以减少其占用的服务器资源,因为服务器维护连接也是消耗资源的。
3)有时黑客或而恶意用户攻击网站,就会不断和服务器建立多个连接,消耗连接数,但是什么也不操作。只是持续建立连接,这就会大量的消耗服务器的资源,此时就应该及时断掉这些恶意占用资源的连接。
4)LNMP环境中,如果用户请求了动态服务,则Nginx就会建立连接请求fastcgi服务以及MySQL服务,此时这个Nginx连接就要设定一个超时时间,在用户容忍的时间内返回数据,或者再多等一会后端服务返回数据,具体策略要看业务。
3.连接超时带来的问题以及不同程序连接设定知识
服务器建立新连接也是要消耗资源的,因此,超时设置的太短而并发很大,就会导致服务器瞬间无法响应用户的请求,导致体验下降。
企业生产有些PHP程序站点就会系统设置短连接,因为PHP程序建立连接消耗的资源和时间相对要少些。而对于java程序站点一般建议设置长连接,因为java程序建立消耗的资源和时间更多。
4.Nginx连接超时的参数设置

(1)设置参数:keeplived_timeout 60;
用于设置客户端连接保持会话的超时时间为60秒。超过这个时间,服务器会关闭该连接,此数值为参考值。
Syntax:   keepalive_timeout timeout [header_timeout]; #参数语法
Default: keepalive_timeout 75s; #参数默认大小
Context: http, server, location #可以放置的标签段
参数作用:keep-alive可以使客户端到服务端已经建立的连接一直工作不退出,当服务器有持续请求时,keep-alive会使用正在建立的连接提供服务,从而避免服务器重新建立新连接处理请求。
(2)设置参数:client_header_timeout 15;
用于设置读取客户端请求头数据的超时时间,此处的数值15单位是秒。
Syntax:  client_header_timeout time;
Default:  client_header_timeout 60s;
Context: http, server
参数作用:设置读取客户端请求头数据的超时时间。如果超过这个时间,客户端还没有发送完整的header数据,服务端将数据返回“Request time out (408)”错误。
(3)设置参数:client_body_timeout 15;
用于设置读取客户端请求主体的超时时间,默认值是60
Syntax: client_body_timeout time;
Default: client_body_timeout 60s;
Context: http, server, location
参数作用:设置读取客户端请求主体的超时时间。这个超时仅仅为两次成功的读取操作之间的一个超时,非请求整个主体数据的超时时间,如果在这个超时时间内,客户端没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60.
http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout
(4)设置参数:send_timeout 25;
    用户指定响应客户端的超时时间。这个超时时间仅限于两个链接活动之间的事件,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接,默认值为60s,可以改为参考值25s
Syntax:   send_timeout time;
Default: send_timeout 60s;
Context: http, server, location
参数作用:设置服务器端传送http响应信息到客户端的超时时间,这个超时时间仅仅为两次成功握手后的一个超时,非请求整个响应数据的超时时间,如在这个超时时间内,客户端没有收到任何数据,连接将被关闭。
http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout
 操作步骤
一般放在http标签即可
http {
sendfile        on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
server_names_hash_bucket_size 128;
server_names_hash_max_size 512;
keepalive_timeout  65;
client_header_timeout 15s;
client_body_timeout 15s;
send_timeout 60s;
}
配置参数介绍如下:
keeplived_timeout 60;
###设置客户端连接保持会话的超时时间,超过这个时间,服务器会关闭该连接。
tcp_nodelay on;
####打开tcp_nodelay,在包含了keepalive参数才有效
client_header_timeout 15;
####设置客户端请求头读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误
client_body_timeout 15;
####设置客户端请求主体读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误
send_timeout 15;
####指定响应客户端的超时时间。这个超过仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
优化服务器域名的bash表大小
哈希表和监听端口关联,每个端口都是最多关联到三张表:确切名字的哈希表,以星号起始的通配符名字的哈希表和以星号结束的统配符名字的哈希表。哈希表的尺寸在配置阶段进行了优化,可以以最小的CPU缓存命中率失败来找到名字。Nginx首先会搜索确切名字的哈希表,如果没有找到,则搜索以星号起始的通配符名称的哈希表,如果还是没有找到,继续搜索以星号结束的通配符名字的哈希表。
注意.nginx.org存储在通配符名字的哈希表中,而不在明确名字的哈希表中,由于正则表达式是一个个串行测试的,因此该方式也是最慢的,并且不可扩展。
举个例子,如果Nginx.org和www.nginx.org来访问服务器最频繁,那么明确的定义出来更为有效
    server {
        listen       80;
        server_name  nginx.org  www.nginx.org *.nginx.org
        location / {
            root   html/www;
            index  index.php index.html index.htm;
        }
server_names_hash_bucket_size size的值,具体信息如下
server_names_hash_bucket_size size 512
#默认是512KB 一般要看系统给出确切的值。这里一般是cpu L1的4-5倍

官方说明:
Syntax:     server_names_hash_bucket_size size;
Default: server_names_hash_bucket_size 32|64|128;
Context: http
参数作用:设置存放域名(server names)的最大哈希表大小。

11.上传文件大小(http Request body size)的限制(动态应用)

设置上传文件大小需要在nginx的主配置文件加入如下参数
client_max_body_size 8m;
具体大小根据公司的业务调整,如果不清楚设置为8m即可
Syntax:    client_max_body_size size;
Default: client_max_body_size 1m;  #默认值是1m
Context: http, server, location
参数作用:设置最大的允许客户端请求主体大小,在请求头域有“Content-Length”,如果超过了此配置值,客户端会收到413错误,意思是请求的条目过大,有可能浏览器不能正确的显示这个错误,设置为0表示禁止检查客户端请求主体大小,此参数对服务端的安全有一定的作用。
http://nginx.org/en/docs/http/ngx_http_core_module.html

12.fastcgi相关参数调优(配合PHP引擎动态服务)

fastcgi参数是配合nginx向后请求PHP动态引擎服务的相关参数
Nginx Fastcgi常见参数列表说明
Nginx Fastcgi相关参数 说明
fastcgi_connect_timeout 表示nginx服务器和后端FastCGI服务器连接的超时时间,默认值为60s,这个参数通常不要超过75s,因为建立的连接越多消耗的资源就越多
fastcgi_send_timeout 设置nginx允许FastCGI服务返回数据的超时时间,即在规定时间之内后端服务器必须传完所有的数据,否则,nginx将断开这个连接,默认值为60s
fastcgi_read_timeout 设置Nginx从FastCGI服务端读取响应信息的超时时间。表示建立连接成功后,nginx等待后端服务器的响应时间,是nginx已经进入后端的排队之中等候处理的时间
fastcgi_buffer_size 这是nginx fastcgi的缓冲区大小参数,设定用来读取FastCGI服务端收到的第一部分响应信息的缓冲区大小,这里的第一部分通常会包含一个小的响应头部,默认情况,这个参数大小是由fastcgi_buffers指定的一个缓冲区的大小
fastcgi_buffers 设定用来读取从FastCGI服务端收到的响应信息的缓冲区大小以及缓冲区数量。默认值fastcgi_buffers 8 4|8k;
指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256lb,那么会为其分配4个64kb的缓存区用来缓存。如果站点大部分脚本所产生的页面大小为256kb,那么可以把这个值设置为“16 16k”、“464k”等
fastcgi_busy_buffers_size 用于设置系统很忙时可以使用fastcgi_buffers大小,官方推荐的大小为fastcgi_buffers*2
默认fastcgi_busy_buffers_size 8k|16k
fastcgi_temp_file_write_size fastcgi临时文件的大小,可设置128-256k
fastcgi_cache oldboy_nginx 表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502错误的发送,但是开启缓存也会引起其他问题,要根据具体情况选择。
fastcgi_cache_path
fastcgi_cache缓存目录,可以设置目录哈希层级。比如2:2会生成256*256个子目录,keys_zene是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放入内存,提高访问速度),inactive表示默认失效时间,max_size表示最多用多少硬盘空间,需要注意的是fastcgi_cache缓存是先卸载fastcgi_temp_path再移到fastcgi_cache_path。所以这两个目录最好在同一个分区
fastcgi_cache_vaild 示例:
fastcgi_cache_valid 2000 302 1h;
用来指定应答代码的缓存时间,实例中的值将200和302应答缓存一个小时
示例:fastcgi_cache_valid 301 1d;
将304应该缓存1天。
还可以设置缓存1分钟(1m)
fastcgi_cache_min_user
示例:fastcgi_cache_min_user 1;
设置请求几次之后响应将被缓存。
fastcgi_cache_user_stale
示例:fastcgi_cache_use_stale error timeout invaild_header http_500;
定义那些情况下用过期缓存
fastcgi_cache_key 示例:fastcgi_cache_key $request_method://$host$request_uri;
fastcgi_cache_key http://$host$request_uri;

定义fastcgi_cache的key,示例中就以请求的URI作为缓存的key,nginx会取这个key的md5作为缓存文件,如果设置了缓存哈希目录,Nginx会从后往前取响应的位置作为目录。注意一定要加上$request_method作为cache key,否则如果HEAD类型的先请求会导致后面的GET请求返回为空

fastcgi cache资料:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache
PHP 优化设置:
在http{}里面
fastcgi_connect_timeout 240;
fastcgi_send_timeout 240;
fastcgi_read_timeout 240;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#fastcgi_temp_path /data/ngx_fcgi_tmp;  需要有路径
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
PHP缓存 可以配置在server标签和http标签
fastcgi_cache ngx_fcgi_cache;
 fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_key http://$host$request_uri;
2个模块地址
http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_buffer_siz
http://nginx.org/en/docs/http/ngx_http_proxy_module.html

未经允许不得转载:Linux 自动化运维之路~ » 深度优

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5阶无向完全图_运动轿跑风 全新上汽名爵5预告图发布

【太平洋汽车网 新车频道】近日&#xff0c;上汽名爵官方发布了一组全新一代名爵5&#xff08;询底价|查参配&#xff09;的预告图。从图片可以看出&#xff0c;换代而来的全新名爵5采用最新的家族化设计语言&#xff0c;外观风格与新款名爵6较为接近&#xff0c;采用轿跑式溜背…

Shell 企业29道面试题 [转]

企业面试题1&#xff1a;&#xff08;生产实战案例&#xff09;&#xff1a;监控MySQL主从同步是否异常&#xff0c;如果异常&#xff0c;则发送短信或者邮件给管理员。提示&#xff1a;如果没主从同步环境,可以用下面文本放到文件里读取来模拟&#xff1a; 阶段1&#xff1a;开…

深度优化LNMP之Nginx [2]

配置Nginx gzip 压缩实现性能优化 1.Nginx gzip压缩功能介绍 Nginx gzuo压缩模块提供了压缩文件内容的功能&#xff0c;用户请求的内容在发送出用客户端之前&#xff0c;Nginx服务器会根据一些具体的策略实施压缩&#xff0c;以节约网站出口带宽&#xff0c;同时加快了数据传…

go int 转切片_一文掌握GO语言实战技能(二)

Go 数组Go 切片Go 变量和内存地址Go Map 类型Go 面向对象编程Go 方法的定义GO 数组数组是同一类型的元素集合。Go中的数组下标从0开始&#xff0c;因此长度为n的数组下标范围是[0, n-1]。整数数组中元素默认初始化为0&#xff0c;字符串数组中的元素默认初始化为""。…

设置固定长度_加气块砌筑(构造柱、圈梁设置)技术交底21条

墙体砌筑技术交底我给下发21条&#xff0c;内容不全&#xff0c;砌筑的墙体观感差&#xff0c;欢迎大家提出宝贵意见1、填充墙的材料、平面位置尺寸见建筑施工图纸&#xff0c;不得随意更改。2、当首层填充墙下无基础梁或结构梁板时&#xff0c;墙下应做基础&#xff0c;基础作…

深度优化LNMP之MySQL

MySQL数据库优化框架体系 1.硬件层面优化 2.操作系统层面优化 3.MySQL数据库层面优化 4.MySQL安全优化 5.网站集群架构上的优化 6.MySQL流程、制度控制优化 硬件层面优化 1、数据库物理机采购 CPU&#xff1a; 64位CPU&#xff0c;一台机器2-16颗CPU。至少2-4颗&#xff0…

element vue 纵向滑动条_Vue 部分

1、ES6Vue &#xff1a;1、Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的…

C#集合通论

前言 写这篇文章的最初动力是来自于一次笔试经历。有一道笔试题大概是这样的&#xff1a;程序使用一个txt文件来存储操作记录。存储记录是多行字符串&#xff0c;每一行代表一次操作记录&#xff0c;格式如下&#xff1a;用户名操作事项名称操作时间。现在假设这个txt文件已经非…

Shell 脚本案例实战 [4]

for循环结构for 循环结构语句1.for循环结构&#xff1a;语法&#xff1a;for 变量名 in 变量取值列表do指令…done提示&#xff1a;在此结构中“in 变量取值列表”可省略&#xff0c;省略时相当于in “$”&#xff0c;使用for i 就相当于使用for i in “$”2.C语言型for循环结构…

深度优化LNMP之PHP

PHP缓存加速介绍1.操作码介绍及缓存原理当客户端请求一个php程序时&#xff0c;服务器的PHP引擎会解析该PHP程序&#xff0c;并将其编译为特定的操作码文件&#xff08;Operate Code,opcode&#xff09;该文件是执行PHP代码后的一种二进制表示形式。默认情况下&#xff0c;这个…

PHP服务Fcgi进程及PHP解析优化

1、PHP引擎缓存加速常见四种软件&#xff1a;1.eAccelerator2.Zendcache3.xcache4.apc5.zendopcache php5.5自带2、使用tmpfs作为缓存加速缓存的文件目录 [rootweb02 ~]# mount -t tmpfs tmpfs /dev/shm -o size256m[rootweb02 ~]# mount -t tmpfs /dev/shm/ /tmp/eaccelerator…

电路 晶振频率_都说晶振是电路的心脏,你真的了解它吗?

之所以说晶振是数字电路的心脏&#xff0c;就是因为所有的数字电路都需要一个稳定的工作时钟信号&#xff0c;最常见的就是用晶振来解决&#xff0c;可以说只要有数字电路的地方就可以见到晶振。常见种类我们常说的晶振&#xff0c;包含两种。一种需要加驱动电路才能产生频率信…

ios 数组中的字典排序_利用数组和字典,实现按指定规则的排序

大家好&#xff0c;今日我们继续讲解数组与字典解决方案&#xff0c;今日讲解第47讲&#xff1a;利用字典和数组&#xff0c;实现按指定规则的排序。随着字典讲解的深入,我们发现字典真的很神奇,在VBA代码中,给人以十分清爽的感觉,在这套数组与字典解决方案中,我会尽可能的把经…

MVC3学习:利用mvc3+ajax实现登录

用到的工具或技术&#xff1a;vs2010,EF code first,JQuery ajax,mvc3。 第一步&#xff1a;准备数据库。 利用EF code first&#xff0c;先写实体类&#xff0c;然后根据实体类自动创建数据库&#xff1b;或者先创建数据库&#xff0c;再写实体类&#xff0c;都可以。如果实体…

vue获取tr内td里面所有内容_vue 项目学习

首先页面的整体内容结构以及package.json 里面的内容package.jsonrouter.js 路由功能import Vue from vue import Router from vue-router import Login from /login;Vue.use(Router) let router new Router({routes: [{path: /,redirect: {name: Login},},{path: /Login,na…

ubuntu中解压rar文件遇到乱码的解决方法

如上图所示&#xff0c;在用ubuntu的时候经常会遇见rar压缩文件打开出现乱码&#xff0c;解压的时候也会出现无效的编码等错误。 解决方法是用 sudo apt-get remove rar 卸载rar 然后用 sudo apt-get instal unrar 安装unrar 然后就可以解决这个问题了。 个人理解rar是用来压缩…

kmeans中的k的含义_硬质合金中P、M、K、N、S、H六大字母含义详解

数控技术在线订单 | 技术 | 干货 | 社群关注可加入机械行业群&#xff01;关注P类:硬质合金中&#xff0c;P类产品的切削范围是指碳钢&#xff0c;铸钢&#xff0c;包括0.25-0.25%C淬火和调质&#xff0c;易切钢包含退火与淬火调质&#xff0c;低碳合金钢含金元素少于5%的范围&…

gitlab集成ldap用户后,禁用原来的账户体系进行拉取代码

gitlab在集成ldao用户后&#xff0c;经过测试&#xff0c;用户可以还可以通过原来的账号体系进行项目代码的拉取&#xff0c;需要把原来的账号体系的拉取功能关闭&#xff0c;使用ldap的账号体系进行工作开展。 方法如下&#xff1a; 在管理员-设置-通用-登录限制里把 Allow…

ffmpeg 分辨率 压缩_用GPU加速FFmpeg中的超分辨率功能

1. 简要回顾首先简单复述一下FFmpeg中对深度学习的支持情况&#xff0c;如上图所示&#xff0c;FFmpeg在libavfilter中支持基于深度学习的filter&#xff0c;目前已经支持sr, derain和dnn_processing等filter&#xff0c;其中&#xff0c;dnn_processing是一个通用的filter&…

mysql存储过程输入参数拆分_一文看懂mysql数据库存储过程、函数、视图、触发器、表...

概述抽空总结一下mysql的一些概念性内容&#xff0c;涉及存储过程、函数、视图、触发器等。一、查看存储过程、函数、视图、触发器、表1、存储过程select * from mysql.proc where typePROCEDURE;show procedure status; show create procedure proc_name; //存储过程定义2、函…