Linux自学笔记——nginx详解


 

 

engineX = Nginx,nginx是一个高性能的http和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。

http协议:html,文本,MIME

       major/minor:text/plain,text/html,image/jpeg

       web资源:URL(scheme://server:port/path/to/source)

       方法:GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS

       http事务:request<-->reponse

              request

                     <method>  <URL>  <version>

                     <HEADERS>

 

                     <body>

              response

                     <version> <status> <reason  phrase>

                     <HEADERS>

 

                     <body>

              Status:

                     1xx:信息类

                     2xx:成功类,200

                     3xx:重定向,301,302,304

                     4xx:客户端类错误,403,401,404

                     5xx:服务端错误,502

页面:多个资源

              请求资源:是入口

                     HREF:80,40

认证:

       基于ip

       基于用户

              Bassic

              Digest

Httpd:MPM

       Prefork,worker,event

C10k问题:

       网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为C10k问题

I/O类型:

       同步和异步:synchronous,asyncrhonous

              关注的是消息通知机制

      

              同步:调用发出不会立即返回,但一旦返回就可以返回最终结果;

异步:调用发出之后,被调用方立即返回消息,但返回的非最终结果;被调用者通过状态、通知机制来通知调用者,或通过回调函数来处理结果;

       阻塞和非阻塞:block,noblock

              关注的是调用等等调用结果(消息、返回值)时的状态

              阻塞:调用结果返回之前,调用者(调用线程)会被挂起;调用者只有在得到结果之后才会返回;

              非阻塞:调用结果返回之前,,调用不会阻塞当前进程;

5种I/O模型:

       blocking   IO :阻塞型

       nonblocking IO:非阻塞型;

       IO multiplexing:复用型;

       Signal driven IO:事件驱动型;

       Asysncrhonous IO:异步

一个read操作:

1)      等数据准备好;

2)      从内核向进程复制数据;

Select()  ,  poll()

水平触发,边缘触发

五种I/O模型过程比较:

      image.png

Nginx的特性:

       模块化设计、较好的扩展性

       高可靠性

              Master  à  worker

       低内存消耗

              10000个keep-alive连接在nginx仅消耗2.5Mb

       支持热部署

              不停机而更新配置文件、更换日志文件、更新服务器程序版本

基本功能:

       静态资源的web服务器,能缓存打开的文件,描述符;

       http,smtp,pop3协议的反向代理服务器,缓存、负载均衡;

       支持fasecgi(fpm)

       模块化,非DSO机制,过滤器zip,SSI及图像大小调整;

       支持SSL

扩展功能:

       基于名称和IP的虚拟主机;

       支持keepalive

       支持平滑升级

       定制访问日志,支持使用日志缓冲区提高日志存储性能

       支持url rewrite

       支持路径别名

       支持基于IP及用户的访问控制

       支持速率限制,支持并发数限制;

Nginx基本架构:

       一个master进程,生成一个或多个worker

       事件驱动:epoll,kqueue,/dev/poll(event ports)

              消息通知:select,poll,rt signals

       支持sendfile,sendfile64

       支持AIO

       支持mmap

Nginx:非阻塞、时间驱动、一个master生成一个或多个worker,每个worker响应n个请求

模块类型:

       核心模块

       Standard http modules

       Optional http modules

       Mail modules

              3rd party modules

Nginx的安装配置:

1.      创建组和用户,并解压缩源码;

    image.png

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

 

# make && make install

    image.png

Note:如果需要调试,定位问题,必须安装时启用--with-debug选项

3.      启动nginx;

    image.png

4.      测试;

    image.png

 

配置文件:

       主配置文件:/etc/nginx/nginx.conf

       Fastcgi的配置文件:/etc/nginx/fastcgi_params   /etc/nginx/uwsgi_params

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

       Directive  value1  [value2…]

       支持使用变量:

              内置变量:由模块引入;

              自定义变量:

                     set  variable  value

              引用变量:$variable

配置文件的组织结构

       main block

       event {

}

http {

  …

}

http配置段:

  http{

server{

      …

      server_name

      root

      alias

      location /url/ {

      }

      …

}

server {

      …

}

              }

       Main配置段:

              类别:

                     正常运行必备的配置;

                     优化性能相关的配置;

                     用于调试、定位问题的配置;

              正常运行必备的配置:

1.      user   USERNAME [GROUPNAMEJ]

指定运行worker进程的用户和组,例如;

user  nginx  nginx

2.      pid  /path/to/pid_file

指定nginx的pid文件;

3.      worker_rlimit_nofile  #

指定一个worker进程所能够打开的最大文件句柄数;

4.      worker_rlimit_sigpending  #

指定每个用户能够发往worker的信号的数量;

              优化性能相关的配置:

1.      worker_processes  #;

worker线程的个数;通常应该为物理cpu核心个数减1;

2.      worker_cpu_affinity  cpumask …

绑定worker进程至指定的cpu上;

       CPUMASK

              0001

              0010

              0100

              1000

       例如:

              Worker_cpu_affinity  00000001  00000010   00000100

3.      timer_resolution   t

计时器解析度:降低此值,可减少gettimeofday()系统调用的次数

4.      worker_priority  nice

指明worker进程的nice值;

-20,19

              事件相关的配置;

1.      accept_mutex  [on|off]

内部调用用户

请求至各worker时用的负载均衡锁;打开时表示能让多个worker轮流地、序列化地与响应新请求;

2.      lock_file  /path/to/lock_file

accept_mutex用到的锁文件的路径;

3.      accept_mutexz-delay  #ms;=

4.      use [epoll|rgsis|select|poll]

定义使用的时间模型;建议让Nginx自动选择;

5.      worker_connections  #

每个worker进程所能够响应的最大并发请求数;

              用于调试、定位问题:

1.      daemon  [off|on]

是否以守护进程方式启动nginx

2.      master_process  on|off

是否以master/worker模型来运行nginx

3.      error_log  /path/to/error_log  level

错误日志文件及其级别;处于调试的目的,可以使用debug级别,但此级别只有在编译nginx时使用  --with-debug选项才有效;

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

配置框架:

       http: {

upstream{

              }

              Server {

                     listen  IP:PORT

                     location  URL {

root“/path/to/somedir”;

}  #类似于httpd中的<location>,用于定义URL与本地文件系统的映射关系;

location  URL {

      if   …   {

           …

      }

}

              }  #每个server类似于httpd中的一个<virtualhost>

              Server {

                     …

              }

       }

   虚拟主机的相关配置:

1.      server {}

定义一个虚拟主机;

示例:

   image.png

浏览器访问:

   image.png

2.      listen

监听的端口

完整格式:listen address[:port]  [default_server]  [ssl]  [spdy]  [proxy_protocol]  [setfib=number]  [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

 

Listen address[:port]  [default_server]  ssl

Backlog=number:指明tcp协议backlog队列的大小。默认为-1,表示不设置;

rcvbuf=size:设定监听句柄的SO_RCVBUF

3.      server_name  name  […]

后可跟多个主机:名称还可以使用正则表达式(~)或通配符;

1)      先做精确匹配:www.claude.com

2)      左侧通配符匹配,例如:*.claude.com;

3)      右侧通配符匹配,例如:www.*;

4)      正则表达式匹配,例如:~^.*\.claude\.com$;

5)      Default_server

示例:server{

server_name     www.claude.com

}

server{

server_name     *.claude.com

}

server{

server_name     www.*

}

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

location @name

功能:允许根据用户请求的URL来匹配定义的各location,匹配到时,次请求将被相应的location块中的配置所处理;

   =:精确匹配检查;

   ~:正则表达式匹配,区分字符大小写;

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

   ^~:URL的前半部分匹配,不检查正则表达式;

匹配优先级:精确匹配(=)、^~、~和~*、由不带符号的URL进行左侧匹配;

示例:

1)      编辑配置文件,将虚拟主机写成如下内容;

    image.png

2)      创建相关文件;

    image.png

3)      浏览器访问测试;

a.       访问http://192.168.19.139:8080/a.txt网址;

    image.png

b.      访问http://192.168.19.139:8080/images/a.txt

    image.png

Note:因为此网址匹配到location中第二个location,所以会到/vhosts/text目录下寻找images/a.txt,所以寻找不到;

5.      root

设置web资源路径映射,用于指明请求的URL所对应的文档的根目录路径;

6.      alias path

用于location配置段,定义路径别名

1)      编辑配置文件;

    image.png

2)      创建相关目录和文件;

    image.png

3)      访问浏览器测试;

    image.png

7.      index file

默认主页面

index  index.html

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

根据http状态码重定向错误页面;

Error_page  404  /404.html

[=code]:以指定的响应码进行响应;省略code表示以新资源的响应码为响应码

9.      基于ip的访问控制

allow  IP/Network;

deny  IP/Network;

1)      编辑配置文件;

    image.png

2)      用ip地址为192.168.19.134主机访问测试;

    image.png

3)      用其他主机访问测试;

    image.png

 

10.  基于用户的访问控制

Basic ,digest

auth_basic  “”;

auth_basic_user_file “/path/to/password_file”

   账号密码文件建议使用htpasswd来创建;

1)      编辑配置文件;

    image.png

2)      创建用户和密码;

    image.png

3)      浏览器访问测试;

    image.png

输入用户名和密码后即可访问;

    image.png

11.  https服务

生成私钥,生成证书请求,并获得证书;

示例:CA主机和nginx主机为同一台主机;

1)      构建私有CA;

    image.png

2)      将nginx主机生成私钥,生成证书请求,并由CA主机签署证书;

    image.png

3)      编辑配置文件;

    image.png

检查配置文件并重载;

    image.png

4)      浏览器测试;

    image.png

导入证书;

    image.png

再次访问,不再有安全提示;

    image.png

12.  stub_status {on |off};

仅能用于location上下文;

location /status {

   stub_status  on;

   allow 192.168.19.0/24;

   deny all;

}

结果示例:

    image.png

Active connections:1  # 当前所有处于打开状态的连接数;

Server accepts handled requests

   2     2     2

1) 已经接受过的连接数;

2) 已经处理过的连接数;

3) 已经处理过的请求数:在“保持连接”模式下,请求数量可能会多于连接数量;

Reading:0 Writing:1 Wating:0

   Reading:正处于接收请求状态的连接数;

   Writing:请求已经接收完成,正处于处理请求或发送响应过程中的连接数;

   Wating:保持连接模式,且处于活动状态的连接数;

13.   url rewrite

rewrite regex replacement flag

例如:

   …

   Rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;

   Rewrite ^/imgs/(.*\.jpg)$ /images/$1 break;

   …

 

flag

last:一旦此rewrite负责重写完成后,就不再被后面其他的rewrite规则进行处理;而是由user agent重新对重写后的url再一次发起请求,并从头开始执行类似的过程;

break:一旦此rewrite规则重写完成后,由user agent对新的url重庆发起请求,且不再会被当前的location内的任何rewrite规则所检查;

redirect:以302响应码(临时重定向)返回新的url;

permanent:以301响应码(永久重定向)返回新的url;

            示例:

1)      编辑配置文件;

    image.png

2)      创建相关目录文件;

    image.png

3)      浏览器访问测试;

访问网址http://192.168.19.139:8080/images/a.txt

    image.png

访问网址http://192.168.19.139:8080/imgs/a.txt

    image.png

可以看出,访问上面的网址,被自动重写,变成了访问下面的网址;

14.  If

语法:if (condition){…}

应用环境:server,location

condition

1)      变量名:

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

2)      以变量为操作数构成的比较表达式

可使用=,!=类似的比较操作符进行测试;

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

~:区分大小写的模式匹配检查

~*:不区分大小写的模式匹配检查;

!~和!~*:对上面的两种测试取反

4)      测试路径为文件可能性:-f,!-f

5)      测试指定路径为目录可能性:-d,!-d

6)      测试文件的存在性;-e,!-e

7)      检查文件是否有执行权限:-x,!-x

例如:

   If($http_user_agent ~* MSIE){

          Rewrite  ^(.*)$  /msie/$1  break;

   }

15.  防盗链

location ~*  \.(jpg|gif|jpeg|png)$  {

   valid_referer none blocked  www.claude.com;

   if ($valid_referer) {

          rewrite ^/ http://www.claude.com/403.html;

   }

}

16.  定制日志访问格式

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                     '"$http_user_agent" "$http_x_forwarded_for"';

access_log  logs/access.log  main;

note:此处可用变量为nginx的內建变量;

    image.png

 

http核心模块的内置变量:

   $uri:当前请求的uri,不带参数;

   $request_uri:请求的uri,带参数;

   $host:http请求报文中的host首部;如果请求中没有host首部,则以处理此请求的虚拟主机的主机名代替;

   $hostname:nginx服务运行在的主机的主机名;

   $remote_addr:客户端ip

   $remote_port:客户端port

   $remote_user:使用用户认证时客户端用户输入的用户名;

   $request_filename:用户请求中的URI经过本地root或alias转换后映射的本地的文件路径;

   $request_method:请求方法

   $server_addr:服务器地址

   $server_name:服务器名称

   $server_port:服务器端口

   $server_protocol:服务器向客户端发送响应时的协议,如http/1.1,http/1.0

   $scheme:在请求中使用scheme,如https://www.claude.com/中的https

   $http_HEADER:匹配请求报文中指定的HEADER,$http_host匹配请求报文中的host首部

$sent_http_HEADER:匹配响应报文中指定的HEADER,例如$http_content_type匹配响应报文中的centent-type首部;

$document_root:当前请求映射到的root配置;

网络连接相关的配置:

1.      keepalive_timeout  time

保持连接的超时时长,默认为75s

2.      keepalive——requests  #;

在一次保持连接上允许承载最大资源请求数;

3.      keepalive_disable  [msie6|safari|none]

为指定类型的浏览器禁用长连接;

4.      tcp_nodelay   on|off

对长连接是否使用tcp_nodelay选项;

5.      client_header_timeout  time;

读取http请求报文首部的超时时长;

6.      client_body_timeout  time

读取http请求报文body部分的超时时长;

7.      send_timeout  time

发送响应报文的超时时长;

对客户端请求进行限制:

1.      limit_except  METHOD  {…}

指定对范围之外的其它方法的访问控制;

limit_except   GET{

allow  192.168.19.0/24

deny all

}

2.      client_body_max_size  SIZE

限制请求报文中body部分的上限;通过检测请求报文首部中的“content_length”来判定;

3.      limit_rate  speed

限制客户端每秒钟传输的字节数,默认为0,表示无限制;

文件操作优化相关的配置:

1.      sendfile  on|off

2.      aio  on|off

3.      direction  size|off

4.      open_file_cache   max=N[inactive=time] | off

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

1)      文件句柄、文件大小和最近一次的修改时间;

2)      打开目录的目录结构;

3)      没有找到的或者没有权限操作的文件的相关信息;

max=N表示可缓存的最大条目上限:一旦到达上限,则会使用LRU从缓存中删除最近最少使用的条目;

inactive=time:在inactive指定的时长内没有被访问过的缓存条目就会淘汰;

5.      Open_file_cache_errors  on|off

是否缓存在文件缓存中缓存打开文件时出现找不到路径,没有权限等的错误信息;

6.      Open_file_cachez_min_users  time

每隔多久检查一次缓存中缓存条目的有效性:默认为60s;                            

重点关注:server{}, location{}, listen, server_name, root, alias, keepalive_timeout, keepalive_requests, error_page

相关文章
相关标签/搜索