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

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

off999 2025-02-11 13:05 18 浏览 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中面向对象的类属性和实例属性?

类属性和实例属性类属性就是给类对象中定义的属性通常用来记录与这个类相关的特征类属性不会用于记录具体对象的特征类属性的理解:类属性是与类自身相关联的变量,而不是与类的实例关联。它们通...

Java程序员,一周Python入门:面向对象(OOP) 对比学习

Java和Python都是**面向对象编程(OOP)**语言,无非是类、对象、继承、封装、多态。下面我们来一一对比两者的OOP特性。1.类和对象Java和Python都支持面向对象...

松勤技术精选:Python面向对象魔术方法

什么是魔术方法相信大家在使用python的过程中经常会看到一些双下划线开头,双下划线结尾的方法,我们把它统称为魔术方法魔术方法的特征魔术方法都是双下划线开头,双下划线结尾的方法魔术方法都是pytho...

[2]Python面向对象-【3】方法(python3 面向对象)

方法的概念在Python中,方法是与对象相关联的函数。方法可以访问对象的属性,并且可以通过修改对象的属性来改变对象的状态。方法定义在类中,可以被该类的所有对象共享。方法也可以被继承并重载。方法的语法如...

一文带你理解python的面向对象编程(OOP)

面向对象编程(OOP,Object-OrientedProgramming)是一个较难掌握的概念,而Python作为一门面向对象的语言,在学习其OOP特性时,许多人都会对“继承”和“多态”等...

简单学Python——面向对象1(编写一个简单的类)

Python是一种面向对象的编程语言(ObjectOrientedProgramming),在Python中所有的数据类型都是对象。在Python中,也可以自创对象。什么是类呢?类(Class)是...

python进阶突破面向对象——四大支柱

面向对象编程(OOP)有四大基本特性,通常被称为"四大支柱":封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)和抽象(Abstrac...

Python学不会来打我(51)面向对象编程“封装”思想详解

在面向对象编程(Object-OrientedProgramming,简称OOP)中,“封装(Encapsulation)”是四大核心特性之一(另外三个是继承、多态和抽象),它通过将数据(属性)和...

Python之面向对象:对象属性解析:MRO不够用,补充3个方法

引言在前面的文章中,我们谈及Python在继承关系,尤其是多继承中,一个对象的属性的查找解析顺序。由于当时的语境聚焦于继承关系,所以只是简要提及了属性解析顺序同方法的解析顺序,而方法的解析顺序,在Py...

Python之面向对象:通过property兼顾属性的动态保护与兼容性

引言前面的文章中我们简要提及过关于Python中私有属性的使用与内部“名称混淆”的实现机制,所以,访问私有属性的方法至少有3种做法:1、使用实例对象点操作符的方式,直接访问名称混淆后的真实属性名。2、...

Python之面向对象:私有属性是掩耳盗铃还是恰到好处

引言声明,今天的文章中没有一行Python代码,更多的是对编程语言设计理念的思考。上一篇文章中介绍了关于Python面向对象封装特性的私有属性的相关内容,提到了Python中关于私有属性的实现是通过“...

Python中的私有属性与方法:解锁面向对象编程的秘密

Python中的私有属性与方法:解锁面向对象编程的秘密在Python的广阔世界里,面向对象编程(OOP)是一种强大而灵活的方法论,它帮助我们更好地组织代码、管理状态,并构建可复用的软件组件。而在这个框...

Python 面向对象:掌握类的继承与组合,让你的代码更高效!

引言:构建高效代码的基石Python以其简洁强大的特性,成为众多开发者首选的编程语言。而在Python的面向对象编程(OOP)范畴中,类的继承和组合无疑是两大核心概念。它们不仅能帮助我们实现代码复用,...

python进阶-Day2: 面向对象编程 (OOP)

以下是为Python进阶Day2设计的学习任务,专注于面向对象编程(OOP)的核心概念和高阶特性。代码中包含详细注释,帮助理解每个部分的实现和目的。任务目标:复习OOP基础:类、对象、继...

外婆都能学会的Python教程(二十八):Python面向对象编程(二)

前言Python是一个非常容易上手的编程语言,它的语法简单,而且功能强大,非常适合初学者学习,它的语法规则非常简单,只要按照规则写出代码,Python解释器就可以执行。下面是Python的入门教程介绍...

取消回复欢迎 发表评论: