本文来深入学习Nginx/OpenResty详解,Nginx到底是个什么鬼
Nginx/OpenResty详解
Nginx(或OpenResty)在生产场景中使用的广泛程度已经到了令人咂舌的地步。无论其实际的市场占用率如何,以笔者这些年所经历的项目来看,其使用率为100%。
然而,笔者周围的大量开发人员对Nginx(或OpenResty)的了解程度都停留在基本配置的程度,对其核心原理和高性能配置了解不多。
本文不仅为大家解读Nginx的核心原理和高性能配置,还将介绍Nginx+Lua高并发实战编程,帮助大家掌握一个解决高并发问题的新利器。
Nginx简介
Nginx是一个高性能的HTTP和反向代理Web服务器,是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的Web服务器。
Nginx源代码以类BSD许可证的形式发布,其第一个公开版本0.1.0发布于2004年10月4日,2011年6月1日发布了1.0.4版本。Nginx因高稳定性、丰富的功能集、内存消耗少、并发能力强而闻名全球,目前得到非常广泛的使用,比如百度、京东、新浪、网易、腾讯、淘宝等都是Nginx的用户。Nginx相关地址如下:
源码地址为https://trac.nginx.org/nginx/browser。
官网地址为http://www.nginx.org/。
Nginx有以下3个主要社区分支:
(1)Nginx官方版本:更新迭代比较快,并且提供免费版本和商业版本。
(2)Tengine:Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上针对大访问量网站的需求添加了很多高级功能和特性。
Tengine的性能和稳定性已经在大型的网站(如淘宝网、天猫商城等)得到了很好的检验。它的最终目标是打造一个高效、稳定、安全和易用的Web平台。
(3)OpenResty:2011年,中国人章亦春老师把LuaJIT VM嵌入Nginx中,实现了OpenResty这个高性能服务端解决方案。OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项,用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和***关。OpenResty的目标是让Web服务直接跑在Nginx服务内部,充分利用Nginx的非阻塞I/O模型,不仅对HTTP客户端请求,甚至对远程后端(诸如MySQL、PostgreSQL、Memcached以及Redis等)都进行一致的高性能响应。
OpenResty通过汇聚各种设计精良的Nginx模块(主要由OpenResty团队自主开发)从而将Nginx有效地变成一个强大的通用Web应用平台,使得Web开发人员和系统工程师可以使用Lua脚本语言调动Nginx支持的各种C以及Lua模块,快速构造出足以胜任10KB乃至1000KB以上单机并发连接的高性能Web应用系统。
通过以下OpenResty官网的链接地址可以查看到OpenResty支持的组件:
官网地址为https://openresty.org/cn/。
组件地址为https://openresty.org/cn/components.html。
正向代理与反向代理
这里先简明扼要地介绍什么正向代理和反向代理。正向代理和反向代理的用途都是代理服务中进行客户端请求的转发,但是区别还是很大的。
正向代理最大的特点是客户端非常明确要访问的服务器地址,如图7-1所示。
图7-1 正向代理的特点
在正向代理服务器,客户端需要配置目标服务器信息,比如IP和端口。一般来说,正向代理服务器是一台和客户端网络连通的局域网内部的机器或者是可以打通两个隔离网络的双网卡机器。通过正向代理的方式,客户端的HTTP请求可以转发到之前与客户端网络不通的其他不同的目标服务器。
反向代理与正向代理相反,客户端不知道目标服务器的信息,代理服务器就像是原始的目标服务器,客户端不需要进行任何特别的设置。
反向代理最大的特点是客户端不知道目标服务器地址,如图7-2所示。
图7-2 反向代理的特点
客户端向反向代理服务器直接发送请求,接着反向代理将请求转发给目标服务器,并将目标服务器的响应结果按原路返回给客户端。
正向代理和反向代理的使用场景说明:
(1)正向代理的主要场景是客户端。由于网络不通等物理原因,需要通过正向代理服务器这种中间转发环节顺利访问目标服务器。当然,也可以通过正向代理服务器对客户端某些详细信息进行一些伪装和改变。
(2)反向代理的主要场景是服务端。服务提供方可以通过反向代理服务器轻松实现目标服务器的动态切换,实现多目标服务器的负载均衡等。
通俗点来说,正向代理(如Squid、Proxy)是对客户端的伪装,隐藏了客户端的IP、头部或者其他信息,服务器得到的是伪装过的客户端信息;反向代理(如Nginx)是对目标服务器的伪装,隐藏了目标服务器的IP、头部或者其他信息,客户端得到的是伪装过的目标服务器信息。
Nginx的启动命令和参数详解
在Windows平台安装OpenResty并且设置path环境变量之后,就可以启动OpenResty了。OpenResty的原始启动命令为nginx,其参数有-v、-t、-p、-c、-s等,使用说明如下:
(1)-v:表示查看Nginx的版本。
C:\dev\refer\LuaDemoProject\src> nginx -v
nginx version: openresty/1.13.6.2
(2)-c:指定一个新的Nginx配置文件来替换默认的Nginx配置文件。
//启动时,在cmd窗口切换到src目录,然后执行以下命令
C:\dev\refer\LuaDemoProject\src> nginx -p ./ -c nginx-debug.conf
(3)-t:表示测试Nginx的配置文件。如果不能确定Nginx配置文件的语法是否正确,就可以通过Nginx命令的-t参数来测试。此参数代表不运行配置文件,只是测试配置文件。
C:\dev\refer\LuaDemoProject\src> nginx -t -c nginx-debug.conf
nginx: the configuration file ./nginx-debug.conf syntax is ok
nginx: configuration file ./nginx-debug.conf test is successful
(4)-p:表示设置前缀路径。C:\dev\refer\LuaDemoProject\src> nginx -p ./ -c nginx-debug.conf在上面的命令中,“-p./”表示将当前目录C:
\dev\refer\LuaDemoProject\src作为前缀路径,也就是说,nginx
debug.conf配置文件中所用到的相对路径都加上这个前缀。
(5)-s:表示给Nginx进程发送信号,包含stop(停止)、reload(重写加载)。
//重启Nginx进程,发送reload信号
C:\dev\refer\LuaDemoProject\src> nginx -p ./ -c nginx-debug.conf -s reload
//停止Nginx进程,发送stop信号
C:\dev\refer\LuaDemoProject\src> nginx -p ./ -c nginx-debug.conf -s stop
Linux下OpenResty的启动、停止脚本
为什么要专门介绍Linux系统下OpenResty的启动和停止脚本呢?
(1)在Nginx/OpenResty发布包中并没有提供好用的启动、停止脚本。
(2)掌握一些基础的脚本指令并能编写基础的运行脚本是Java工程师必备的基础能力,很多面试场景都会出现“你使用过哪些Linux操作指令”的面试题。
作为参考,这里提供一份笔者常用的Linux下OpenResty/Nginx的启动脚本,它公布在疯狂创客圈社群网盘上,它的内容如下:
#!/bin/bash
#设置OpenResty的安装目录
OPENRESTRY_PATH="/usr/local/openresty"
#设置Nginx项目的工作目录
PROJECT_PATH="/work/develop/LuaDemoProject/src/"
#设置项目的配置文件
#PROJECT_CONF="nginx-location-demo.conf"
PROJECT_CONF="nginx.conf"
echo "OPENRESTRY_PATH:$OPENRESTRY_PATH"
echo "PROJECT_PATH:$PROJECT_PATH"
#查找Nginx所有的进程id
pid=$(ps -ef | grep -v 'grep' | egrep nginx| awk '{printf $2 " "}')
#echo "$pid"
if [ "$pid" != "" ]; then
#如果已经在执行,就提示
echo "openrestry/nginx is started already, and pid is $pid, operating failed!"
else
#如果没有执行,就启动
$OPENRESTRY_PATH/nginx/sbin/nginx -p ${PROJECT_PATH} \
-c ${PROJECT_PATH}/conf/${PROJECT_CONF}
pid=$(ps -ef | grep -v 'grep' | egrep nginx| awk '{printf $2 " "}')
echo "openrestry/nginx starting succeeded!"
echo "pid is $pid "
fi使用以上脚本之前,需要在脚本中配置OpenResty/Nginx的安装目录、项目的工作目录、项目的配置文件3个选项。配置完成后,在Linux的命令窗口执行openresty-start.sh启动脚本即可启动OpenResty。
[root@localhostlinux]#/work/develop/LuaDemoProject/sh/linux
/openresty-start.sh
OPENRESTRY_PATH:/usr/local/openresty
PROJECT_PATH:/work/develop/LuaDemoProject/src/
openrestry/nginx starting succeeded!
pid is 31403 31409
下面简单介绍上面的openresty-start.sh脚本中主要用到的指令:
(1)echo显示命令:用于显示信息到终端屏幕。
(2)ps进程列表:用于显示在本地机器上当前运行的进程列表。
(3)grep查找命令:用于查找文件里符合条件的字符串。
以上3个命令是经常用到的、非常基础的Linux命令。疯狂创客圈社群网盘中除了提供上面的openresty-start.sh脚本之外,还提供了另外3个有用的OpenResty操作脚本,具体如下:
(1)openresty-stop.sh用于停止OpenResty/Nginx。
(2)openresty-status.sh用于输出OpenResty/Nginx的运行状态和进程信息。
(3)openresty-restart.sh用于重启OpenResty/Nginx。
Windows下OpenResty的启动、停止脚本
除了提供Linux下的Shell脚本外,这里还为大家提供Windows脚本文件。Windows下的脚本通常叫作批处理脚本,批处理脚本扩展名为.bat,包含一系列DOS命令。
作为参考,这里提供一份Windows下OpenResty/Nginx的启动、停止、重启、查看状态的脚本,大家可以在疯狂创客圈社群网盘下载,其中启动脚本openresty-start.bat的具体内容如下:
@echo off
rem启动标志flag=0表示之前已经启动,flag=1表示现在立即启动
set flag=0
rem设置OpenResty/Nginx的安装目录
set installPath=E:/tool/openresty-1.13.6.2-win32
rem设置Nginx项目的工作目录
set projectPath=C:/dev/refer/LuaDemoProject/src
rem设置项目的配置文件
set PROJECT_CONF=nginx-location-demo.conf
rem set PROJECT_CONF=nginx.conf
echo installPath: %installPath%
echo project prefix path: %projectPath%
echo config file: %projectPath%/conf/%PROJECT_CONF%
echo openresty starting...
rem查找OpenResty/Nginx进程信息,然后设置flag标志位
tasklist|find /i "nginx.exe" > nul
if %errorlevel%==0 (
echo "OpenResty/Nginx already running ! "
rem exit /b
) else set flag=1
rem如果需要,就启动OpenResty/Nginx
cd /d %installPath%
if %flag%==1 (
start nginx.exe -p "%projectPath%" -c "%projectPath%/conf/%PROJECT_CONF%"
ping localhost -n 2 > nul
)
rem输出OpenResty/Nginx的进程信息
tasklist /fi "imagename eq nginx.exe"
tasklist|find /i "nginx.exe" > nul
if %errorlevel%==0 (
echo "OpenResty/Nginx starting succeeded!"
)
使用之前,在启动脚本openresty-start.bat中配置OpenResty/Nginx的安装目录、项目的工作目录、项目的配置文件这3个选项后,在Windows CMD命令窗口中执行openresty-start.bat启动脚本,即可启动OpenResty。
PS C:\dev\refer\LuaDemoProject\sh\windows> .\openresty-start.bat
installPath: E:/tool/openresty-1.13.6.2-win32
project prefix path: C:/dev/refer/LuaDemoProject/src
config file: C:/dev/refer/LuaDemoProject/src/conf/nginx-location-demo.conf
openresty starting...
"OpenResty/Nginx already running ! "
映像名称 PID会话名 会话# 内存使用
========================= ======== ================ =========== ============
nginx.exe 34264 Console 2 9,084 K
nginx.exe 25912 Console 2 8,992 K
"OpenResty/Nginx starting succeeded!"
上面的.bat批处理文件主要用到的指令简单介绍如下:
(1)rem注释命令:一般用来给程序加上注释,该命令后的内容不被执行。
(2)echo显示命令:用于显示信息到终端屏幕。
(3)cd目录切换:用于切换当前的目录。
(4)tasklist进程列表:用于显示在本地或远程机器上当前运行的进程列表。
除了上面的openresty-start.bat脚本外,针对Windows系统,本文的配套源码中还提供了3个有用的OpenResty操作批处理脚本,具体如下:
(1)openresty-stop.bat:用于停止OpenResty/Nginx。
(2)openresty-status.bat:用于输出OpenResty/Nginx的运行状态和进程信息。
(3)openresty-restart.bat:用于重启OpenResty/Nginx。
从提高效率的维度来说,这些脚本还是非常有用的。大家可从疯狂创客圈社群网盘自行下载、研究学习和定制使用。