第十六周

Posted amy_itx_aps

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十六周相关的知识,希望对你有一定的参考价值。

第十六周

1.对常用I/O模型进行比较说明

I/O模型相关概念

同步/异步: 关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。

 同步:synchronous 被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成

 异步:asynchronous 被调用者通过状态,通知或回调机制主动通知调用者的运行状态
阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态

 阻塞:blocking 指IO操作需要彻底完成后才返回到用户空间,调用结果返回前,调用者被挂起,干不了别的事情。
 非阻塞:nonblocking 指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。

网络I/O模型

阻塞型 非阻塞型 服用型 信号驱动型 异步

阻塞型I/O模型 blocking IO

阻塞IO模型时最简单的IO模型,用户线程在内核进行IO操作时被阻塞
用户线程通过系统调用read发起IO读操作,由于用户空间转到内核空间,内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read 操作
用户需要等待read将数据读取到buffer后,才能继续处理接收的数据,整个I/O请求的过程中,用户线程是被阻塞的,者导致用户在发起IO请求时,不能做任何事情,对cpu的资源利用率不够高

优点:程序简单,在阻塞等待数据期间进程/线程挂起,基本不会占用CPU资源

缺点: 每个连接需要独立的进程/线程单独处理,当并发请求量大时为了维护程序,内存、线程切换开销大,apache的preforck使用的就是这种模式
同步阻塞:程序向内核发起I/O请求后一直等待内核响应,如果内核处理请求的IO操作 不能立刻返回,则进程将一直等待并不在接受新的请求,并由进程轮询查看I/O是否完成,完成后进程将I/O 结果返回给 clien ,在
I/O没有返回期间进程不能接受其他客户的请求,而且是由进程自己区查看I/O 是否完成,这种方式简单,但是比较慢,用的比较少
非阻塞型I/O 模型 nonblocking IO 

用户线程发起IO请求时立刻返回,但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据道道后,才正真正读取到数据,继续执行。即 轮询机制存在两个问题:如果有大量文件描述符都要等,
那么就得一个一个的 read 。 这会带来大量的 Context switch(read 是系统调用,每调用一次就得在用户态和核心态切换一次)。轮询的时间不好把握,这里是要猜多久之后数据才能到。等待时间设的太长,
程序响应延迟就过大;设的太短,就会造成过于频繁的重试,干耗CPU 而已,是比较浪费CPU 的方式,一般很少使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性

非阻塞:程序向内核发起I/O请求后一直等待内核响应,如果内核处理请求的I/O操作不能立即返回IO结果,进程将不再等待,而且继续处理其他请求,但是仍然需要进程隔一段时间就要查看内核i/O 是否完成
多路复用I/O型(I/O multiplexing)

上面的模型中,每一个文件描述符对应的IO是由一个线程监控和处理

多路复用IO指一个线程可以同时(实际是交替实现,即并发完成)监控和处理多个文件描述符对应各自的IO,即复用同一个线程

一个线程之所以能实现同时处理多个IO,是因为整个线程调用了内核中的 select  poll或epoll 等系统调用,从而实现多路复用IO

IO/multiplexing 主要包括:select  poll epoll  三种系统调用, select/poll/epoll  的好处就在于单个process 就可以同时处理多个网络连接的IO

它的基本原理就是select /poll/epoll 整个function会不断的轮询所负责的所有 socket ,当某个 socket 由数据到达了,就通知用户进程

当用户进程调用了 select  那么整个进程会被 block 而同时,kernel 会监视所有select 负责的 socket ,任何一个socket 中的数据准备好了, select 就会返回,整个时候用户进程再调用read 操作,将数据从
kernel 拷贝到用户进程

apache prefork 是此模式的 select, worker 是 poll模式

优点:可以基于一个阻塞对象,同时再多个描述符上等待就绪,而不是使用多个线程(每个文件描述符一个线程),这样可以大大节约系统资源

缺点:当连接数较少时效率相比多线程+阻塞 I/O 模型效率低,可能延迟更大,因为单个连接处理需要2次系统调用,占用时间会由增加

当一个服务器既要处理监听套接字,又要处理已连接套接字,一般也要用到I/O复用
信号驱动式I/O模型(signal-driven IO)

信号驱动i/o 的意思就是进程现在不用傻等这,也不用区轮询,而是让内核再数据就绪时,发送信号通知进程

此模型的优势在于等待数据报到达期间进程的被阻塞,用户主程序可以继续执行,只要等待来自信号处理函数的通知。

在信号驱动模式I/O模型中,应用程序使用套口进行喜好驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞

当数据准备好时候,进程会收到一个 sigio 信号,可以子啊信号处理函数中调用I/O操作函数处理数据,
优点:线程并没有在等待数据时被阻塞,内核直接返回调用接收信号,不影响进程继续处理其他请求,因此可以提高资源利用率。

缺点:信号I/O 在大量IO操作时可能会因为信号队列溢出导致没法通知
异步阻塞:程序进程向内核发送IO调用后,不用等待内核响应,可以继续接受其他请求,内核收到进程请求后进行的IO如果不能立即返回,就由内核等待结果,直到IO完成后内核再通知进程。

异步I/O模式(asynchronous IO)

异步I/O 与信号驱动I/O最大的区别在于,信号驱动时内核通知用户进程何时开始一个IO操作。而异步IO时由内核通知用户进程IO操作何时完成,两者由本质区别,相当于不用区饭店场吃饭,直接点个外卖,把等待上菜的事件也给
省了。

异步非阻塞:程序进程向内核发送IO调用后,不用等待内核响应,可以继续接受其他请求,内核调用的IO如果
不能立即返回,内核会继续处理其他事物,直到IO完成后将结果通知给内核,内核在将IO完成的结果返回给进
程,期间进程可以接受新的请求,内核也可以处理新的事物,因此相互不影响,可以实现较大的同时并实现较
高的IO复用,因此异步非阻塞使用最多的一种通信方式 

五种 IO 对比

这五种 I/O 模型中,越往后,阻塞越少,理论上效率也是最优前四种属于同步 I/O,因为其中真正的 I/O 
操作(recvfrom)将阻塞进程/线程,只有异步 I/O 模型才与 POSIX 定义的异步 I/O 相匹配

常用I/O模型比较

select poll epoll
操作方式 遍历 遍历 回调
底层实现 数组 链表 哈希表
IO效率 每次调用都进行线性遍历,时间复杂度O(n) 每次调用都进行线性遍历,时间复杂度O(n) 事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪的fd放到rdlist里,时间复杂读O(1)
最大连接数 1024(x86) 2048(x64) 无上限 无上限
fd拷贝 每次调用select 都需要把fd集合从用户态拷贝到内核态 每次调用poll,都需要把fd集合从用户态拷贝到内核态 调用epoll_ct时拷贝进内核并保存,之后每次epoll_wait 不拷贝

2.nginx中的模块分类及常见核心模块有哪些

核心模块:时nginx 服务器正常运行必不可少的模块,提供粗无日志记录、配置文件解析、事件驱动机制、进程管理等核心功能
标准http模块:提供http协议解析相关的功能,比如:端口配置、网页编码设置、http响应头设置等
可选http模块:主要用于扩展标志http功能,让nginx 能处理一些特殊的服务,比如:flash 多媒体传输、解析geiIO 请求,网络传输压缩、安全协议 ssl 支持等
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议
的支持
stream 服务模块:实现反向代理共功能,包括tcp 协议代理
第三方模块:是为了扩展nginx服务器应用,完成开发者自定义功能,比如:json支持,lua支持等
nginx 模块:
官方文档:http://nginx.org/en/docs/
Modules reference

模块分类
核心模块 core module 
标志模块:
 http 模块 nginx_htp_*
 http core mode  #默认功能
 http_optional modules #需要编译时指定
mail 模块: ngx_mail_*
stream 模块 ngx_stream_*
第三方模块

3.nginx中配置指令的含义

#http://nginx.org/en/docs/
#nginx 主配置文件nginx.conf
[root@elb01 ~]# cat /app/nginx/conf/nginx.conf

##------------------------------------------- nginx 全局(main) 全局配置,对全局生效  --------------------------------------------------------------------------------------------

#worker进程以哪个用户运行 ,编译安装时候可以指定用户 组 , master 进程 默认以 root 用户运行(配置文件 master进程 监听 在80 端口 只要特权用户可以使用 1024 以内的 端口 ) 
##Syntax:   user user [group];
#Default:   user nobody nobody;
user nginx nginx;

#work进程数量, 最佳值取决于许多因素,包括(但不限于)CPU物理内核数,auto可以自动检测cpu 核心数量, 通常应该等于或小于 物理cpu 核心数 服务上主要运行 nginx  无其他服务的情况下配置比较合适
##Syntax:   worker_processes number | auto;
#Default:   worker_processes 1;
worker_processes  auto;

#将worker进程绑定到指定的cpu核心上, 有几个cpu就写几位数字  8个cpu 与8个work进程 依次绑定,减少进程切换造成的cpu缓存失效,提高cpu缓存命中率
# Syntax:   worker_cpu_affinity cpumask ...;
#worker_cpu_affinity auto [cpumask];
#Default:   —
#worker_cpu_affinity 0001 0010 0100 1000 ;
worker_cpu_affinity auto;

##worker 进程的优先级别 -20到19 默认优先级为 0
# Default:  worker_priority 0; worker_priority 0;
#Syntax:    worker_priority number;
#Default:   worker_priority 0;

worker_priority -10;

# 所有 worker 进程能够打开的文件数量的上限, 并发量的上限 ,默认无配置 需要配合  /etc/security/limits.conf  配置
#  cat /etc/security/limits.conf 
#*        soft        core        unlimited
#*        hard        core        unlimited
#*        soft        nproc       1000000
#*        hard        nproc       1000000
#*        soft        nofile      1000000
#*        hard        nofile      1000000
#*        soft        memlock     32000
#*        hard        memlock     32000
#*        soft        msgqueue    8192000
#*        hard        msgqueue    8192000
#*        soft        stack       32768
#*        hard        stack       32768

#fs.file-max-nr  #决定了当前内核可以打开的最大的文件句柄数
#cat>>/etc/sysctl.conf<<eof
#fs.file-max=65535
#eof
# #Syntax:  worker_rlimit_nofile number;
#Default:   —
worker_rlimit_nofile 65536;

## -----------------------------------------------------------  调试 定位问题-------------------------------------------------------

#确定 nginx 是否应该成为守护进程。主要在开发过程中使用
#前台执行 或者后台执行 默认 后台执行 写成容器需要配置为前台执行 daemon on | off;
# #Syntax:  daemon on | off;
#Default:   daemon on;#

#确定是否启动工作进程。该指令适用于 nginx 开发人员
#是否以master/worker模型运行nginx 
##Syntax:   master_process on | off;
#Default:   master_process on;
#master_process on;

#错误日志
##Syntax:   error_log file [level];
#Default:   error_log logs/error.log error;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
error_log  logs/error.log error;

#定义file将存储主进程的进程 ID 的
##nginx master 进程pid 
# #Syntax:  pid file;
#Default:   pid logs/nginx.pid;
pid        logs/nginx.pid;

##--------------------------------------------- 异步网络IO事件模型  epoll  配置影响 nginx 服务器或与用户的网络连接 ------------------------------------------------
#
events 

##异步网络IO事件模型  回调机制
# #Syntax:  use method;
#Default:   —
use epoll;

#单个worker 进程能够处理的最大并发连接数, 该数目包括所有连接(例如,与代理服务器的连接等),而不仅包括与客户端的连接。另一个需要考虑的因素是,并发连接的实际数量不能超过打开文件最大数量的当前限制,可以通过worker_rlimit_nofile进行更改 
# #Syntax:  worker_connections number;
#Default:   worker_connections 512;
worker_connections  10240;

##处理新的连接请求的方法:
#如果accept_mutex on 则每个 worker 进程将依次接收新的网络连接,每个worker 都有活干,否则新的网络连接请求来时,将通知所有worker worker 进程都被唤醒 如果新连接的数量很少,则某些worker进程可能分派不到任务,则会浪费系统资源,白白唤醒了 worker进程但又未能给worker 分配到任务.
#惊群现象: 来了少量的请求把worker 进程都唤醒,可能只要一个worker 分配到了处理任务,其他worker 白白被唤醒 浪费了资源 
#如果accept_mutex on  工作进程将依次接受新连接。否则,所有的工作进程都会收到新连接的通知,如果新连接的数量很少,一些工作进程可能只会浪费系统资源。
#accept_mutex off 当某一时刻只要一个网络连接到来时,多个睡眠的worker进程被同时唤醒,但是只有一个进程可以获得连接。如果每次唤醒的进程数目过多,会影响一部分系统性能。即惊群现象 
#accept_mutex on  会对多个进程接收连接进行序列化 ,防止多个进程对连接的争抢 避免惊群 
#
#worker 进程之间是平等的,每个workdr 进程,处理请求的机会也是一样的,当我们提供80端口的 http 服务时候,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢? 首先,每个worker 进程都是从 master 进程 fork 过来,在master 进程里面,先建立好 listen 的 socket  之后,然后再 fork  出多个 worker 进程,这样每个 worker 进程都可以去 accept  这个 socket (当然不是同一个 socket ,只是每个进程的这个 socket 会监听在同一个 IP 地址与端口 ,这个在网络协议里面是允许的 ) .一般来说,当一个连接进来后,所有在 accept 在这个  socket 上面的进程,都会收到通知,而只有一个进程可以accept 这个链接,其他accept 失败,这是所谓的惊群。
#当然 nginx  也不会不管,,所以 nginx  提供了一个  accept_mutex  这个东西,从名字上,我们可以看这是一个加在 accept 上的一把共享锁,有了这个锁之后,同一时刻,就会只有一个进程在 accept 连接,这样就不会有惊群问题了。
#
#建议 on 轮流分派
##Syntax:   accept_mutex on | off;
#Default:   accept_mutex off;
accept_mutex on; 

#multi_accept on  nginx 的每一个worker 进程 可以同时接收多个新的网络连接 提高并发
#如果multi_accept off  工作进程将一次接受一个新连接。否则,工作进程将一次接受所有新连接
#
# #Syntax:  multi_accept on | off;
#Default:   multi_accept off;
multi_accept on;



###  -----------------------------------------    http  配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置   -------------------------------------------------------------------------------------------------------

http 

    #导入支持的文件类型,相对于/app/nginx/conf的目录
    include       mime.types;

    ##如果在mime.types 文件中没有定义的文件类型, 当作 default_type 定义的类型处理
    default_type  application/octet-stream;

     #charset koi8-r;
     #是否在响应报文中的content-Type 显示指定的字符集
     #将指定的字符集添加到“Content-Type”响应头字段中
     #此外,该模块可以将数据从一种字符集转换为另一种字符集,但有一些限制
     # #转换以一种方式执行——从服务器到客户端,
     #只能转换单字节字符集
     #或单字节字符集到 UTF-8
     charset utf-8;

     #启用或禁用在错误页面和“服务器”响应标头字段中发出 nginx 版本
     ##Syntax:  server_tokens on | off | build | string;
     #Default:  server_tokens on;
     server_tokens off;            

######================== hash  mime.types 
#设置类型哈希表的桶大小
#为了快速处理静态数据集,例如服务器名称、 map指令的值、MIME 类型、请求标头字符串的名称,nginx 使用哈希表。在启动和每次重新配置期间,nginx 会选择最小可能的哈希表大小,以便存储具有相同哈希值的键的桶大小不超过配置的参数(哈希桶大小) 表的大小以桶表示。调整一直持续到表大小超过 hash max size 参数
## 设置保存类型 mime.types哈希表的最大值 hash 值存入内存
##为了快速寻找到相应MIME type Nginx使用散列表来存储 MIME type与文件扩展名。types_hash_bucket_size 设置了每个散列桶占用的内存大小
#
###设置类型哈希表的桶大小 
##Syntax:   types_hash_bucket_size size;
#Default:   types_hash_bucket_size 64;
types_hash_bucket_size 64;

# 设置size类型哈希表的最大值   2048 个类型 
#types_hash_max_size影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升。
#设置size类型哈希表的最大值
# #Syntax:  types_hash_max_size size;
#Default:   types_hash_max_size 1024;
types_hash_max_size 2048;

########### ------------------ logs  format ------------------------------------------------------------------------------------------------------------------------
#
    ## 日志配置 log_format 为日志指令 main 为日志格式指定的标签,记录日志时候通过这个main 标签选择指定的格式
#    #
#    log_format  main 
#                     $server_name
#                     $server_port
#                     $remote_addr  
#                     $remote_user
#                     [$time_local] - "$request" 
#                     $status  $body_bytes_sent  
#                     "$http_referer" 
#                     "$http_user_agent"  
#                     "$http_x_forwarded_for"   
#                     $request_time 
#                     $upstream_response_time  
#                     $upstream_addr 
#                     $upstream_status ;

     log_format  main  $remote_addr  $remote_user [$time_local] -  $request 
                      $status $body_bytes_sent  $http_referer 
                      $http_user_agent  $http_x_forwarded_for 
                      $server_name  $server_port ;

##================= 访问 日志 写入 ========
#

## 用来指定日志文件的路径及使用的何种日志格式记录日志
## 设置缓冲日志写入的路径、格式和配置。可以在同一配置级别上指定多个日志。 可以通过在第一个参数中指定“ ”前缀来配置记录到系统日志syslog:。特殊值off取消access_log当前级别的所有 指令
    # 如果使用 buffer  gzip   参数,写入日志将被缓冲 
    # 启用缓冲后,数据将写入文件
    # 如果使用该gzip参数,则缓冲数据将在写入文件之前进行压缩。压缩级别可以设置在 1(最快、较少压缩)和 9(最慢、最佳压缩)之间。默认情况下,缓冲区大小等于 64K 字节,压缩级别设置为 1。由于数据是按原子块压缩的,因此可以随时通过“ zcat”解压或读取日志文件。
    # 要使用 gzip 压缩,必须使用 zlib 库构建 nginx
    #Syntax:    access_log path [format [buffer=size] [gzip[=level]][flush=time][if=condition]];
    #access_log off;
    #Default:   access_log logs/access.log combined
    #Context:   http, server, location, if in location, limit_except
    access_log  logs/access.log  main    gzip  buffer=1024K flush=10s;

##============= 访问日志文件描述符 缓存 
#
#定义一个缓存,用于存储名称包含变量的常用日志的文件描述符。该指令具有以下参数:
# 对于每一条记录日志,都将是先打开文件,再写入日志 ,然后关闭,可以使用 open_log_file_cache 来设置日志文件缓存 
#
#max 设置缓存中的最大文件描述符数量 ,如果缓存已满,则关闭最近最少使用 (LRU) 描述符
#inactive 非活动时长 , 如果在此期间没有访问,则设置缓存描述符关闭的时间;默认情况下,10 秒
#min_uses 设置在inactive参数定义的时间内使用的最小文件数,以使描述符在缓存中保持打开状态;默认情况下,1
#   在inactive 指定的的时长内访问次数大于等于此值方可被当作活动项
#valid 验证缓存中各缓存项是否为活动项的时间间隔
#off 禁用缓存
###Syntax:  open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
#open_log_file_cache off;
#Default:   open_log_file_cache off;
#Context:   http, server, location
open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;

###----------------------------------  网络  IO   长连接  -------------------------------------
#
#
    ## 启用或禁用的使用 sendfile() 函数 来传输文件 默认 off
    # 当应用程序传输文件时,内核首先缓冲数据,然后将数据发送到应用程序缓冲区。 应用程序反过来将数据发送到目的地。 Sendfile方法是一种改进的数据传输方法,其中数据在操作系统内核空间内的文件描述符之间复制,而不将数据传输到应用程序缓冲区。 这使操作系统资源的利用率提高。
    #数据零拷贝提高效率
    # #Syntax:  sendfile on | off;
    #Default:   sendfile off;
    sendfile        on;

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

#在开启了sendfile的情况下,合并请求后统一发送给客户端, 把响应报文首部和整合文件的起始内容放到一个报文中发送,利用完整的报文发送文件
#在一个数据包中发送响应首部和文件的首部 以完整的数据包发送文件
# #Syntax:  tcp_nopush on | off;
#Default:   tcp_nopush off;
    tcp_nopush          on;

   ##长连接
   #用于设置客户端连接保持会话的超时时间  默认keepalive_timeout 75s; 
   #当出现对服务器的后续请求时,  keepalive_timeout  功能可避免建立或重新建立连接
   # #Syntax:   keepalive_timeout timeout [header_timeout];
   #Default:    keepalive_timeout 75s;
    keepalive_timeout  65 60;

  ##长连接最大连接数限制
  ##设置可以通过一个保持活动连接提供的最大请求数。发出最大请求数后,连接关闭
  #默认:#keepalive_requests 100  需要定期关闭连接以释放每个连接的内存分配。因此,使用过高的最大请求数可能会导致内存使用过多,不推荐使用。在 1.19.10 版本之前,默认值为 100
 #Syntax:   keepalive_requests number;
 #Default:  keepalive_requests 1000;
 #Context:  http, server, location   
   keepalive_requests  200;

   ##在  keepalive 模式下的连接是否启用 TCP_NODELAY
   #TCP/IP网络存在“小包”问题,其中单字符消息可能在高负载网络上导致网络拥塞。 例如分组大小为41字节,其中40字节用于TCP报头,只有1字节是有用信息。 这些小包占用了大约4000%的巨大开销并且使得网络饱和。
   #ohn Nagle通过不立即发送小包来解决 "小包"  问题(Nagle的算法)。 所有这样的分组被收集一定量的时间,然后作为单个分组一次发送。 这改进了底层网络的的效率。 因此,典型的TCP/IP协议栈在将数据包发送到客户端之前需要等待200毫秒。
   #在打开套接字时可以使用TCP_NODELAY选项来禁用Nagle的缓冲算法,并在数据可用时立即发送 不延迟发送。 NGINX提供了tcp_nodelay指令来启用此选项。
   # tcp_nodelay on  会增加小包的数量,但是可以提高响应速度。在及时性高的通信场景中应该会有不错的效果 
   #默认 tcp_nodelay on  关闭nagle 算法(会产生严重的延时效果) 不延迟 立刻发送 
   ##Syntax:    tcp_nodelay on | off;
   #Default:    tcp_nodelay on;
tcp_nodelay         on;

#### ------------------------------------  压缩 节约网络带宽 ---------------------------------------------------------------------
#
#
#启用或禁用 gzip 压缩响应的报文
#valid 设置应该检查文件是否仍然存在同名的时间;默认情况下,60 秒
##Syntax:   gzip on | off;
#Default:   gzip off;
#Context:   http, server, location, if in location
gzip  on;

#获取多少内存用于缓存压缩结果,16 8k 表示以 8k*16 为单位获得
#设置用于压缩响应的number和size的缓冲区。默认情况下,缓冲区大小等于一个内存页。根据平台的不同,它可以是4K或8K。
#16个 8k 的缓冲空间
#支持实现压缩功能时为其配置的缓存区数量及每个缓存区的大小
#Syntax:    gzip_buffers number size;
#Default:   gzip_buffers 32 4k|16 8k;
#Context:   http, server, location
gzip_buffers     32 4K; 

#允许压缩的页面最小字节数,页面字节数从 header 头中的 Content-Length 中进行获取。默认值是 0,不管页面多大都压缩。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大
#设置将被压缩的响应的最小长度。长度仅从“ Content-Length”响应头字段中确定 
# #Syntax:  gzip_min_length length;
#Default:   gzip_min_length 20;
#Context:   http, server, location
gzip_min_length    1K;

##

#设置压缩响应所需的最低HTTP版本请求
#Syntax:    gzip_http_version 1.0 | 1.1;
#Default:   gzip_http_version 1.1;
#Context:   http, server, location
gzip_http_version 1.1;

#除了“ text/html”外,还对指定的MIME类型启用响应的压缩。特殊值“ *”与任何MIME类型(0.8.29)匹配。“ text/html”类型的响应始终被压缩
#Syntax:    gzip_types mime-type ...;
#Default:   gzip_types text/html;
#Context:   http, server, location
gzip_types  text/css image/gif  image/jpeg application/javascript  image/png image/tiff application/java-archive ;

#预先压缩好的文件 不用临时压缩 不消耗cpu 高并发
# index.html.tar.gz 访问 index.html     
##允许发送带有“ .gz”文件扩展名的预压缩文件,而不是常规文件
#该模块启用后,Nginx 首先检查是否存在请求静态文件的 gz 结尾的文件,如果有则直接返回该 .gz 文件内容
# 默认情况下不构建此模块,应使用--with-http_gzip_static_module 配置参数启用它  
#Syntax:    gzip_static on | off | always;
#Default:   gzip_static off;
#Context:   http, server, location
gzip_static on;

# 根据请求和响应启用或禁用对代理请求的响应进行 gzip 压缩
# nginx作为代理服务器接收到从被代理服务器发送的响应报文后 ,在何种条件下启用压缩功能的
#  no-cache  no-store  private  表示从被代理服务器收到的响应报文首部的 cache-control 的值为此三者中的任何一个 则启用压缩功能 
#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
##gzip_proxied  any;

#gzip 压缩比,压缩级别是 1-9,1 压缩级别最低,9 最高,级别越高压缩率越大,压缩时间越长,建议 4-6;
#设置level响应的gzip压缩。可接受的值范围是1到9
#Syntax:    gzip_comp_level level;
#Default:   gzip_comp_level 1;
#Context:   http, server, location
gzip_comp_level    2;

#用于在响应消息头中添加 Vary:Accept-Encoding,使代理服务器根据请求头中的 Accept-Encoding 识别是否启用 gzip 压缩;
#加响应头”Vary: Accept-Encoding” 如果指令gzip, gzip_static或gunzip 处于活动状态, 则启用或禁用插入“ Vary:Accept-Encoding”响应标头字段 。
#Syntax:    gzip_vary on | off;
#Default:   gzip_vary off;
#Context:   http, server, location
gzip_vary on ;

## ---------------------------  nginx  default  server  -----------------------------------------------------------------------------------------
#
##nginx  local  server https  
#
#    server 
#
#        listen       80;
#       listen 443 ssl;
##ssl_certificate /root/ca/server.crt;
##ssl_certificate_key /root/ca/server.key;
#
##ssl_session_cache shared:SSL:1m;
##ssl_session_timeout 5m;
#
##ssl_ciphers HIGH:!aNULL:!MD5;
##ssl_prefer_server_ciphers on;
#
#
#
#        server_name  www.nginx.org nginx.org;
#
#        charset utf-8;
#
#        access_log  logs/host.access.log  main;
#
# 根据请求 URI 设置配置
# 在一个  server 中 location  配置段可以有多个,  用于实现从 url 到文件系统的路径映射;nginx 会根据用户请求的URI来检查定义的所有location  , 并查找一个最佳匹配,而后应用其配置
#Syntax:    location [ = | ~ | ~* | ^~ ] uri  ... 
#location @name  ... 
#Default:   —Context:   server, location
#
#        ##  location  /  表示当访问网站的 / 的时候到 html 目录下找网页
#        location / 
#             
#  ##  root  网站的家目录      ## 站点的根目录,即DocumentRoot 相对路径时为 <prefix>/html  也可以指定其他路径 /data/nginx/html/mgedu 
#            # 设置请求的根目录
#            # 设置web 资源路径映射 用于指明用户请求的url 所对应的本地文件系统上的文档所在的路径
#            root   html;
#            index  index.html index.htm;
#
#            Syntax:    allow address | CIDR | unix: | all;
#            Default:   —
#            Context:   http, server, location, limit_except
#
#            #Syntax:   deny address | CIDR | unix: | all;
#            Default:   —
#            Context:   http, server, location, limit_except

#        allow 192.168.80.0/24;
#            deny all;
#
#        
#       使用“HTTP 基本身份验证”协议启用用户名和密码验证 
#       location  /nginx_status 
#
#            auth_basic           "closed site";
#                auth_basic_user_file conf/htpasswd;
#                 
#                   ## 指定保存用户名和密码的文件 
#                   #Syntax:    auth_basic_user_file file;
#                   Default:    —
#                   Context:    http, server, location, limit_except
#
#
#       
#
#
#        #error_page  404              /404.html;
#
#        ##如果访问了网站不存在的网页返回 404 则将404 转换为 302  重定向至网页的主页 可以防止 360 浏览器 访问网页 找不到页面 返回 404 的时候 360 会劫持 将页面重定向到 360 的搜索页面
#        error_page  404 =302              /index.html;
#
#
#        # redirect server error pages to the static page /50x.html
#        
#         error_page   500 502 503 504  /50x.html;
#
#
#        location = /50x.html 
#            root   html;
#        
#
#   
#
#

##### ---------------------------------- nginx  服务器 读取客户端 请求报文 请求头  -----------------------------------------------------------------------------

     #定义用于读取客户端请求标头的超时。如果客户端在此时间内未传输整个标头,则请求会因408(请求超时)错误而终止
     ##Syntax:  client_header_timeout time;
     #Default:  client_header_timeout 60s;
     #Context:  http, server
     client_header_timeout 15;

     #设置用于读取客户端请求标头的缓冲区大小。对于大多数请求,一个1K字节的缓冲区就足够了。但是,如果请求中包含长Cookie或来自WAP客户端,则该请求可能不适合1K。如果请求行或请求标头字段不适合此缓冲区,则将分配由large_client_header_buffers指令配置的较大缓冲区
     # #Syntax: client_header_buffer_size size;
     #Default:  client_header_buffer_size 1k;
     #Context:  http, server
     client_header_buffer_size 32k;

    ####设置最大number和size用于读取大的客户请求头缓冲器。请求行不能超过一个缓冲区的大小,否则会向客户端返回 414(Request-URI Too Large)错误。请求头域也不能超过一个缓冲区的大小,否则返回400(Bad Request)错误给客户端。缓冲区仅根据需要分配。默认情况下,缓冲区大小等于 8K 字节。如果在请求处理结束后连接转换为保持活动状态,则这些缓冲区将被释放。
    # #Syntax:  large_client_header_buffers number size;
    #Default:   large_client_header_buffers 4 8k;
    #Context:   http, server
    large_client_header_buffers 4 16k;

 # 定义读取客户端请求正文的超时时间。超时仅针对两次连续读取操作之间的一段时间设置,而不是针对整个请求正文的传输。如果客户端在此时间内未传输任何内容,则请求将因 408(请求超时)错误而终止。
#Syntax:    client_body_timeout time;
#Default:   client_body_timeout 60s;
#Context:   http, server, location
client_body_timeout 60s;

##--------------------------------------- 客户端请求的相关配置 ---------------------------------------------------------------
#
#
#    
     #设置传输响应给客户端的超时时间。超时仅设置在两次连续的写操作之间,而不是用于整个响应的传输。如果客户端在这段时间内没有收到任何消息,则连接关闭。
     #Syntax:   send_timeout time;
     #Default:  send_timeout 60s;
     send_timeout          25;

   #客户端上传大文件 时候需要上调 此参数 大小 
   #用于接收客户端请求报文的 body 部分的缓冲大小,默认 16k  ,超出此大小时,其将暂存到磁盘上的由 client_body_temp_path    指令定义的位置
   #设置读取客户端请求正文的缓冲区大小。如果请求主体大于缓冲区,则将整个主体或仅其一部分写入 临时文件。默认情况下,缓冲区大小等于两个内存页。这是 x86、其他 32 位平台和 x86-64 上的 8K。在其他 64 位平台上通常为 16K。
   #Syntax: client_body_buffer_size size;
   #Default:    client_body_buffer_size 8k|16k;
   #Context:    http, server, location
   client_body_buffer_size 2048k;

### 快速路由找到文件,文件路径的路由查找 
## 客户端上传文件大小超过  client_body_buffer_size  需要写入磁盘文件
## 设定用于存储客户端请求报文的 body 部分的临时存储路径及子目录结构和数量
# 定义用于存储包含客户端请求正文的临时文件的目录。指定目录下最多可以使用三级子目录层次结构
#client_body_temp_path path [level1 [level2 [level3]]];
#16 进制数字:
#1 表示用1位16进制数字表示一级子目录 0-f 
#2 表示用2位16进制数字表示二级子目录 00-ff
#3 表示用2位16进制数字表示三级子目录 00-ff
# 2 1 1 表示 有256个一级子目录,每个一级子目录下16个2级子目录, 每个2级子目录下有16个三级子目录  
# 三级子目录的数量   256*16*16 
# 二级子目录的数量   256*16 
# 一级子目录数量     256
##Syntax:   client_body_temp_path path [level1 [level2 [level3]]];
#Default:   client_body_temp_path client_body_temp;
#Context:   http, server, location
client_body_temp_path /app/nginx/client_temp 1 2;

#设置客户端请求正文的最大允许大小。如果请求中的大小超过配置的值,则会向客户端返回413(请求实体太大)错误。请注意,浏览器无法正确显示此错误。设置size为0将禁用对客户端请求主体大小的检查
     #设置允许客户端上传某个文件的最大值 默认为1M  上传文件超过 1M会报 413 错误
     ##Syntax:  client_max_body_size size;
     #Default:  client_max_body_size 1m;
     #Context:  http, server, location
     client_max_body_size  8m;

##------------------------------服务器名称哈希表     -------------------------------------------------------
#
     ## 设置服务器名称哈希表的存储桶大小。默认值取决于处理器的缓存行的大小。
     ##Syntax:  server_names_hash_bucket_size size;
     #Default:  server_names_hash_bucket_size 32|64|128
     server_names_hash_bucket_size 128;

     #设置size服务器名称哈希表的最大值
     ##Syntax:  server_names_hash_max_size size;
     #Default:  server_names_hash_max_size 512;
     server_names_hash_max_size 512;

##------------------------------ 文件操作优化   -------------------------------------------------------

#是否 启用或禁用异步文件 I/O (AIO)  需要编译开启  --with-file-aio
#Syntax:    aio on | off | threads[=pool];
#Default:   aio off;
#Context:   http, server, location
#异步I/O允许进程进行不受阻塞或不需要等待I/O完成的I/O操作
#aio命令可在NGINX配置的http,server和location区块下使用。 根据在指令所在区块,该指令将为匹配的请求执行异步I/O
#默认情况下,该参数设置为off。 在Linux上,aio需要启用direction,而在FreeBSD上,sendfile需要禁用以使aio生效。
#该指令具有特殊的线程值,可以为发送和读操作启用多线程。 多线程支持仅在Linux平台上可用,并且只能与处理请求的epoll,kqueue或eventport方法一起使用。
#为了使用线程值,在编译Nginx时使用–with-threads选项配置多线程支持。 在NGINX全局上下文中使用thread_pool指令添加一个线程池。 在aio配置中使用该线程池
aio on;

#在 Linux 上, directio 只能用于读取在 512 字节边界(或 XFS 为 4K)上对齐的块。文件的未对齐结尾以阻塞模式读取。这同样适用于字节范围请求和非文件开头的 FLV 请求:读取文件开头和结尾的未对齐数据将被阻塞
#directio 操作和 aio 完全相反 aio 是读取文件,而directio 是写文件 到磁盘 启用直接I/O  默认是关闭  当文件大于等于指定大小时候 同步(直接写磁盘 ) 不写缓存
#Syntax:    directio size | off;
#Default:   directio off;
#操作系统内核通常尝试优化和缓存任何读/写请求。 由于数据在内核中缓存,对同一位置的任何后续读取请求将更快,因为不需要再从磁盘读取信息。
#直接I/O是文件系统的一个功能,其从应用程序到磁盘直接读取和写入,从而绕过所有操作系统缓存。 这使得更好地利用CPU周期和提高缓存效率。
#该方法用于数据具有较差命中率的地方。 这样的数据不需要在任何高速缓存中,并且可以在需要时加载。 它可以用于提供大文件
#任何大于指令中指定的文件将由直接I/O加载。 其它情况下禁用此参数
#在 Linux 上同时启用 AIO 和sendfile 时,AIO 用于大于或等于directio指令中指定大小的文件,而sendfile用于较小大小的文件或禁用directio时
directio 4m;

##直接I/O取决于执行数据传输时的块大小。 NGINX有directio_alignment指令来设置块大小
#除了XFS文件系统,默认值512字节在所有Linux版本运行良好。在此文件系统下,大小应增加到4 KB
#Syntax:directio_alignment size;
#Default:directio_alignment 512;
directio_alignment 4k;

#配置可以存储的缓存 缓存元数据:
 ##缓存以下三种信息:
 #打开文件描述符,它们的大小和修改时间;
 #有关目录存在的信息;
 #文件查找错误,例如“找不到文件”、“没有读取权限”等

#该指令具有以下参数:
 #max 可缓存的,缓存项上限,达到上限之后,会使用 LRU (最近最少使用算法) 实现缓存管理  
 #inactive 缓存项的非活动时长, 在此处指定的时长内未命中的或命中的次数少于 open_file_cache_min_uses指令所指定的次数的,缓存项即为非活动项
 #Syntax:   open_file_cache off;
 #open_file_cache max=N [inactive=time];
 #Default:  open_file_cache off;

open_file_cache max=1000 inactive=60s;

# 在open_file_cache指令number的inactive参数配置的时间段内 设置文件访问的最小值,这是文件描述符在缓存中保持打开状态所必需的
# 在 open_file_cache 指令的 inactive 参数指定的时长内,至少应该被命中多少次 方可被归类为活动项
#Syntax:    open_file_cache_min_uses number;
#Default:   open_file_cache_min_uses 1;
#Context:   http, server, location
open_file_cache_min_uses 3;

# 缓存项有效性的检查频率 默认为60s  没有指定的活动次数便归为非活动项 达到上限后 LRU 计算清理缓存 每隔设定值清理
#设置 应验证open_file_cache元素的时间
#多长时间检查下 缓存是否过期了 周期性的检查缓存是否失效
#设置 应验证open_file_cache元素的时间
#Syntax:    open_file_cache_valid time;
#Default:   open_file_cache_valid 60s;
#Context:   http, server, location
open_file_cache_valid 30s;

##是否缓存查找文件是发生错误的文件一类的信息 快速应答错误
##通过open_file_cache启用或禁用文件查找错误的缓存信息 
##Syntax:   open_file_cache_errors on | off;
#Default:   open_file_cache_errors off;
#Context:   http, server, location
open_file_cache_errors on;

#### ------------------------ 负载均衡 服务器组  反向代理指向负载均衡服务器组中的server 使用负载均衡算法将请求调度到组内的服务器 ----------------------------------------------

## ============ http   upstream 

## 定义一组后端服务器 ,也称为上游服务器(upstream),可以为每一种类型的后端服务器分一个组,然后结合 proxy_pass 或者其他代理指令将相应的请求转发至服务器组,组内可以有多台服务器,多台服务器如何实现负载均衡和算法有关,默认是指定权重的加权均衡算法, 服务器可以在不同的端口上侦听
    #负载均衡算法:  

    #       默认情况下,使用加权循环平衡方法在服务器之间分配请求

    #       ip_hash;  指定组应使用负载平衡方法,其中根据客户端 IP 地址在服务器之间分配请求。客户端 IPv4 地址或整个 IPv6 地址的前三个八位字节用作散列键。该方法确保来自同一客户端的请求将始终传递到同一服务器,除非该服务器不可用。在后一种情况下,客户端请求将被传递到另一个服务器。最有可能的是,它也将始终是同一台服务器
    #       使用 ip_hash 指令可设置ip_hash 算法,但使用ip_hash指令后,如果 server 指令中使用了 weight 和 backup 选项,这两个功能将失效

    # upstream 模块自动做后端服务器健康检测,后端服务器宕机 自动将其移出  upstream 定义的 服务器池  
    #
    #  Syntax:  upstream name  ... 
    #  Default: —
    #     Syntax:   server address [parameters];
    #     Default:  —
    #
    #     定义 服务器的address和其他parameters。地址可以指定为域名或 IP 地址,带有可选端口,或指定为“ unix:”前缀后指定的 UNIX 域套接字路径。如果未指定端口,则使用端口 80。解析为多个 IP 地址的域名一次定义多个服务器
    #
    #可以定义以下参数:
    #    
    #                   weight=number 设置服务器的权重,默认为 1
    #                   max_conns=number 限制number到代理服务器的最大同时活动连接数,默认值为零,表示没有限制。如果服务器组不驻留在共享内存中,则限制适用于每个工作进程。
    #                   max_fails=number 设置在fail_timeout 参数设置的持续时间内应该发生的与服务器通信的失败尝试次数,以考虑服务器在fail_timeout参数设置的持续时间内不可用 。默认情况下,不成功尝试的次数设置为 1。零值禁用尝试
    #
    #                   fail_timeout=time 与服务器通信失败的指定次数应该被认为服务器不可用的时间;服务器将被视为不可用的时间段。默认情况下,该参数设置为 10 秒。
    #                   backup 将服务器标记为备份服务器。当主服务器不可用时,它将传递请求, 例如后端的 服务器都不可用了,会返回 backup 主机的页面,等到 后端有可用的服务器之后,返回后端服务器的正常页面,后端 server 恢复正常之后 需要等待 fail_timeout=time 之后的时间 代理服务器才将请求发往后端正常的 server 
    #                   down 将服务器标记为永久不可用 down  代理的请求不往后端服务器分发请求,如果还有用户正在访问 等待用户自动断开,后端服务器维护时候可以标记为 down  待后端服务器维护完成再上线。
    #
    #
    #
     upstream tomcatpools  

      # ip_hash;
      # hash $remote_addr   
      # hash KEY [consistent]
      #健康状态检测:
      # max_fails=2  fail_timeout=20s 定义代理服务器联系后端服务器的失败重联次数和失败后重试等待的时间,默认为 1和10  
      # max_fails=0  不做健康检测 
      # 如果设置为 2和3,则表示只尝试联系2次,每次失败等待3秒后进行下一次重试 ,也就是说6秒后就能判定次后端服务器无法联系上,将负载均衡到下一台服务器,常常会配合 proxy_next_upstream 或者 fastcgi_next_upstream   或者  memcached_next_upstream 来指定失败时候如何处理
      #
       server   192.168.80.100:8080 weight=1  max_fails=1 fail_timeout=10s; 
       server   192.168.80.101:8080 weight=1  max_fails=1 fail_timeout=10s ;       
       server   192.168.80.103:8080 weight=1  max_fails=1 fail_timeout=10s ;       
       server   192.168.80.104:8080 weight=1  max_fails=1 fail_timeout=10s ;       

    #激活缓存以连接到上游服务器。

        #该connections参数设置保留在每个工作进程的缓存中的上游服务器的最大空闲保持连接数。超过此数量时,将关闭最近最少使用的连接。

        #应该特别注意的是,该keepalive指令不限制 nginx 工作进程可以打开的上游服务器的连接总数。该connections参数应设置为一个足够小的数字,以便上游服务器也处理新的传入连接。
        #当使用默认循环方法以外的负载平衡方法时,必须在keepalive指令之前激活它们。
        # Syntax:   keepalive connections;
        # Default:  —
        # Context:  upstream
        # 可使用长连接的连接数量:每个worker 进程与后端服务器保持的最大空闲长连接的数量
        keepalive 32;

   

### ================================================= fastcgi upstream =================================================================

    upstream fastcgipool  

    server 192.168.80.3  weight=1  max_fails=5 fail_timeout=15s ;
    server 192.168.80.30 weight=1  max_fails=5 fail_timeout=15s ;
    server 192.168.80.4 weight=1  max_fails=5 fail_timeout=15s down  ;
    server 192.168.80.8 weight=1  max_fails=5 fail_timeout=15s down  ;

        #激活缓存以连接到上游服务器。

        #该connections参数设置保留在每个工作进程的缓存中的上游服务器的最大空闲保持连接数。超过此数量时,将关闭最近最少使用的连接。

 #应该特别注意的是,该keepalive指令不限制 nginx 工作进程可以打开的上游服务器的连接总数。该connections参数应设置为一个足够小的数字,以便上游服务器也处理新的传入连接。
 #
        #当使用默认循环方法以外的负载平衡方法时,必须在keepalive指令之前激活它们。
        # Syntax:       keepalive connections;
        # Default:      —
        # Context:      upstream
        # 可使用长连接的连接数量:每个worker 进程与后端服务器保持的最大空闲长连接的数量
        keepalive 32;

     

##------------------------------------------  http  proxy_cache 缓存 hash  表  ------------------------------------------------------------------------
#
#proxy_cache_path   /app/nginx/proxy_cache levels=1:2 keys_zone=cache_one:10m  max_size=1g;
#proxy_cache cache_one ;
#proxy_cache_valid 200 302 10m;
#proxy_cache_valid 404 1m;
#proxy_cache_key $scheme$proxy_host$request_uri;

#当实现网页内容缓存时,作为web服务程序,它可以缓存自身返回给客户端的数据,包括读取的图片、文件等;作为代理,它可以缓存来自后端的数据。缓存后的数据在内存中有,也会放在设定的目录下。这样以后客户端继续请求相同资源时,可以直接从内存中或者自身的磁盘中获取并返回给客户端。当缓存超出指定的空间大小时,将会有一个专门的线程cache_manager来清理缓存。

#Syntax:    proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size]
#Default:   —
#Context:   http 

#设置缓存的路径和其他参数。缓存数据存储在文件中。高速缓存中的文件名是将MD5功能应用于 高速缓存键的结果。该levels参数定义高速缓存的层次结构级别:从1到3,每个级别接受值1或2
#缓存的响应首先写入临时文件,然后重命名该文件。从 0.8.9 版本开始,临时文件和缓存可以放在不同的文件系统上。
#但是,请注意,在这种情况下,文件是跨两个文件系统复制的,而不是廉价的重命名操作。因此,建议对于任何给定位置,缓存和保存临时文件的目录都放在同一个文件系统上。临时文件的目录根据use_temp_path参数 (1.7.10) 设置。如果此参数被省略或设置为 value on,则将使用proxy_temp_path指令为给定位置设置的目录。如果该值设置为off,临时文件将直接放在缓存目录中
# 此外,所有活动密钥和有关数据的信息都存储在共享内存区域中,其name和size 由keys_zone参数配置。一兆字节的区域可以存储大约 8000 个密钥

#levels 定义缓存目录级别,同时定义缓存目录名称的字符数, 例如levels=1:2:2  表示3级目录 且第一级目录名为1个字符 ,第二级目录2个字符,第三级目录2个字符,目录最多 3级 ,目录名最多为2个字符

#keys_zone 定义缓存标识名称和内存中缓存的最大空间,name 部分必须唯一 ,在后面会引用name 来表示使用该缓存方法

#max_size 定义磁盘中缓存目录的最大空间,即path 定义的文件最大空间

#在inactive参数指定的时间内未访问的缓存数据 会从缓存中删除,而不管它们的新鲜度如何。默认情况下,inactive设置为 10 分钟

#该指令定义后只是定义了一种缓存方法,并非开启了缓存

proxy_cache_path   /app/nginx/proxy_http_cache levels=1:2:2  keys_zone=cache_http:50m  inactive=30  max_size=2g;

##fastcgi_cache_path /app/nginx/proxy_fastcgi_cache levels=1:2 keys_zone=fastcache:10m; 

## 在inactive参数指定的时间内未访问的缓存数据 会从缓存中删除,而不管它们的新鲜度如何。默认情况下,inactive设置为 10 分钟 ,在此10 分钟内至少被访问过 N次即是有效的缓存  
## #Syntax: proxy_cache_min_uses number;
#Default:   proxy_cache_min_uses 1;
#Context:   http, server, location
proxy_cache_min_uses 3 ;

##定义用于缓存的共享内存区域。同一区域可以在多个地方使用
#定义要使用哪个缓存方法 使用 proxy_cache_path 中的name来引用,  keys_zone=cache_one
#调用缓存 
# #Syntax:  proxy_cache zone | off;
#Default:   proxy_cache off;
#Context:   http, server, location
proxy_cache cache_http ;

### 定义一个用于缓存的键  例如  proxy_cache_key "$host$request_uri $cookie_user";
# 默认情况下,指令的值接近字符串  proxy_cache_key $scheme$proxy_host$uri$is_args$args; 
##Syntax:   proxy_cache_key string;
#Default:   proxy_cache_key $scheme$proxy_host$request_uri;
#Context:   http, server, location
proxy_cache_key $request_uri; 

### 如果此指令中列出了客户端请求方法,则响应将被缓存。“ GET” 和“ HEAD” 方法始终添加到列表中,但建议明确指定它们
##Syntax:   proxy_cache_methods GET | HEAD | POST ...;
#Default:   proxy_cache_methods GET HEAD;
#Context:   http, server, location
proxy_cache_methods GET HEAD;

#proxy_cache_valid [code ...] time; 
#设置不同响应代码的缓存时间  根据状态码来指定缓存有效期
#200   302 缓存  10分钟   404 缓存  1分钟  其他状态码缓存5分钟
#为不同的响应代码设置缓存时间
# #Syntax:  proxy_cache_valid [code ...] time;
#Default:   —
#Context:   http, server, location
proxy_cache_valid 200 302 1m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1m;

#后端服务器处于什么状态是可以使用缓存响应客户端请求
#确定在哪些情况下可以在与代理服务器通信期间使用陈旧的缓存响应
#
##Syntax: proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;
#Default:   proxy_cache_use_stale off;
#Context:   http, server, location
#error如果无法选择代理服务器来处理请求, 该参数还允许使用陈旧的缓存响应
proxy_cache_use_stale   error  http_502 ;

#-------------------------------------------------  proxy_fastcgi cache ----------------------------------------------------------------------
#Syntax:    fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [min_free=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
#Default:   —
#Context:   http

## fastcgi_cache_path /app/nginx/fcache levels=1:2 keys_zone=fastcache:10m inactive=30 max_size=500m; 

fastcgi_cache_path /dataweb/nginx/cache levels=1:2 keys_zone=fastcache:10m; 

            ## 注意  fastcgi 的缓存的调用 只能放在  location 匹配 php  访问中
            fastcgi_cache   fastcache ;
            fastcgi_cache_key $request_uri;

            fastcgi_cache_valid 200 302 10m;
        fastcgi_cache_valid 301      1h;
        fastcgi_cache_valid any      1m;

###--------------------------------- 反向代理的错误页面,如果后台Tomcat 或者 php  处理报错抛出404,想把这个状态叫Nginx反馈给客户端或者重定向到某个连接
#
#
#这个变量开启后,我们才能自定义错误页面,当后端返回404,nginx拦截错误定义错误页面
#确定代码大于或等于 300 的代理响应是否应该传递给客户端或被拦截并重定向到 nginx 以使用error_page指令进行处理
#Syntax:    proxy_intercept_errors on | off;
#Default:   proxy_intercept_errors off;
#Context:   http, server, location#
proxy_intercept_errors on ;

### ------------------------------- 如果后端是 php 处理报错抛出  404  想把这个状态叫 nginx 反馈给客户端或者重定向到某个连接或页面 
#
#
#
#确定是否应将代码大于或等于 300 的 FastCGI 服务器响应传递给客户端或拦截并重定向到 nginx 以使用error_page指令进行处理。
#Nginx解析php代码的错误页面
#如果后端是php解析的,需要加一个变量 在http段中加一个变量 fastcgi_intercept_errors on 就可以了

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

### ---------------------------- nginx 将指示 FastCGI 服务器保持连接打开
#
## 默认情况下,FastCGI 服务器会在发送响应后立即关闭连接。但是,当此指令设置为 value 时on,nginx 将指示 FastCGI 服务器保持连接打开。这 对于 FastCGI 服务器的keepalive连接运行是必要的
#     Syntax:   keepalive connections;
#     Default:  —
#     Context:  upstream  
#     激活缓存以连接到上游服务器
#     该connections参数设置保留在每个工作进程的缓存中的上游服务器的最大空闲保持连接数。超过此数量时,将关闭最近最少使用的连接。
#     应该特别注意的是,该keepalive指令不限制 nginx 工作进程可以打开的上游服务器的连接总数。该connections参数应设置为一个足够小的数字,以便上游服务器也处理新的传入连接。
#     当使用默认循环方法以外的负载平衡方法时,必须在keepalive指令之前激活它们
##
##

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

##---------------------------------------------------- include  vhost ------------------------------------------------------------------------------------------
##nginx  localhost 
##导入子配置文件

    #http

    include  proxy.conf;
    include  proxy_fastcgi.conf;
    #include  extra/ilinux.conf;
    #include  extra/mg.conf;
    #include  extra/jg.conf; 
    #include  extra/ks.conf; 
    #include  extra/xjdx.conf; 

    # include  extra/pma.conf;
    #include   extra/cc.conf;
    include   extra/facgi.conf;
    include   extra/pc.conf;  

#nginx子配置文件
#nginx子配置文件将配置与主配置文件分开、清晰、好管理

#include  proxy.conf
#http 代理相关
[root@elb01 conf]# cat proxy.conf

# 设置代理的 HTTP 协议版本。默认情况下,使用版本 1.0。建议将 1.1 版与 keepalive 连接和 NTLM 身份验证一起使用。
##Syntax:       proxy_http_version 1.0 | 1.1;
#Default:       proxy_http_version 1.0;
#Context:       http, server, location

proxy_http_version 1.1 ;

##指示是否将原始请求的头字段传递给代理服务器
#
#Syntax:        proxy_pass_request_headers on | off;
#Default:       proxy_pass_request_headers on;
#Context:       http, server, location
proxy_pass_request_headers on;

## --------------------------------------- 允许重新定义或附加字段到传递给代理服务器的请求标头 ----------------------------------------------------------------------
#----- 设定发往后端服务器的请求报文的请求首部的值
##在代理服务器上设置 http 报头信息
 ## 设置http请求header项传给后服务器节点,例如: 可实现让代理后端的服务器节点获取访问客户端用户的真实IP地址
 ## 允许在传递给代理服务器的请求标头中重新定义或附加字段 。该value可以包含文本,变量,以及它们的组合
 #
 #
 #
## 当反向代理服务器向后重新发起请求时候,要携带主机头信息,以明确告诉节点服务器要找哪个虚拟主机
## 这是节点服务器多虚拟主机时候的关键配置
#在代理向后端服务器发送的 http 请求头中加入 host 字段信息后,若后端服务器配置有多个虚拟主机,它就可以识别代理的是哪个虚拟主机,这是节点服务器多虚拟主机时候的关键配置
#Syntax:        proxy_set_header field value;
#Default:proxy_set_header Host $proxy_host;
#proxy_set_header Connection close;
#Context:       http, server, location

proxy_set_header Host  $host;

#在反向代理请求后端节点服务器的请求头中增加获取客户端IP的字段信息 然后节点后端服务器可以通过程序或者相关配置接收 X-Forwarded-For 传过来的客户zhengshi真实IP
#在代理向后端服务器发送的 http 请求头中加入 X-Forwarded-For 字段信息,用于后端服务器程序 日志等接收 记录真实的用户IP 而不是代理服务器的IP
#Syntax:        proxy_set_header field value;
#Default:       proxy_set_header Host $proxy_host;
#proxy_set_header Connection close;
#Context:       http, server, location

#仅在代理服务器上设置了该头部字段后还不够,因为后端服务器仅仅只是获取到它,默认并没有将其记录下来。所以需要在后端的服务的日志格式设置上记录此项或者在其他有需求的地方设置它
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-For $remote_addr;

###  ----------------------- proxy 网络连接超时  -------------------------------------------------------------------------------

##表示反向代理与后端节点服务器链接的超时时间,即proxy 向后端被代理服务器 发起TCP握手等候响应的超时间
#定义与代理服务器建立连接的超时时间。需要注意的是,这个超时时间通常不能超过 75 秒
##Syntax:       proxy_connect_timeout time;
#Default:       proxy_connect_timeout 60s;
#Context:       http, server, location
proxy_connect_timeout 60 ;

# ------------------ 会话 超时 时长  ------------
#
#定义从代理服务器读取响应的超时时间。超时仅在两次连续读取操作之间设置,而不是针对整个响应的传输。如果代理服务器在此时间内未传输任何内容,则连接将关闭
#定义代理服务器何时关闭和后端服务器连接的超时时长,默认60秒 ,表示某次后端传输完数据给代理服务器后,如果60秒内代理服务器和后端服务器没有任何传输,则关闭
#此连接,目的是避免代理服务器和后端服务器一直保持连接不断开而占用资源
##Syntax:       proxy_read_timeout time;
#Default:       proxy_read_timeout 60s;
#Context:       http, server, location

proxy_read_timeout 30 ;

#设置将请求传输到代理服务器的超时时间。超时仅设置在两次连续的写操作之间,而不是针对整个请求的传输。如果代理服务器在这段时间内没有收到任何信息,连接就会关闭。
#
#
# #Syntax:      proxy_send_timeout time;
#Default:       proxy_send_timeout 60s;
#Context:       http, server, location
proxy_send_timeout 30 ;

##### ------------------------------------ 定义可用于 proxy 功能的缓冲  -------------------------------------------------------------------------------------

#启用或禁用来自代理服务器的响应缓冲
#启用缓冲后,nginx 会尽快收到来自代理服务器的响应,将其保存到由proxy_buffer_size和proxy_buffers指令设置的缓冲区中 。如果整个响应不适合内存,可以将其中的一部分保存到磁盘上的临时文件中。写入临时文件由 proxy_max_temp_file_size和 proxy_temp_file_write_size指令控制。
#
#禁用缓冲后,响应一收到就立即同步传递到客户端。nginx不会尝试从代理服务器读取整个响应。nginx一次可以从服务器接收的最大数据大小由proxy_buffer_size指令设置
#也可以通过在“X-Accel-Buffering”响应头字段中传递“ yes”或“ no”来启用或禁用缓冲。可以使用proxy_ignore_headers指令禁用此功能
#Syntax:        proxy_buffers number size;
#Default:       proxy_buffers 8 4k|8k;
#Context:       http, server, location
proxy_buffering on;

## 设置缓冲区大小 默认该缓冲区大小等于指令 proxy_buffers设置的大小
## 设置size用于读取从代理服务

以上是关于第十六周的主要内容,如果未能解决你的问题,请参考以下文章

第十六周学习进度

第十六周学习进度

第十六周进度

第十六周学习进度条

软件工程--第十六周学习进度

第十六周学习进度