nginx

nginx

http (hypertest transfer procotol)协议

首先http协议工作在 80/tcp 端口上

HTML(hypertest transfer mark language)超文本传输语言

早期的http(1.0)之前的http协议只支持文本传输,到了http 2.0之后http引入了MIME(multipurpose internet mail extension)机制,

MIME他做的是把 非文本编译成文本 ,等传输到了client端再由client的浏览器查看具体是什么类型的文本,再用相应的工具解码。

MIME的格式

major/minor (主类型/次类型)
例如 text/plain
image/jpeg

应用层的协议格式由2种(文本,二进制)
client位了请求server上的web页面,页面上有多个资源,首先client看到的每一个资源都是(例如图片)url,然后client把所有的url加载到本机,为了加快加载,有几个手段

  1. 运用本地缓存,如果以前访问过web在自己的主机上就会有一个缓存,
  2. 还有一个手段是用多个核心取加载,每一个线程发一个请求。
http报文

http协议是一个cs架构,非常简单,client端(也就是浏览器)发送request给server端,这中间就有了tcp的三次握手,

  • 首先client在浏览器上输入url向server端请求资源,首先client会看自己的本地缓存,如果有就直接解析没有的话就找hosts文件如果hosts文件也没有就找自己指向的dns服务器,dns服务器再在自己本地找缓存,…
  • 然后http的报文发送到了server端,而http的request报文格式是
    <method><url><version>  //method是请求方法 主要有/get:请求页面,headers和body为空 /head:只请求首部 /post:向服务器端提交数据 /put:将请求的数据存在服务器上不处理 /delete:删除服务器上制定的文档 /trace:追踪到达服务器中间经过了多少代理服务器 /options 
    headers     //headers的格式都是name:value他承载了请求页面,服务器,等信息
    <body>  //实体主体
    
  • 然后http服务器收到报文返回对应的respond报文其报文的格式是
    <version><status><reason-phrase> //status是返回状态码如200:请求成功,301:请求url指向的资源已经被删除,但是在响应报文中通过,304:客户端发送了条件式的请求,但是服务器上的资源并没有发生改变,401:需要输入账号密码认证才能访问资源,403:请求被禁止,404:服务器无法找到相对应的资源,500:服务器内部错误,502:代理服务器从后端收到一条伪响应    
    headers   
    <bodys>
    

httpd服务的mpm(Multi-Processing Module,多路处理模块)

  • profork

主进程,生成多个子进程,一个子进程响应一个请求

  • worker

主进程生成多个子进程,每个子进程生成多个线程,每个线程响应一个请求

  • event

这是Apache最新的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。
##io复用简介
为什么需要使用io复用,当一个io请求到达本机后,我们传统做法用一个进程去处理一个IO,但是我们还有一个方法就是io复用,一个进程处理多个IO,进程在处理一个IO的时候需要向内核发系统调用,此时不用堵塞而是去再处理下一个io
IO的请求过程(以磁盘为例),首先我们的用户空间进程向磁盘请求数据,此时我们的用户空间进程就会先向内核发起系统调用,内核将磁盘的数据copy到内核空间,然后再由进程将数据copy到自己的用户空间,对于进程来说这有2步首先第一步是等待数据到内存,第二部是等待数据由内核空间到自己的用户空间

  • 堵塞:首先第一步内核将数据拷贝到内核空间是挂起状态,第二部把内核数据copy到自己的用户空间也是堵塞状态
  • 非堵塞:第一步内核将数据拷贝到内核空间是睡眠或者忙等待状态,第二部内核将数据从内核空间copy到用户空间是堵塞状态

同步异步

用于消息通知

同步调用

调用者向被调用者发起调用,比如我们的进程/线程向另一个进程/线程,发起调用,此时这个进程会等待,什么也不干,只有等另一个进程返回消息,调用者进程才会执行下一步

异步调用

调用者向被调用者发送请求后,不会等待,而是去处理别的事情,被调用者通过状态,通知,或者回调机制通知调用者被调用者的运行状态

阻塞/非阻塞

阻塞

当我们的一个进程向内核发起系统调用,此时我们的这个进程就会被堵塞,也就是被挂起/睡眠,什么也不干,等内核将进程发起的io请求所需要的数据copy到进程的内核空间,此时进程唤醒再由进程将此数据拷贝到自己的用户空间,之前都是除于睡眠状态什么都不干 ,这个睡眠叫做不可中断睡眠

非阻塞

调用者发起调用,在调用结果返回之前,会等待被调用者返回数据,这个等法有2种,第一种是睡眠等待被调用者完成数据copy去叫醒你,这个睡眠并不是挂起,还有一种等发是调用者不睡眠,而是不断地去询问调用者好了没,这叫做忙等待

1,同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的
2,阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。
3,阻塞是使用同步机制的结果,非阻塞则是使用异步机制的结果。
4,调用者发起调用后,调用者能不能继续向后走,能向后走就是异步,不能向后走就是同步
5,阻塞和非阻塞关注的是被调用者的状态,调用者向调用者发起调用,调用者被挂起那么就是阻塞,没有被挂起,而是忙等待那么就是非阻塞

复用IO

如果我们有一个进程在进行内核调用,被阻塞(不可中断睡眠)在原地,我们又发送了一个IO,ctrl + c按照阻塞非阻塞的逻辑他是不会理ctrl+c这个IO,但是实际上并不是这样,我们的IO复用就是这样的,我们阻塞不会去阻塞到进程上而是阻塞到一个特殊IO管理组建

首先他是这样我们的进程不会再去向内核发起系统调用直接去请求磁盘,而是向内核种一个特殊的IO管理组建去发起IO调用,由这个管理组建去代发IO请求,此时这个进程被阻塞,但是不是被阻塞到一路IO上,而是阻塞再这个IO调用器上,这个调用器也可以帮这个进程去监听是否有其他的IO过来,如果有IO过来就唤醒进程

以上都是同步,向被调用者发送io,调用者什么都不干,包括阻塞非阻塞都是同步

select(),poll()

select是复用IO,他可以帮助我们的linux最多监控1024个IO,而poll并没有这个限制,我们的httpd mem 种prefork就是用的select(),也许你会问prefork的一个进程只相应一个IO怎么实现了select?因为select实现prefork的是主控master进程,所以他最多只能生成1024个子进程,相应1024个IO并发 ,为什么select会最多允许1024个IO了?超过1024个他的性能并不会有提升,但是这样为什么会有poll?因为select是BSD发明的,而poll是System V发明的,System V有UNIX正统血统,继承于贝尔实验室,不屑于用加州大学伯克利分校发明的select,而是自己搞了一个poll

信号驱动型IO

首先信号驱动型IO是实现了一定的异步,当调用者向被调用者发起请求后请求数据到内核空间,自己不会去等待,不会去挂起而是去干别的事情,比如再去接受别的IO,那么此时实现了IO复用,如果当数据已经被拷贝到内核空间,此时进程还是要被挂起,去处理将内核空间的数据copy到自己用户空间,这个阶段是阻塞的,但是内存间互相copy比从磁盘copy到内存快多了,
2000年之后产生的,nginx再这个技术出现后开发,可以直接使用他,不像httpd一样有历史包袱

epoll,kqueue,/dev/poll

epoll是linux实现的,它由libevent提供
kqueue是由BSD实现的
/dev/poll是由solaris实现的

异步IO

在这里插入图片描述

Nginx简介

nginx是原意思为 engine X 他是一个open-source,hight-performance http server, and reverse proxy and IMAP/POP3 proxy server nginx也可以用反向代理,但是他是用于7层,将报文拆开修改发给后端服务器

nginx的特性

  • nginx是模块化设计,较好的扩展性(和httpd一样支持模块动态装卸载,但是他在2016年才支持的,在这之前阿里的nginx变种tengine早就支持了)
  • 高可靠性:nginx的组成部分是一个主控进程(master)和多个子进程(worker)
  • 低内存消耗:10000个keepalive模式下的connection,nginx只需要消耗2.5MB的内存
  • 支持热部署:不停机而更新配置文件,日志文件滚动,升级程序版本
  • 支持事件驱动,异步IO,内存映射

nginx基本功能

  • 静态资源的web服务,能缓存打开的文件描述符:
  • 支持http,smtp,pop3协议的反向代理服务
  • 反向代理
    客户端访问web主机一般来说是直接访问,但是用户量一大单个web服务器就抗不过来,所以来了一个反向代理服务器,当client访问反向代理服务器的时候,请求从client发到反向代理服务器,反向代理服务器的用户空间有一个反向代理进程监听在80端口一收到请求就立马把请求重新封装,发给真的web服务器,然后web服务器返回回应到反向代理服务器,然后反向代理服务器在转发给用户,这样有一种负载均衡的效果,他和lvs有点像
  • 正向代理
    就是client发送的所有的请求都发给正向代理服务器,然后由正向代理服务器帮助你去访问网站(和翻墙有点像)

代理服务器加速代理服务收到web服务器的请求后就回缓存一份到本机,缓存是键值对的方式缓存,键是URL,值是内容,缓存在内存中,当有用户访问的URL正好和缓存的建一样就直接返回值,就不用去web服务器上查找

  • 支持缓存加速(通过反向代理),和负载均衡(通过反向代理)
  • 支持fastCGI(与PHP-fpm交互,LNMP),支持uWSGI(与python交互)
  • 支持ssl

nginx扩展功能

  • 基于名称和IP的虚拟机
  • 支持keepalive
  • 支持平滑升级
  • 定制访问日志,支持使用日志缓冲区提供日志存储性能
  • 支持url,rewrite
  • 支持路径别名
  • 支持基于ip及用户的访问控制
  • 支持速率限制,支持并发数限制

nginx架构

image

一个master生成多个worker

master是主程序worker是子进程,master用来管理worker,每一个worker可以处理多个请求,接受请求后可以通过http协议反向代理给webserver,或者通过fast cgi协议反向代理给application server,也可以通过memcache协议反代给memcache,一个worker可以处理多个io为什么了?因为他是用的epoll模型,当然他也可以用select io模型,当收到请求后后端服务器的响应内容我们可以先存在本地然后在响应,第二个请求来了后我们可以先看缓存,如果有就直接返回,这一定程度上实现了加速的作用,管理缓存用了2个进程cache loader(缓存加载器)和cache manager(管理器),对于磁盘io来说他用到了advanced(高级) io,sendfile,A io,mmap(内存映射)

支持sendfile (httpd也支持)

首先一次网络IO的操作具体过程是这样的,首先网卡接收到数据,然后通过内核中注册绑定监听的套接字传到用户空间,然后用户空间的进程收到后就再往内核发送io请求请求数据内核把数据存到内核的内存中,然后再由进程把数据从内核空间copy到进程空间,再由用户(进程)生成响应报文,再由进程内存发起网络IO 发往内核内存,再发到网卡队列中再发出去,应为要频繁的进行内核空间和用户空间之间的上下文切换,所以非常消耗资源,这时候出来了一个叫做sendfile的机制

sendfile :
首先网卡接受数据通过内核中注册绑定监听的套接字传到用户空间中,再由用户空间发起IO请求向内核要数据,注意这时候和普通的io不一样,普通的直接返回到内核空间再copy到用户空间构成响应报文,sendfile是内核把数据传到内核空间后不发往用户空间,直接再内核空间进行响应报文的构建然后发往,网卡出去,这样省去了2次的内核空间和用户空间的上下文切换

支持AIO
支持mmap

nginx工作模式

由一个master主进程生成多个worker进程,是master/work模型,
master的作用

master不处理用户请求,master的三个核心作用,1:是装载配置文件,2:启动worker进程,3:平滑升级(非停机跟新)。

worker的作用

nginx高度模块类型

  • 核心模块
  • standard HTTP modules
  • optional HTTP modules(可选的http模块)
  • mail modules
  • 流模块 (stream modules 4层传输代理/负载均衡)
  • 3rd party modules(第三方模块)

前4中模块Nginx自带第三方模块需要编译安装nginx的时候加上

nginx安装

1,首先我们在nginx官网找到nginx的官方yum源,然后用你的服务器配置yum指向这个yum源
http://nginx.org/packages/centos/7/x86_64/
这里面有很多支持动态装卸载的包

2,我们直接安装nginx

[root@centos1 ~]# yum install nginx -y 

3,

rpm包安装

nginx虽然没有收录进基本的包,但是他被收录进了epel包
nginx安装分用rpm包和编译安装

首先创建一个目录专门用来放置这个包并且解压这个包

[root@linux-node1 ~]# mkdir /pack
[root@linux-node1 ~]# mv nginx-1.12.2.tar.gz  /pack/
[root@linux-node1 ~]# 
[root@linux-node1 ~]# 
[root@linux-node1 ~]# ls
anaconda-ks.cfg
[root@linux-node1 ~]# 
[root@linux-node1 ~]# cd /pack/
[root@linux-node1 pack]# ls
nginx-1.12.2.tar.gz
[root@linux-node1 pack]# tar -xf nginx-1.12.2.tar.gz 
[root@linux-node1 pack]# 
[root@linux-node1 pack]# 
[root@linux-node1 pack]# ls
nginx-1.12.2  nginx-1.12.2.tar.gz

nginx需要匹配正则 所以我们安装perl扩展 pcre-devel包

[root@linux-node1 nginx-1.12.2]# yum install pcre-devel -y
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package pcre-devel.x86_64 0:8.32-17.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===================================================================================================
 Package                  Arch                 Version                    Repository          Size
===================================================================================================
Installing:
 pcre-devel               x86_64               8.32-17.el7                base               480 k

Transaction Summary
===================================================================================================
Install  1 Package

安装zalib-devel和openssl-devel的这些外部支持

[root@linux-node1 nginx-1.12.2]#yum install -y zlib-devel  openssl-devel

然后创建nginx组和nginx用户

[root@linux-node1 nginx-1.12.2]# groupadd -r nginx
[root@linux-node1 nginx-1.12.2]# useradd -g nginx -r nginx
[root@linux-node1 nginx-1.12.2]# 

安装gcc

[root@linux-node1 nginx-1.12.2]# yum install gcc -y

生成makefile为编译做准备

[root@linux-node1 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi 

编译

[root@linux-node1 nginx-1.12.2]#make

安装

[root@linux-node1 nginx-1.12.2]#make install 

创建必须的目录

[root@linux-node1 nginx-1.12.2]# mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi,uwsgi}
mkdir: created directory ‘/var/tmp/nginx’
mkdir: created directory ‘/var/tmp/nginx/client’
mkdir: created directory ‘/var/tmp/nginx/proxy’
mkdir: created directory ‘/var/tmp/nginx/fastcgi’
mkdir: created directory ‘/var/tmp/nginx/uwsgi’

完成

nginx的配置文件

主配置文件

首先我们用yum直接安装nginx后我们再用rpm -ql nginx 查看生成的文件 /etc/nginx/nginx.conf (主配置文件 我们还可以在主配置文件中加上一句include conf.d/*.conf把/etc/nginx下的conf.d文件夹后面以.conf结尾的文件都包括进去)

主配置文件的配置指令
directive value ;
注意:

指令必须以分号结尾,

支持指令使用配置变量

  • 变量由内建变量和自定义变量组成,内建变量在模块装载的时候就生成有的内建变量不能用说明没有装载具体的模块,具体对应关系查看官方文档 ;自定义变量用set variable_name value来指定 我们直接$variable_name来使用变量

主配置文件结构

main block (主配置段)

event{}; (事件驱动相关配置段)
http{}; (http/https协议相关配置段)

主要配置虚拟主机(用server关键字),而http里面server外面是各个server的公共选项 一个server定义一个虚拟主机

http{
  server{ 
        listen  //监听的端口  
        server_name  //主机名  
        root   //制定站点的根目录,就好比DocumentRoot
        alias   //路径别名   
        location [operator] URL{   //对某一个url来做访问限定  
                if  ... {
                    ...
                }
            
        }
  } ; 
};

mail{}; (邮件相关配置段)
stream{}; (4层传输层代理应用等相关配置段)

主程序文件

/usr/sbin/nginx
nginx -V查看nginx版本和模块
nginx -T/-t 测试配置文件语法是否正确
nginx -s stop -s是发送信号sign后面有stop停止 reload重新加载

初探NGINX

我们安装完nginx后我们启动nginx服务

systemctl start nginx.service  

查看nginx进程

ps -aux   
root       1070  0.0  0.0  46364   976 ?        Ss   10:21   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx      1071  0.0  0.0  46768  1936 ?        S    10:21   0:00 nginx: worker process
[root@centos1 ~]# vim /etc/nginx/nginx.conf 
events {
    worker_connections  1024;  //设置一个worker承受的并发连接为1024个我们可以通过更改数字来调整1秒承受的并发数量,但是不能一味的往上加,要考虑服务器实际的负载
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';  //这个是访问日志的格式,后面的都是变量,[每一个变量的具体意义以官方给出的意义为准](http://nginx.org/en/docs/varindex.html)

    access_log  /var/log/nginx/access.log  main;  //这个是访问日志的地址   
    

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;   //长连接65秒

    #gzip  on;

    include /etc/nginx/conf.d/*.conf; //这个目录下的文件都在这个http内生效  
}
[root@centos1 ~]# vim /etc/nginx/conf.d/vhost1.conf  //根据上面的include配置http虚拟主机  
server{
       listen 80;  //监听80端口
       server_name www.zhr.com;  //主机名  ,前提是能解析这个域名
       root /data/nginx/vhost1;   //网页文件
}

[root@centos1 ~]# nginx -t  //测试语法
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@centos1 ~]# systemctl start nginx.service  //开启nginx服务器
[root@centos1 ~]# nginx -s reload   //重新加载配置文件
[root@centos1 ~]# 

worker的性能调优

worker进程绑定cpu

我们看到上面有一个master进程和一个worker进程为什么只有一个?因为一个worker对应一个cpu核心数,我的虚拟机是一个核心所以就1个worker
,我们也可以自己配置/etc/nginx/nginx.conf文件调整worker的数量
查看nginx主配置文件

vim /etc/nginx/nginx.conf 

user  nginx;
worker_processes  1;   //1为设置1个worker,auto为检查有几个核心就设置几个worker   
worker_cpu_affinity cpumask; //如果不写cpu的mask,写成auto那么这个就会自动的把worker绑定到cpu上,那么cpumask是什么了如果你有8个cpu的核心,那么你的cpumask就有8位,第0个cpu核心是00000001,第1个是0000010,第2个是00000100,第3个是00001000,第四个cpu00010000,以此类推到第7个cpu 10000000     
#我们可以通过 watch -n.5 'ps axo comm,pid,psr| grep' nginx用watch命令每隔0.5秒查看命令ps axo comm,pid,psr | grep nginx的变化,而-o代表fromat格式化出输出后面的结果,而后面的psr代表查看进程被分配到那个cpu上,然后我们用httpd自带的网页压力测试工具ab测试网页,再看nginx的worker是否移动到别的cpu上,前提是没有绑定   

   

[root@centos1 ~]# watch -n.5  'ps -axo comm,pid,psr | grep nginx'  
nginx             1180   0
nginx             1181   0
[root@centos1 ~]# yum install httpd -y 
Loaded plugins: fastestmirror   
[root@centos1 ~]# ab -n 100000 -c 100 http://192.168.10.2/index.html    //-n代表会话一共有多少个请求个数,-c表示一次请求多少次   

然后我们手动绑定cpu

[root@centos1 ~]# vim /etc/nginx/nginx.conf    
worker_cpu_affinity 01 10;   
[root@centos1 ~]# nginx -t  //测试语法
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@centos1 ~]# nginx -s reload  /重新加载 
[root@centos1 ~]#    
发现worker已经绑定到cpu上没有来回切换。   


worker进程的优先级(nice值)

worker进程的优先级配置和调优时cpu绑定时配置的位置一样在main中,用关键字worker_priority

[root@centos1 ~]# vim /etc/nginx/nginx.conf   
user  nginx;
worker_processes  auto;
worker_cpu_affinity 01 10;
worker_priority   -5
//进程的优先级分2中一种是os内核为进程设定的优先级(old priority)我们不能手动调整,还有一种我们可以手动调整的nice值,所以最后的优先级等于,finally priority= old priority + nice   finally priority的值越低优先级越高,所占的cpu运行时间越长,
//首先所有进程的nice值都默认是0,nice值的范围是[-20,19]   

worker_rlimit_nofile number (worker进程能打开的文件数量上限)

一个请求来了以后我们要打开一个套接字文件,我们设置的worker的并发连接为10240个所以我们在,我们有2个worker,所以我们在这里要设置成20480,这后面的数字是所有worker一共可以打开多少个文件,这样来吧性能调整到最优处,

调试定位问题

daemon on | off ; 默认on

是否以守护进程的方式运行nginx,就是用守护进程启动nginx,在centos 6 上我们要注意,但是在centos7上他用systemd来管理

master_process on | off; 默认on

是否以master/worker方式进行工作,在实际的环境中 nginx是以一个master进程管理多个worker进程的方式运行的,关闭后 nginx就不会fork出worker子进程来处理请求,
而是用master进程自身来处理请求,这样出了什么问题就直接由主控进程出现在前台上,不会在后台

error_log file [level];

nginx是不用rsyslog管理的但是他也有日志级别的概念,因为这种服务的日志量信息非常大,

event事件驱动相关配置

events{

};

worker_connections number;

每一个worker所承受的最大并发连接数量

use method

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

accept_mutex on | off ;

这个是处理请求的新方法,当你有多个请求来的时候on代表一个worker,一个worker的循环接收,off,代表有一个请求来个每一个worker一起抢这个请求,谁先抢到谁先接受,on代表的起点公平,而off代表的是结果公平,因为如果来了1000个请求我们采用的是on,如果第一个worker还有500个请求没有处理完,第二个第三个都已经完成了,再来请求不就又给了第一个worker了吗,

http相关的配置

与套接字相关的配置
tcp_nodelay
tcp_nodelay on|off ; //tcp_nodelay只对长连接有效   
//tco_nodelay 只对长连接有效,如果tcp_nodelay 为on
那么就自动的禁用了nagle算法,因为在tcp协议中nagle算法自动开启,而什么是nagle算法了?他的作用是当在长连接的时候服务端向客户端返回资源如果资源非常小只有1个字节但是报文的头部40个字节的话使用率不高,那么就将几次回复打包只用一个报文当收到ack或者积累的数据量到达最大的 TCP Segment Size后发送,
tcp_nopush
tcp_nopush on | off //只有当sendfile使用的时候才能使用这个选项   
//首先sendfile发送是当内核空间的tcp协议栈收到请求后就由用户空间监听的套接字查看是否是这个应用程序的如果是就把请求发往用户空间,然后进程就像内核请求该请求请求的资源,然后资源到达内核空间后就用户进程就不拷贝到自己的用户空间就直接在内核空间生成相应报文,当然这个相应报文只是有tcp首部,没有应用层首部因为内核空间识别不了,然后当回应报文发送后应用层首部随后就到,这样分成了2个报文,这个是sendfile,而tcp_nopush开启后就在内核空间准备发送"残疾"的响应报文时,说等一下等一等用户进程的应用层首部,然后用户空间的应用层首部到达内核空间的时候将报文拼装起来当成一个报文发送,这个是开启tcp_nopush。
keepalive_timeout

保持连接超时时间默认75秒

keepalive_requests

长连接,client最多请求的资源个数,默认为100,也就是说client请求了100个资源,就启用四次挥手,不管长连接时间到没到

typrs_hash_max_size

设置保存hash表的最大值 后面的单位是项,条目
为什么会用到hash,在nginx内部为了加速对某一个资源的访问,会把资源直接放在内存,我们要分析这个是什么资源,比较他内存中有没有,但是怎么比较?不是一个一个字符串的比较而是用hash值比较因为一个一个字节比较非常的慢有可能前50个一样只有最后一个不一样,但是用hash值就不同了,他直接算出不同之处。

server{}
server{
    //配置一个虚拟主机    
        listen port|address:port ;  
        server_name SERVER_NAME; //指明虚拟主机的名称,在这里也可以用正则表达式,1.支持以*通配任意长度,任意字符,如www.zhr*   *.zhr.com 2.支持以-起始的正则表达式做匹配,     
        //如果我们有2个虚拟主机,他们的主机名一个是用*通配符,一个使用正则表达式,此时我们在浏览器输入一个主机名,正好都匹配,这时我们有一个优先级机制 (1)首先是字符串精确匹配 (2)左侧*通配符 (3)右侧*通配符 (4)正则表达式
        root /PATH/TO/DOCUMENT;   //这个是对于 nginx作为web服务器而言,如果是反代服务器这一项就不起作用,root只能用于http(所有server都用一个root,当然也可以在server中再写一个root,这个root覆盖http中的root),server,location,if in location中   
        proxy_pass URL; //反向代理服务器,监听在某个接口,请求到达后都转向后面这个url所指向的服务器响应   
        location / {     //location后面除了url也可以加上~匹配正则表达式(区分大小写)比如 location ~*\.(jpg|png)$  , 也可以=后加url做精确匹配,也可以~*对url做正则匹配但是不区分大小写 他们的优先级从大到小排名 =,~|~*(优先级一样) ,不带符号 
            deny 192.168.10.1;   // 不允许192.168.10.1这个主机访问
            allow all; //允许所有的主机访问
            
        } 
        //location根据请求的url来做请求访问设置相应,匹配的规则是自上而下匹配的
 
        location = / {	// =说明精准匹配
            root /image;    //这个在location里面定义一个location代表该覆盖了server里面定义的root
        }   
        location /images {
            root /image; //这个意思是首先把/image当成根然后image下有一个images文件对他做匹配,但是这时候访问www.zhr.com默认的回到了server的root下,不在是location里面的root
        }   
         location ^~ /images/ {   
                alias /image;   //他的意思是当你访问www.zhr.com/images时自动转到根目录下的image里面


        }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值