Nginx 模块化管理机制
-
Nginx 是一个高性能web和反向代理服务器,尤其是在激烈的Web服务器竞争领域中能够依然保持很好的这个发展势头,并且在现在的众多企业中得到一个广泛的应用,这一切其实跟Nginx架构设计是分不开的
-
另外高度模块化的设计也很好的使Nginx保持了高可用性和高可靠性,对于高度模块化,是Nginx一个架构基础
-
对Nginx服务器来说,它能够分解为多个模块,每个模块其实只实现了自身的某一个特定的功能,而且模块与模块之间遵循高内聚低耦合这样一个开发设计原则
对于整体模块分类来说,大致可以分为以下几个方向
1 )核心服务器模块
- 对核心服务器模块来说,它提供了 Nginx 正常运行的一些必不可少的一些模块
- 包括提供了错误日志记录的errorlog模块,包括提供配置文件解析的conf模块,包括提供事件驱动机制的event模块,epoll 是一个事件处理机制, 包括一些进程管理等等一些核心功能,都是封装在核心功能模块中的
2 ) HTTP 模块
- 标准HTTP模块提供了和HTTP解协议的一种解析相关的功能,比如说像端口配置,网页编码,字符如何被处理,包括像我们的HTTP的响应头的设置, 它也有一个核心模块 ngx_http_core 模块
- 还有一个就是可选的HTTP模块,主要用于扩展标准的一个HTTP的一个功能, 让Nginx能处理一些像特殊的这种服务
- 比如提供对于 SSO的支持,对于现在这种HTTPS协议来说是必不可少的, 还有解析gzip, 在传输HTTP请求报文和响应报文的时候,尤其是响应报文的时候,它会首先要求你进行压缩,可以有效的减少网络带宽的占用
- 还有其他一些各种模块,比如说像 Flash 模块的支持,多媒体传输模块的支持,都是一些可选的HTTP模块
3 )邮件服务
- Nginx 是能够支持反向代理邮件服务器的, 那对于mail模块的支持来说,它主要是用于支持Nginx的邮件服务协议
- 包括像pop3协议,包括像SMTP协议等等的支持,在mail模块中,它也有一个核心模块 ngx_mail_core 模块
4 ) 第三方模块
- 其实第三方模块是为了扩展Nginx 服务器的一个应用
- 很多情况下是为了完成开发的所自定义的一些功能
- 比如说 rds_json_nginx 这样一些模块,主要是提供于json的一些支持。
还有像 lua_nginx 这个模块,开发者可以利用 lua 脚本来进行二次开发支持
5 )总结
-
对Nginx来说,高度模块化的设计, 有利于方便的开发,另外对于构建高性能的Web 服务器和反向代理服务器来说是最核心的设计思想
-
高度模块化设计之后,有利于把功能拆分出来,尽可能的减少模块与模块之间的影响,全部耦合在一块的话,一个模块的问题可能引发另外一些模块的问题,导致整个 Nginx 不可用,模块化设计之后,就可以很大程度避免这样一些问题
-
针对 Nginx 整个体系结构来说,它的内部结构其实是有核心模块和一系列的功能模块组成的,比如说最核心的内就是一个core模块
-
Nginx 这个core模块它实现了一个底层的一个通信协议,为其他模块和Nginx进程,构建了一个底层的运行环境, 同时也是其他各个模块沟通协作的一个基础
-
在核心模块之上,它最核心的两个功能,一个是HTTP功能 和 mail 功能
-
除此之外,它更外面的一些模块,并不是只有这些模块,大概分为这几种类型,比如说像那种有一种类型的模块,就是这种 event_module 模块,它这种其实就是独立操作系统的一个事件处理机制的模块,它提供了对于各具体事件的一个处理, 对于如何利用这些模块来处理事件, 依赖于操作系统, 主要处理跟操作系统,底层相关的一些event相关的一个模块
-
还有一个 phrasehandler模块,这个模块主要是负责处理客户端请求并产生响应内容的一个模块, 比如说可以对客户端的一个静态页面请求处理,并对响应后的磁盘文件做内容输出的时候做设定的一个模块
-
filter模块,就是一个过滤模块主要是对输出内容进行一个处理, 比如说进行修改,或者是对URL进行替换, 定义
-
upstream模块, 就是实现了反向代理的功能,只要有这个模块 Nginx 就能够将一个客户端的用户请求真正的转发到一个后端的一个服务器,可能是具体的应用服务器,从而它还能够实现在后端服务器结束有具体的响应内容之后,从后端的服务器上读取响应的内容,从而继续封装返回给客户端,对于upstream模块来说,其实也是一种特殊的handler模块,只不过,这个响应模块它不是自己来处理的而从后端服务器上读取的
-
extend module 扩展的一些模块,允许开发者自定义开发需要的一些模块,然后把它加入到Nginx中
-
load badancer 模块,它其实就是一个负载均衡,实现特定的算法,其实是跟upstream结合起来使用的一个模块
Nginx 编译安装常用配置参数
1 )常用配置参数
参数 | 含义 |
---|---|
–prefix | 指定安装的目录, 总的父目录 |
–user | 运行nginx的worker子进程的属主 |
–group | 运行nginx的worker子进程的属组 |
–pid-path | 存放进程运行pid文件的路径 |
–conf-path | 配置文件nginx.conf的存放路径 |
–error-log-path | 错误日志error.log的存放路径 |
–http-log-path | 访问日志access.log的存放路径 |
–with-pcre | pcre库的存放路径,正则表达式会用到 |
–with-zlib | zlib库的存放路径,gzip模块会用到 |
- –prefix 是所有的父目录,下面一些path不指定,都会引用这个父目录取一个默认值
- –with-pcre 支持正则表达式的库,需要匹配正则就要安装它
- 这些模块不编译也没有关系,编译后可以正常使用相关功能
- 内置参数默认原色
- 显示加上,默认不内置 --with
- 显示去掉,默认内置
2 )定制编译示例
-
现在源码包中有如下源码包,$
cd /opt/source/ && ll
-
解压
- $
tar xf zlib-1.2.11.tar.xz
- $
tar xf pcre-8.43.tar.gz
- $
tar xf nginx-1.16.1.tar.gz
- $
-
进入nginx目录 $
cd nginx-1.16.1 && ll
-
编译安装
./configure --prefix=/opt/nginx --conf-path=/opt/nginx/conf/nginx.conf--user=nginx--group=nginx--pid-path=/opt/nginx/pid/nginx.pid--error-log-path=/opt/nginx/logs/error.log --with-pcre=/opt/source/pcre-8.43 --with-zlib=/opt/source/zlib-1.2.11 --with-http_ssl_module --with-http_image_filter_module --with-http_stub_status_module--http-log-path=/opt/nginx/logs/access.log
-
如果出现
./configure: error: C compiler cc is not found
- 安装:$
yum install gcc gcc-c++
解决,需要一定时间
- 安装:$
-
如果出现:
./configure: error: SSL modules require the OpenSSL library.
- 安装:$
yum install openssl openssl-devel
- 安装:$
-
如果出现:
./configure: error: the HTTP image filter module requires the GD library.
- 安装:$
yum install gd gd-devel -y
- 安装:$
-
每次出现上述中断,则重新执行上述命令
-
直到出现如下信息,则配置成功
-
使用 $
make
再对nginx源码进行编译 -
之后,使用 $
make install
进行安装 -
启动nginx: $
/opt/nginx/sbin/nginx
- 如果启动出问题,查看防火箱
- $
systemctl stop firewalld
- $
systemctl disable firewalld
- $
- 查看selinux 是否关闭
- $
setenforce 0
临时关闭 - 永久关闭 $
vim /etc/sysconfig/selinux
SELINUX=disabled
- $
- 如果启动出问题,查看防火箱
Nginx 配置文件结构
1 )结构
-
主要是三大模块,第一个是events模块,第二个是http模块,第三个是server模块
-
当然最上面还有一个叫main模块(用来定义全局的设置), 比如说 nginx 服务运行的用户是谁,属主是谁,应该启动几个worker进程
-
对events模块,它通常是配置影响nginx服务器与用户的网络连接的,比如说配置 linux 或者是 nginx 事件驱动模型处理有关的指令
-
对于 http段,主要就是设定http的核心指令的一个段,比如说可以嵌套多个server,这个server可能对应的是一个虚拟主机,比如说,现在有三个不同域名需要去部署不同的网站服务,对于不同的网站服务来说,可以将它部署到同一台nginx服务器上, 只要在server中定义对应的域名,就可以解析到对应的server 段,所以,server端是配置虚拟主机的一个相关参数,在http段中可以有多个server段
- http 段嵌套了多个 server,同时,需要配置一些反向代理,缓存,甚至是日志定义等绝大多数功能和第三方模块的配置的时候,会在http段中做书写
- 比如说想要定义反向代理的配置,一个网站是有静态请求和动态请求的, 对于在server中,也就是定义的这样一个虚拟主机中,动态请求可以直接找到对应的location (url)
- 最后就是 location段,它是嵌套在server中的,它只能用在这个server中,主要配置一个请求的路由,以及各种页面的一个处理情况, location可以理解为一个 url, 比如说请求某一台服务器的时候,我们可以写一个域名, 后面加一个路径,对应磁盘文件上的一个映射路径,也是这个静态文件的一个映射路由
2 ) 示例
user nginx;
group nginx;
....
....events {........
}http {........server {location path {........}........}server {location path {........}........}........
}