Linux下Nginx web服务器的实现及功能模块指令详解

Nginx (engine x)是一个高性能的HTTP和反向代理服务器,也是一款轻量级的Web 服务器

关于http协议的相关概念:

URL统一资源定位符的形式:

shceme://username:[email protected]:port/path;params?query#frag

http事务:一次请求和一次响应构成一次事务

request请求格式:

        <method><URL><VERSION>
        HEADERS

        <body>

response响应格式:

        <VERSION><STATUS><REASON-PHTASE>
        HEADERS
        <body>

Method请求方法: GET/HEAD/POST,PUT/DELETE,TRACES,OPTIONS

Status code:

        1xx:
        2xx:成功响应码
        3xx:重定向类的响应码
        4xx:客户端错误
        5xx:服务器端错误

Nginx配置文件nginx.conf的结构:

不被花括号所包含的是main block 配置段,也是全局配置段

 event{
 } 与事件驱动相关的配置段
 http{
 } 与http/https相关的配置段
 mail{
 }与邮件代理相关的配置段
 stream{
 }与负载均衡相关的配置段

作为web服务器http的配置段的结构

  http{
      ... 配置各个server的全局配置段
      server{
          listen  80; 监听的端口
          server_name www.example.com
          root  /web/hosts/
          alias 
          location {OPERATOR} URL{
          ... 
              if CONDITION{
              ...
              }
          }
      }每一个server是一个虚拟站点
  }

nginx配置main block段相关指令及含义

指定work进程的运行身份:

    user nginx group;

指明pid文件的存放路径

    pid /var/run/nginx.pid;

包含其他配置文件片段

include file_name|mask;

指明要动态装载的模块

load_module file_name;

错误日志:

    error_log /var/log/nginx/error.log varn;

与系统优化相关的配置:

worker进程能够打开文件描述符的数量上限:

    worker_rlimit_nofile  20;   配置最好与ulimit -n 数值相同,修改文件描述符的数量ulimit -HSn 180000

生成work进程数

    worker_processes 3 | auto;

woker进程的优先级:默认为0

    worker_priority -9;

nginx的worker进程与cpu绑定

 wokrer_cpu_affinity  1000 0100 0010| auto;
     cpu mask所代表的含义:
          1000  : 四核心cpu的最后一个
          0100  : 四核心cpu的倒数第二个
          ...

用于debug使用的配置:

是否以守护进程的方式运行

     daemon on|off;

是否以master/worker模型运行

      master_process  on| off;

指定错误日志路径及级别

 error_log     file warn; 指明错误日志路径及名称时不可引用变量

与events配置相关的配置段:

每个worker进程所能响应的最大并发数

 worker_connetctions  65535;
     一台服务器所能承载的并发响应总数
     worker_processes  * worker_iconnections

指明并发链接请求的处理方法:

 use  epoll;

worker进程接受新请求的方法

 accept_mutex on|off;
     如果为on则worker进程轮流接受新的请求
     如果为off则worker进程都会接收到通知,空闲的接受请求

与站点套接字相关的配置

server{
    listen  address:port default_server  ssl http2 backlog=123 rcvbuf=512 sndbuf=512;
        #default_server:指定为默认虚拟站点
       #ssl : 限制仅能通过ssl间接站点
        #http2: 指明http协议的版本
        #backlog=number: 后援队列长度
        #rcvbuf=接收缓冲区大小
        #sndbuf=发送缓冲区大小
    server_name SERVER_NAME;
        #SERVER_NAME 支持通配符通配;
            #例如*.abc.com
                    #支持~以字符开头的正则表达式
            #例如~^www.*\.abc.com$
        #匹配的优先次序:
            #1.精确匹配
            #2.左侧匹配
            #3.右侧匹配
            #4.正则表达式匹配    
    root  /PATH/DOCUMENT_ROOT; 指明站点的根目录
}

在keepalived模式下的连接是否启用TCP_NODELAY功能

tcp_nodelay  on|off;

是否启用sendfile功能:

sendfile on|off;

在sendfile 模式下是否开启TCP_CORK功能:

tcp_nopush on|off;

路径相关的配置段

指定站点的根目录,用于文件系统与url的映射关系

root path;

匹配URL所映射的系统路径的关系

location [ = | ~ | ~* | ^~ ] url {...}
    在一个server配置段中可以有多个location的配置段
    nginx根据匹配的不同的url将其资源与不同的路径进行映射    
    =  : 对url做精确匹配
        例如:location  =  / {
            ...
        }
    ~  : 对url做正则表达式匹配,区分字符大小写;
    ~* : 对rul正则表达式匹配,不区分大小写;
    ^~ : 对rul左半部分正则表达式匹配,不区分大小写
    无符号: 对此url为开头的所有url的做匹配
        匹配的优先级:
            = , ^~ , ~/~* , 无符号

示例:

    server{
    root  /web/hosts/vhsost1
    location /wcdma {
    root /web/hosts/wcdma/
    index index.html index index.php
        }
    }

定义路径的别名

location /images/ {
alias /web/data/images/;
}

定义站点的默认首页资源:

index file;
     例如: index index.html index.htm index

定义错误的返回页面

error_page 404 =  200 /eror_page   #相对路径

接受多个路径作为参数,当一个资源 无法找到时自动寻找下一个,否则找默认位置

try_files file  ... url;

示例:

           location / {
            try_files index.html index.htm @default;
            }

            location @default {
            root /web/hosts/error;
            index index.html;
            }

与客户端请求相关的配置

配置保持链接的超时时长, 0表示进制长连接模式

keepalive_timeout  75;

单个长连接上所能请求的最大资源数

keepalive_requests 100;

对哪种浏览器禁用长连接模式

keepalive_disable none|browser;

向客户端发送响应报文的超时时长,指两次写操作之间的时间间隔

send_timeout  20;

用于接受客户端请求报文body部分的缓冲区大小,如果超出此大小则将被存储在磁盘上由client_body_temp_path所指定的位置

client_body_buffer_size size;

指定用于存储接受客户端请求报文的body部分的位置

client_body_temp_path /var/tmp/client_body 2 1 1;
        2:第一个数字2表示用2位16进制数个作为1级目录
        1:第二个数字1表示用1位16进制数个作为2级目录
        ...

与客户端限制相关的配置

限制响应给客户端的传输速率,单位为bytes/ second , 0 表示无限制

limit_rate 500;

限制除了指定方法的客户端

    例如: limit_except GET {
        allow 110.11.223.0/24;
        deny all;
    }

文件操作的优化:

是否开启aio机制

   aio on|off | threads [=pool];

是否启用directio机制,在LINUX主机启用O_DIRECT标记,当请求大于设定值时,
直接跳过内核的缓存的进程直接读取硬盘,用于命中率较差或较大文件.

   directio size | off;

是否启用打开文件缓存:

open_file_cache off;
  open_file_cache max=200  inactive=60;

nginx 可以缓存的三种信息:

            1.文件描述符.文件大小,最近一次修改时间;
            2.打开目录的结构
            3.没有找到的或没有权限访问的文件相关信息;
        max=200  缓存项的上限,达到上限则使用LRU算法管理
        inactive=time 缓存项的非活动时长,指定时间内没有被访问的,或命中次数少于open_file_cache_min_uses指令所指定的次数的缓存项

缓存有效性检查频率,时间

       open_file_cache_valid 60;

在open_file_cache inactive所指定的时间内,缓存所访问的次数少于该数的被归类为非活动项

 open_file_cache_min_users 1;

是否缓存查找错误的信息

 open_file_cache_errors  on| off;

ngx_http_access_module模块相关的配置:

   allow ipaddress;
   deny  ipaddress;

ngx_http_auth_basic_module模块

实现基于访问控制,basic认证方式(需要借助hdpasswd生成用户文件)

    auth_basic string|off;
    auth_basic_user_file file_name;

示例:

location /admin/ {
           alias  /web/vhosts/app1/data;
           auth_basic "Admin Area";
           auth_basic_user_file /etc/nginx/.ngxpasswd;
       }
           ~]# htpasswd -c -m /etc/nginx/.ngxpasswd tom

ngx_http_stub_status_module模块配置:

用于输出nginx的基本状态信息:

   Active connections: 活动状态的连接数;
   accepts : 已经接受的客户端的请求总数;
   handled : 已经处理完成的请求总数;
   requests : 客户端发来的总的请求总数;        
   reading : 处于读取客户端请求报文首部的链接总数;
   writing : 处于向客户端发送响应的过程的连接数;
   waiting : 处于等待客户端发出请求的空闲连接数;

示例:

 stub_status;
      location /basic_status {
          stub_status;
      }

ngx_http_log_module日志模块

日志格式:

log_format name string;
       string可以使用nginx核心模块的吃内置变量

   access_log /var/log/nginx/access.log  format buffer=512  gzip=1 flush=time if=condition;
   access_log off;
     buffer=512  定义缓冲区的大小
     flush=time  刷新时间
   open_log_file_cache max=100  inactive=60  min_uses=1 valid=60;
   open_log_file_cache off;
   缓存各日志文件相关的元数据;
       max 缓存的文件描述符的最大个数
       min_uses 在inactive时间内最少被访问的次数
       inactive  非活动时长数;
       valid 验证缓冲项是否为活动项的时间间隔;

ngx_http_gzip_module压缩模块;

传输数据时压缩传输之用

   gzip on|off;

压缩级别:

   gzip_com_level 1;

指明哪些客户端不进行压缩:

   gzip_disable regex...;

指明压缩传输的最小值

   gzip_min_length 60k;

指明压缩传输的缓冲区个数及每个的大小

   gzip_buffers 20 100;

nginx作为代理服务器时,接受到从被代理服务器发送的响应报文后,以何种的条件启用压缩

   gzip_proxied off | expired |no-cache |nostore | private | no_last_modified | no_etag |auth | any ;
       off:对代理的请求不启用
       no-cache,no-store,private:表示从被代理服务器收的响应报首部的Cahce_control的值为三者中的一个时启用压缩;

针对某些类型启用压缩:

   gzip_types mime-type;
   是一种压缩过滤器,仅对该类型的压缩
           示例:
               gzip  on;
               gzip_comp_level 6;
               gzip_min_length 64;
               gzip_proxied  any;
               gzip_types text/xml text/css application/javascript;

ngx_http_ssl_module安全模块:

启用https功能

  ssl on|off;

指定主机使用的ped格式的证书文件

 ssl_certificate file;

指明主机证书与之对应的私钥文件

 ssl_certificate_key file;

指明ssl 协议的版本

  ssl_protols [SSLv2] [SSLv3] TLSv1 TLSv1.1 TLSv2 ;

指明openssl内建的缓存,此缓存为每个worker进程私有以及共享的缓存名大小;

 ssl_session_cache off|none| builtin 500 shared:name:500

指明客户端的链接可以复用ssl session cache中缓存的ssl参数的有效时长

 ssl_session_timeout 60;

示例:

          server{
          listen 443 ssl;
          server_name www.abc.com;
          root /web/vhsts/ssl/;
          ssl on;
          ssl_certificate /etc/nginx/ssl/nginx.crt;
          ssl_certificate_key /nginx/ssl/nginx.key;
  ssl_protocols TLSv1 tlsv1.1 tlsv2 sslv2 sslv3;
         ssl_session_cache shared:sslcache:20m;
          }

ngx_http_rewrite_module模块:

将用户请求的URL基于regex所描述的模式进行检查,匹配到的url将重新替换为新的url;

rewrite regex replacement flag

此模式值得注意的是:如果在同一级别下配置多个rewrite规则, 自上而下逐个匹配,完成匹配之后再次进行新的url继续进行匹配,具有循环的机制

[flag]的标志位用于控制此循环机制;
    last:重写完成后停止对当前URL在当前location中的后续的其他重写机制,而后对新的URL启动新训创业的重写机制;
    break:重写完成后停止对当前URL在当前location中后续的重写操作,直接跳出重写模块
    redirect:重写完成之后临时重定向方式直接返回给客户端,客户端重新请求新的URL不能以http://或https://开头

如果replacement 是以http://或者htts://开头,则替换后的结果会直接以重定向的方返回给客户端

    301:永久重定向
return 返回给客户端状态码
    return code text;
    return code URL;
    return URL;

是否开启重写日志:

return_log on|off;

if (condition) {...}语句,一个新的配置条件满足时,执行配置块中的配置指令:

condition:
    比较操作符:
        ==
        !=
        ~: 模式匹配,区分大小写;
        ~*:模式匹配,不区分大小写;
        !~:模式不匹配, 区分大小写;
        !~:模式不匹配, 不区分字符大小写;
文件及目录存在性判断:
                    -e, !-e
                    -f, !-f
                    -d, !-d
                    -x, !-x

用户自定义变量:

set $variable value;

ngx_http_referer_module 模块:跳转模块配置

定义referer首部的合法可用值;

valid_referers none | blocked | server_names| string ..;
    none: 请求报文首部没有referer首部;
    blocked: 请求报文的referer首部没有值;
    server_name: 参数, 有值做为主机名或主机名模式;
        arbitrary_string: 直接字符串,但可使用*作通配符;
        regular expression:指定的正则表达式模式匹配到的字符串; 要使用~开头,
             例如 : ~.*\.acb\.com;

配置示例:

    valid_referers none block server_names *.abc.com  abc.com ~\.abc\.com;
    if($invalid_referer) {
        return 403;
    }
时间: 2024-10-29 10:45:37

Linux下Nginx web服务器的实现及功能模块指令详解的相关文章

Linux下高并发socket最大连接数所受的各种限制(详解)

1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [[email protected] ~]$ ulimit -n1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中

Linux下FFMPEG--H264--编码&&解码的C实现与相关原理详解

FFMPEG是很强大的一套视频音频处理库,不过,强大的功能一般免不了复杂的实现,或者更加现实地说,"麻烦"的部署和使用流程 关于"FFMPEG怎么部署"这事就放在另一篇文章啦,下面入正题.. 编码encoder模块和解码decoder模块都有init初始化方法和资源free方法 init初始化方法主要是进行ffmpeg所必需的编解码器的初始化和部分功能方法的参数配置,而free资源释放方法则是相应地进行必要的回收 Encoder模块的实现和细节分析 #include

Linux下命令提示符的修改,PS1的个项参数详解

1. 需要解决的问题 1.在linux下虽然很方便,但是当登录多个服务器,或者有时需要去分辨这些问题,这无疑是很大的不方便,假如有一种方法能轻易分辨那就很方便了. 2.没错,就是有这样的方法,那就是修改PS1环境变量,具体参数及用法实验,我们接下来看. 2. 对PS1的分析 2.1 本次操作系统,Ubuntu 2.3 首先我来看看我现在命令行,显示如下: [email protected]64:~$ [email protected]-64:~$ [email protected]-64:~$

Linux下Gcc生成和使用静态库和动态库详解

参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同

【转】Linux下gcc生成和使用静态库和动态库详解

一.基本概念 1.1 什么是库 在Windows平台和Linux平台下都大量存在着库. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者的库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2 库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大. 共享库的代码是在可

Linux下ps -ef和ps aux的区别及格式详解

Linux下显示系统进程的命令ps,最常用的有ps -ef 和ps aux.这两个到底有什么区别呢?两者没太大差别,讨论这个问题,要追溯到Unix系统中的两种风格, System V风格和BSD 风格,ps aux最初用到Unix Style中,而ps -ef被用在System V Style中,两者输出略有不同.现在的大部分Linux系统都是可以同时使用这两种方式的. ps -ef 是用标准的格式显示进程的.其格式如下 其中各列的内容意思如下 UID     //用户ID.但输出的是用户名 P

【转载】linux下文件的复制、移动与删除命令使用详解

[转载]原文链接:https://www.cnblogs.com/qiuhong10/p/7940410.html linux下文件的复制.移动与删除命令为:cp,mv,rm一.文件复制命令cp    命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination)              cp [option] source1 source2 source3 ...  directory    参数说明:    -a:是指archive的意思,也说是指复制

Linux下ps -ef和ps aux的区别及格式详解-转

原文:https://www.linuxidc.com/Linux/2016-07/133515.htm Linux下显示系统进程的命令ps,最常用的有ps -ef 和ps aux.这两个到底有什么区别呢?两者没太大差别,讨论这个问题,要追溯到Unix系统中的两种风格,System V风格和BSD 风格,ps aux最初用到Unix Style中,而ps -ef被用在System V Style中,两者输出略有不同.现在的大部分Linux系统都是可以同时使用这两种方式的. ps -ef 是用标准

命令行CURL教程,可以用来在linux下向web服务器发GET等请求

CURL? 嗯,说来话长了~~~~ 这东西现在已经是苹果机上内置的命令行工具之一了,可见其魅力之一斑 1)二话不说,先从这里开始吧! curl http://www.yahoo.com 回车之后,www.yahoo.com 的html就稀里哗啦地显示在屏幕上了~~~~~ 2)嗯,要想把读过来页面存下来,是不是要这样呢? curl http://www.yahoo.com > page.html 当然可以,但不用这么麻烦的!用curl的内置option就好,存下http的结果,用这个option: