20190426 Nginx详解--知其然必知其所以然1

目录

参考链接:http://nginx.org/en/(官网)

参考链接:http://www.nginx.cn/doc/(中文) 

 

知其然必知其所以然,个人喜欢第二种的排版,哈哈。

1.Nginx功能概述(是什么?)

__IMAP/POP3 代理服务功能:__

使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;

__支持的操作系统:__

__结构与扩展:__

__其他HTTP功能:__

__实验特性:__

 

2.为什么选择nginx?(作用--基础了解)

3.安装?(实际操作)

参考链接:http://www.nginx.cn/install

4.nginx启动,停止,重启命令(重要)

sudo / usr / local / nginx / nginx     (nginx二进制文件绝对路径,可以根据自己安装路径实际决定) 

nginx的从容停止命令,等所有请求结束后关闭服务

ps -ef | grep nginx

kill -QUIT nginx主进程号

ps -ef | grep nginx

kill -TERM nginx主进程号 

kill -9 nginx主进程号

nginx的重启命令

使用信号加载新的配置

平滑升级到新的二进制代码

5.配置符号参考(了解)

6.优化 Nginx(了解)

事件模型

7.常见问题(FAQ)(了解)

某些东东不工作 (URL重写, 代理, 路径, ...)

有没有其它类似的Web服务器

对于chroot的支持是否在计划之中?

在什么情况下使用Nginx比使用squid要好? 反之亦然。

怎么让Nginx成为以postfix做为后端的SMTP代理?

Nginx使用什么算法来实现负载均衡? 它能实现基于连接数的负载均衡吗?

> 我能关闭从代理服务器到后端服务器的缓存吗或者使用上传进度特性?

8.调试nginx(了解)


参考链接:http://nginx.org/en/(官网)

参考链接:http://www.nginx.cn/doc/(中文) 

 

知其然必知其所以然,个人喜欢第二种的排版,哈哈。

1.Nginx功能概述(是什么?)

_HTTP基础功能:__

  • 处理静态文件,索引文件以及自动索引;

  • 反向代理加速(无缓存),简单的负载均衡和容错;
  • FastCGI,简单的负载均衡和容错;
  • 模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;
  • SSL 和 TLS SNI 支持;

__IMAP/POP3 代理服务功能:__

  • 使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;

  • 使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端;
  • 认证方法:
  • POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;
  • IMAP: IMAP LOGIN;
  • SMTP: AUTH LOGIN PLAIN CRAM-MD5;
  • SSL 支持;
  • 在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;

__支持的操作系统:__

  • FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;

  • Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;

  • Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;
  • MacOS X (10.4) PPC;

__结构与扩展:__

  • 一个主进程和多个工作进程。工作进程是单线程的,且不需要特殊授权即可运行;

  • kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支持;

  • kqueue支持的不同功能包括 EV_CLEAR, EV_DISABLE (临时禁止事件), NOTE_LOWAT, EV_EOF, 有效数据的数目,错误代码;
  • sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持;
  • 输入过滤 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;
  • 10,000 非活动的 HTTP keep-alive 连接仅需要 2.5M 内存。
  • 最小化的数据拷贝操作;

__其他HTTP功能:__

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

  • Memcached 的 GET 接口;

  • 支持 keep-alive 和管道连接;
  • 灵活简单的配置;
  • 重新配置和在线升级而无须中断客户的工作进程;
  • 可定制的访问日志,日志写入缓存,以及快捷的日志回卷;
  • 4xx-5xx 错误代码重定向;
  • 基于 PCRE 的 rewrite 重写模块;
  • 基于客户端 IP 地址和 HTTP 基本认证的访问控制;
  • PUT, DELETE, 和 MKCOL 方法;
  • 支持 FLV (Flash 视频);
  • 带宽限制;

__实验特性:__

  • 内嵌的perl
  • 通过aio_read() / aio_write()的套接字工作的实验模块,仅在 FreeBSD 下。
  • 对线程的实验化支持,FreeBSD 4.x 的实现基于 rfork()

 

2.为什么选择nginx?(作用--基础了解)

参考链接:http://www.nginx.cn/nginxchswhyuseit

Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:

作为 Web 服务器

相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.

作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级

3.安装?(实际操作)

参考链接:http://www.nginx.cn/install

具体安装,可百度最新安装方法。

4.nginx命令

参考:http://www.nginx.cn/nginxchscommandline

nginx的命令行参数(了解)

不像许多其他软件系统,Nginx仅有几个命令行参数,完全通过配置文件来配置

-c </ path / to / config> 为Nginx指定一个配置文件,来代替缺省的。

-t不运行,而仅仅仅测试配置文件.nginx将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。

-v显示nginx的版本。

-V显示nginx的版本,编译器版本和配置参数

nginx的控制信号

可以使用信号系统来控制主进程。默认,nginx将其主进程的pid写入到/usr/local/nginx/nginx.pid文件中

通过传递参数给./configure或使用pid指令,来改变该文件的位置

主进程可以处理以下的信号:

TERM,INT快速关闭
放弃从容关闭
HUP配置重载
用新的配置开始新的工作进程
从容关闭旧的工作进程
USR1重新打开日志文件
USR2平滑升级可执行程序。
绞车从容关闭工作进程

尽管你不必自己操作工作进程,但是,它们也支持一些信号:

TERM,INT快速关闭
放弃从容关闭
USR1重新打开日志文件

4.nginx启动,停止,重启命令(重要)

nginx的启动

sudo / usr / local / nginx / nginx     (nginx二进制文件绝对路径,可以根据自己安装路径实际决定) 

nginx的从容停止命令,等所有请求结束后关闭服务

ps -ef | grep nginx

kill -QUIT nginx主进程号

nginx快速停止命令,立刻关闭nginx进程

ps -ef | grep nginx

kill -TERM nginx主进程号 

如果以上命令不管用,可以强制停止

kill -9 nginx主进程号

如果嫌麻烦可以不用查看进程号,直接使用命令进行操作
其中/usr/local/nginx/nginx.pid为nginx.conf中pid命令设置的参数,用来存放nginx主进程号的文件

kill - 信号类型( HUP服务|服务条款| QUIT)cat /usr/local/nginx/nginx.pid 
例如

1

kill -QUIT `cat /usr/local/nginx/nginx.pid`

nginx的重启命令

nginx的重启可以分成几种类型

1.简单型,先关闭进程,修改你的配置后,重启进程
.kill -QUIT cat /usr/local/nginx/nginx.pid
sudo / usr / local / nginx / nginx
2. 重新加载配置文件,不重启进程,不会停止处理请求
3. 平滑更新nginx的二进制,不会停止处理请求

使用信号加载新的配置

Nginx支持几个信号,能在它运行时控制其操作。其中最普通的是15,用来中止运行的进程:

1

2

3

4

# <strong>ps aux | egrep '(PID|nginx)'</strong>

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root      2213  0.0  0.0   6784  2036 ?        Ss   03:01   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

# <strong>kill -15 2213</strong>

而最有趣的是能平滑改变nginx配置的选项(请注意,在重载前,要先测试一下配置文件):

1

2

3

4

5

6

7

#<strong> nginx -t -c /etc/nginx/nginx.conf</strong>

2006/09/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf syntax is ok

2006/09/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf was tested successfully

#<strong> ps aux | egrep '(PID|nginx)'</strong>

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root      2213  0.0  0.0   6784  2036 ?        Ss   03:01   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

<strong># kill -HUP 2213</strong>

当nginx接收到HUP信号,它会尝试先解析配置文件(如果指定配置文件,就使用指定的,否则使用默认的),

成功的话,就应用新的配置文件(例如:重新打开日志文件或监听的套接字)。

之后,nginx运行新的工作进程并从容关闭旧的工作进程。

通知工作进程关闭监听套接字但是继续为当前连接的客户提供服务。

所有客户端的服务完成后,旧的工作进程被关闭。如果新的配置文件应用失败,nginx将继续使用旧的配置进行工作。

平滑升级到新的二进制代码

你可以在不中断服务的情况下 - 新的请求也不会丢失,使用新的nginx可执行程序替换旧的(当升级新版本或添加/删除服务器模块时)。

首先,使用新的可执行程序替换旧的(最好做好备份),然后,发送USR2(kill -USR2 pid)信号给主进程。主进程将重命名它的.pid文件为.oldbin比如/usr/local/nginx/logs/nginx.pid.oldbin),然后执行新的可执行程序,依次启动新的主进程和新的工作进程:

1

2

3

4

5

6

7

8

9

  PID  PPID USER    %CPU   VSZ WCHAN  COMMAND

33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx

33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)

33135 33126 nobody   0.0  1380 kqread nginx: worker process (nginx)

33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)

36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx

36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

在这时,两个nginx实例会同时运行,一起处理输入的请求。要逐步停止旧的实例,你必须发送WINCH信号给旧的主进程,然后,它的工作进程就将开始从容关闭:

1

2

3

4

5

6

7

  PID  PPID USER    %CPU   VSZ WCHAN  COMMAND

33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx

33135 33126 nobody   0.0  1380 kqread nginx: worker process is shutting down (nginx)

36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx

36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

一段时间后,旧的工作进程处理了所有已连接的请求后退出,就仅由新的工作进程来处理输入的请求了:

1

2

3

4

5

6

  PID  PPID USER    %CPU   VSZ WCHAN  COMMAND

33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx

36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx

36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

这时,因为旧的服务器还尚未关闭它监听的套接字,所以,通过下面的几步,你仍可以恢复旧的服务器:

  • 发送HUP信号给旧的主进程 - 它将在不重载配置文件的情况下启动它的工作进程
  • 发送QUIT信号给新的主进程,要求其从容关闭其工作进程
  • 发送TERM信号给新的主进程,迫使其退出
  • 如果因为某些原因新的工作进程不能退出,向其发送KILL信号

新的主进程退出后,旧的主进程会由移除.oldbin前缀,恢复为它的.pid文件,这样,一切就都恢复到升级之前了。

如果尝试升级成功,而你也希望保留新的服务器时,发送QUIT信号给旧的主进程使其退出而只留下新的服务器运行:

1

2

3

4

5

      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND

    36264     1 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx

    36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

    36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

    36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

5.配置符号参考(了解)


容量符号缩写

K,K千字节
M,M兆字节

例如,“8k”,“1m”代表字节数计量。

时间符号缩写

女士毫秒
小号
分钟
H小时
d
w ^
中号一个月,30天
ÿ年,365天

例如,“1h 30m”,“1y 6M”。代表“1小时30分”,“1年零6个月”。

6.优化 Nginx(了解)

Ngnix使用hash表来协助完成请求的快速处理。

考虑到保存键及其值的hash表存储单元的大小不至于超出设定参数(hash bucket size),

在启动和每次重新配置时,Nginx为hash表选择尽可能小的尺寸。

直到hash表超过参数(hash max size)的大小才重新进行选择. 对于大多数hash表都有指令来修改这些参数。

例如,保存服务器名字的hash表是由指令server_names_hash_max_sizeserver_names_hash_bucket_size所控制的。

参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。

在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。

如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。

第一次是确定存储单元的地址,第二次是在存储单元中查找键值。

因此,如果Nginx给出需要增大 hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.

事件模型

Nginx支持如下处理连接的方法(I/O复用方法),这些方法可以通过use指令指定。

  • select - 标准方法。 如果当前平台没有更有效的方法,它是编译时默认的方法。你可以使用配置参数--with-select_module--without-select_module来启用或禁用这个模块。
  • poll - 标准方法。 如果当前平台没有更有效的方法,它是编译时默认的方法。你可以使用配置参数--with-poll_module--without-poll_module来启用或禁用这个模块。
  • kqueue - 高效的方法,使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
  • epoll - 高效的方法,使用于Linux内核2.6版本及以后的系统。在某些发行版本中,如SuSE 8.2, 有让2.4版本的内核支持epoll的补丁。
  • rtsig - 可执行的实时信号,使用于Linux内核版本2.2.19以后的系统。默认情况下整个系统中不能出现大于1024个POSIX实时(排队)信号。这种情况对于高负载的服务器来说是低效的;所以有必要通过调节内核参数/proc/sys/kernel/rtsig-max来增加队列的大小。可是从Linux内核版本2.6.6-mm2开始, 这个参数就不再使用了,并且对于每个进程有一个独立的信号队列,这个队列的大小可以用 RLIMIT_SIGPENDING 参数调节。当这个队列过于拥塞,nginx就放弃它并且开始使用poll方法来处理连接直到恢复正常。
  • /dev/poll - 高效的方法,使用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+.
  • eventport - 高效的方法,使用于 Solaris 10. 为了防止出现内核崩溃的问题, 有必要安装 这个 安全补丁。

    7.常见问题(FAQ)(了解)

  • [#notwork 某些东东不工作 (URL重写, 代理, 路径, ...)]
  • [#other 有没有其它类似的Web服务器]
  • [#chroot 对于chroot的支持是否在计划之中?]
  • [#usecase 在什么情况下使用Nginx比使用squid要好?]
  • [#imapexample 有没有人能给出一个完整的.conf配置文件来详细的解读一下怎么配置和测试 IMAP 模块, 而不只是关于 IMAP 的只言片语啊?]
  • [#smtpexample 怎么让Nginx成为以postfix做为后端的SMTP代理?]
  • [#loadbalancing Nginx使用什么算法来实现负载均衡? 它能实现基于连接数的负载均衡吗?]
  • [#proxy_buffering 我能关闭从代理服务器到后端服务器的缓存吗或者使用上传进度特性?]
  • 某些东东不工作 (URL重写, 代理, 路径, ...)

    例如: 如URL重写(rewrite)不工作了或者是unix的路径(/$PATH)的问题云云...

    请仔细阅读 [NginxDebugging] 并且 逐行 查看错误日志。
    如果你没找到错误 打起精神 试着到IRC或邮件列表里说明一下你碰到的问题。

    有没有其它类似的Web服务器

  • Cherokee
  • Lighttpd (Lighty)
  • thttpd
  • 关于各自的优缺点请使用自己喜欢的搜索引挚查找  ;-)

    对于chroot的支持是否在计划之中?

    有人知道吗?

    在什么情况下使用Nginx比使用squid要好? 反之亦然。

    大体上来说nginx主要用于反向加速代理而不是像squid那样做为常规代理服务器。Nginx的最大优势在于高负载情况下内存和CPU的低消耗。 我不认为squid能给你带来比nginx更好的性能。

    怎么让Nginx成为以postfix做为后端的SMTP代理?

    有人知道不?

    Nginx使用什么算法来实现负载均衡? 它能实现基于连接数的负载均衡吗?

    目前Nginx使用简单的轮巡算法,所以无法做基本链接计数的负载均衡。 这个可能会在将来的版本中有所改变。

    > 我能关闭从代理服务器到后端服务器的缓存吗或者使用上传进度特性?

    基于 太多人询问下面的问题:

  • 我能为了得到上传进度而关闭代理的缓存吗
  • 使用nginx我怎么才能给用户显示上传进度
  • ...
  • 到目前为止 (2007-Apr-26) 还没有办法关闭到后端服务器的缓存.

    8.调试nginx(了解)

    Nginx的一个杀手级特性就是你能使用debug_connection指令只调试某些连接。

    这个设置只有是你使用--with调试编译的nginx的才有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值