Nginx专题(1) - Nginx简介、安装与运行控制
本文最后更新于 2021年4月15日 下午
Nginx简介
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server. NGINX is known for its high performance, stability, rich feature set, simple configuration, and low resource consumption.
Nginx,是 engine X 的缩写,发音也是’engine x’,2004 年由俄罗斯大神伊戈尔 · 赛索耶夫开发,提供了高性能而易用的 HTTP 反向代理功能。后期还加入了 TCP 的反向代理支持。
文档与网站
维基:Wikipedia
Nginx官网:http://nginx.org
Nginx Plus (商用付费版,快速专业的技术支持):https://www.nginx.com
同时nginx.com的许多文档也是可以拿来参考的。
中文文档: https://www.nginx.cn/doc/
据我初步观察,https://www.nginx.org.cn 这个中文社区也比较活跃,可以参考。
以上网站与本人均无利益相关。
简单安装
如果你像我一样,只是想把自己的博客部署到云服务器上,实现一个非常简单的站点,那么推荐你使用这种简易安装方式。
nginx.com上给出了安装开源版Ngxin的教程,简单来说,CentOS、Debian或者Ubuntu等都可以直接通过yum/apt 安装编译好的包来实现一建安装。此外还可以通过docker来运行Nginx。
对于Ubuntu Server 20.04:
1 |
|
这样默认安装路径在 /etc/nginx/
,稍加配置便可开始使用了。
编译安装
下载Nginx源码并在自己的机器上编译安装是更灵活可定制的做法。
准备工作
确保机器的内核为Linux 2.6及以上,这样才支持epoll
可以通过uname
命令来查询Linux内核版本
1 |
|
安装必备软件
- GCC编译器
获取Nginx源码后,需要GCC来进行编译安装。
- PCRE库
PCRE(Perl Compatible Regular Expressions, Perl兼容正则表达式)
- zlib库
zlib库用于对HTTP包的内容做gzip格式的压缩,如果我们在nginx.conf里配置了gzip on
,并指定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减少网络传输量,那么在编译时就必须把这zlib编译进Nginx。
- OpenSSL开发库
如果需要在更安全的SSL协议上传输HTTP,那么需要OpenSSL。另外,如果我们需要使用MD5、SHA1等散列函数,那么也需要安装它。
上面所列的4个库只是完成Web服务器最基本功能所必须的。
Nginx是高度自由化的Web服务器,它的功能是由许多模块来支持的。而这些模块可根据我们的使用需求来定制,如果某些模块不需要使用则完全不必理会它。同样,如果使用了某个模块,而这个模块使用了一些类似zlib或OpenSSL等的第三方库,那么就必须先安装这些软件。
磁盘目录
要使用Nginx,还需要在Linux文件系统上准本以下目录
- Nginx源代码存放目录
存放从官网上下载的Nginx源码文件
- Nginx编译阶段产生的中间文件存放目录
该目录用于放置在configure命令执行后所生成的源文件及目录,以及make命令执行后生成的目标文件和最终连接成功的二进制文件。默认情况下,configure命令会将该目录命名为objs,并放在Nginx源代码目录下。
- 部署目录
该目录存放实际Nginx服务运行期间所需要的二进制文件、配置文件等。默认情况下,该目录为/usr/local/nginx
。
- 日志文件存放目录
日志文件通常会比较大,当研究Nginx的底层架构时,需要打开debug级别的日志,这个级别的日志非常详细,会导致日志文件的大小增长得极快,需要预先分配一个拥有更大磁盘空间的目录。
Linux内核参数的优化
由于默认的Linux内核参数考虑的是最通用的场景,不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,使得Nginx可以拥有更高的性能。
首先,需要修改 /etc/sysctl.conf
来更改内核参数。例如,最常用的配置:
1 |
|
然后执行sysctl-p
命令,使上述修改生效。
上面的参数意义解释如下:
- file-max:这个参数表示进程(比如一个worker进程)可以同时打开的最大句柄数,这个参数直接限制最大并发连接数,需根据实际情况配置。
- tcp_tw_reuse:这个参数设置为1,表示允许将TIME-WAIT状态的socket重新用于新的TCP连接,这对服务器来说很有意义,因为服务器上总会有大量 TIME-WAIT状态的连接。
- tcp_keepalive_time: 这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置的小一些,可以更快清理无效的连接。
- tcp_fin_timeout: 这个参数表示当服务器主动关闭连接时,socket保持在FIN-WAIT-2状态的最大时间。
- tcp_max_tw_buckets: 这个参数表示操作系统允许TIME-WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立即被清除并打印警告信息。该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。
- tcp_max_syn_backlog: 这个参数表示TCP三次握手建立阶段接收SYN请求队列的最大长度,默认为1024,将其设置得大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的连接请求。
- ip_local_port_range: 这个参数定义了在UDP和TCP连接中本地(不包括连接的远端)端口的取值范围。
- net.ipv4.tcp_rmem: 这个参数定义了TCP接收缓存(用于TCP接收滑动窗口)的最小值、默认值、最大值。
- net.ipv4.tcp_wmem: 这个参数定义了TCP发送缓存(用于TCP发送滑动窗口)的最小值、默认值、最大值。
- netdev_max_backlog:当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值。
- rmem_default: 这个参数表示内核套接字接收缓存区默认的大小。
- wmem_dafault: 这个参数表示内核套接字发送缓存区默认的大小。
- rmem_max: 表示内核套接字接收缓存区的最大大小。
- wmem_max: 表示内核套接字发送缓存区的最大大小。
- tcp_syncookies:该参数与性能无关,用于解决TCP的SYN攻击。
下载Nginx源码
可在Nginx官方网站获取Nginx源码包。将下载好的nginx-1.18.0.tar.gz
源码压缩包放置到准备好的Nginx源码目录中,然后解压。例如:
1 |
|
编译
安装Nginx最简单方式是,进入nginx-1.18.0目录后执行以下三个命令:
1 |
|
configure命令做了大量的“幕后”工作,包括检测操作系统内核和已经安装的软件,参数的解析,中间目录的生成以及根据各种参数生成一些C源码文件、Makefile文件等。
configure命令参数
使用help命令可以查看configure包含的参数
1 |
|
详细内容非常多,就不在这里说明了,可以参考这篇博客Nginx —— configure的命令参数(nginx编译选项)
运行和控制Nginx
启动
注意,如果没有修改过系统环境变量,需要进入到Nginx二进制程序安装位置(如果编译安装时没有修改configure中相关参数,默认位置为/usr/local/nginx/sbin/nginx
),以下命令才生效。(对于apt install nginx
简易安装,可以在任意位置直接使用)
1 |
|
这时会读取默认路径下的配置文件,即congigure命令执行时使用--conf-path=PATH
指定的nginx.conf
文件,默认为/usr/local/nginx/conf/nginx.conf
。(对于apt install nginx
默认路径为/etc/nginx/nginx.conf
)
1 |
|
测试
1 |
|
停止
1 |
|
to stop nginx processes with waiting for the worker processes to finish serving current requests, the following command can be executed
quit关闭是等待worker进程处理完当前的请求之后再停止nginx,比stop更“优雅”
注意只有启动nginx的用户才能执行命令停止nginx
重新加载配置文件
1 |
|
Changes made in the configuration file will not be applied until the command to reload configuration is sent to nginx or it is restarted. To reload configuration, execute:
nginx -s reload
在通过reload命令重新加载配置文件之前,所有配置文件的变化不会生效。
官方文档中下面这段话很有意思:
Once the master process receives the signal to reload configuration, it checks the syntax validity of the new configuration file and tries to apply the configuration provided in it. If this is a success, the master process starts new worker processes and sends messages to old worker processes, requesting them to shut down. Otherwise, the master process rolls back the changes and continues to work with the old configuration. Old worker processes, receiving a command to shut down, stop accepting new connections and continue to service current requests until all such requests are serviced. After that, the old worker processes exit.
当主进程收到重新加载配置文件信号后,会检查新的配置文件的有效性,并尝试应用其中的配置。如果成功,则主进程将启动新的工作进程,并要求旧的进程关闭。否则,主进程将回滚更改并继续使用旧配置。旧的工作进程收到关闭命令后,停止新的连接,并继续为当前请求提供服务直到全部完成,之后再退出。
这说明了nginx可以在不停止服务的情况下重新加载配置文件(灰度升级)。
日志文件回滚
1 |
|
使用这个命令重新打开日志文件,这样可以先把当前日志文件改名或转移到其他目录中备份,再重新打开时就会生成新的日志文件。这个功能使得日志文件不至于过大。
获取nginx进程列表
1 |
|
Linux下的ps命令用于显示当前进程的状态,参数-ax显示所有进程,通过管道输入给grep,查找其中包含nginx的项
参考文档
陶辉《深入理解Nginx:模块开发与架构解析》第2版