前言

早期Nginx 的诞生是为了解决Web中出现的C10K 问题,即服务器如何承受一万的并发量。当时流行的Web server为Apache Httpd,而Httpd的IO模型使用的select()模型,这种IO模型为端口复用模型,他的并发量只能达到1024。而Nginx的使用了一种epoll的IO模型,这种模型使用事件驱动机制极大的提高了并发量。当然到现今为止,Nginx的功能不仅仅提供web服务。

一. Nginx架构

1. Nginx进程架构

Nginx系列--01基本架构及其安装

由上图可知,nginx的进程模型分为两级,一个master进程和多个工作进程。master进程用于负载加载和分析配置文件、管理worker进程、平滑升级。woker进程处理并响应用户请求,worker进程在响应用户请求可以通过异步、事件驱动和非阻塞多种方式;与缓存相关的进程用于加载,管理缓存对象。

平滑升级:master/worker进程的工作模式使得能Nginx能够平滑升级。升级时我们先关闭master进程,由于负责处理请求的是work进程,所以并不影响业务。此时我们在启动升级后的master,旧版本的work进程此时不再接受新请求,完成正在处理的后会关闭。升级后的master进程会启动升级后的work进程。这样就达到了平滑升级

2. Nginx高度模块

Nginx的每个功能由具体模块提供,是高度模块化的,但其模块早期不支持DSO机制;近期版本(1.10及其以上)支持动态装载和卸载。Nginx模块主要分为分类:
1). 核心模块:core module
2). 标准模块:根据功能不同分为三类

  • HTTP modules:用于配置HTTP服务,这里面的模块分为Standard HTTP modules和Optional HTTP modules,Standard modules本身就有有,而Optional模块需要我们在编译时指定参数才会有。而第三方模块在编译时要指向引用此模块。
  • Mail modules:用于Mail相关配置
  • Stream modules:用于Stream相关配置

3). 第三方模块:用于扩展Nginx https://www.nginx.com/resources/wiki/modules/ 此连接可以看到目前支持的第三方模块。

3. Nginx功能

1). 静态的web资源服务器:图片服务器或js/css/html/txt等静态资源服务器
2). 结合FastCGI/uwSGI/SCGI等协议反代动态资源请求
3). http/https协议的反向代理
4). imap4/pop3协议的反向代理:用于处理邮件协议,此处不涉及
5). tcp/udp协议的请求转发: 使用stream模块

这些功能除了imap4/pop3协议的反向代理其他的都会通过模块的方式在后续的文章中一一介绍。

二. Nginx的安装

我们将会使用两种方式来安装Nginx,一种是通过yum安装,一种使用源码安装。
操作系统版本:

  1. CentOS7.2 处于最小化安装。
  2. IP为 192.168.239.131
  3. 清空iptables规则:~]# iptables -F
  4. 禁用selinux:~]# setenforce 0

1. YUM源安装Nginx

一般没有什么特许要求我们都是通过信任的yum源进行安装

1)配置yum源

Nginx在EPEL源中,我们使用的是阿里的镜像。
~]# vim /etc/yum.repos.d/epel.repo

[epel]
name=CentOS-$releasever EPEL
baseurl=http://mirrors.aliyun.com/epel/$releasever/$basearch
gpgcheck=0

2)yum安装Nginx

~]# yum install -y nginx
查看安装包安装了哪些文件
~]# rpm -ql nginx | less
Nginx系列--01基本架构及其安装

Nginx系列--01基本架构及其安装

启动nginx服务
~]# systemctl restart nginx
Nginx系列--01基本架构及其安装

访问nginx服务
Nginx系列--01基本架构及其安装

看到此页面说明nginx启动成功

2. 源码编译Nginx

一般我们都会使用yum安装,因为它更便于升级管理。而我们之所以对源码进行编译是因为版本出现了大的漏洞,或者我们需要第三方模块提供的功能。

1)安装编译开发工具(包组)

~]# yum groupinstall -y "Desktop Platform Development" "Server Platform Development" "Development Tools"
查看yum源中的包组可以使用 yum grouplist 命令,如果使用此命令查看的包组名是中文那么在安装是要使用中文安装。

2)安装依赖的包

~]# yum install -y install pcre-devel zlib-devel openssl-devel
pcre:perl 兼容的正则表达式库,他为nginx 的核心和rewrite模块提供正则表达式功能
zlib:用于Nginx为Gzip模块提供头部压缩功能
openssl:为Nginx SSL模块提供HTTPS协议支持

3)下载源码包

我们编译最新Nginx版本
~]# wget http://nginx.org/download/nginx-1.13.8.tar.gz (如果没有安装wget可以使用 yum install -y wget 安装)
~]# tar xf nginx-1.13.8.tar.gz -C /opt
~]# cd /opt
opt]# ln -sv nginx-1.13.8 nginx
~]# cd nginx

说明: 之所以创建软连接是因为后期版本的升级时,我们只需要修改软连接即可。而且一旦新版本有问题我们只需修改软连接指向就可以回退到老版本。

4)编译之普通版

C语言编写的程序是有多个原文件组成的,而且文件与文件之间具有依赖关系。所以我们需要特定的项目管理工具对其进行管理,使得程序在编译的时候可以根据依赖关系依次进行。在Linux平台上常用的项目管理工具为GUN make,make在编译时会根据其makefile配置文件中定义的次序对其进行编译。
makefile文件如何生成: 在程序编写完成后,会使用autoconf为程序代码生成一个脚本文件configure,这个脚本文件会收集当前系统的开发环境中所依赖的各组件的版本,和其依赖的环境是否满足,最后会更具makefile.in生成makefile文件
makefile.in文件如何生成: 在程序编写完成后,会使用autoconf为程序代码生成一个makefile模板文件makefile.in

  • ./configure
    运行configure命令时一定要处于其所在的父目录下。
    ~]# cd /opt/nginx
    ~]# ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/etc/nginx.conf --pid-path=/usr/local/nginx/run/nginx.pid --lock-path=/usr/local/nginx/run/nginx.lock --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-http_dav_module --with-threads --with-file-aio

--prefix:编译完成后,程序的安装目录。默认在/usr/local
--conf-path: 指明配置文件的安装文件路径,如果不指明则在--prefix 指明的目录下
--pid-path:主程序的pid文件路径,如果不指明则在--prefix 指明的目录下
--lock-path:锁文件路径,如果不指明则在--prefix 指明的目录下
--error-log-path:nginx错误日志文件路径,如果不指明则在--prefix 指明的目录下
--http-log-path:nginx访问日志路径,如果不指明则在--prefix 指明的目录下
--user,--group:指明程序运行的用户,默认是nobody,配置文件中使用user指令指明
--with-http_ssl_module,--with-http_v2_module, --with-http_stub_status_module,--with-dav-module:启动对应的模块功能,使用--with-XXX_module的说明默认没有编译,需要显示说明编译。使用--without-XXX_module的表明默认会编译,但如果你不想使用此功能模块,可以使用此选项显示表明不编译。可以使用--help查看有哪些选项。
Nginx系列--01基本架构及其安装

--with-threads:使用线程池功能
--with-file-aio:启用文件一步IO功能

下图为configure运行结果
Nginx系列--01基本架构及其安装

可以看到没有报任何错,在configure当前目录下我们看到生成了一个Makefile文件。
Nginx系列--01基本架构及其安装

  • 使用make工具编译源码
    make命令会根据生成的Makefile文件编译源码,运行此命令是处于makefile的父目录下。
    nginx]# make

  • 将编译好的文件安装到指定目录
    nginx]# make install
    在configure时我们通过--prefix指明安装在/usr/local/nginx目录下。有些文件是在nginx启动后才生成的,所以此处看不到。如下图:
    Nginx系列--01基本架构及其安装

  • 运行nginx
    Nginx系列--01基本架构及其安装
    运行nginx程序时发现报错,查找资料发现是因为没有启动程序使用的用户,我们指定运行work进程的用户为nginx。
    Nginx系列--01基本架构及其安装
    我们发现80端口已经监听,访问nginx页面
    Nginx系列--01基本架构及其安装
    由上图可知nginx使用正常。

5)编译之添加第三方模块

https://www.nginx.com/resources/wiki/modules/ 可以看到可用的第三方模块。此次我们会使用阿里巴巴的nginx-http-footer-filter模块进行
Nginx系列--01基本架构及其安装

  • 下载nginx-http-footer-filter
    ~]# wget https://github.com/alibaba/nginx-http-footer-filter/archive/1.2.2.zip
    ~]# cp 1.2.2.zip /opt
    opt]# unzip 1.2.2.zip
    目录结构为:
    Nginx系列--01基本架构及其安装
    opt]# cd nginx
  • 编译
    记得清理原有编译结果,在重新展开nginx tarball
    ~]# rm -rf /usr/local/nginx
    ~]# rm -rf /opt/nginx*
    ~]# tar xf nginx-1.13.8.tar.gz -C /opt
    ~]# cd /opt
    opt]# ln -sv nginx-1.13.8 nginx
    ~]# cd nginx
    正式编译:
    nginx]# ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/etc/nginx.conf --pid-path=/usr/local/nginx/run/nginx.pid --lock-path=/usr/local/nginx/run/nginx.lock --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-http_dav_module --with-threads --with-file-aio --add-module=../nginx-http-footer-filter-1.2.2

  • 修改配置文件
    ~]# vim /usr/local/nginx/etc/nginx.conf
    Nginx系列--01基本架构及其安装
  • 启动服务
    ~]# /usr/local/nginx/sbin/nginx start

  • 页面访问nginx服务
    Nginx系列--01基本架构及其安装

可以看到配置生效了。
此模块的详细用法请看链接https://github.com/alibaba/nginx-http-footer-filter/tree/1.2.2

5)编译之支持动态装卸载模块

前期的一些步骤就省略了
~]# ./configure --help
Nginx系列--01基本架构及其安装

~]# ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/etc/nginx.conf --pid-path=/usr/local/nginx/run/nginx.pid --lock-path=/usr/local/nginx/run/nginx.lock --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-http_dav_module --with-threads --with-file-aio --with-stream=dynamic

查看生成的目录
Nginx系列--01基本架构及其安装
我们如果要想使用此模块就要使用load_module加载对应模块,才能使用其模块中的指令。如果我们想要将第三方库编译成动态装卸载怎么办?只需将--add-module 改为--add-dynamic-module即可

后记

接下来将会整理Nginx的配置文件的使用,以及常用模块的使用。

参考资料

https://www.nginx.com/resources/admin-guide/installing-nginx-open-source/