Nginx学习笔录


官方文档

Http协议简介

  • http协议:80/tcp,HyperText Transfer Procotol

  • html:Hypertext Mark Language

  • 文本:HTTP/1.0 MIME

  • MIME:Multipurpose Internet Mail Extension

    • major/minor
      • text/plain
      • image/jpeg
  • URL:schem://server[:port]/path/to/source

  • http事务:request <——–> response

    • request:

    • response:

      • 协议格式:文本,二进制
  • method:
    GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS

  • status:
    1xx: 信息类
    2xx: 成功类 200(ok)
    3xx: 重定向类 301,302,304
    4xx: 客户端错误类 403,404
    5xx: 服务器端错误 502

  • HEADER:
    通用首部
    请求首部:
    IF-Modified-Since IF-None-Match
    响应首部
    实体首部
    扩展首部

Web页面访问及其页面资源

  • Web页面:多个资源
    入口,资源引用

  • 认证:
    基于IP认证
    基于用户认证

  • 资源映射:
    Alias
    DocumentRoot

  • httpd:MPM

    • prefork,worker,event

      prefork:主进程,生成多个子进程,每个子进程处理一个请求
      worker:主进程,生成多个子进程,每个子进程生成多个线程,每个线程响应一个请求
      event:主进程,生成多个子进程,每个子进程响应多个请求

I/O类型

  • 同步与异步:synchronous,asynchronous
    关注的是消息通知机制

    • 同步:调用发生之后不会立即返回,但一旦返回,就返回最终结果
    • 异步:调用出发之后,被调用方立即返回消息,但返回并非最终结果;被调用通过状态,通知机制来通知调用者,或通过回调函数来处理结果过
  • 阻塞与非阻塞:block,nonblock
    关注的是调用者等待返回调用结果时的状态

    • 阻塞:调用返回之前,调用者被挂起,只能得到返回结果过才能继续
    • 非阻塞:调用在结果返回之前,不会被挂起,即调用不会阻塞调用者

I/O模型

  • blocking I/O:阻塞式

  • nonblocking I/O:非阻塞式

  • IO multiplexing:复用型
    select(),poll()

  • signal driven IO:事件驱动

    • 通知:
      水平触发:多次通知
      边缘触发:只通知一次
  • asynchronous IO:异步

例如:一次读操作

  1. 等待数据准备好,磁盘到内核内存
  2. 从内核复制到进程内存

注:前三个为同步,后两个为异步

Nginx

  • http://nginx.org/ , C10k

  • Igor Sysoev,Rambler Media;

    • engine X:nginx
    • tenglne,OpenResty
  • Nginx特性:

    1. 模块化设计,较好的扩展性
    2. 高可靠性:master/worker
    3. 支持热部署:不停机更新配置值文件,更新日志,更新服务器程序版本
    4. 低内存消耗:10000个keep-alive连接模式的非活动链接仅占2.5M
    5. event-driven,alo,mmap
  • 基本功能

    • 静态资源的web服务器

    • http协议的反向代理

      • http代理:指的是使用代理服务器使网络用户访问外部网站。代理服务器是介于浏览器和Web服务器之间的一台服务器,是建立在超文本传输协议上的网络浏览方式,作用是可以防伪部分对协议进行了限制的局域网。
      • 关于HTTP代理服务器的主要功能包括五个方面:
        1. 突破自身IP访问限制,访问国外站点;
        2. 访问一些单位或团体内部资源,如某大学的内部网,使用教育网内地址段免费代理服务器可以用于对教育 网开放的各类下载上传以及各类资料查询共享等服务;
      1. 突破中国电信IP封锁中国电信有很多网站限制了用户访问,使用HTTP代理可以突破访问限制;
      2. 提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时将信息保存到缓冲区中,当其他用户再访问相同的信息时, 可直接由缓冲区中取出信息传递给用户,提高访问速度;
      3. 隐藏真实IP:HTTP代理可以隐藏IP地址,避免受到网络攻击。
        • http反向代理:所谓反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
          我们常说的代理是指正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,科学上网工具 Shadowsocks 扮演的就是典型的正向代理角色。在天朝用浏览器访问 www.google.com 时会被无情的墙掉,要想翻阅这堵墙,你可以在国外用 Shadowsocks 来搭建一台代理服务器,让代理帮我们去请求 www.google.com,代理再把请求响应结果再返回给我。
          反向代理隐藏了真实的服务端。
    • pop3,SMPT,IMap4等邮件协议的反向代理

    • 能缓存打开的文件(元数据),支持FastCGI(php-fpm),uWSGI(python web Framwork)等协议

    • 模块化,过滤器zip,ssi,ssl

  • Web服务相关功能
    虚拟主机,keepalive,访问日志,url rewrite,路径别名,基于IP及用户的访问控制,支持速率限制及并发数限制;……

  • Nginx基础架构

    • master/worker
      一个master进程,可以生成多个worker进程;
      事件驱动:epoll(Linux),kqueue(FreeBSD),/dev/poll(Solars)

      • 消息通知:select,poll,rt signals

      支持sendfile,sendfile64
      支持AIO,mmap

      master:加载配置文件,管理worker进程,平滑升级……
      worker:http服务,http代理,fastcgl代理……

  • 模块类型

    • 核心模块:core module
    • Standard HTTP modules
    • Optional HTTP modules
    • Mail modules
    • 3rd party modules
  • 做什么?
    静态资源web服务器
    http服务器反向代理

Nginx安装与配置

Nginx:Window下安装与配置
Nginx:Ubuntu下安装与配置

配置文件

  • 主配置文件:nginx.conf
  • mime.types
  • fastcgi配置文件:fastcgi_params uwsgl_params
  • proxy.conf
  • sites.conf

配置指令(必须以分号结尾)

Directive value1[value2……];

支持使用变量:

  • 内置变量:又模块引入
  • 自定义变量:
    set variable value
  • 引用变量:$variable

nginx.conf配置文件组织结构

main block
event{
...
}
http{
...
  upstream{
  ...
  }
  //至少一个server
  server{
    ...
    server_name
    root
    alias
    location /url/{
    ...
    }
  }
  server{
    ...
  }
} 

main block配置
类别:

  • 正常运行必备的配置
1. user USERNAME [GROUPNAME];  指定用于运行work进程的用户和组.
user nginx nginx
2. pid /PATH/TO/PID_FILE;  指定nginx进程的pid文路径
pid /var/run/nginx.pid
3. worker_rlimit_nofile #;  一个work进程所能打开的最大文件描述符数量
4. worker_rlimit_slgpending #; 每个用户能够发给worker进程的信号数量
  • 优化性能相关的配置
1. work_processes # ;  worker进程的个数,通常为该物理CPU核心数量-1,可以设置为‘auto’
2. worker_cpu_affinity CPUMASK CPUMASK ……
    CUPMASK:0001    0010    0100    1000
worker_cpu_affinity 00000001 00000010 00000100
3. worker_priority nice;
[-20,19]
  • 用于调试,定位问题的配置
1. daemon off|on;   是否以守护进程方式启动nginx
2. master_process on|off;   是否以master/worker模型运行nginx
3. error_log  /PATH/TO/ERROR_LOG level;   错误日志文件及其级别;用于调试需要,可以设为debug,但debug仅在编译时使用‘--with-debug’选项时才生效

event配置

1. worker_connections # ; 每个worker进程能够响应最大的并发请求数量
worker_proceses * worker_connections
2. use [epoll|rgsig|select|poll];定义使用的事件模型,建议让nginx自动选择
3. accept_mutex [on|off];  各worker接受用户请求的负载均衡锁;启用时,表示用于让多个worker轮流的,序列的响应新请求
4. lock_file /PATH/TO/LOCK_FILE;

http配置

  • 套接字或主机相关指令
  1. server{}://定义虚拟主机

    server{
    listen PORT;
    server_name NAME;  
    root /PATH/TO/DOCUMENTROOT;
    }

    注:(1)基于port:listen监听不同的端口;
    (2)基于hostname:server_name指令指向不同主机

  2. listen

    listen address[:port][default_server][ssl][http2|spdy]
    listen port[default_server][ssl][http2|spdy]
    //default_server:设置默认虚拟主机,用于基于IP地址,或使用任意不能对应任何一个server的name时所返回的站点;
    //ssl:用于限制只能通过ssl连接提供服务
    //spdy:SPDY protocol(speedy),在编译时spdy模块情况下,用于支持SPDY协议
    //http2:http version 2;
  3. server_name NAME [……];
    可跟一个或多个主机名,名称还可以使用通配符和正则表达式(~);

1.首先做精准匹配:www.magedu.com
2.左侧通配符:*.magedu.com
3.右侧通配符:www.magedu.*
4.正则表达式:~^.*\magedu\.com$
5.default server
  1. tcp_nodelay on|off
    在keepalive模式下的连接是否使用TCP_NODELAY选项;

  2. tcp_nopush on|off
    是否启用TCP_NOPUSH(FREEBSE)或TCP_CORK(LINUX)选项;仅在sendfile为on时有用

  3. sendfile on|off
    是否启用sendfile功能

  • 路径相关指令
  1. root
    设置web资源的路径映射,用于指明请求的URL所对应的文档目录的路径:
    server{
    ...
    root /data/www/vhost1;
    }
    // 访问http://www.a.com/image/logo.jpg  -->/data/www/vhost1/image/logo.ipg
    server{
    ...
    server_name www.a.com
    location /image/ {
     root /data/imgs/;
     ...
    }
    // 访问http://www.a.com/image/logo.jpg  -->/data/imgs/image/logo.ipg
  2. location [= | ~ | * | ^] url{……}
    location @name {……}

功能:允许根据用户请求的url来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理,简言之,即用于需要的专用配置的URL提供特定配置。

  • =:url的精确匹配
  • ~:做正则表达式匹配,区分字符大小写
  • ~*:做正则表达式匹配,不区分字符大小写
  • ^~:url左半部分匹配,不区分字符大小写

匹配优先级:=,^,或~*,不带符号的url;

  1. alias
    只能用于location匹配段,定义路径别名

    location /image/{
    root /data/imgs/;
    }
    location /image/{
    alias /data/imgs/;
    }

    注:
    root:给定的路径对应location的“/”这个url
    /image/test.jpg–>/data/imgs/image/test.jpg
    alias:给定的路径对应于location的“/url”这个url
    /image/test.jpg–>/data/imgs/test.jpg

  2. index

    index file ……;

    默认主页面

  3. error_page code … [=[response]] url
    根据http的状态码重定向错误页面;

    error_page 404 /404.html
    error_page 404=200 /404.html   //以指定状态码响应
  4. try_files file…… url;
    try_files file……=code;
    尝试查找第一个至第N-1个文件,第一个返回给请求者的资源,若N-1文件都不存在,则跳转至最后一个url(必须不能匹配至当前location,而应该匹配至其他location,否则会导致死循环);

用户请求相关配置

  1. keepalive_timeout timeout [header_timeout]
    设定keepalive连接的超时时长;0表示禁止长连接

  2. keepalive_requests number;
    在keepalive链接上所允许请求的最大资源数量;默认100

  3. keepalive_disable none|browser …;
    指明禁止为何种浏览器使用keepalive功能;

  4. send_timeout #;
    发送响应报文超时时长,默认60s

  5. client_body_buffer_size size;
    接受客户端请求报文body的缓冲区大小,默认16k;超出此值时,将被移存于磁盘上

  6. client_body_temp_path path [level1 [level2 [level3]]];
    设定用于存储客户端请求body的临时储存路径及子目录结构和数量;

    client_body_temp_path /var/tmp/client_body 2 2

对客户端请求进行限制

  1. limit_except METHOD{…}
    对指定范围外的其他方法进行访问控制;

    limit_except GET{
    allow 172.16.0.0/16;
    deny all;
    }
  2. limit_rate speed;
    限制客户端每秒钟所能够传输的字节数,默认为0表示无限制。

文件操作优化相关配置

  1. aio on|off

  2. directio size|off;

  3. open_file_cache off;
    open_file_cache max=N [inactive=time]

    nginx可以缓存以下三种信息:

    1. 文件描述符,文件大小和最近一次的修改时间
    2. 打开的目录的结构
    3. 没有找到的或者没有权限操作的文件的相关信息

max=N 表示可缓存的最大条目上限,则会使用LUR算法中删除最近最少使用的缓存项;

inactive=time:在此处指定的时长内没有被访问的缓存项视为非活动缓存项,因此直接删除;

  1. open_file_cache_errors on|off;
    是否缓存找不到路径的文件,或没有权限访问的文件相关信息;

  2. open_file_cache_valid time;
    没隔多久检查一次缓存中缓存项的有效性,默认60s;

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

ngx_http_access_module模块(基于IP的访问控制)

  1. allow address|CIDR|unix|all;

  2. deny address|CIDR|unix|all;

    应用上下文:http,server,location,limit_except

ngx_http_auth_basic_module模块(basic认证)

  1. auth_basic string|off;
    使用http basic认证协议对用户进行认证

  2. auth_basic_user_file file;
    实现用户认证的账号文件;

  • 文件格式:
    name1:password1
    name2:password2;commit

  • 密码格式:

1.encrypted with the crypt() function;
2.md5加密;

location /admin/ {
auth_basic "admin"
auth_basic_user_file /etc/nginx/.ngxhtpasswd;
}

ngx_http_log_module模块(访问日志)

  1. log_format name string …;
    定义日志格式及其名称,日志格式一般通过调用内置函数变量来定义

  2. access_log path [format[buffer=size[flush=time]]];
    access_log off;

访问日志路径,格式名称以及缓存大小的刷写时间间隔;建议定义缓冲以提升性能。

  1. open_log_file_cache max=N[inactive=time][min_user=N][valid=time];
    open_log_file_cache off;

ngx_http_stub_status_module模块

  1. stub_status;
    通过指定的url的stub_status

Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106

  • Active connections:当前活动客户端连接数,包括Waiting连接数。
  • accepts:已接受的客户端连接总数。
  • handled:已处理连接的总数。通常,参数值与accepts 除非已达到某些资源限制(例如, worker_connections限制)相同。
  • requests:客户端请求的总数。
  • Reading:nginx正在读取请求标头的当前连接数。
  • Writing:nginx将响应写回客户端的当前连接数。
  • Waiting:当前等待请求的空闲客户端连接数。

ngx_http_referer_module模块

  1. valid_referers none | blocked | server_names | string …;
  • none 请求标头中不存在“Referer”字段;
  • blocked:“Referer”字段出现在请求标头中,但其值已被防火墙或代理服务器删除; 这些值是不以“ http://”或“ https://” 开头的字符串;
  • server_names:“Referer”请求头字段包含一个服务器名称;
  • arbitrary string:直接字符串,可以使用通配符
  • regular expression:以~起始的正则表达式

内置变量:$invalid_referer(所有不能符合valid_referer指令定义的引用请求均为不合法引用)

实例:

valid_referers none blocked server_names
               *.example.com example.* www.example.org/galleries/
               ~\.google\.;

文章作者: JackHCC
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 JackHCC !
评论
  目录