百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

本文来深入学习Nginx/OpenResty详解,Nginx到底是个什么鬼

off999 2025-02-11 13:05 12 浏览 0 评论

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所示。

在正向代理服务器,客户端需要配置目标服务器信息,比如IP和端口。一般来说,正向代理服务器是一台和客户端网络连通的局域网内部的机器或者是可以打通两个隔离网络的双网卡机器。通过正向代理的方式,客户端的HTTP请求可以转发到之前与客户端网络不通的其他不同的目标服务器。

反向代理与正向代理相反,客户端不知道目标服务器的信息,代理服务器就像是原始的目标服务器,客户端不需要进行任何特别的设置。

反向代理最大的特点是客户端不知道目标服务器地址,如图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。

从提高效率的维度来说,这些脚本还是非常有用的。大家可从疯狂创客圈社群网盘自行下载、研究学习和定制使用。

本文给大家讲解的内容是Nginx/OpenResty详解,Nginx简介

  1. 下篇文章给大家讲解的是 Nginx/OpenResty详解,Nginx的核心原理;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

相关推荐

Python进阶教程:如何自定义异常(附电商库存管理案例)

在Python中,你可以使用异常(exceptions)来预期和处理那些干扰程序正常执行流程的错误。Python内置了许多常见的异常,例如ValueError、TypeError和KeyError,但...

Python 中使用try来处理异常的方法

六二,直方大,不习无不利。在学习python中会经常遇到各种异常事件;现归纳一下如何捕捉并处理这些异常;今天来给大家整理一下。一、异常的概念什么是异常?异常即是一个事件,该事件会在程序执行过程中发生,...

python入门-day3:异常处理(异常处理方法及流程python)

异常处理的内容,包括try、except、finally的用法,介绍常见异常类型,最后通过一个练习(处理用户输入的非法数字)帮你把知识点串起来。我会用简单易懂的语言,确保新手也能轻松掌握。Da...

16-Python的异常(python的异常类型及处理)

1-异常介绍1-2-什么是异常异常是程序运行时发生的错误或异常情况,它会中断正常的程序执行流程;Python使用异常处理机制来处理这些运行时错误。1-4-为什么要捕获异常异常会中断程序的执行;1-3-...

Python 异常处理详解(python中异常)

一、什么是异常?核心定义在程序运行过程中,当Python解释器检测到无法继续执行的操作时,会立即创建异常对象并中断当前流程。此时若不处理异常,程序将直接崩溃退出。典型场景与原理用户输入无效数据nu...

掌握这些 Python 异常处理技巧,代码稳如老狗!

在Python中,异常处理不仅可以帮助我们捕获和处理错误,还能让我们更清晰地了解错误发生的背景。1.异常层次结构Python内置了许多异常,我们在编程时可能会经常遇到,例如ZeroDivisi...

python异常处理机制最佳实践(python异常处理总结)

Python异常处理的最佳实践需要兼顾代码健壮性、可读性和性能。以下是经过工程验证的10个核心原则和技巧:一、精准捕获原则避免裸except禁止使用except:或exceptExce...

python之异常处理(python异常处理过程可以概括为三个步骤)

异常语法try:<代码块>except<异常类型>:<代码块>捕获通用异常try:<代码块>exceptExceptionas...

一天学一点,今天学习掌握Python:异常处理与文件操作全攻略

这一笔记记录了我学习python的异常和文件的操作,这也是针对Python异常和文件操作教程的进一步优化建议和注意事项:异常处理优化1.避免过度捕获异常o不要为了捕获异常而捕获异常,应根据实际需求...

新手学Python避坑,学习效率狂飙! 十二、Python 异常处理

异常处理系统分享在Python里,异常指的是程序运行期间出现的错误。当异常发生时,正常的程序流程会被中断,Python会抛出异常对象。为了防止程序因异常而崩溃,你可以使用异常处理机制捕获并处理这...

Python异常处理全攻略:从入门到精通,轻松应对代码“翻车”时刻

喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。引言:异常处理——代码世界的“保险丝”在编程的世界里,错误和异常就像路上的“坑”,稍不留神就会让你的程序“翻车”。而异常处理,就是...

Python异常处理全面指南(python异常处理步骤)

Python异常处理完全指南异常处理是编写健壮程序的关键技术。Python提供了灵活的语法和丰富的内置异常类型,能够有效管理程序运行时的错误。以下是Python异常处理的全面指南:一、异常处理...

进阶突破python——异常处理机制(异常处理用什么语句python)

Python的异常处理机制是其健壮性设计的核心,通过清晰的语法结构和灵活的处理策略实现错误管理。以下从核心语法、异常对象、高级特性和最佳实践四个维度详解:一、核心语法结构Python使用try-...

Python基础编程——详细介绍Python的异常捕获示例代码

这篇文章主要为大家详细介绍了python的异常捕获,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助①捕捉一个异常捕捉一个异常以用0作为除数会得到Ze...

Python学习 -- 异常捕获技巧(python怎么捕获异常)

在编写Python代码时,异常处理是确保程序稳定性的关键。Python提供了灵活的异常捕获机制,包括try...except语句、try...except...else语句和try...except....

取消回复欢迎 发表评论: