最近开始对nginx做系统学习,决定把自己学到的东西整理成文章,方便以后查看。
1、nginx是什么?
百度百科中给出的解释为:
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
2、为什么选择Nginx?
为什么选择Nginx?因为它具有以下特点:
(1)、更快
这里表现在两个方面:一方面在正常情况下,单次请求会得到更快的响应;另一方面,在高峰,Nginx比其它web服务器更快的响应请求
(2)、高扩展性
Nginx的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。当对某一个模块进行修复或者升级时,可专注模块本身,无需在意其它。而且在HTTP模块中,还设计了HTTP过滤器模块:一个正常的HTTP模块在处理完请求后,会有一串HTTP过滤器模块对其请求结果进行再处理。
Nginx的模块都是嵌入到二进制文件中执行的,无论官方发布的模块还是第三方模块都是如此。这使得第三方模块一样具备及其优秀的性能,充分利用Nginx的高并发性。
(3)、高可靠性
Nginx的高可靠性来自其和兴框架的代码的优秀设计、模块设计的简单性。我个worker进程相对独立,master进程在1个worker进程出错时可以快速拉起新的worker子线程。
(4)、低内存消耗
一般情况下,10000个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存。
(5)、单机支持10W以上的并发连接
理论上,Nginx支持的并发连接上限取决于内存,10W远未封顶。
(6)、热部署
master管理进程与worker工作进程的分离设计,使得Nginx能够提供热部署功能,既可以在7*24小时不间断服务的前提下,实际Nginx的可执行文件。当然,他也支持不停止服务更新配置、更换日志文件等功能。
(7)、最自由的BSD许可协议
BSD许可协议不只是允许用户免费试用Nginx,它还允许用户在自己的项目中直接使用或修改Nginx源码,然后发布
以上7个当然不是Nginx的全部,它还有更多模块满足应用场景
3、Nginx服务器类型
(1)、Web服务器
Web服务器用于提供HTTP(包括https)的访问,例如Nginx、Apache、IIS等,虽然Tomcate也能够做到,但这并不是它的主要功能,而且其性能也不如专门的Web服务器。
(2)、应用程序服务器
用于应用程序的运行,包括的工作有:客户会话管理、业务逻辑管理、数据操作等。
(3)、代理服务器
(4)、反向代理
(5)、后台服务器
(6)、CDN缓存服务器
4、使用Nginx的必备软件
(1)、GCC编译器
GNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)。GCC的初衷是为GNU操作系统专门编写的一款编译器。
yum install -y gcc
GCC是必须的编译工具。在编写HTTP模块中,需要用到G++编译器
yun install -y gcc-c++
(2)、PCRE库
PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。这些在执行正规表达式模式匹配时用与Perl 5同样的语法和语义是很有用的。Boost太庞大了,使用boost regex后,程序的编译速度明显变慢。测试了一下,同样一个程序,使用boost::regex编译时需要3秒,而使用pcre不到1秒。因此改用pcre来解决C语言中使用正则表达式的问题
yum install -y pcre pcre-devel
(3)、zlib库
zlib是提供数据压缩用的函式库。
yum install -y zlib zlib-devel
(4)、OpenSSL开发库
如果我们的服务器不只是支持HTTP,还需要在更加安全的SSL协议上传输HTTP,那么我们就需要OpenSSL了。
yum install -y openssl openssl-devel
5、Nginx的命令行控制
(1)、默认方式启动
/usr/local/nginx/sbin/nginx
——取默认路径下的配置文件:/usr/local/nginx/conf/nginx.conf
(2)、指定配置文件启动
/usr/local/nginx/sbin/nginx -c /tmp/nginx.conf
——使用-c参数指定配置文件
(3)、指定安装目录
——/usr/local/nginx/sbin/nginx -p /usr/local/nginx.conf
(4)、指定全局配置项启动
/usr/local/nginx/sbin/nginx -g "pid /var/nginx/test.pid"
—— -g参数的约束条件是指定的配置项不能与默认条件下的nginx.conf中的配置项冲突,否则无法启动。另外一个约束条件是以-g方式启动的Nginx服务执行其它命令时,需要把-g参数带上,否则可能出现配置项不匹配的情况,如果要停止服务,则执行如下代码:
/usr/local/nginx/sbin/nginx -g "pid /var/nginx/test.pid" -s stop
(5)、测试配置信息是否正确
/usr/local/nginx/sbin/nginx -t
(6)、在测试阶段不输出信息
/usr/local/nginx/sbin/nginx -t -q
——使用-q,可以不把error级别以下的信息输出
(7)、显示版本信息
/usr/local/nginx/sbin/nginx -v
(8)、显示编译阶段的参数
/usr/local/nginx/sbin/nginx -V
(9)、快速的停止服务
/usr/local/nginx/sbin/nginx -s stop
——实际上,如果通过kill命令直接向nginx master进程发送TERM或者INT新号,效果是一样的,首先通过ps查找ningx的master进程ID
kill -s SIGTERM 10801 或者 kill -s SIGINT 10801
(10)、优雅的停止服务
/usr/local/nginx/sbin/nginx -s quit
首先会关闭监听接口,停止接收新的连接,然后把当前正在处理的连接全部处理完,最后在退出进程。可以直接发送QUIT信号给master进程停止服务,其效果和quit相同
kill -s SIGQUIT <NGINX MASTER PID>
如果希望优雅的停止worker,可以适应WINCH:
kiill -s SIGWINCH <NGINX MASTER PID>
(11)、使运行中的Nginx重读配置项并生效
/usr/local/nginx/sbin/nginx -s reload
使用kill的HUP命令来实现
kiill -s SIGHUP <NGINX MASTER PID>
(12)、日志文件回滚
使用reopen命令重新打开日志文件,这样可以把当前日志文件改名或者保存到其它文件夹下面,在重新打开生成新的日志文件。
/usr/local/nginx/sbin/nginx -s reopen
kiill -s SIGUSR1 <NGINX MASTER PID>
(13)、平滑升级Nginx
当Nginx服务升级到新的版本时,必须将旧的二进制文件Nginx替换掉,Nginx支持不重启服务来完成版本更新的平滑升级
升级时包括如下步骤:
1)、通知正在运行的旧版本Nginx准备升级。通过向master进程放usr2信号可以达到目的。例如: kiill -s SIGUSR2 <NGINX MASTER PID>,这时运行中的Nginx会将pid文件重命名,将 /usr/local/nginx/logs/nginx.pid重命名为 /usr/local/nginx/logs/nginx.pid.oldbin,这样新的Nginx才能启动成功。
2)、启动新版本的nginx,可以通过以上介绍的任意一种实现。然后通过ps命令可以发现新旧版本的Nginx在同时运行。
3)、通过kill命令向旧版本发出SIGQUIT命令
(14)、显示命令行帮助
使用-h或者-?参数会显示支持的所有命令参数。
欢迎关注微信公众号