购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第1章
Nginx高效服务器

Nginx是一款轻量级的Web服务器,特点是高性能、高并发。它由俄罗斯程序设计师Igor Sysoev开发,供俄国大型入口网站及搜索引擎Rambler使用。Nginx在BSD-like协议下发行,是一款高性能Web服务器,目前在Web服务器中排名第二。虽然Apache还是全球Web服务器的“老大”,但是Nginx已经占到了Wed服务器市场22%以上的份额,是成长最快的Web服务器。Nginx使用了大量的高并发和低内存占用技术,并使用了高可靠性技术,拥有高过Apache一个数量级以上的接入能力。因为并发能力强的特点,Nginx在中国的互联网公司中得到了大量应用,中国的大型互联网公司无一不使用了Nginx,以应对中国众多的网民,以及各种抢购热潮(如“双十一”)、世界杯等热点事件。Nginx在这种大量的流量涌入、需要分流、导流、反向代理的场合下得到大量应用。

1.1 Nginx的特点

与其他Web服务器相比,Nginx具有以下显著特点。

1. 速度更快

Nginx使用了预读、连接池、内存池等技术,使得单次HTTP请求速度更快。同时,因为其整体的多进程架构以及轻任务思想,在更多连接的情况下(以万为单位的并发情况下),Nginx比其他Web服务器速度更快。

2. 扩展性好

Nginx的结构是“核心+模块”的结构,Nginx本身就是一个基于Epoll或Kqueue的事件处理和分发架构,管理HTTP主流程,其他功能都可以通过模块实现。模块专注于自身功能实现,可以更稳定,模块的升级和修复不影响其他功能以及核心本身。模块可以不断添加或升级,如事件(event)模块、代理模块、过滤模块、请求地址获取模块、地址转换模块、应答处理模块、日志模块等。Nginx提供了众多的模块以供选择,可以配置出不同行为的Web服务器。

Nginx提供了C级别的模块开发机制,但C级别的开发需要遵从复杂的数据结构。现在可以通过ngx_lua模块以Lua脚本实现业务逻辑。得益于Lua协程的支持,ngx_lua在万级并发请求时只占用很少的内存,而性能都是万级(Operation Per Second,每秒操作次数),这使得Nginx的扩展性更好。

3. 高可靠性

得益于整体架构的优秀以及模块设计的简单性,Nginx拥有极高的可靠性,在各大型网站中得到了认可。Nginx核心由一个任务很轻的管理进程(master进程)和若干工作进程(worker进程)组成。具体的HTTP请求在工作进程内负载均衡,如果某个工作进程异常终止了,管理进程会迅速重启一个新的工作进程接替该进程。

4. 低内存占用

一般情况下,10000个非活跃的HTTP保活连接仅占用2.5MB内存。而ngx_lua每扩展10000个连接也仅占2.xMB内存,使得Nginx可以大量部署。

5. 高并发能力

一般Nginx是部署在万级以上的场合下。为了应付海量的请求,各网站都需要单机能处理峰值10万以上并发请求的Web服务器。理论上,Nginx处理能力的上限仅受内存限制,简单的业务场景下Nginx还可以提供更高的处理能力。

Nginx全异步、非阻塞I/O的思想贯穿在核心、模块以及ngx_lua模块中,无论是自己实现的模块,还是通过Lua实现的脚本代码,都是非阻塞地高速运行。

6. 热部署

因为Nginx的管理进程和工作进程是分开设计的,所以可以实现热部署功能,即能在系统不间断的情况下升级可执行程序、更新配置文件、更新日志文件等。

7. 开源

Nginx遵守相对自由的BSD协议。用户可以自由使用Nginx,还可以自由修改和使用Nginx的源码。用户可以在节省大量时间和成本的情况下,得到一个高性能的服务器框架。

1.2 Nginx的安装

Nginx有预编译版本、源码,因为我们进行的是Nginx配套的开发工作,考虑到功能、性能等原因,源码安装方法更适合本书读者,故这里主要介绍源码安装方法。

另外,有一个OpenResty项目将Nginx整合进Lua、LuaJIT和其他配合组件,形成一个多功能的开发型Web服务器套件,因为我们学习Lua开发,所以推荐使用OpenResty,本章介绍的Nginx安装方法可供读者自定义系统时参考。

因为典型的互联网应用基本安装在Linux上,所以,本文中的安装和编译均以Linux为例,系统为CentOS,用其他Linux发布包将对应工具换下即可。

1. 下载Nginx源文件

安装文件与源码可以从Nginx官网下载,地址为 http://nginx.org/en/download.html

我们需要下载源码,本书以1.10.0版本为例。

下载:

wget http://nginx.org/download/nginx-1.10.0.tar.gz

解压:

tar -zxvf nginx-1.10.0.tar.gz
2. 检查安装依赖项

要使用Nginx常用功能,首先需要确保操作系统上至少安装如下软件。

1)GCC(GNU Compiler Collection):用来编译C语言程序。在使用源码方式安装Nginx时,需要使用GCC编译Nginx及后面要用到的模块源码。

2)PCRE(Perl Compatible Regular Expressions,Perl兼容正则表达式):由Philip Hazel开发的函数库,目前为很多软件使用,支持正则表达式,由RegEx发展而来。ngx_lua中的ngx.re.*系列API需要使用PCRE库。如果在nginx.conf中使用了正则表达式,那么编译Nginx时就必须把PCRE库编译进Nginx,Nginx中的HTTP模块要靠它解析正则表达式。通常情况下都会用到正则表达式。

3)Zlib库:用于对HTTP报文内容做gzip格式压缩,如果在nginx.conf中配置了gzip on,并指定某些Content-Type的HTTP应答包体使用gzip进行压缩,以减小网络传输量,那么就需要在编译Nginx时指定zlib,将其编译进Nginx。

4)OpenSSL库:使用HTTPS在SSL上传输HTTP,就需要安装OpenSSL。另外,在ngx_lua中使用MD5、SHA1等散列函数时,也需要安装OpenSSL。

Nginx的特点是高性能和定制灵活,实现多功能的Web服务,所以各种模块可以根据需求组合。这些模块可能使用到其他支撑的基础库,因此需要保证这些库的正确安装,上面列出的4个库就是基础库,如果用到了其他库,也需要首先安装,具体需求参见模块的相关文档和手册。

在Nginx上安装工具的方法很多,我们可以使用yum安装,相对比较简单,命令如下:

yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

也可以分步骤安装,命令如下:

yum install –y gcc
yum install –y gcc-c++
yum install –y pcre pcre-devel
yum install –y openssl openssl-devel
3. Linux内核参数优化

默认的Linux内核参数适合于通用的场景。Linux的特点是可以根据不同的应用场景调整内核参数以及安装的包和工具,使之成为专用的服务器。通常Linux用作各种服务器更为合适,作为高性能的Web服务器的基础服务是比较典型的应用。

当Nginx作为静态Web服务器、反向代理服务器等不同服务器时,所需的内核参数是不同的,本文针对通常的多并发Nginx应用,给出内核参数修改样表。

修改/etc/sysctl.conf,常用配置如下:

fs.file-max = 999999
net.core.netdev_max_backlog = 8096
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 61000
net.ipv4.tcp_rmem = 4096 32768 262142
net.ipv4.tcp_wmen = 4096 32768 262142
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024

执行sysctl–p命令,使修改生效。

各内核参数的作用如下。

1)fs.file-max:表示进程(在Nginx里指一个工作进程)可以同时打开的最大句柄数。本参数影响最大并发连接数。

2)net.ipv4.tcp_syncookies:解决TCP的SYN攻击。

3)net.ipv4.tcp_tw_reuse:参数为1时表示允许将TIME_WAIT状态的套接字重新用于新的TCP连接。服务器上的TCP协议栈在工作时会有大量的TIME_WAIT状态连接,重新使用这些连接对于服务器处理大并发连接非常有用。

4)net.ipv4.tcp_keepalive_time:表示当keepalive启用时,TCP发送keepalive消息的频率。默认为2小时,如果本值变小,可以更快地清理无效的连接。

5)net.ipv4.tcp_fine_timeout:表示服务器主动关闭连接时,套接字的FIN_WAIT-2状态最大时间。

6)net.ipv4.tcp_max_tw_buckets:表示操作系统允许的TIME_WAIT套接字数量的最大值。当超过这个值,TIME_WAIT状态的套接字被立即清除并输出警告消息,默认值为180000,过多的TIME_WAIT套接字会使服务器速度变慢。

7)net.ipv4.tcp_max_syn_backlog:表示TCP三次握手阶段SYN请求队列最大值,默认为1024。调置为更大的值可以使Nginx在非常繁忙的情况下,若来不及接收新的连接时,Linux不至于丢失客户端新创建的连接请求。

8)net.ipv4.ip_local_port_range:定义UDP和TCP连接中本地端口范围(不包括连接到远端的端口)。

9)net.ipv4.tcp_rmen:定义TCP接收缓存(TCP接收窗口)的最小值、默认值、最大值。

10)net.ipv4.tcp_wmen:定义TCP发送缓存(TCP发送窗口)的最小值、默认值、最大值。

11)net.core.netdev_max_backlog:当网卡接收报文速度大于内核处理速度时,本参数设置这个缓冲队列最大值。

12)net.core.rmem_default:表示内核套接字接收缓冲区默认值。

13)net.core.wmem_default:表示内核套接字发送缓冲区默认值。

14)net.core.rmem_max:表示内核套接字接收缓冲区最大值。

15)net.core.wmem_max:表示内核套接字发送缓冲区最大值。

4. 配置安装选项

通常Nginx安装在/opt或/usr/local目录下。其他配置选项根据需要选择,具体意义和使用方法参见1.3节中各个配置项分类表格,或使用./configuration–help命令查看。对于具体的ngx_lua API使用中所需要的参数,也可以在API章节查看API描述。

配置命令如下:

./configure  –prefix=/opt/nginx –sbin-path=/opt/nginx/sbin/nginx
5. 编译与安装

命令如下:

make
make install

未在./configuration中指定目录的情况下,Nginx默认会安装到/usr/local/nginx目录下。安装后的Nginx可以通过复制创建新实例,以方便调试和开发。

6. 启动、停止、重启

启动命令如下:

/opt/nginx/sbin/nginx –p /opt/nginx/

如果在编译的时候通过--prefix和--sbin-path指定了目录,可以直接使用Nginx启动。

-p指定Nginx的目录。因为同一台服务器可以运行多个Nginx实例,所以需要指定当前实例的目录。这个参数将影响很多ngx_lua API中文件参数的检索。通常将配置文件等均放在指定目录下面。

多个Nginx实例可以编译不同的参数和模块,以实现不同的应用。

在本机浏览器中输入 http://127.0.0.1 或在其他机器上输入Nginx所在服务器IP,如果看到了“Welcome to nginx”页面,表示nginx启动成功。

停止命令如下:

/opt/nginx/sbin/nginx –p /opt/nginx –s stop

如果编译时指定了Nginx的工作目录,可以直接使用nginx–s stop启动。

重启(重新载入配置文件)命令如下:

/opt/nginx/sbin/nginx –p /opt/nginx –s reload

如果编译时指定了目录,可以直接使用nginx–s reload重启。

1.3 configure命令参数

使用configure命令参数可以在新编译的Nginx程序里打包指定的模块,或去除指定的模块,这样可以自定义Nginx功能,同时可以减少内存占用。下面介绍常用的configure命令参数。

1. 编译参数

编译器相关参数如表1-1所示。

表1-1 编译器相关参数

2. 路径参数

configures支持的路径参数如表1-2所示。

表1-2 configure支持的路径参数

3. 依赖参数

依赖参数如表1-3所示。

表1-3 依赖参数

4. 模块参数

Nginx的架构分为核心代码(Nginx core)和功能模块(module),以模块形式实现灵活而强大的功能。模块根据需求灵活使用,需要在configure阶段把需要用到的模块加载到Nginx中来。

Nginx的模块大致可以分为核心事件(event)模块、默认会编译进Nginx的HTTP模块、默认不会编译进Nginx的HTTP模块和其他模块。

Nginx的核心事件模块相关参数如表1-4所示。

表1-4 Nginx的核心事件模块相关参数

默认会编译进Nginx的HTTP模块如表1-5所示。

表1-5 默认会编译进Nginx的HTTP模块

默认不会编译进Nginx的HTTP模块如表1-6所示。

表1-6 默认不会编译进Nginx中的HTTP模块

其他Configure参数如表1-7所示。

表1-7 其他configure参数

1.4 小结

本章介绍了Nginx服务器的特点、以源码方式编译和安装Nginx的方法、Nginx常用操作,并分类别介绍了configure命令参数。 eF4XxgCLySF9Trn5lYPXaGogOTZh23BWKpgOZVu5P5rBjvjt4kgLQiKT6K404gy+

点击中间区域
呼出菜单
上一章
目录
下一章
×