Nginx配置详解

NginX

回顾http协议:

1.URL格式

URLshceme://username:password@host:port/path;params?query#fram

2.http事务:

    request:请求报文格式       reponse:响应报文格式

    <method> <URL> <VERSION>     <VERSION> <STATUS Code> <REASON-PHRASE>

    HEADERS              HEADERS

    空行               空行

    <body>              <body>        

MethodGET/HEAD/POST, PUT/DELETE, TRACES, OPTIONS

    Status Code

    1xx:信息类状态码

    2xx:成功类响应码,常见:200–OK

    3xx:重定向类的响应码,301, 302, 304

    4xx:客户端错误,常见:403:forbidden—-客户端没权限;404:not found-客户端请求的资源不存在)

    5xx:服务器端错误,常见:502(bad gate–通常是反向代理服务器向后端服务器请求超时导致,nginx中常见)

3.认证:http协议提供,有basicdigest两种认证算法

    基于ip认证

    基于用户认证

4.跨主机进程间通信之串行响应模型

客户端的某个进行请求服务端的服务器端的某个进行进行通信时,此时服务器端的进行有可能是被客户端独占的,如果此时再有其他客户端进行请求服务端进行响应是,那么客户端只能处于等待状态,这就叫串行模型。

 

5.跨主机进程间通信之并发响应模型

为解决串行响应模型带来的性能瓶颈提出的解决方法,并发响应模型中,服务器启动一个主控进程,监听在某服务相对应的套接字上,此主控进程用于fock自身生成子进程来相应客户端请求,但为避免主控进程生成过多子进程从而占用存储空间,主控进程只能fock自身生成有限的子进程来对客户端的请求进行响应。但是如果等到客户端发起请求在fock自身生成子进程的话速度上会有所减慢,所以就提出比较常用的三种进程模型:preforkworkerevent

 

6.httpd MPM:运行与并发响应模型中

prefork进程模型,两级结构,由主控进程master负责fock自身生成子进程,每个子进程负责响应一个请求;

主控进程预先生成指定的空闲子进程,使用的是select()机制,并发请求连接数上限最多1024个子进程

worker:线程模型,三级结构,由主控进程master负责fock生成子进程,每个子进程负责生成多个线程,每个线程响应一个请求;

对于linux系统来说,线程和进程对于内核本身没有太多的区别,主控进程用于监听在套接字中,生成子进程来响应客户端请求,而子进程并不直接响应客户请求,而是生成有限的线程对客户端的请求进行响应,每个线程响应一个请求,每个子进程创建的线程是有限的,线程可以共享进程打开的所有资源,如果线程过多,性能会非常低。

线程模型:对于支持线程模型的服务器来说,线程模型在工作中就表现为一个子进程响应多个请求一样

 

Event由主控进程master负责fock自身生成子进程,每个子进程响应多个请求;

正真意义上的一个子进程响应N个请求,内部并没有创建线程响应请求,而是在内部使用一个完整的处理逻辑机制来处理客户端发给此子进程的请求,此子进程中基于事件驱动模型来实现,事件驱动模型的好处在于,每个子进程在响应客户请求是不用再寻找一个内部的处理机制来处理请求,只需要在请求到达时,而当前的进程正在处理请求,此机制会找一段内存空间将此请求的状态记录下来,然后处理其他请求,当子进程工作完成此机制会通知其子进程根据其请求的状态来继续响应

基于cow(写时复制)机制,使用select()机制完成并发,最多并发1024

 

7.I/O模型:

异步、同步、阻塞型、非阻塞型、复用型、信号驱动型

 

同步进程间通信就有同步异步的概念,同步(synchronous),异步(asynchronous)
如果一个任务依赖另一任务,这个任务向被依赖任务发起调用请求,这个调用请求不会立即返回,而是要等待对方处理完成才返回,但一旦返回了就一定是处理成功的结果;只要收到返回的结果就表示调用者也成功了,这叫做同步;

 

异步

当调用发出以后,被调用方可以立即返回消息,但返回的并不是最终结果,于是被调用者可以通过状态通知机制通知调用者;这种机制就叫异步;这种方式就要依赖于通知,回调函数等等;
所谓异步是指不需要等待被依赖的任务完成,只是通知被依赖的任务干什么事,依赖的一方可以继续自己的其它任务,被依赖的任务把最终完成的结果通知依赖方即可

同步/异步: 关注消息通知机制;

同步:等待对方返回成功消息;

异步:被调用者通过状态、通知或回调机制通知调用者被调用者的运行状态;

 

阻塞:

是指调用结果返回之前,调用者被挂起(暂停)睡眠状态;一直处于等待消息通知,不能执行其它任务,只有被调用者的结果返回,调用者才被唤醒并继续后面的任务;

 

非阻塞:

当前线程就是调用者可能并没有被改为睡眠状态,还可以处理其它任务;调用者在等待被调用者返回时,仍然能执行其它消息的处理这种情况就叫非阻塞;

 

阻塞/非阻塞:

关注调用者在等待结果返回之前所处的状态;

 

A调用B,B不返回,A就完成不了,所以一定是同步的,只不过在B返回时,A能不能干其它事,如果能就是非阻塞,如果不能就是阻塞;


阻塞和非阻塞是用来描述同步模式下调用者的状态的;阻塞、非阻塞和异步就没有关系了,异步就不可能有阻塞;

 

阻塞:blocking,针对于同步I/O,调用结果返回之前,调用者被挂起;

非阻塞:nonblocking,针对于同步I/O,调用结果返回之前,调用者不会被挂起;

复用型IO调用:

select()1024

poll()

I/O模型:5种

一次IO请求,都会由两阶段组成:

第一步:等待数据,即数据从磁盘到内核内存;

第二步:复制数据,即数据内核内存到进程内存;
(1)同步阻塞第一步和第二步都会阻塞
(2)同步非阻塞:第一步不会阻塞,第二步会阻塞
(3)IO multipexing:IO复用select(并发上限最多1024),poll机制(可修改并发上限);
(4)Signal Driven IO:信号驱动(消息通知),同步非阻塞模型(异步阻塞模型),第一阶段完全是非阻塞;
(5)Asynchronous IO:异步IO:都不阻塞

 

 

 

 

 

 

Nginx: 全名:engine X = Nginx

http协议:web服务器(类似于httpd)、http reverse proxy(类似于httpd)、imap/pop3 reverse proxy

Nginx配置详解 

架构:一个master进程有多个一个或多个worker子进程,每个worker子进程可以相应N个请求,每个worker有核心模块core和外围的模块modules组成,有实现http功能的ht_core模块,实现负载均衡的ht_upstream模块,实现反代的ht_proxy模块,实现fcgiht_fastcgi模块

在需要用到某种功能是直接编译或转载指定模块即可,基于每种模块可以与后端的不同应用进行通信,例:基于ht_core模块可以基于http协议与后端的web server通信,基于ht_fastcgi模块可以与php通信,基于memcache模块可以与mamcache通信,这些都是反代模型工作时的架构

 

Nginx架构功能:

Worker进程接收客户端的请求,如果使用缓存功能,则把后端服务器的内容缓存到本地,如果客户端再次请求相同数据则负责从缓存中加载数据,直接响应给客户端;如果客户端请求的内存没有缓存,则通过代理客户端到后端服务器上取资源,如果要取的资源所在的后端服务器是http就用http模块进行,如果是php服务器就使用FastCgi模块进行。Nginx能向客户端提供服务、向后端服务器提供反代服务,又能将后端服务器内容缓存在本地以提高性能。

 

1.Nginx的程序架构:master/worker

一个master进程:负责加载配置文件、管理worker进程、平滑升级

一个或多个worker进程:分别是那种进程处理并响应用户请求

 

2.缓存相关的进程:

cache loader:载入缓存对象

cache manager:管理缓存对象

 

 

3.特性

1异步I/O、事件驱动、非阻塞

2并实现并发用户请求响应处理时:可通过kevent/epoll/select机制

3基于在本地磁盘上与本地磁盘数据通行时,支持高级IO机制:高级IO sendfile,异步,mmap

Mmap:内存映射,如果文件要想被访问,都必须先从磁盘载入内核内存中才能够被访问,而内存映射指在内存空间中找一段空间映射本地磁盘中的数据,但并没有把数据复制到内存空间中,而是直接通过这段内存加载数据。

4.nginx高度模块块高度模块化,但其模块早期不支持DSO机制;近期版本支持动态装载和卸载;

核心模块:core module

标准模块:Standard HTTP modules 标准http模块

  Optional HTTP modules可选http模块

  Mail modules  邮件模块

  Stream modules 流模块

3rd party modules  第三方模块

每个模块都引入两个特性:

第一:指令,有某个模块,就有相应的配置指令,没有编译的模块就没有这个配置指令

第二:内置变量,不用模块有不同的变量

 

5.nginx的功用:

(1)静态的web资源服务器;

(2)结合FastCGI/uwSGI/SCGI等协议反代动态资源请求;

(3)http/https协议的反向代理;

(4)imap4/pop3协议的反向代理;

(5)tcp/udp协议的反向代理;

6.nginx的安装配置:

(1)官方的预制包:

http://nginx.org/packages/centos/7/x86_64/RPMS/

(2)编译安装:

~]#下载nginx程序源码包

~]# yum install pcre-devel openssl-devel zlib-devel

Prce-develurl重写模块用到的开发包

Openssl-devel:使用ssl模块是使用的开发包

~]# useradd -r nginx

~]#./configure –prefix=/usr/local/nginx –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pid-path=/var/run/nginx.pid –lock-path=/var/run/nginx.lock –user=nginx –group=nginx –with-http_ssl_module –with-http_v2_module –with-http_dav_module –with-http_stub_status_module –with-threads –with-file-aio

~]# make && make install

编译安装Nginx的选项含义:

–prefix=/usr/local/nginx 程序安装路径

–conf-path=/etc/nginx/nginx.conf 程序配置文件安装路径

–error-log-path=/var/log/nginx/error.log  错误日志安装路径

–http-log-path=/var/log/nginx/access.log  访问日志安装路径

–pid-path=/var/run/nginx.pid  进程号存放文件路径

–lock-path=/var/run/nginx.lock  锁文件存放路径

–user=nginx  指定那个用户运行worker进程,主控进程一般与root用户运行

–group=nginx  

–http-client-body-temp-path=/var/cache/nginx/client_temp

客户端body部分的临时文件存放路径,如果服务器允许客户端使用put方法提交大数据时,临时存放的磁盘路径
–http-proxy-temp-path=/var/cache/nginx/proxy_temp

作为代理服务器,服务器响应报文的临时文件存放路径
–http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp

作为fastcgi代理服务器,服务器响应报文的临时文件存放路径
–http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp

作为uwsgi代理服务器,服务器响应报文的临时文件存放路径
–http-scgi-temp-path=/var/cache/nginx/scgi_temp 作为scgi反代服务器,服务器响应报文的临时文件存放路径

 

–with表示要编译指定的某个模块,要启用指定的模块

–without表示不编译指定的某个模块,禁用指定的模块

–with-http_ssl_module   

–with-http_v2_module

–with-http_dav_module

 –with-http_stub_status_module

 –with-threads

–with-file-aio

 

7.配置文件:

主配置文件:nginx.conf

include conf.d/*.conf

fastcgiuwsgiscgi等协议相关的配置文件

mime.types:支持的mime类型

fastcgi.conf 支持fastcgi的配置文件,与php结合要编辑此文件;
fastcgi_params 支持fastcgi的配置文件,与php结合要编辑此文件;
koi-utf 支持语言的配置文件
koi-win 支持语言的配置文件
mime.types 支持的MEMI类型的配置文件
scgi_params 支持scgi的配置文件
uwsgi_params 支持uwsgi的配置文件,与params结合要编辑此文件;    

8.主配置文件的配置指令:

directive value [value2 …];

注意:(1) 指令必须以分号结尾;

   (2) 支持使用配置变量;

内建变量:由Nginx模块引入,可直接引用;

自定义变量:由用户使用set命令定义;

set variable_name value;

引用变量:$variable_name

9.主配置文件结构:

main block:主配置段,也即全局配置段;

event {

}:事件驱动相关的配置;

http {

}http/https 协议相关的配置段;

mail {

}  邮件相关的配置

stream {

}

 

~]#vim /etc/nginx/nginx.conf

worker_processes  1;

//定义启动的worker进程数,设置为auto时为当前cpu核心数

worker_cpu_affinity 0010 0100;

//指定第1和第2cpuworker运行
使用命令ps axo command,pid,psr 查看worker工作在哪颗cpu上,cpu编号是从0开始;
使用cpumask标识,有几颗cpu就用几位二进制数标识使用cpu的个数;
例如:有八颗cpu,用8个位二进制
0000 0000 – 1111 1111
0000 0001 表示第0cpu
0000 0010 1cpu
0000 0100 2cpu
0000 1000 3cpu
0001 0000 4cpu 

……

worker_priority -5;

//指定worker进程的优先级nice值为-5

events {

worker_connections  1024;

//定义每个worker进程可以处理的请求数,每worker支持的最大并发数

}

 

 

10.main配置段常见的配置指令:

(1)正常运行必备的配置

(2)优化性能相关的配置

(3)用于调试及定位问题相关的配置

(4)事件驱动相关的配置

11.正常运行必备的配置:

1user指定运行worker进程的用户

Syntax: user user [group];

Default: user nobody nobody;

Context: main

user  nobody;

2pid /PATH/TO/PID_FILE;

指定存储nginx主进程进程号码的文件路径;

pid        logs/nginx.pid;

3include file | mask;

指明包含进来的其它配置文件片断;

http{

include       mime.types;

}

4load_module file;

指明要装载的动态模块;

 

12.性能优化相关的配置:

1worker_processes number | auto;

worker进程的数量;通常应该为当前主机的cpu的物理核心数;

worker_processes  1;

2worker_cpu_affinity auto [cpumask];

绑定worker进程运行在指定的cpu核心上,多个cpu核心用空格隔开  

CPU MASKcpu掩码

000000010CPU

000000101CPU

… …

worker_cpu_affinity 00000001 00000010

 

3worker_priority number;

指定worker进程的nice值,设定worker进程优先级;[-20,20]

worker_priority -5;

4worker_rlimit_nofile number;

单个worker进程所能够打开的文件数量上限,默认为1024

 Work_rlimit_nofile  2048

13、调试、定位问题:

1daemon on|off;

是否以守护进程方式运行Nignx;如果设定为offnginx会输出信息到桌面

Daemon off;  

2master_process on|off;

是否以master/worker模型运行nginx;默认为on,如设定为off,则只有一个worker进程监听,处理请求;

Master_process off;  

3error_log file [level];

错误日志文件的记录方式及其日志级别;其中debug,依赖于编译时–with-debug选项

error_log  logs/error.log  info;

 

 

 

 

 

14、事件驱动相关的配置:

定义在events端中的指令:

events {

}  

1worker_connections number;

每个worker进程所能够打开的最大并发连接数数量;

总并发数=worker_processes * worker_connections

events {

       worker_connections  1024;

}

每一个进程所能够打开是数量是受限于(worker_rlimit_nofile设置)它所能够打开的文件数量的  

2use method;

指明并发连接请求的处理方法;

支持的方法有:selectpollkqueueepoll/dev/polleventport

events {

       use epoll;

}

3accept_mutex on | off;

是否打开负载均衡锁,处理新的连接请求的方法;on意味着由各worker轮流处理新请求,Off意味着每个新请求的到达都会通知所有的worker进程;

events {

       Accept_mutex on;

}

 

15.http协议相关的配置结构

http {

:各server虚拟的公共配置

server {

}:每个server用于定义一个虚拟主机;

server {

server_name   //定义当前虚拟主机的主机名

Root  //定义文档根目录

Alias   //别名

location [OPERATOR] URL {    //定义类似于别名的映射

if CONDITION {

}

}

}

}

 

 

 

 

 

 

 

 

 

Nginx 配置:与套接字相关的配置

1.server {…}配置虚拟主机
配置一个虚拟主机;基于ip和主机名没显著区别;只能用于http上下文中;
server {
 listen address[:PORT]|PORT;
 server_name HOSTNAME;
 root /PATH/TO/DOCUMENTROOT;
 …
}

注意:(1)基于port的虚拟主机:
 listen指令需要使用不同的端口;

2)基于HOSTNAME的虚拟主机:
 server_name指令指向不同的主机名;
3)基于IP的虚拟主机;
 listen IP:port

2.listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE

listen address[:port] [default_server] [ssl] [http2 | spdy]  [backlog=number] [rcvbuf=size] [sndbuf=size]

default_server:设置默认虚拟主机;用户访问虚拟主机不存在时默认响应的虚拟主机
ssl:限制只能通过ssl连接提供服务;端口要为443
backlog:后援队列的长度;例如并发最大为100个,来了200请求,就要排队,如果排队也满了就靠后援队列,后援队列也满了就有可能超时了;
rcvbuf:接收缓冲区大小;
sndbuf:发送缓冲区大小;

 

3.server_name name …;

指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串;

支持*通配任意长度的任意字符;server_name *.magedu.com

支持~起始的字符做正则表达式模式匹配;server_name ~^www\d+\.magedu\.com$

匹配机制:

(1) 首先是字符串精确匹配;

(2) 左侧*通配符;

(3) 右侧*通配符;

(4) 正则表达式;

 

 

 

 

练习:定义四个虚拟主机,混合使用三种类型的虚拟主机;

仅开放给来自于本地网络中的主机访问;

1.编辑主配置文件,定义虚拟主机:

12定义基于主机名的虚拟主机

34定义基于ip的虚拟主机

24定义基于端口的虚拟主机

~]# vim /etc/nginx/nginx.conf         

   (1)server {              

listen  88;    

server_name www.li1.com;  

root /var/li1/html;    

}        

    (2)server {      

listen  192.168.1.4:88;    

server_name www.li2.com;  

root /var/li2/html;    

}      

      (3)server {        

listen  10.1.25.11:8;

server_name www.li3.com;

root /var/li3/html;

}

    (4)server {

listen  192.168.1.4:8; www.li4.com;

root /var/li4/html;

}

2.添加防火墙规则:   

[root@Centos72 ~]#iptables  -P INPUT DROP

[root@Centos72 ~]# iptables -A INPUT -s 10.1.0.0/16 -d 10.1.25.11 -p tcp -m multiport –dport 22,8,88,80 -j ACCEPT

[root@Centos72 ~]# iptables -A OUTPUT -s 10.1.25.11 -p tcp -m multiport –sport 22,8,88,80 -j ACCEPT

 

 

[root@Centos72 ~]# iptables -vnL

Chain INPUT (policy DROP 0 packets, 0 bytes)

 pkts bytes target    prot opt in  out source destination   

 347 28512 ACCEPT  tcp — *   10.1.0.0/16  10.1.25.11   multiport dports 22,8,88,80

 

pkts bytes target   prot opt in  out  source  destination         

18  1648 ACCEPT tcp — * *    10.1.25.11    0.0.0.0/0     multiport sports 22,8,88,80

 

 

4.tcp_nodelay on|off;
只对keepalived模式下才有意义,是否启用TCP_NODELAY选项;
tcp特性每次都要3次握手,4次断开,如果两主机间通信时,次在保持连接的通信上,服务器只发送很小的数据给客户端,会浪费带宽(开销比数据大)

如果客户端只请求了这个很的数据,等待很长时间才能得到响应,此时tcp等待很小的报文增多时一起发送时,表示tcp_delay=off

如果客户端请求有小数据时,服务端也立即发送,表示tcp_nodelay=on

 

tcp_nodelay on  表示数据报文每请求一次发送一次,不允许延迟发送响应报文

Tcp_nodelay off  表示数据报文请求数据少的时候,聚合数据报文多的时候同意发送响应报文


 

5.sendfile on|off;
是否启用sendfile功能,即在内核中直接封装响应报文响应用户的请求;默认是关闭的,需要手动启用;
(把用户所请求的数据直接在内核中封装响应发送给客户端)
tcp_nopush on | off;
只在sendfile启用时才有效,默认是关闭的;

 

定义路径相关配置 

6.root path;
设置web资源的路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;
可用的上下文:
http:表示对所有server都生效;
server:表示只对当前一个server生效;
location:表示只对server定义的location中的URL生效;
if:表示仅对条件判断生效;

 


7location 2种方式:
location [ = | ~ | ~* | ^~ ] uri { … }
location @name {…}
根据用户请求的URI来匹配定义的location,匹配到时,此请求将被相应的location块中的配置指令所处理;有点类似于if的功能;
=URI精确匹配;用户给定的URIlocation中的完成一样;
~:做正则表达式模式匹配,区分字符大小写;
~*:做正则表达式模式匹配,不区分字符大小写;
^~:对URI左半部分做匹配检查,不区分字符大小写;

匹配优先级:=^~~/~*、不带符号;

如果用户请求的URIserver中的代码块中多个location都能匹配到,应用则按照优先级;

URi:访问资源时路径:http://www.magedu.com/images/1.jpg其中:/images/1.jpg就被称为uri

 

location可以对某特定资源类型加以限制,例如用户访问的都是以.txt结尾,压缩以后发送;此时就必须标识出那些资源
txt结尾,来作出额外处理:
location  ~*  \.txt {
gzip on;
}

location引入了新的上下文,可有指令,但仅对location能匹配到的uri资源生效;所以在一个serverlocation可出现多次,分别用来实现对不同类型资源做特定处理功能;location中还可嵌套location


8alias path;
定义路径别名,也是文档映射的一种机制,只能用在location上下文;
root指令:给定的路径对应于location/uri/左侧的/
alias指令:给定的路径对应于location中的/uri/右侧的/(这个url),而不包含uri本身;

例如:在http中,定义别名 alias /bbs/ /forum/
请求资源:http://www.magedu.com/bbs/a.jpg
对应资源:http://www.magedu.com/forum/a.jpg
文件路径:/web/forum/a.jpg
nginx中,定义别名,例如:
location /bbs/ {
alias /web/forum/;
}

相当于访问的是:/web/forum/a.jpg

有时常用法,例如:
location /bbs/ {
root /web/forum/;
}

相当于访问的是:/web/forum/bbs/a.jpg

例:定义虚拟主机,定义bbs别名

  1 server {

  2     root /var/li1/html;

  3     server_name www.li1.com;

  4     listen 80;

  5     location /bbs {

  6         root /var/li1/html;

  7     }

  8     location /bbs2 {

  9         alias /var/li1/forum;

 10     }

 11 }

实验结果:

(1)访问www.li1.com时显示/var/li1/html/index.html主页信息

(2)访问www.li1.com/bbs时显示/var/li1/html/bbs/index.html主页信息

(3)访问www.li1.com/bbs2时显示/var/li1/forum/index.html主页信息

结论:

(1)定义rootalias指定的路径时相对于文件系统的绝对路径地址

(2)对于root,访问location指定的目录时会补全locationroot指定的目录后面

(3)对于alias,访问location指定的目录会直接跳转到alias指定的目录

(4)定义别名时,location指定的目录和alias指定的

 

9.index file …;
可用位置:httpserverlocation
设置默认主页;在不同的location可指定不同的主页;

10.error_page code…[=[response]] url;
自定义错误页面,根据用户请求的资源的http响应的状态码实现错误页重定向;
可用于httpserverlocationif in location

 

(1)自定义错误码对应错误页面
server {

root /var/li1/html;

server_name www.li1.com;

listen 80;

location /bbs {

root /var/li1/html;

error_page 404 =200 /error.html;

}

当用户访问错误码是404,响应/var/li1/html/error.html错误页面给用户,并且客户端的回应码为200 ok

(2)自定义多个响应码响应一个页面

例:服务器端错误页面:可定义多个响应码
server {

root /var/www/html;

server_name www.li1.com;

listen 808;

error_page 404 403 /error.html;

location = /error.html {

root /var/error;

}

}

用户访问页面时代码为403,404时,返回error.html页面给用户

注意:error.html页面首先匹配location中定义的root目录下是否存在error.html文件,如果location中的root指定的目录中未定义error.html文件,则会从httpserver自上而下匹配root下的error.html页面返回给用户

 

 

(3)错误解决方法

显示:Error_Page
编译时没有自动创建:/var/run/nginx/nginx.pid
解决办法:sudo nginx -c nginx.conf
sudo nginx -s reload

11try_files

 定义客户端请求的相关配置:

12keepalive_timeout timeout [header_timeout];
设定保持连接的超时时长,0表示禁止使用长连接,默认为75秒;


13keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量,默认100个;

14keepalive_disable none|browser…
对哪种浏览器禁用长连接;none表示不禁用;

15send_timeout time;
向客户端发送响应报文的超时时长,默认60秒;是指两次写操作之间的间隔时长;

 

16、client_body_buffer_size size;
用于接收客户端请求报文的body部分的缓冲区大小,默认为816k(取决于3264位系统,超出此大小时,其将被暂存到磁盘上;

客户端请求资源时,缓存主体内容的缓冲区大小

 

17、client_body_tmp_path path[level1 [level2 [level3]]];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;

 

每一个客户端请求报文的body大小为16k,并发连接的请求量有很多;因此,如果每一个请求量都大于了16k,都应该缓存到磁盘上,如果请求数量有2万个,就意味着在这个目录下有2万个文件,从这2万个文件中找一个在某个时刻是特别慢,为了加速这个过程,就实现分级存储;

例:
/var/tmp/body/{1,2,3}创建3个一级子目录,还可在1下再创建{a,b,c}二级子目录;
在文件存储时,可以按级存储,好处在于可以按级查找文件;把每个用户请求的URL,把URLmd5编码,编码后首字母是0-15之间的数字,所以就看第一位是什么,第一位是0就放在0目录下,是1就放在1目录下;然后再找第二位,是a就放在a目录下,是b
就放在b目录下
由于使用的是16个数字,就意味着可以把2万个文件平均在16个子目录下,第一次查找就可以缩减了15倍,在二级子目录下查找又可以缩减15倍;
因此,这里分级的意义,就是用来指明,创建多少一级子目录,创建多少二级子目录,多少三级子目录;

这里的[level1 [level2 [level3]的代表一个数字,表示十六进制数的个数;
例如:
/var/tmp/body 2 表示在body目录下使用两个十六进制字符创建一级子目录,一个十六进制是4位二进制数,两个十六进制数就是8位二进制数;因此,一共有256中变化,即:
00-ff 可创建256个一级子目录;

/var/tmp/body 2 1 表示在每一个一级子目录下,使用一个十六进制数创建二级子目录,即可创建16个二级子目录;00-ff 可创建256个一级子目录;0-f 可创建1个二级子目录;

/var/tmp/body 2 1 2 表示在每个二级子目录下有两个十六进制数创建三级子目录,即可创建256了三级子目录;00-ff 可创建256个一级子目录;0-f 可创建1个二级子目录;00-ff 可创建256个三级子目录;

所以,这样查找一个文件只需前5个字符,就可以第一次缩减256倍,第二次缩减16倍,第三次又缩减256倍;就是2^8+2^4+2^8,只需3次查找就基本可以定位到文件的位置了;

 

 

 

 

 

 

 

 

 

对客户端请求进行限制的相关配置:
18limiti_rate rate;
限制服务器端每秒钟响应给客户端的传输速率,单位是字节/秒,bytes/second0表示无限制;只用于httpserverlocationif

例:定义limit_rate限制客户端请求服务端资源速率
]# vim /etc/nginx/nginx.conf
location /download/ {
 limit_rate 20480;
  root /web/host1;
}

]# mkdir /web/host1/download
]# dd if=/dev/zero of=/web/host1/download/test.img bs=1M count=50

在本机测试:
]# wget http://192.168.255.2/test.img
浏览器测试:http://www1.stu11.com/download/test.img
显示:下载对话框;速度非常慢;

 

实验结果:

(1)设定limit_rate 20480时,使用浏览器http://HOST/download/test.img时,会自动弹出下载框,此时下载速率为20k/s;当关闭limit_rate指令时,下载速率为20M/s

 

 


19limit_except method… {…};
限制对指定的请求方法之外的其它方法的使用客户端;

仅限制用于location中;

:限制GET方法可以所有人访问,但除了GET方法以外的其他方法只允许10.1.1.25客户端访问;
limit_except GET {     
 allow 10.1.1.25/32;
 deny all;
}

表示除了GET方法以外的其它方法仅允许192.168.1.0/32中的主机使用;

 

 

 


文件操作优化的配置:
20aio on|off|threads[=pool];
是否启用aio功能;默认关闭;指明使用多少个线程;不指定就是用多少启用多少线程;建议开启,可用在http, server, location

21、directio size|off;

Context:httpserverlocation
是否启用直接IO, 当请求的文件达到指定大小时启用直接IO
直接IO就是,写请求的时候,数据不在内存中缓存而是直接刷到磁盘上去,这就是直接IO;对性能有影响,对数据可靠性比较高;
例:当I/O请求的文件大于4M以后启用直接I/O    #directio 4m

22open_file_cache off;
open_file_cache max=N[inactive=time];
有助于提高性能;对打开的文件是否缓存下来,nginx缓存的是文件的元数据;

off:表示不缓存;
max=N:可缓存的缓存条目上限;达到上限后会使用LRU(最近最少使用)算法实现缓存管理;
inactive=TIME:缓存项的超时时长,在此处指定的时内未被访问命中或命中的次数少于open_file_cache_min_users指令指定的次数的缓存项即为非活动项;
nginx可以缓存以下三种信息:
1)文件的描述符、文件大小和最近一次的修改时间;
2)打开的目录结构;
3)没有找到的或没有权限访问的文件的相关信息;
23open_file_cache_errors on|off;
是否缓存查找时发生错误的文件一类的信息;open_file_cache的功能是否有效,取决于此处指令

24open_file_cache_min_uses number;
缓存项在非活动期限内,最少应该被访问的次数;

open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次可以被归类为活动项

哪些文件被认为是非活动项:在open_file_cache中指定的时长内没有被访问的项就叫非活动项;其实,非活动项是有最小门槛限制的;在指定的时长内,至少要访问多少次,才认为是活动项,少于此处指定的次数才认为是非活动项,而不是0次;

open_file_cache中指定的时长内没有被访问的项就叫指令的inactive参数指定的时长内,在至少命中此处指定的次数方可不被归类到非活动项;

25open_file_cache_valid time;
缓存项有效性的检查频率;默认为60秒;
能改善nginx的性能,nginx很多地方都能用到缓存,而缓存的管理方法都是近似的;理解了这一个,其它就很容易了;
一旦发现文件是非活动期限,超出非活动时长,或在指定时长内,访问次数小于min_uses指定的次数,就应该把该文件删除;此处就是设置,每隔多久检查一次文件的非活动期限;

 

ngx_http_access_module模块:访问控制模块
实现基于客户端ip的访问控制功能;跟http基于ip实现访问控制是一类法则;

26allow address|CIDR|unix:|all;

27deny address|CIDR|unix:|all;
可用上下文:httpserverloactionlimit_except
例如:
location / {
deny 192.168.11.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8:/32;
deny all;
}


ngx_http_auth_basic_module模块;基于用户认证的模块
例如:
location / {
 auth_basic "closed site";
 auth_basic_user_file /etc/nginx/conf.d/htpasswd;
}

28auth_basic string|off;
使用basic机制进行用户认证;
用户为虚拟用户,要指明账号、密码的位置;
auth_basic_user_file file
认证用的账号密码文件;
文件格式:name:password:commet(注释)
密码格式:htpasswd命令(或使用crypt()函数进行加密)

例:创建账号、密码文件;
]# yum -y install httpd
]# htpasswd -c -m /etc/nginx/.nginxpasswd tom tom用户设定密码
]# htpasswd -m /etc/nginx/.nginxpasswd jerry jerry用户设定密码

]# vim /etc/nginx/nginx.conf

        root /var/www/html;
 location /admin/ {
  auth_basic "Admin Area";
  auth_basic_user_file  /var/www/.pass;
} 

实验结果:

密码文件所在的位置只能使用文件系统上的绝对路径

 


ngx_http_stub_status_module模块;
能够启用nginx自带的状态页面,
用于输出nginx的基本状态信息;

29tub_status;
:定义nginx状态页面
]# vim /etc/nginx/nginx.conf
 location /status {
 stub_status;

Access_log off   //不记录访问状态页面的访问记录
}

显示信息解释
Active connections: 2  当前活动状态客户端链接数
server accepts handled requests
 19    19     44

Reading: 0 Writing: 1 Waiting: 1

 

解释:
Active connecttions:处于活动状态的客户端连接的数量;(包括等待客户端发来请求、开始建立连接的客户端但已经处于等待客户端发请求、或正在处理客户端请求、正在给客户端发响应报文)
accepts服务器已经接受客户端请求的总数;(包括已经处理完、正在处理)
handled已经处理完成的客户端请求的总数;(接收的大于处理完成的数量;)
requests客户端已经发来的请求总数;(包含拒绝的请求)
Reading正处于读取客户端请求报文首部的连接数量;
Writing正处于向客户端发送响应报文过程中的连接数;
Waiting正处于等待客户端发出请求的空闲连接数;如果启用保持连接功能,客户端请求资源后没再请求就处于空闲状态;如果waiting状态数量很多,表示大量客户端处于空闲状态,有可能是keep allive timeout设置时间太长所导致;

 

 

 

 

 

 

 

 


ngx_http_referer_module模块:
基于引用做访问控制;表示从哪个链接跳转到当前页面;
30valid_referers none|blocked|server_names|string…;
定义合法的referers数据;可实现防盗链拒绝访问,拒绝来自某链接到本网页等功能; Context:  server, location

one:请求报文首部没有referer首部;
blocked:请求报文的referer首部没有值;
server_names:其值是主机名;一般是自己的域名;
string:有2
arbitrary string:直接字符串,可以使用*通配符;
regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头;

例如:使用主机名;
valid_referers none blocked server_names *.magedu.com magedu.* ~\.magedu\.;
if($invalid_referer){
 return 403; }

中,$invalid_referer是内嵌变量,表示只有不能被valid_refers指令匹配到的头被归类到invalid_referer;直接调用$invalid_referer变量即可;

 

例:只允许baidu.com域名的主机跳转,不允许baidu.com域名以外的跳转

  [root@Centos conf.d]# vim vhost.conf

location /status {

         stub_status;

         access_log off;

         valid_referers none blocked server_names *.baidu.com;

         if ($invalid_referer) {

             return 403;

        }

     }

 

验证:baidu.com域名的所有主机可以跳转,其余都不能跳转

[root@Centos72 ~]# curl -e  http://www.baidu.com  http://192.168.1.10/status

Active connections: 1

server accepts handled requests

 37 37 37

Reading: 0 Writing: 1 Waiting: 0

[root@Centos72 ~]# curl -e  http://www.google.com  http://192.168.1.10/status

<h1>403 404 error.html

 

 

ngx_http_log_module模块
用于实现以指定格式记录用户请求日志;
httpd设置日志格式时,有4种:combinedcommonrefereragent等;但日志记录的信息越丰富,对并发较高的场景中,对磁盘IO压力越大;
31access_log path format gzip[=leve][buffer=size][flush=time][if=condition];

access_log off;关闭访问日志;Contextstream  server

 

path:可指明日志文件路径;
gzip[=leve] 指明日志文件压缩存放时的gzip压缩比
format:日志格式;
buffer=size日志缓存大小;(磁盘刷写频率过高时应调大此值);
flush=time:多长时间从内存刷写至磁盘上一次;

例:access_log /testdir/nginx_status/acc.log main gzip=7;

结论:日志格式必须定义在http段, 日志文件路径及格式定义在server


32access_log syslog:server=address[,parameter=value] [format[if=condition]];
向指定的日志服务器发送日志;
33log_format name string…;

Context:http
定义日志格式,指明名称和字符串;与httpd定义略有区别,在httpd中使用%u等宏定义,而对nginx则使用内建的变量来定义格式;

string可以使用nginx核心模块及其它模块内嵌的变量;    

:日志格式定义及含义
log_format  main   '$remote_addr – $remote_user [$time_local] '
  '"$request" $status $bytes_sent '
  '"$http_referer" "$http_user_agent" "$gzip_ratio"';
access_log /spool/logs/nginx-access.log compression buffer=32k;

含义:
main:日志格式名称
$remote_addr:表示远程地址;
$remote_user:远端用户名;
$request:客户端发出的请求;
$http_referer:上一级跳转的页面;
$http_user_agent:浏览器类型;
$gzip_ratio:压缩比;

使用access_log用格式名(main)即可;

课外作业:为nginx定义使用类似于httpdcombined格式的访问日志;

http格式:

     log_format sts  '$remote_addr'

         ' – – ["$time_local"]'

                    ' "$request"'

    ' $status'

                    ' \"-\" "$http_user_agent"';


34open_log_file_cache max=N[inactive=time][min_uses=N][valid=time];
open_log_file_cace off; 关闭此功能
定义缓存空间,用来存储文件描述符,对Linux系统,任何文件在内核中都能基于某个数字来追踪这个文件,这个数字就是引用这个文件的唯一标识;称为fdfile descriptors)叫做文件描述符;可理解为内核打开文件引用的临时映射的数字标识;
多个server虚拟主机打开的文件不止一个,日志的每一次写操作都要临时通知内核,打开一个文件,写完之后就关闭了,再写时还得再找,这样太慢了;可以把打开的文件缓存下来,每个文件打开后用一个描述符映射,随时用随时找这个描述符就可以;

max=N缓存的最大文件描述符数量,默认10个;能缓存多少条打开的文件,在一个缓存中能缓存多少个打开的文件条目;如果超过设置条目,使用基于LRU算法最近最少使用算法,进行换进换出做缓存管理;

min_users:在inactive指定的时长内访问大于等于此值方可被当作活动项;

inactive:非活动时长;

valid:验正缓存中各缓存项是否为活动项的时间间隔;

 

 

nginx的内置变量:
 $bytes_sent:发送的字节数;the number of bytes sent to a client
 $connection:连接的序列号;
 $connection_requests:连接请求;
 $msec:毫秒;
 $pipep表示基于管道,.表示otherwise
 $request_length:请求报文的长度;
 $request_time:请求时间;
 $status:响应码;
 $time_iso8601:时间格式;
 $time_local:本地时间;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ngx_http_rewrite_module模块:
用于实现将用户请求的URI基于正则式转换为其它URl机制;并且以重定向方式默认返回给客户端,让客户端对新的URI重新再次发起请求;
处理步骤:
server当中,使用rewrite指令定义的重写机制是自上而下逐条进行处理的,类似于iptables的规则都是自上而下应用设置的;如果被第一条处理,下面不会再检查;因为处理过了已经返回给客户端,客户端已经再次请求新URI了;

执行过程会重复如下操作:
(1)基于用户请求的URI去搜索location
(2)在一个location内部的指令,是从上而下逐条检查;
(3)如果URI被重写循环重复,最多10,就会提示错误页面
(4)用户请求到达nginx服务器端时,服务端有多个server虚拟主机,映射到哪个server,取决于用户请求的server name,根据用户请求的server name最终被判断到底请求的是哪个server,从而判断属于哪个server,每个srever内部还有多个location,每个location用来定义URL到本地文件系统路径的映射方式以及内部处理机制;因此,还有根据用户请求的URL去匹配location;所以,这里有2步操作:

        第一步,根据server name匹配是哪个server

        第二步,根据用户请求的URL去匹配server内部的location;在一个location内部可能存在多个rewrite指令,rewrite指令作用就是把用户请求的URL换成其它的URL

例如:用户请求的是http://server2/hello.htm被匹配到第二个srever上,其中location中如果第一条rewrite指令,指明了把hello.html指向了hi.html;则返回给客户端去请求http://server2/hi.html,而后客户端要重新再次发请求,依然自上而下去匹配属于哪个server、哪个location;如果hi.html被第三location匹配则被location中的指令处理;

 例:循环重写示例:
rewrite  (.*)\.jpg$ –> $1.html
rewrite  (.*)\.html$ –> $1.jpg  


写的规则次序很重要:根据用户请求的主机名来判断是哪个server;确定server后,根据location完成搜索,根据location中的重写规则完成重写,重写后,返回客户端一个新的URL,客户端再次发请求;如果中间出现循环最大循环10此;URL重写可实现跨server,例如请求http://server2/images/1.jpg,改写为http://images/$1.html,这个images可能是其它虚拟主机,甚至还可能是另一台物理服务器;
所有URL重写,可在一个主机上的一个server内只把URL部分重写,但有时可以把server重写,实现镜像服务器;把里面的服务器地址改了,但是URL没改;
URL重写可把对应动态资源的请求转换为静态的URL地址;因此,这个结果可被搜索引擎收录,还可被缓存服务器缓存;可理解为把动态资源静态化的效果;
如果用户访问的php动态资源,很多时候缓存服务器是不缓存这个结果的,但是如果动态资源生成的结果不会再变化可以缓存服务器缓存下来时(静态的存下来),可以给静态URL;这种机制可在nginxrewrite功能来实现;但用到正则式就要启动正则表达式引擎,这样会消耗更多资源;因此,尽量不使用;
1rewrit regex replacement[flag];
用于实现重写操作;
把用户请求的URI基于regex做检查,匹配到时,这个URI将替换为replacement指定的字符串;

[flag]

last重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环;

break重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环;

redirect重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端对新URL进行请求;(重定向响应码302不能以http://https://开头;

permanent: 重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端对新URL进行请求;(重定向响应码301

如果第一条规则被last匹配了,意味着新的URI会重新做一次请求,nginx会在内部自动重新检查,如果又被这个location匹配,还会再检查一遍;最终将资源加载后返回给客户端;
如果第一条规则被break匹配,rewrite停止在第一条中的新URI上,意味着不再被执行重写指令即跳出循环,nginx会在内部而继续执行此location内的其它指令;最终将资源加载后返回给客户端;
如果第一条规则被redirect匹配,直接将新URL返回给客户端,浏览器自动对新URL发请求,这个新URL有可能还是本机中location,再解析匹配检查,所以,redirect直接返回的不是资源,而是一个新的URL
redirectpermanent,表示当用户请求的URL被重定向时,直接返回用户新的URL,让用户自己重新请求,只不过这两者的区别为,redirect是临时重定向,permanent是永久重定向;

注意:lastbreak都是nginx自动的在内部进行后续处理;
  redirectpermanentnginx返回URL给客户端浏览器自动重新请求的

 

注意:

(1)在同一location中存在多个rewrite规则会自上而下逐个被检查(隐含循环);可使用flag控制此循环功能;

(2)如果replacement是以http://https://开头,则替换结果会直接以重定向方式返回给客户端;

(3)如果replacement不是以http://https://开头,将会按次序,依次读取规则,所有规则都处理完成后,把最终结果返回客户端,而不是被某条规则重写后立即返回客户端;

(4)查找时可使用模式,替换为的内容不能使用模式,但可使用后向引用,在nginx中不使用\1,是使用$1来表示引用;

(5) 如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;

(6)rewrite指令的执行次序,就是写在配置文件中的次序,如果重写时一个规则依次向下循环匹配很多规则时,可使用flag中的break在指定的规则上停止循环,完成最终重写。


:(1)无错误页面重写
]# vim /etc/nginx/nginx.conf
20     location / {

21         index index.html;

22         rewrite (.*)\/.*\.?.* $1/index.html break;

  23     }

结论:无论用户输入什么资源,都会重写到index.html页面

 

(2)定义死循环

]# vim /etc/nginx/nginx.conf

20     location / {

21         index index.html;

22         rewrite (.*)\.txt $1.html;

23         rewrite (.*)\.html $1.txt;

24     }

结论:浏览器输入http://10.1.1.25/index.txt时,服务器响应码为500(服务器内部错误),此时在两条重写规则任意一条中添加break即可终止循环。

 


2rewrite_log on | off;
是否启用重写日志;启用时,日志信息被发往错误日志;
if(condition){…} 条件判断机制,在条件满足时,执行配置块中的配置;引入了一个新的配置上下文;通常对nginx的变量做判断;
可在ngx_http_core_module模块中,查看定义的变量;$remote_addr$remote_port$remote_user$request_uri$uri等等;

 

Condition:表达式

(1)条件比较表达式:
等值比较和不等值比较: ==!=
~:模式匹配,左侧字符串是否能被右侧模式匹配,区分字母大小写;
~*:模式匹配,左侧字符串是否能被右侧模式匹配,不区分字符大小写;
~:模式不匹配,左侧字符串是否不能被右侧模式匹配,区分字符大小写;
~*:模式不匹配,左侧字符串是否不能被右侧模式匹配,不区分字符大小写;
(2)文件及目录存在性判断:
-f|!-f:存在且类型为文件,叹号表示取反;
-d|!d:判断为目录;
-e|!-e:判断存在;
-x|!-x:判断执行权限;


:(1)定义只允许浏览器类型为ChromeFirefox时,才能将.txt重写为.html
    ]#vim /etc/nginx/conf.d/vhost.conf

if ($http_user_agent ~* Chrome|Firefox ) {

        rewrite (.*)\.txt $1.html break;

    }

表示:判断用户的浏览器是否能被ChromeFirefox匹配,$http_user_agent是其它模块引入的变量;
(2)定义如果用户请求方法为post时,返回错误代码及提示给用户

if ($request_method = POST) {
return 405 Sorry;
}
(3)定义用户访问的uri中带有admin字样就返回错误代码及提示给用户
]# vim /etc/nginx/nginx.conf
if ($uri ~* .*admin,*) {
return 403 "go away";
}

结论:(1)浏览器输入:www1.stu11.com/admin.html显示:go away,响应码还是403
    (2)返回指定的错误代码不受自定义的错误代码响应页面影响

 

set $variable value;
用户自定义变量;在nginx中变量无论在定义还是引用都要使用$符号;

 

 

 

 

ngx_http_gzip_module模块
过滤器,对指定类型的资源压缩传输以节约带宽;但消耗了cpu资源;

一下所有指令都可用与http, serverlocation
1gzip on|off;
是否启用gzip压缩响应报文;不是所有浏览器都支持压缩机制;
2gzip_comp_level level;
指定压缩比,1-9,默认为1;数越大压缩比越大;
3gzip_disable regex …;
regex是匹配客户端浏览器类型的模式,表示对所有匹配到的浏览器不执行压缩响应;因为有些浏览器类型不支持压缩;
4gzip_min_length length;
触发启用压缩功能的响应报文的最小长度;
5gzip_http_version 1.0|1.1;
设定启用压缩响应功能时,协议的最小版本;向下兼容原则;
6gzip_types mime-type …;
压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能;默认为text/html

7gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any …;
nginx作为代理服务器接收到从被代理服务器发送的响应报文后,在何种条件下启用压缩功能的;
off:对代理的请求不启用
expired:如果响应报文首部包含expired字段并有值,其值即是有效的但过期了,因为禁用了缓存机制,则启用压缩;
no-cache, no-storeprivate:表示从被代理服务器收到的响应报文首部的Cache-Control的值为此三者中任何一个,则启用压缩功能;


示例:定义压缩机制

]#vim /etc/nginx/conf.d/vhost.conf
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_disables msle6;
gzip_min_length 2;
gzip_type text/plain text/css text/xml applicatin/x-javascript application/xml application/json application/javascript;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  ngx_http_fastcgi_module模块:

LNMP():
nginx+phpfpm):只有1
nginx编译时只支持fastcgi模块,php也只能使用php-fpm机制;fpm就是fastcig processor manager进程管理器; php在编译时使用–enable-fpm选项支持fpm

当有大量数据进行保存时,要放在专用的存储中,需要专用的协议客户端,php程序代码,要与后端mysql通信,就要php链接mysql的驱动,叫php链接器;不同程序员使用不同的链接器,存储mysql数据库;
当用户请求有动态资源时,就交由后台的php服务器进行处理,如果还要有数据存储,就由php再与myslq通信,从而,将结果返回给客户端;

后端存储会存在多个客户端与数据库服务器通信,此时会遇到资源征用,可能会导致资源响应较慢;


安装php-fpmnginx结合;安装php链接mysql的驱动;

nginxphp-fpm在同一台主机:
]# yum -y install php-fpm php-mysql php-mbstring php-gd php-xml
]# rpm -ql php-fpm
/etc/php-fpm.d/www.conf 配置文件
/etc/sysconfig/php-fpm 环境配置文件
/usr/share/fpm/status.html 状态页面
]# vim /etc/php-fpm.d/www.conf
[www]
listen = 127.0.0.1:9000 监听php本机的ip地址
;listen.backlog = -1 后援队列
listen.allowed_clients = 127.0.0.1 前端web服务器的ip地址;
user = nginx
group = apache
pm = dynamic 动态方式
pm.max_children = 50 最大并发进程数,根据业务,资源设置;
pm.start_servers = 5 启动时的进程数
pm.min_spare_servers = 5 最小空闲进程数
pm.max_spare_servers = 35 最大空闲进程数
;pm.max_requests = 500 单个pm进程最多响应请求数量
pm.status_path = /pm_status 可能被nginx所占用,改名为pm_status
]# systemctl start php-fpm
]# vim /etc/php-fpm.d/www.conf
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; fastcgi请求传递给后端php服务器
fastcgi_index index.php; 匹配此location中的php
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name; 其中/scripts应为后端php主机资源所在的文件路径;
include fastcgi_params; 在文件中定义参数;
}

]# ls /etc/nginx/
fastcgi.conf
fastcgi.conf.default
fastcgi_params
fastcgi_params.default
使用哪个文件,就在配置文件中include包含哪个文件即可;
]# vim /etc/nginx/fastcgi_params
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
参数有很多,在URL请求中包含很多信息,参数、查询字符串、请求方法等都要让后端服务器知道;在代理时,前端服务器是根据客户端请求的报文首部分析;

就是把前端的各种信息保存在变量中,参数可认为就是变量,把变量的值保存在对应的参数中,后端服务器可通过参数获取值,这个参数相当于中间变量,由前端的fastcgi模块,把变量传递给后端php服务器;
]# vim /usr/local/nginx/html/info.php
<?php
phpinfo();
?>
]# nginx -s reload
浏览器输入:https://www1.stu11.com/info.php

 

 

 

 


fastcgi模块指令:
1fastcgi_pass address;
指明后端php-fpm服务器的address;是fpm服务器监听的地址和端口;
示例:fastcgi 127.0.0.1:9000;
2fastcgi_index name;
定义fastcgi应用的主页名称;可以是多个;
3fastcgi_param parameter value [if_not_empty];
指明向后端传递的参数,传递给fpm服务器的参数及其值;有可能调用的nginx变量的值;
(1)fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time]
(2)[max_size=size] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off]
(3)[purger_files=number] [purger_sleep=time] [purger_threshold=time];
定义缓存空间的名称;
path:文件系统路径,用于存放缓存的文件数据;在此目录下分多级目录
max_size=size:定义此路径下多大空间用于存储缓存数据;其它使用默认设置即可;
levels=#[:#[:#]]:缓存目录的层级定义;一般为12
例如:levels=1:2;
keys_zone=name:size
定义内存中用于缓存k/v映射关系的空间名称及大小;
inactive=time 非活动时间

注意:只能用于http上下文;

 

nginx缓存实现加速,php执行代码的结果保存在nginx的缓存空间中,用户再请求时就不会交给后端的php在执行了,而是直接从缓存返回给客户端,这就相当于静态资源了;httpd基于模块也能缓存;
注意:

第一:缓存结果内容,有可能刚存下来,资源被删了,客户端请求时发现资源仍然可以响应,这样就不真实了,所以,缓存要及时清理;
第二:缓存下来的内容,得有命中率,要有客户端经常访问,否则没有意义;同一资源被多次请求的经历;

nginx把缓存分为两段:
首先在内存空间中保存缓存文件的元数据;然后在磁盘中保存元数据所指向的文件内容;所以,对于nginx缓存保存的是键值数据,把文件系统上的层级文件数据,转换成Key-Value数据,key在内存中,value在磁盘中是一个个的文件对象;而文件的名字等信息是在内存中的;key也是分层级的但不同于文件系统的层级;k是文件的名字或是访问的URL,而v是真正的数据;数据文件的名字是这个文件内容的校验码;
缓存下来的文件的文件名是文件内容做md5校验计算后的校验码,md5校验码是128位二进制定长输出;每四位二进制对应一个十六位进制数,以md5为例,128/4=32,即32个十六进制数;文件内容不同校验码就不同;把这些十六进制数字组成的文件名进行层级划分;可把前两个字符当作一级子目录的名字,再两字符当二级子目录的名字,再一个字符当三级子目录的名字;这样意味着,一级子目录有(两个十六进制数字表示的个数)即256个,二级子目录有256个。三级子目录有16个;想要分几级,就用多少个十六进制数所能划分的个数来表示;
4fastcgi_cache zone|off;
是否启用cache功能,如果启用,要提前定义缓存空间的名字;默认为off不缓存;
5fastcgi_cache_key string;
定义要使用的缓存键;
例如:fastcgi_cache_key $request_uri
6fastcgi_cache_methods GET | HEAD | POST …;
缓存哪些类型的请求的相关数据;是请求方法;
7fastcgi_cache_min_uses number;
缓存最少使用次数;在指定时长内,如果小于此值就为非活动;
8fastcgi_cache_valid [code …] time;
缓存数据时,对不同响应码设定其可缓存的时长;
注意:调用缓存时,至少应该制定3个参数
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid


例如:定义缓存,使用ab命令压测试
]# ab -c 10 -n 100 https://172.18.11.114/info.php
平均响应请求为300个左右;
开启nginx缓存功能:
]# vim /etc/nginx/nginx.conf
http配置段:
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fcgicache:10m;
调用缓存:
location ~ \.php$ {
root html;
fastcgi_cache fcgicache;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
fastcgi_cache_key $request_uri;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
]# mkdir /var/cache/nginx/fastcgi -pv
]# nginx -s reload
在浏览器:https://www1.stu11.com/info.php 多次刷新页面后,查看生成的缓存文件:
]# tree /var/cache/nginx/fastcgi/
]# ab -c 10 -n 100 https://172.18.11.114/info.php
有显著提升,平均响应为400左右

ngx_http_ssl_module模块:

ssl协议位于传输层和应用层之间的半层;应用层协议在开发时调用ssl功能,就能支持ssl,有些应用层协议在调用ssl时,可把ssl做一个模块,用到时就可以调用;就像httpd,可提供http服务,也可提供https服务;只不过,如果是基于rpm安装方式时,需要
安装mod_ssl模块;
ssl协议是基于tcp通信的,经过tcp3次握手后,才能进行sslhandshake
服务器发证书给客户端,包括支持哪些加密算法,与客户端协商;客户端接收后证书后,要验证证书持有者与访问主机站点地址是否一致,证书的颁发机构是否是信任的机构,验证证书的有效期,用CA公钥解密数字签名,用同样的算法加密特征码,对比是否一致,验证CA的合法性;还要检查证书吊销列表;验证通过后,才通信;但通信时,还要有密钥交换的过程,用对方的公钥加密选择的一次性对称密钥,然后传递给对方,对方用私钥解密后,就得出了密码,然后就用这个密码来加密客户端请求的资源之后,将资源发送给客户端,随后就是ssl双方之间的通信;

这个通信是基于ssl会话进行的,所有http报文在发送给tcp层之前,先交给ssl层,ssl层会把文本形式的报文,转换为ssl报文,ssl报文是为二进制格式的;随后才交给tcp层;因此基于ssl层的会话,可认为是在整个报文多了一层,即数据之外是应用层,应用层之外是ssl会话层,然后才是tcp层,最后经过封装MAC发送;
运营商能截获客户端的访问页面,插入相关的链接或广告,站点有可能都不知道;在cdn层次上分析客户的访问;因此,站点现在都做全站https,这样,再运营商插入广告,客户就打不开网页,从而,运营商为了满足客户端打开网页的需求,就不能插入广告了;
ssl会话是基于tcp隧道承载的一种协议,是在tcp建立连接之后,才建立的;而在拆除会话时,是先拆除ssl会话,再拆除tcp连接;
ssl加解密会给cpu带来很大压力;将来做服务器时,要做选型;软硬件模型多服务器做压测,要满足业务需要;客户端使用域名访问服务器站点,通过DNS服务器解析返回一个请求的要访问服务器ip地址,之后,客户端就封装http请求报文,http报文基于get方法,body部分一般是空的,再外面封装的是http请求报文首部,当中有大多请求报文的header,其中有一个header叫做host,这个host给的就是在浏览器中键入的主机名;再封装tcp等等;域名只在http请求报文首部才用到,而首部是在ssl会话内部的;所以两台主机间通信tcp会话是基于ip地址进行,ssl会话也是基于ip地址进行的;双方身份识别是基于ip地址,而没有用到主机名;所以,任何一台服务器只有一个IP地址的主机,只能提供一个https的虚拟主机;但现在有个开源项目,能够实现单台主机使用多个https的虚拟主机;

灰度模型:服务器上线、下线一批一批来打补丁;
 

1、ssl on|off;
是否启用当前虚拟主机的ssl
手动测试时,可临时关闭;
基于ip地址的ssl会话,在一个ip上进行只能一个虚拟主机ssl会话;
2ssl_certificate file;
当前虚拟主机使用的PEM格式的证书文件;
3ssl_certificate_key file;
指明私钥文件;当前虚拟主机使用的证书文件中的公钥配对儿的私钥文件路径,PEM格式;
4ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
指明使用的ssl协议版本;最好使用TLSv1以上的版本;
5ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
ssl会话创建非常消耗资源,能缓存下来对同一主机的多次请求,在有效时间内可不用建立ssl会话,基于缓存来实现;指明ssl会话的缓存机制;
off:禁止使用会话;坚决禁止;
none:禁止使用会话;温和禁止;告诉客户端会话有可能被重用,但并不保证;
builtin:使用openssl(加密的库)内建的缓存机制,此为各worker独占;
为每个worker进程在自己的空间中加载ssl相关库,各worker是不共享的;每个worker自己独立管理自己的ssl会话缓存;

        缺陷:同一个用户请求,第一个请求调度在第一个worker响应,第二个请求有可能被调度到第二个worker响应,这样缓存有可能无法被命中;
shared:相对于builtin而言,ssl缓存是由各worker共享的缓存;缓存空间需要定义namesize等,每个共享必须有名字;共享的缓存由nginx进程所管理的一段内存空间,对于nginx,共享内存空间非常多,所以共享内存空间要有名字和空间大小;
name:缓存空间的名称;每一段空间间必须有一个名字;
size:字节为单位的缓存空间的大小,每1MB内存空间可缓存4000个会话;10M空间就可缓存4万个会话;一般只使用共享,效率会高些;多个虚拟主机可使用同一段缓存空间来缓存自己的ssl会话;

6ssl_verify_client

是否验证客户端证书;一般不会验证客户端证书;
7ssl_ciphers 

加密算法,必须是Openssl所支持的加密算法才可以;
!(叹号)表取反,+表示包含的算法;
使用openssl ciphers命令,可查看openssl支持哪些加密算法;

8ssl_session_timeout;
ssl会话超时时长,指ssl会话缓存中缓存条目的有效时长(即非活动期限的有效时长);默认是5分钟;

9ssl_prefer_server_ciphers

  当使用SSLv3TLS协议时,优先使用服务器端的加密算法;倾向于使用服务器端的加密算法;
server {
listen 443 ssl;    ————————-强制ssl会话
server_name localhost; ——————虚拟主机名
ssl_certificate cert.pem; —————–证书
ssl_certificate_key cert.key;————-私钥
ssl_session_cache shared:SSL:1m; —-共享ssh缓存大小
ssl_session_timeout 5m; —————–会话ssl的超时时长
ssl_ciphers HIGH:!aNULL:!MD5; ——–ssl的加密算法
ssl_prefer_server_ciphers on; ———–倾向于使用服务器端的加密算法
location / {
root html;
index index.html index.htm;
}

nginx配置虚拟主机使用https示例:centos7系统:

创建私钥创建签署证书请求:

]# mkdir ssl
]# (umask 077;openssl genrsa -out ssl/nginx.key 1024)
]# openssl req -new -key nginx.key -out nginx.csr -days 365

创建私有CA
]# cd /etc/pki/CA/
创建CA私钥创建CA自签证书:
]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
创建CA必要文件:
]# touch index.txt
]# echo 01 > serial
CA签署证书请求:
]# openssl ca -in /etc/nginx/ssl/nginx.csr -out /etc/nginx/ssl/nginx.crt -days 365
配置nginx配置文件

]# vim /etc/nginx/nginx.conf

server {
listen 443 ssl;
server_name www1.stu11.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}

在浏览器输入:https://www1.stu11.com

 

 

 

 

 

 

原创文章,作者:Lii,如若转载,请注明出处:http://www.178linux.com/54476

(0)
LiiLii
上一篇 2016-10-25
下一篇 2016-10-25

相关推荐

  • 磁盘管理

    磁盘,分区,文件系统

    Linux干货 2017-12-02
  • Linux文件权限及ACL

    文件权限 文件或目录可存取的身份分为3类,owner/group/others (所属者/所属组/其他人) ,所以访问一个文件或目录的权限分为三种, 所有者权限,所属组权限,其他人权限 (通过ll text.log查看)。 在linux系统中常用的权限分为3种 r(read) w(write) x(excute)。 对文件或目录的权限进行修改时,要用到chm…

    Linux干货 2017-06-01
  • vim编辑器总结与操作练习

    一、VIM总结如下: 模式化的编辑器 1、三种基本模式:     编辑模式(命令模式)     输入模式(插入模式)    末行模式:内置的命令行接口 2、如何使用VIM打开文件,编辑文件     打开文件:     #vim  【options】【file】     +n;打开文件后直接让光标处于第n行的行首     +/PATTERN:打开文件后,直接让…

    2017-11-29
  • rsyslog将日志记录于MySQL中,并用loganalyzer进行分析日志

    1、首先来安装lamp环境的支持,与其相关的软件包      # yum -y install rsyslog-mysql mariadb-server php php-mysql php-gd httpd       说明:rsyslog-mysql在数据库中生成一个库文件,但这个文件需…

    Linux干货 2013-09-03
  • 沉舟侧畔千帆进,枯木头前万树春

    N21第五周博客作业 1、  显示/boot/grub/grub.conf中以至少一个空白字符开头的行; ~]#  grep -E "^[[:space:]]+" //boot/grub/grub.conf root (hd0,0) kernel /vmlin…

    Linux干货 2016-07-29
  • mysql主从复制

    MySQL主从复制        主从复制原理: mysql主从同步其实是一个异步复制的过程,要实现复制首先在master上开启bin-log日志功能。整个过程需要开启3个线程, 分别是master开启IO线程,slave开启IO线程和SQL线程. (1) 在slave服务器执行start…

    Linux干货 2016-06-26