yyyyy

http请求过程

 

1)建立TCP连接

 2)web浏览器想服务器发送请求

 3)web浏览器发送请求头部信息(请求报文)

 4)应答(响应报文)

 5)web服务器发送应答头部

 6)web服务器发送数据

 7)web服务器关闭TCP连接

头部信息分为通用头部、请求头部、响应头部、实体头部

 

其中需要仔细了解的

    通用头部:

     Cache-control(缓存信息)

     pragma

     transfer-encoding(web服务器表明自己对本响应消息体,比如是否分快)

     Connection:表示是否需要持久连接(keep-alive等)

    请求头部:

     Methord-requert-URI http-version accept(告诉web服务器自己接受什么介质类型 */*表示任何类型、type/*表示该类型下的所有子类型)

    

   Accetp-enconding

     浏览器申明自己接受的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法

     

     HOST

     referer (跳转的信息如上一跳)

     user-agent

HTTP协议报文格式

 

请求报文

 <method> <URL> <version>

 <HEADERS>

 

 <body>

 

 响应报文

 <version> <status> <reason phrase>

 <HEADERS>

 

 <body>

 

 协议的格式分为:文本格式、二进制格式

 

 method: (常见的)

 GET:请求 、HEAD:响应首部 、POST: 提交表单 DELETE: 删除资源 TRACE:资源经过的代理服务器

 、OPTIONS:查看资源支持的请求

 

 URL: scheme://server[:port]/path/to/source

 

 status:

 1**:信息类

 2**:成功类 200

 3**:重定向类 301 302 304

 4**:客户端错误类:403 404 401

 5**:服务器端错误类 502 504 

 

 HEADER:

  

 通用首部

 请求首部

 if-modified-since 、if-none-match

 响应首部

 实体首部

 扩展http请求过程

 

1)建立TCP连接

 2)web浏览器想服务器发送请求

 3)web浏览器发送请求头部信息(请求报文)

 4)应答(响应报文)

 5)web服务器发送应答头部

 6)web服务器发送数据

 7)web服务器关闭TCP连接

头部信息分为通用头部、请求头部、响应头部、实体头部

 

其中需要仔细了解的

    通用头部:

     Cache-control(缓存信息)

     pragma

     transfer-encoding(web服务器表明自己对本响应消息体,比如是否分快)

     Connection:表示是否需要持久连接(keep-alive等)

    请求头部:

     Methord-requert-URI http-version accept(告诉web服务器自己接受什么介质类型 */*表示任何类型、type/*表示该类型下的所有子类型)

    

   Accetp-enconding

     浏览器申明自己接受的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法

     

     HOST

     referer (跳转的信息如上一跳)

     user-agent

HTTP协议报文格式

 

请求报文

 <method> <URL> <version>

 <HEADERS>

 

 <body>

 

 响应报文

 <version> <status> <reason phrase>

 <HEADERS>

 

 <body>

 

 协议的格式分为:文本格式、二进制格式

 

 method: (常见的)

 GET:请求 、HEAD:响应首部 、POST: 提交表单 DELETE: 删除资源  TRACE:资源经过的代理服务器

 、OPTIONS:查看资源支持的请求

 

 URL: scheme://server[:port]/path/to/source

 

 status:

 1**:信息类

 2**:成功类  200

 3**:重定向类 301 302 304

 4**:客户端错误类:403 404 401

 5**:服务器端错误类  502 504 

 

 HEADER:

  

 通用首部

 请求首部

 if-modified-since  、if-none-match

 响应首部

 实体首部

 扩展首部

 

  

我们请求的一般是web页面,其中一个页面基本都有很多个资源。

 

 

认证方式

   

基于IP的用户

基于用户的认证

    basic认证

    digest认证

    

资源映射

    ailas :路径别名

    docuementroot:URL根

    

htpd:MPM

    

    prefork:主进程生成多个子进程,每个子进程处理一个请求

    worker:主进程生成多个子进程,每个子进程生成U盾讴歌线程

    event:主进程生成多个子进程,每个子进程响应多个请求

    

   

 

IO类型:

    同步和异步:aynchronous 

    synchronous

    

    阻塞和非阻塞:block ,nonblock

    

    

    

    同步/异步:关注的是消息通信机制

. 同步:synchronous,调用者等待被调用者返回消息,才能继续执行

 

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

 

 

    阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态 

 

    阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起

    

    非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起

 

 

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

 

 

IO本身的执行过程

 

A 调用者

B 被调用者

IO的过程在B看来分成两部分

 

1)数据从磁盘到内核空间的过程

2)从内核空间被复制到进程空间中

 

nginx的优点:

  

     1)高并发连接:支持2-3W的并发连接数

     2)内存消耗少:3W的并发量下开启10个NGINX进程消耗只有150M内存

     3)配置简单:

     4)支持重写

     6)内置的健康检查功能:   一旦宕机不影响负载均衡调度

     7)节省带宽:支持压缩

     8)稳定性高

     9)模块化设计:模块可以动态编译

     10)外围支持好:文档比较全,二次开发和模块比较多

     11)支持热部署:可以不停机重载配置文件

     12)支持时间驱动AIO.MMAP等性能优化

 

 

 发布项目可以利用内置检查功能,直接修改状态码为404等 然后下线下线后,上限包,然后修改回来状态包,或者在重启时写脚本curl web 然后修改状态码然后自动上线

 

 

 

 

 web服务相关的功能:

    虚拟主机(server)

    支持 keep-alive 和管道连接

    访问日志(支持基于日志缓冲提高其性能)

    url rewirte

    路径别名

    基于IP及用户的访问控制

    支持速率限制及并发数限制

    重新配置和在线升级而无须中断客户的工作进程

    Memcached 的 GET 接口 

 

 

 

nginx的程序架构:

    master/worker结构

    一个master进程:

    负载加载和分析配置文件、管理worker进程、平滑升级

    一个或多个worker进程

    处理并响应用户请求

    缓存相关的进程:

    cache loader:载入缓存对象

    cache manager:管理缓存对象 

         

 

NGINX的工作模式:

    

    基于非阻塞、事件驱动、由一个master进程生成读个worker线程,每个worker响应N个请求

    

模块类型:

    

    模块分类:

    核心模块:core module

    标准模块:

    HTTP 模块: ngx_http_*

        HTTP Core modules 默认功能

    HTTP Optional modules 需编译时指定

    Mail 模块 ngx_mail_*

    Stream 模块 ngx_stream_*

    第三方模块 

         

 

nginx:1.8以后支持的新特性

 

    1、基于哈希的负载均衡方法

    2、后端ssl证书校验

    3、线程池定义线程

    4、支持更多的代理功能

     

NGINX中的模块

    

    正常运行的必备配置

       每一个指令必须以分号结尾    

        1、user USER [GroupName]:指定用来运行worker的用户(组 【省略表示和用户名同名的组】)

         如:user nginx nginx

        

        

        2、pid /Path/to/pid_files

        指定nginx守护进程的pid文件

         如:pid /var/run/nginx/nginx.pid

        

        3、work_rlimit_nofile_ Number 

         指定所有worker进程可以打开的最大并发文件句柄数(默认是1024 比较小,linux中最大可以支持5W左右但是端口号只有三万左右所以我们需要把它调大)  

         

         

        4、work_rlimit_core Size

        所有worker文件所使用的文件最大支持的大小(一般不需要更改)

        

性能优化相关配置

        

        1、worker_processes #

           worker的进程数(通常应该略少为cpu核心数)

        2、worker_cpu_affintify_cpumask ....

           

          优点:能够提升缓存的利用率

           

          context switch :会产生cup的性能消耗,所以我们要绑定worker在cpu上

        

          如:worker_cpu_affintify_cpumask 0001 0100 (表示绑定第一和第三颗)

        

        3、timer_resolution 

          

           计时器解析度 

           降低此值,颗减少gittimeofday()系统调用的次数

           

        4、woker_priority Number

           指明worker进程的nice值(-20---19)

        

    事件相关的配置

    

        1、accept_mutex on|off;

          :新的请求到达时,master调度至多个worker进程的负载均衡锁;on 表示让多个worker轮流响应

         

        2、lock_file file accept_mutex用到的锁文件路径;

        

        3、use Use_Methord [epoll,poll,select];: 指定使用的事件模型(建议让NGINX自行选择)   

        

        4、worker_connections # ;

          设定单个worker进程所能够处理的最大并发连接

          

          

    用于调试、定位错误的   

        

        编译安装时必须用--with-debug才能使用此项

        

          1、daemon on|off; :

          是否按守护进程的方式运行nginx,调试时应该设置为off 其他时间设置为on

          

          2、master_process on|off;

        

          是否以master/worker模式运行(调试时可以设置为off)

        

          3、error_log /Path/to/file  level(debug|info|notice|warn|error|crit|alert|emerg)

           

           格式 error_log 位置  级别

           

          

        总结:常需要调整的参数

        worker相关的那四个

        

        

    新改动配置文件生效的方式

        nginx -s reload 

              stop  quit reopen

              

                  

        

        

    nginx作为web服务器时使用的配置

        

        http{} 由 ngx_http_core_moudle模块引入

        

        

    主配置文件结构:四部

        main block:主配置段,即全局配置段,对http,mail都有效

        event {

        ...

        } 事件驱动相关的配置

        http {

        ...

        } http/https 协议相关配置段

        mail {

        ...

        } mail 协议相关配置段

        stream {

        ...

        } stream 服务器相关配置段    

                    

        

        

        http {

            ...

            ... 各server的公共配置

            server { 每个server用于定义一个虚拟主机

            ...

            }

            server {

            ...

            server_name 虚拟主机名

            root 主目录

            alias 路径别名

            location [OPERATOR] URL { 指定URL的特性

            ...(一个server可以有多个location)

            

            if CONDITION {

            ...(还可以有条件判断的功能)

            

            ...(可以有多个server)   

               

                }

               }

              }

             }  

            

        注意与HTTP相关的指令只能防止与http 、server、loction、upstream、if上下文

        但是有些指令仅应用于这五种上下文的某些种

        

      

      指令

         

         1、server{

             listen 8080;

             server_name www.a.com;

             root "/app/a";

             }

        2、listen

            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连接提供服务

            backlog=number 超过并发连接数后,新请求进入后援队列的长度

            rcvbuf=size 接收缓冲区大小

            sndbuf=size 发送缓冲区大小

            注意:

            (1) 基于port;

            listen PORT; 指令监听在不同的端口

            (2) 基于ip的虚拟主机

            listen IP:PORT; IP 地址不同

            (3) 基于hostname

            server_name fqdn; 指令指向不同的主机名

                        

                        

        server_name name ...;

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

        

                        支持*通配任意长度的任意字符

            server_name *.a.com  wwwa.*

            

            支持~起始的字符做正则表达式模式匹配,性能原因慎用

            server_name ~^www\d+\.a\.com$

        

        

            匹配优先级机制从高到低:

            (1) 首先是字符串精确匹配 如:www.weenry.com

            (2) 左侧*通配符 如:*.weenry.com

            (3) 右侧*通配符 如:www.weenry.*

            (4) 正则表达式 如: ~^.*\.weenry\.com$

            (5) default_server

        

         4、root        

             设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径,可用于http, server, location, if in location(指明根位置(越精确匹配度越高生效))                   

        5、location

        

            location [ = | ~ | ~* | ^~ ] uri { ... }

            location @name { ... }

            在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置

            

            示例

            server {...

            server_name www.weenry.com;

            location /images/ {

            root /data/imgs/;

            }

            }

            http://www.weenry.com/images/logo.jpg

            --> /data/imgs/images/logo.jpg

        

        =:对URI做精确匹配;

            location = / {

            ...

            }

            http://www.weenry.com/ 匹配

        ^~:

            对URI的最左边部分做匹配检查,不区分字符大小写 

        ~:

            对URI做正则表达式模式匹配,区分字符大小写    

            

        ~*:

            对URI做正则表达式模式匹配,不区分

        不带符号:

            匹配起始于此uri的所有的uri

        

        匹配优先级从高到低:

            =, ^~, ~/~*, 不带符号

    6、alias path;

        路径别名,文档映射的另一种机制;仅能用于location上下文    

        location指令后定义的URL是相对于alias所指明的路径而言 

         示例:

        http://www.magedu.com/bbs/index.php

        location /bbs/ {

        alias /web/forum/;

        } --> /web/forum/index.html

        location /bbs/ {

        root /web/forum/;

        } --> /web/forum/bbs/index.html           

       

                       注意:location中使用root指令和alias指令的意义不同

            (a) root,给定的路径对应于location中的/uri/左侧的/

            (b) alias,给定的路径对应于location中的/uri/右侧的/

        

            index file ...;

            指定默认网页文件,注意:ngx_http_index_module模块

        

    7、index file :

            默认主页面

            

    8、error_page code [...] [=code] URI |@name

              

        模块:ngx_http_core_module

        定义错误页,以指定的响应状态码进行响应

        可用位置:http, server, location, if in location

        error_page 404 /404.html

        error_page 404 =200 /404.html

                    

    基于IP的访问控制机制

        

        allow  IP

        deny   IP

        

    基于用户的访问控制

    

        basic

        digest

          

        auth_basic "提示语句"

        auth_basic_user_file /PATH/to/.file

        

        然后用htpasswd -c -m /Path/tp/file 

        生成账号密码(如果没有命令需要安装http-tools)

        

    SSL:

        

        1、进入/etc/pki/CA

           (umask 077; openssl genrsa -out private/cakey.pem 2048)

        2、创建自签名证书 

           openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3655

           填写信息

        3、touch serial index.txt

           echo 01 > serial

        4、创建nginx证书目录  cd /etc/nginx

          mkdir SSL

          cd SSL 

          (umask 077; openssl genrsa -out nginx.key 2048

          

          openssl req -new -key nginx.key -out nginx.csr

          填写信息主机名必须与提供服务的主机名一致

           

          发送给ca端

        5、ca端签名

           openssl ca -in nginx.csr -out nginx.crt -days 3655 

         6、修改配置文件

         

           server {

            listen 443 ssl;

            server_name www.magedu.com;

            root /vhosts/ssl/htdocs;

            ssl on;

            ssl_certificate /etc/nginx/ssl/nginx.crt;

            ssl_certificate_key /etc/nginx/ssl/nginx.key;

            ssl_session_cache shared:sslcache:20m;

            ssl_session_timeout 10m;

            }    

        

    stub_status on|off

         

         仅能使用在location中

            示例:

               

                location /status {

                stub_status on;

                allow from 172.20.87.1/16;

                deny  all;

                }

         

            结果示例:  Active connections: 4   (所有处于打开状态的活动链接数)

                        server accepts handled requests (接受下来并处理的请求)

                         25 25 16   (接受的链接   处理的链接  处理的请求)  (备注:在保持链接下请求的数量可能会多于连接数)

                        Reading: 0 Writing: 1 Waiting: 3 

                         (正处于接受请求状态的连接数 

                         请求已经接受完成,整处于处理请求或者发送响应的过程中的连接数

                         保持链接模式,且处于活动状态的连接数)

    rewrite regex replacement [flag ]

    

            将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI

            注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查

            隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制

            如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端, 即永久重定向301 

 

            [flag]:

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

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

            redirect:临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302

            permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,状态码:301

    

            示例: rewrite ^/images/(.*\.jpg)$ /img/$1 break;

                      http://www.weenry/a.b/a.jpg-->imgs/a/b/a.jpg

 

            

            、if (condition) { ... }

                条件满足时,执行配置块中的配置指令;server, location

                condition:

                变量名:

                变量值为空串,或者以0开始则为false 其他均为true

                

                比较操作符:

                = 相同 != 不同

                

                正则表达式的模式匹配操作

                ~:模式匹配,区分字符大小写

                ~*:模式匹配,不区分字符大小写

                !~:模式不匹配,区分字符大小写

                !~*:模式不匹配,不区分字符大小写

                文件及目录存在性判断:

                -e, !-e 存在(包括文件,目录,软链接)

                -f, !-f 文件 -d, !-d 目录 -x, !-x 执行

 

    ngx_http_referer_module模块:

                

                用来阻止Referer首部无有效值的请求访问,可防止盗链

        1、valid_referers none|blocked|server_names|string ...;

                定义referer首部的合法可用值,不能匹配的将是非法值

                none:请求报文首部没有referer首部

                blocked:请求报文有referer首部,但无有效值

                server_names:参数,其可以有值作为主机名或主机名模式

                arbitrary_string:任意字符串,但可使用*作通配符

                regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,例如: ~.*\.magedu\.com

 

 

 

 

 

 

 

定制日志访问格式:

         log_format: 

 

 

       1、 log_format name string ...;

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

       2、access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

        access_log off;

        访问日志文件路径,格式及相关的缓冲的配置

        buffer=size

        flush=time

 

 

 

网络连接相关的配置

 

 

    keepalive_timeout timeout [header_timeout];

            设定保持连接超时时长,0表示禁止长连接,默认为75s(这个值有些大)

    

    keepalive_requests number;

            在一次长连接上所允许请求的资源的最大数量

            默认为100

    

    keepalive_disable none | browser ...

            对哪种浏览器禁用长连接

 

    send_timeout time;

            向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长,而非整个响应过程的传输时长

    

    client_body_buffer_size size;

            用于接收每个客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置 

            

    client_body_temp_path path [level1 [level2 [level3]]];

            设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量

            目录名为16进制的数字;

            client_body_temp_path /var/tmp/client_body 1 2 2

            1 1级目录占1位16进制,即2^4=16个目录 0-f

            2 2级目录占2位16进制,即2^8=256个目录 00-ff

            2 3级目录占2位16进制,即2^8=256个目录 00-ff             

                 

 

 

 

    nginx反向代理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值