1.nginx的发展历史
2.nginx的IO调用以及优化原理
多进程的master-workerIO复用方式
1.Nginx启动后,会产生一个主进程,主进程执行一系列的工作后会产生一个或者多个工作进程
2.在客户端请求动态站点的过程中,Nginx服务器还涉及和后端服务器的通信。Nginx将接收到的Web请求通过代理转发到后端服务器,由后端服务器进行 数据处理和组织;
3.Nginx为了提高对请求的响应效率,降低网络压力,采用了缓存机制,将历史应答数据缓存到本地。保障对缓存文件的快速访问
master进程主要用来管理 worker 进程,具体包括以下主要功能:
(1)接收来自外界的信号。
(2)处理配置文件读取。
(3)创建,绑定和关闭套接字
(4)启动,终止和维护配置的工作(worker)进程数
(5)当woker进程退出后(异常情况下),会自动重新启动新的woker进程。
worker 进程的主要任务是完成具体的任务逻辑。其主要关注点是与客户端或后端真实服务器(此时 worker 作为中间代理)之间的数据可读/可写等I/O交互事 件。
(1)接收客户端请求;
(2)将请求一次送入各个功能模块进行过滤处理;
(3)与后端服务器通信,接收后端服务器处理结果;
(4)数据缓存
(5)响应客户端请求
IO复用/EventLoop
1、IO复用是什么?
IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程,目前支持I/O多路复用的系统调用有 select , poll , epoll,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符(socket),一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读 写操作。
2、select跟poll
Select介绍:
监视并等待多个文件描述符的属性变化(可读、可写或错误异常)。 select 函数监视的文件描述符分 3 类,分别是writefds、readfds、和 exceptfds。调用 后 select 会阻塞,直到有描述符就绪(有数据可读、可写、或者有错误异常),或者超时( timeout 指定等待时间),函数才返回。当 select ()函数返回 后,可以通过遍历 fdset,来找到就绪的描述符,并且描述符最大不能超过1024
Poll 介绍:
poll 的机制与 select 类似,与 select 在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是 poll 没有最大文件描 述符数量的限制。 poll 和 select 同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是 否就绪,它的开销随着文件描述符数量的增加而线性增大。
问题:
select/poll 问题很明显,它们需要循环检测连接是否有事件。如果服务器有上百万个连接,在某一时间只有一个连接向服务器发送了数据,
select/poll 需要做循环100万次,其中只有1次是命中的,剩下的99万9999次都是无效的,白白浪费了CPU资源。
epoll:
epoll 是在2.6内核中提出的,是之前的和 poll 的增强版本。相对来说, epoll 更加灵活,没有描述符限制,无需轮询。epoll 使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中。 简单点来说就是当连接有I/O流事件产生的时候, epoll 就会去告诉进程哪个连接有I/O流事件产生,然后进程就去处理这个进程。
这里可以多加一个选择 worker 的原因,因为 worker 是基于 epoll 的异步非阻塞的服务器程序。自然, worker 能够轻松处理10w+的并发连接,也就无可厚非 了。
更加详细请参考:http://t.csdnimg.cn/VNDgg
3.nginx的运行原理及模块
进程结构
web 请求处理机制1. 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直 到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务 器资源耗尽而无法提供请求2.多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客 户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器 对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可 以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作 了,IIS 服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。Nginx是多进程组织模型,而且是一个由 Master 主进程和 Worker 工作进程组成。
![](https://i-blog.csdnimg.cn/direct/b79aaae5138f4a45b1084e5ebbfa90b0.png)
4.nginx的架构和安装(源码编译安装)
- Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus )
- Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器 解决C10K问题(10K Connections)
- Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加 了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了 很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始, Tengine成为一个开源项目官网: http://tengine.taobao.org/
- OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春团队开发,官网:http://openr esty.org/cn/
- yum的版本比较旧
- 编译安装可以更方便自定义相关路径
- 使用源码编译可以自定义相关功能,更方便业务的上的使用
4.1环境准备
- 一台NGINX主机ip为172.25.254.100,关闭selinux,关闭防火墙!!!!(否则会在测试的时候出现很多问题)
- 去nginx官网下载软件
- 先安装其依赖软件,最后安装nginx。
- 依赖工具:pcre-8.3.7.tar.gz, openssl-1.0.1t.tar.gz, zlib-1.2.8.tar.gz, nginx1.11.1.tar.gz。
- nginx的http模块使用pcre来解析正则表达式,需要在linux上安装pcre库
- nginx使用zlib对http包的内容进行gzip,需要在linux上安装安装zlib库
- 安装openssl库,让 nginx 支持 https(即在ssl协议上传输http)
安装相关依赖:
[root@Nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y
4.2nginx编译安装
4.2.1编译安装
利用xftp导入源码包
解压后创建nginx用户组
进入解压后目录,自定义安装功能组件
编译&&安装下载
[root@Nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx \--user=nginx \ # 指定nginx 运行用户--group=nginx \ # 指定nginx 运行组--with-http_ssl_module \ # 支持https://--with-http_v2_module \ # 支持http 版本 2--with-http_realip_module \ # 支持ip 透传--with-http_stub_status_module \ # 支持状态页面--with-http_gzip_static_module \ # 支持压缩--with-pcre \ # 支持正则--with-stream \ # 支持tcp反向代理--with-stream_ssl_module \ # 支持tcp的 ssl 加密--with-stream_realip_module # 支持tcp 的透传 ip[root@Nginx nginx-1.24.0]# make && make install 编译&&安装
![](https://i-blog.csdnimg.cn/direct/0ec53c08af9f4cdea4e32ef749f03913.png)
4.2.2.验证版本及编译参数
[root@Nginx ~]# vim ~/.bash_profile[root@Nginx ~]# source ~/.bash_profile[root@Nginx ~]# nginx -V
nginx常用命令
cd /usr/local/nginx/ 进入配置的目录
./nginx 启动
./nginx -s stop 停止
./nginx -s quit 安全退出
./nginx -s reload 重新加载配置文件 如果我们修改了配置文件,就需要重新加载。
ps aux|grep nginx 查看nginx进程
4.2.3nginx的启动文件
nginx如果不做启动文件,他就无法使用系统的systemctl 只能用自己的默认开启查看关闭操作
重启则成功
4.2.4平滑升级和回滚
平滑升级:让客户感受不到任何的使用影响
- 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
- 向master进程发送USR2信号
- master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
- master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主
- 进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进程的PID存放至新生成的pid文件nginx.pid
- 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
- 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
- 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT
导入安装包编译,参考上面24版安装,步骤相似[root@Nginx nginx]# tar zxf nginx-1.26.1.tar.gz[root@Nginx nginx]# cd nginx-1.26.1/ #开始编译新版本[root@Nginx nginx-1.26.1]# ./configure --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module -- with-stream_realip_module#只要make无需要make install(注意!!!!)
#查看两个版本
[root@Nginx nginx-1.26.1]# ll objs/nginx /usr/local/nginx/sbin/nginx
#把之前的旧版的nginx命令备份
[root@Nginx ~]# cd /usr/local/nginx/sbin/
[root@Nginx sbin]# cp nginx nginx.bak
#把新版本的nginx命令复制过去
[root@Nginx sbin]# \cp -f /root/nginx/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin
#检测一下有没有问题
[root@Nginx sbin]# nginx -t
[root@Nginx sbin]# kill -USR2 48732 #nginx worker ID
#USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的
nginx
#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80
#此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进
程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
回滚:如果升级的版本发现问题需要回滚,可以重新拉起旧版本的worker
[root@Nginx sbin]# kill -HUP 38666
[root@Nginx sbin]# ps aux | grep nginx
[root@Nginx sbin]# kill -WINCH 42076
[root@Nginx sbin]# ps aux | grep nginx
[root@Nginx sbin]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.24.0 ##版本回滚完成
Date: Thu, 18 Jul 2024 08:31:51 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Thu, 18 Jul 2024 03:41:13 GMT
Connection: keep-alive
ETag: "66988ed9-267"
Accept-Ranges: bytes
5.nginx核心配置
5.1全局配置参数优化调整
5.2核心配置
基于不同的IP、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块 ngx_http_core_module实现。
5.2.1配置中的root和alias
1.root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location
新建一个PC web站点:
- 创建虚拟主机网站配置
- 写入网站信息
- 访问测试,注意在访问主机中设解析
root示例:
创建相应的目录文件
写入配置参数
但是这样写的就会导致页面访问出现404,这个原因出在root /data/web/test1 多写了一个test1.因为在定义location的时候,文件的绝对路径等于 root+location
更改如下
访问网页:www.yara.org/test1
2.alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于 location上下文,此指令使用较少
- 写入配置文件
- 把网页内容指向test1测试
注意:在这里写路径的时候如果location部分的后面要加/,那么alias后面也需要添加/(要加都加,不加都不加),否则就是404
root #给定的路径对应于location中的/uri左侧的/
alias #给定的路径对应于location中的/uri的完整路径
5.3location的详细使用
#语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
= #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立
即处理请求
^~ #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头
#对uri的最左边部分做匹配检查,不区分字符大小写
~ #用于标准uri前,表示包含正则表达式,并且区分大小写
~* #用于标准uri前,表示包含正则表达式,并且不区分大写
不带符号 #匹配起始于此uri的所有的uri
\ #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
#匹配优先级从高到低:
=, ^~, ~/~*, 不带符号
实验每一个匹配的步骤:
- 建立起想要访问的页面目录文件
- 在vhost文件写入相应的配置
- 在网页上测试
5.3.1用户认证
- 创建用户以及密码
- 建立相应目录,写入网页内容
- 写入网页配置文件内容
- 测试访问网页
5.3.2nginx自定义错误页面
在/usr/local/nginx/conf.d/vhost.conf的路径下
访问页面www.yara.org/error_page
5.3.3自定义错误日志
[root@Nginx ~]# mkdir "/var/log/nginx" -p
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
error_page 404 /40x.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
}
#重启nginx并访问不存在的页面进行测试并验证是在指定目录生成新的日志文件
5.3.4nginx中的文件检测
try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如 果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一 个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。
[root@Nginx ~]# echo "index.html is not exist" >
/webdata/nginx/timinglee.org/lee/error/default.html
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
root /webdata/nginx/timinglee.org/lee;
error_page 404 /40x.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
}
如果不存在页面, 就转到default.html页面
5.3.5长连接配置
vim /usr/local/nginx/conf/nginx.conf
如果将连接请求数改为2:
测试:
[root@node100 ~]# telnet lee.timinglee.org 80
Trying 172.25.254.200...
Connected to lee.timinglee.org.
Escape character is '^]'.
GET / HTTP/1.1 ##输入动作
HOST: lee.timinglee.org ##输入访问HOST
##输入回车
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Sat, 20 Jul 2024 12:54:16 GMT
Content-Type: text/html
Content-Length: 15
Last-Modified: Sat, 20 Jul 2024 08:49:12 GMT
Connection: keep-alive
ETag: "669b7a08-f"
Accept-Ranges: bytes
172.25.254.200
GET / HTTP/1.1 #第二次操作
HOST: lee.timinglee.org #第二次操作
#第二次操作
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Sat, 20 Jul 2024 12:54:25 GMT
Content-Type: text/html
Content-Length: 15
Last-Modified: Sat, 20 Jul 2024 08:49:12 GMT
Connection: close
ETag: "669b7a08-f"
Accept-Ranges: bytes
172.25.254.200
Connection closed by foreign host. #自动断开链接
5.3.6下载服务器的设定及优化
相关指令:
autoindex on | off; #自动文件索引功能,默为off
autoindex_exact_size on | off; #计算文件确切大小(单位bytes),off 显示大概大小(单位K、
M),默认on
autoindex_localtime on | off ; #显示本机时间而非GMT(格林威治)时间,默认off
autoindex_format html | xml | json | jsonp; #显示索引的页面文件风格,默认html
limit_rate rate; #限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位
B/s,bytes/second, #默认值0,表示无限制,此指令由
ngx_http_core_module提供
set $limit_rate 4k; #也可以通变量限速,单位B/s,同时设置,此项优级高.
实现站点下载:
#注意:download不需要index.html文件
[root@Nginx ~]# mkdir -p /webdata/nginx/timinglee.org/lee/download
[root@Nginx ~]# cp /root/anaconda-ks.cfg
/webdata/nginx/timinglee.org/lee/download
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
root /webdata/nginx/timinglee.org/lee;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
location /download {
autoindex on; #自动索引功能
autoindex_exact_size on; #计算文件确切大小(单位bytes),此为默认值,off只显示
大概大小(单位kb、mb、gb)
autoindex_localtime on; #on表示显示本机时间而非GMT(格林威治)时间,默为为off显
示GMT时间
limit_rate 1024k; #限速,默认不限速 }
}
#重启Nginx并访问测试下载页面
5.4nginx的高级配置
5.4.1状态页
为避免累赘,建立新的子配置文件status,内容如下
/usr/local/nginx/conf.d/status.conf
测试页面:
5.4.2数据压缩功能
注意:此处的压缩仅是发送时的大小会有所改变,而存储在服务器上的文件大小没有改变
此处是一个示例:
[root@Nginx ~]# mkdir /webdata/nginx/timinglee.org/lee/data
[root@Nginx ~]# cp /usr/local/nginx/logs/access.log
/webdata/nginx/timinglee.org/lee/data/data.txt
[root@Nginx ~]# echo test > /webdata/nginx/timinglee.org/lee/data/test.html #小于1k的文件测试是否会压缩
[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
@@@@省略内容@@@@
gzip on;
gzip_comp_level 5;
gzip_min_length 1k;
gzip_types text/plain application/javascript application/x-javascript text/css
application/xml text/javascript application/x-httpd-php image/gif image/png;
gzip_vary on;
#重启Nginx并访问测试:
[root@client ~]# curl --head --compressed lee.timinglee.org/data/test.html
HTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Sun, 21 Jul 2024 15:42:46 GMT
Content-Type: text/html
Content-Length: 5
Last-Modified: Sun, 21 Jul 2024 15:40:35 GMT
Connection: keep-alive
ETag: "669d2bf3-5"
Accept-Ranges: bytes
[root@client ~]# curl --head --compressed lee.timinglee.org/data/data.txt
HTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Sun, 21 Jul 2024 15:43:17 GMT
Content-Type: text/plain
Last-Modified: Sun, 21 Jul 2024 15:40:13 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: W/"669d2bdd-3e25b5"
Content-Encoding: gzip
5.4.3nginx的变量使用
1.内置变量
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
root /webdata/nginx/timinglee.org/lee;
location /var {
default_type text/html;
echo $remote_addr; #存放了客户端的地址,注意是客户端的公网IP
echo $args; #变量中存放了URL中的所有参数
#例如:https://search.jd.com/Search?keyword=手机&enc=utf-8
echo $document_root; #保存了针对当前资源的请求的系统根目录
echo $document_uri; #保存了当前请求中不包含参数的URI,注意是不包含请求的指令
echo $host; #存放了请求的host名称
echo $http_user_agent; #客户端浏览器的详细信息
echo $request_filename; #当前请求的资源文件的磁盘路径
echo $scheme; #请求的协议
echo $http_cookie; #客户端的所有cookie信息
echo $cookie_key2;
echo $http_Accept;
}
}
[root@client ~]# curl -b "title=lee;key1=lee,key2=timinglee"
"lee.timinglee.org/var?search=lee&&id=666666"
172.25.254.20
search=lee&&id=666666
/webdata/nginx/timinglee.org/lee
/var
lee.timinglee.org
curl/7.29.0
/webdata/nginx/timinglee.org/lee/var
http
http://lee.timinglee.org/var?search=lee&&id=666666
title=lee;key1=lee,key2=timinglee
timinglee
*/*
2.自定义变量
set $name yara;
echo $name;
set $my_port $server_port;
echo $my_port;
echo "$server_name:$server_port";
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name xu.yara.org;
root /webdata/nginx/yara.org/xu;
location /var {
default_type text/html;
set $name yara;
echo $name;
set $web_port $server_port;
echo $web_port;
}
}
测试输出
[root@client ~]# curl xu.yara.org/var
xu
80
6.nginx的反向代理功能及动静分离
反向代理死代理将客户端的请求分别发送给某个服务器。nginx服务器是服务端搭建的,代表的是服务端的利益。
实验1:
1.另外两台主机172.25.254.10/20
2.关闭防火墙,关闭selinux
3.写入网页内容10:172.25.254.10 20:20,打开httpd服务,nginx测试访问
4.location中实现反向代理单台服务器
实验2:
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速 度。降低原来单个服务器的压力
server {
listen 80;
server_name www.yara.org;
location / {
proxy_pass http://172.25.254.10;
}
location ~ /static {
proxy_pass http://172.25.254.20:8080;
}
}
#后端web服务器必须要有相对于的访问URL
[root@apache20 ~]# mkdir /var/www/html/static
[root@apache20 ~]# echo static 172.25.254.20 > /var/www/html/static/index.html
[root@apache10 ~]# echo 172.25.254.30 > /var/www/html/index.html
#重启Nginx并访问测试:
[2024-07-25 17:09.35] ~
➤ curl www.yara.org/static/
static 172.25.254.20
[2024-07-25 17:09.39] ~
➤ curl www.yara.org
172.25.254.30
7.负载均衡
待完善。。。
8.二次开发
8.1openresty
实现了 OpenResty 这个高性能服务端解决方案
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方 模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服 务和动态网关。
OpenResty 由于有功能强大且方便的的API,可扩展性更强,如果需要实现定制功能,OpenResty是个不错的选择
8.2编译安装
[root@Nginx ~]#dnf -yq install gcc pcre-devel openssl-devel perl
[root@Nginx ~]#useradd -r -s /sbin/nologin nginx
[root@Nginx ~]#cd /usr/local/src
[root@Nginx src]#wget https://openresty.org/download/openresty-1.17.8.2.tar.gz
[root@Nginx src]#tar xf openresty-1.17.8.2.tar.gz
[root@Nginx src]#cd openresty-1.17.8.2/
[root@Nginx openresty-1.17.8.2]#./configure \
--prefix=/apps/openresty \
--user=nginx --group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with_http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module
--with-pcre --with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
[root@Nginx openresty-1.17.8.2]#make && make install
[root@Nginx openresty-1.17.8.2]#ln -s /apps/openresty/bin/* /usr/bin/
[root@Nginx openresty-1.17.8.2]#openresty -v
nginx version: openresty/1.17.8.2
[root@Nginx openresty-1.17.8.2]#openresty
[root@Nginx openresty-1.17.8.2]#ps -ef |grep nginx
[root@Nginx ~]#curl 10.0.0.18