欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nginx基础知识

程序员文章站 2022-07-10 12:44:50
...

Nginx介绍

特性:

  1. 模块化设计,较好的扩展性
  2. 高可靠性
  3. 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  4. 底内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
  5. event-driven,aio,mmap,sendfile

基本功能:

  1. 静态资源的web服务器
  2. http协议反向代理服务器
  3. pop3/imap4协议反向代理服务器
  4. FastCGI(LNMP),uWSGI(python)等协议
  5. 模块化(非DSO),如zip,SSL模块

nginx的程序架构

web服务器相关的功能:

  1. 虚拟主机(server)
  2. 支持keep-alive 和管道连接
  3. 访问日志(支持基于日志缓存)
  4. url rewrite
  5. 路径别名
  6. 基于IP及用户的访问控制
  7. 支持速率限制及并发数限制
  8. 重新配置和在线升级而无需中断客户的工作进程
  9. Memcached的GET接口

nginx 架构

nginx基础知识

nginx的程序架构:

master/worker结构
  1. 一个master进程:负载加载和分析配置文件,管理worke进程,平滑升级
  2. 一个或多个worker进程:处理并响应用户请求
  3. 缓存相关的进程:cache loader: 载入缓存对象 cache manager:管理缓存对象

nginx模块

nginx 高度模块化,
模块分类:
  1. 核心模块:core module
  2. 标准模块:
  • HTTP模块:ngx_http_*
    HTTP Core modules 默认功能
    HTTP Optional modules 需编译时指定
  • Mail模块 ngx_mail_*
  • Stream模块ngx_stream_*
  1. 第三方模块

nginx的公用

  1. 静态的web资源服务器:html,图片,js,css,txt等静态资源
  2. 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
  3. http/https协议的反向代理
  4. imap4/pop3协议的反向代理
  5. tcp/udp协议的请求转发(反向代理)

nginx配置

配置文件的组成部分:
  1. 主配置文件:nginx.conf
    子配置文件: include conf.d/*.conf
  2. fastcgi, uwsgi, scgi 等协议相关的配置文件
  3. mime.types: 支持的mime类型
主配置文件的配置指令:
  1. directive value [value2 …];
注意:
  1. 指令必须以分号结尾
  2. 支持使用配置变量
    • 内建变量:由Nginx模块引入,可直接引用
    • 自定义变量:由用户使用set命令定义 set variable_name value;
    • 引用变量 :$variable_name

nginx配置文件

主配置文件结构:四部
  1. main block:主配置段,即全局配置段,对http,mail都有效
    event {

    }事件驱动相关的配置
  2. http {

    } http/https协议相关配置段
  3. mail {

    } mail协议相关配置段
  4. stream {

    } stream服务器相关配置段

http协议相关的配置结构

nginx基础知识

性能优化相关的配置:

  1. worker_processes number | auto
    worker进程的数量,通常应该为当前主机的cpu的物理核心数
  2. worker_cpu_affinity auto [cpumask]提高缓存命中率
    CPU MASK: 00000001:0号CPU
    00000010: 1号CPU
    10000000: 8号CPU
    worker_cpu_affinity 0001 0010 0100 1000;
    worker_cpu_affinity 0101 1010;
  3. worker_priority number: 指定worker进程的nice值,设定worker进程优先级:[-20,20]
  4. worker_rlimit_nofile number:worker进程所能够打开的文件数量上限:如65535

事件驱动相关的配置:

  1. events{

    }
  2. worker_connections number:每个worker进程所能够打开的最大并发连接数数量,如10240总最大并发数: worker_processes * worker_connections
  3. use method: 指明并发连接请求的处理方法,默认自动选择最优方法 use epoll;
  4. accept_mutex on | off 互斥: 处理新的连接请求的方法;on指由各个worker轮流处理新请求,Off指每个新请求的到达都会通知(唤醒)所有的进程,但只有一个进程可获得连接,造成“惊群”,影响性能。

调试和定位问题

  1. daemon on | off 是否以守护进程方式运行nginx,默认是守护进程方式
  2. master_process on | off 是否以master/worker模型运行nginx;默认为on off 将不启动worker
  3. error_log file [level] 错误日志文件及其级别;处于调试需要,可设定为debug;但debug仅在编译时使用了"–with-debug"选项才有效
    方式:file /path/logfile;
    stder: 发送到标准错误
    syslog:server-address[,parameter=values]:发送到syslog memory:size 内存 level:debug|info|notice|warm|error|crit|alter|emerg

与套接字相关的配置:

  1. server{…}
    配置一个虚拟主机
    server{
    listen address[:PORT]|PORT;
    server_name SERVER_NAME;
    root /PATH/TO/DOCUMENT_ROOT;
    }

  2. listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
    listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcbuf = 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; 指令指向不同的主机名

  1. server_name name …;

    • 虚拟主机的主机名称后可跟多个由空白字符分隔的字符串
    • 支持*通配任意长度的任意字符
      server_name .magedu.com www.magedu.
    • 支持~起始的字符做正则表达式模式匹配,性能原因慎用
      server_name ~^www\d+.magedu.com$
      说明: \d 表示[0-9]
    • 匹配优先级机制从高到低:
      (1) 首先是字符串精确匹配 如:www.magedu.com
      (2) 左侧通配符 如:.magedu.com
      (3) 右侧通配符 如:www.magedu.
      (4) 正则表达式 如:~^.*.magedu.com$
      (5) default_server
  2. tcp_nodelay on | off;
    在keepalived模式下的连接是否启用TCP_NODELAY选项
    当为off时,延迟发送,合并多个请求后再发送
    默认On时,不延迟发送
    可用于:http,server,location

  3. sendfile on | off;
    是否启用sendfile功能,在内核中封装报文直接发送
    默认off

  4. server_tokens on | off |build |string
    是否在响应报文的Server首部显示nginx版本

定义路径相关的配置

  1. root
    设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径,可用于http,server,location,if in location
    server {

    root /data/www/vhost1;
    }

    示例:
    http://www.megedu.com/images/logo.jpg
    –> /data/www/vhosts/images/logo.jpg

  2. location [ = | ~ | ~* | ^~ ] uri {…}
    location @name {…}
    在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置
    示例:
    server{…
    server_name www.megedu.com;
    location /images/ {
    root /data/imgs/;
    }
    }

    http://www.magedu.com/images/logo.jpg
    –> /data/imgs/logo.jpg

  • = : 对URI做精确匹配;
    location = /{

    }
    http://www.megedu.com/ 匹配
    http://www.magedu.com/index.html 不匹配

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

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

  • ~* :对URI做正则表达式模式匹配,不区分字符大小写

  • 不带符号 : 匹配起始于此uri的所有的uri

  • 匹配优先级从高到低:
    =, ^~, /*, 不带符号

  1. alias path;
    路径别名,文档映射的另一种机制;仅能用于location上下文
    示例 :
    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/右侧的/

  1. index file …;
    指定默认网页文件,注意:ngx_http_index_module模块

  2. error_page code … [=[response]] uri;
    模块:ngx_http_core_module
    定义错误页,以指定的响应状态码进行响应
    可用位置:http, server, location, if in location
    error_page 404 /404.html
    error_page 404 = 200 /404.html

  3. try_files file … uri;
    try_files file … =code;
    按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误
    location /images/ {
    try_files $uri /images/default.gif;
    }
    location / {
    try_files $uri $uri/index.html $uri.html=404;
    }

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

  1. keepalive_timeout timeout [header_timeout];
    设定保持连接超时时长,0表示禁止长连接,默认为75s

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

  3. keepalive_disable none | browser …
    对哪种浏览器禁用长连接

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

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

  6. client_body_temp_path path [level1] [level2] [level3];
    设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量 目录名为16进制的数字;
    client_body_temp_path /var/tmp/client_body 1 2 2
    1级目录占1位16进制,即2^4=16个目录 0-f
    2级目录占2位16进制,即2^8=256个目录 00 -ff

对客户端进行限制的相关配置

  1. limit_rate rate;
    限制响应给客户端的传输速率,单位是bytes/second
    默认值0表示无限制
  2. limit_except method … {…},仅用于location
    限制客户端使用除了指定的请求方法之外的其他方法
    method: GET, HEAD, POST, PUT, DELETE, MKCOL, COPY, MOVE, OPTIONS, PROPFIND, PROPPATCH, LOCK, UNLOCK, PATCH
    limit_except GET {
    allow 192.168.1.0/24;
    deny all;
    } 除了GET和HEAD之外其他方法仅允许192.168.1.0/24网段主机使用

文件操作优化的配置

  1. aio on | off | threads[=pool];
    是否启用aio功能

  2. directio size | off;
    当文件大于等于给定大小时,列如directio 4m ,同步(直接)写磁盘,而非写缓存

  3. open_file_cache off;
    open_file_cache max = N [inactive=time];
    nginx可以缓存以下三种信息:
    (1)文件元数据:文件的描述符,文件大小和最近一次的修改时间
    (2)打开的目录结构
    (3)没有找到的或者没有权限访问的文件的相关信息
    max=N : 可缓存的缓存项上限;达到上限后会使用LRU算法实现管理
    inactive = time : 缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项,将被删除

  4. open_file_cache_errors on | off;
    是否缓存查找时发生错误的文件一类额信息
    默认值为off

  5. open_file_cache_min_uses number;
    open_file_cache 指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项
    默认值为1

  6. open_file_cache_valid time;
    缓存项有效性的检查频率
    默认值为60s

ngx_http_access_module 模块

实现基于ip的访问控制功能

  1. allow address | CIDR | unix: | all;
  2. deny address | CIDR | unix: | all;
    http, server location, limit, limit_except
    自上而下检查,一旦匹配,将生效,条件严格的置前

示例:
location / {
deny 192.168.1.1; #拒绝
allow 192.168.1.0/24; #允许
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}

ngx_http_auth_basic_module模块

实现基于用户的访问控制,使用basic机制进行用户认证
  1. auth_basic string | off;
  2. auth_basic_user_file file;
    location /admin/ {
    auth_basic “Admin Area”;
    auth_basic_user_file /etc/nginx/.ngxpasswd;
    }
用户口令文件:
  1. 明文文本:格式name:password:comment
  2. 加密文本:由htpasswd命令实现
    httpd-tools 所提供

ngx_http_stub_status_module

  1. ngx_http_stub_status_module模块
    用于输出nginx的基本状态信息
    输出信息示例:
    Active connections: 291
    server accepts handled request
    16630948 16630948 31070465
    上面三个数字分别代表对应accepts,handled,requests三个值
    Reading: 6 Writing:179 Waiting:106

ngx_http_log_module模块

指定日志格式记录请求

  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
  3. open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
    open_log_file_cache off;
    缓存各日志文件相关的元数据信息
    max:缓存的最大文件描述符数量
    min_uses:在inactive指定的时长内访问大于等于此值方可被当做活动项
    inactive:非活动时长
    valid:验证缓存中各缓存项是否为活动项的时间间隔

ngx_http_gzip_module

用gzip方法压缩响应数据,节约带宽
1. gzip on | off;   启用或禁用gzip压缩
2. gzip_comp_level  level;    压缩比由低到高:1到9  默认:1
3. gzip_disable regex ...;   匹配到客户端浏览器不执行压缩
4. gzip_min_length length;  启用压缩功能的响应报文大小阀值
5. gzip_http_version 1.0 |1.1
	设定启用压缩功能时,协议的最小版本   默认:1.1
6. gzip_buffers number size;
	支持实现压缩功能时缓冲区数量及每个缓冲区的大小  默认:32 4k  或 16 8k
7. gzip_types mime-type ...;
	指明仅对哪些类型的资源执行压缩操作;即压缩过滤器
	默认包含有text/html,不用显示指定,否则出错
8. gzip_vary on | off;
	如果启用压缩,是否在响应报文首部插入 “Vary:Accept-Encoding”
9. gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
nginx充当代理服务器时,对于后端服务器的响应报文,在何种条件下启用压缩功能
off: 不启用压缩
expired, no-cache, no-store, private : 对后端服务器的响应报文首部Cache-Control值任何一个,启用压缩功能
示例:
	gzip on;  
	gzip_comp_level 6
	gzip_min_length 64;
	gzip_proxied any;
	gzip_types text/xml text/css application/javascript;
相关标签: nginx 配置