接下来我们介绍编译 Nginx 的过程。那么实际上安装 Nginx 有两种方法,除了编译以外,我们还可以直接用操作系统上自带的一些工具,比如说 yarn, 比如说 apt-get 直接去安装Nginx。但是直接安装 Nginx binary有个大问题,因为就像我之前所说的 Nginx 的二进制文件啊,它是会把模块直接编译进来的。Nginx 的官方模块并不是每一个默认都会开启的。如果你想添加第三方的模块,你必须通过编译 Nginx 这样一种方式,才能把第三方的这样的强大的生态圈里的功能添加到我们的 Nginx 中。
    编译Nginx主要分为以下六个部分。
    image.png
    首先我们需要下载 Nginx,从 nginx.org 这个网站上去下载就可以了。接下来我会详细介绍从我们下载的Nginx 的源代码中每一个目录。是做什么用的?第三步,按照unix系统的惯例,我们首先需要执行config这个文件,这个文件会有很多中间选项,我们会详细的介绍拷贝的文件会生成很多中间文件,这里的中间文件我也会做一个简要的介绍。接下来我们开始编译 Nginx,编译完 Nginx 以后实际上也会有一些中间文件。最后我们开始安装 Nginx,首先我们需要下载 Nginx,
    打开 nginx.org,这个时候在这个页面中我们找到右下角的 download 的,
    image.png
    点击 download。
    image.png
    我们这时候会发现 Nginx 有两类版本,一个叫 Mainline 版本,一个叫叫 stable 版本,也就是说最新的一些主要功能都会在 Mainline。我们看最新已经到了 1.15.5。而 stable 版本呢是 1.14.0。好,我们先选择 Nginx 1.14.0 的下载链接,复制链接地址,接下来我们进入 linux 中。
    image.png
    首先我们要下载这个最新的版本。

    1. wget http://nginx.org/download/nginx-1.18.0.tar.gz

    好。当我们下载完 Nginx 压缩包以后,首先我们解压这个压缩包。

    1. tar -xzf nginx-1.18.0.tar.gz

    接着我们进入解压后的源码版本,

    1. cd nginx-1.14.0

    源码目录里面,可以看到源码目录里面这些目录大概是什么意思,
    image.png
    我做一个简单的解释啊。首先我们从 nginx 源码目录开始看起,从上往下看啊第一个目录叫 auto 目录,auto 目录里面有什么样的目录结构呢?我们可以进去看一下。
    image.png
    auto 目录里面有四个子目录,像 cc,它是用于编译的. 还有 lib 库。还有对所有的操作系统的判断在os目录里面,其他所有文件都是为了辅助config脚本执行的时候去判定我们的 nginx 支持哪些模块,当前的操作系统有什么样的特性可以供 nginx 使用。
    image.png
    CHANGES 文件就是 nginx 每一个版本中提供了哪些特性和bug fix。我们可以简单浏览一下。
    image.png
    我们可以看到每一个版本,其中会有feature, Bugfix, Changes 这三种特性在里面。CHANGES.ru 则是因为作者是一个俄罗斯人,所以它有一个俄罗斯版本语言的 CHANGES 文件。conf 文件呢是一个示例文件,也就是我们把 nginx 安装好以后。为了方便运维去配置,那么会把config目录里面的示例文件拷贝到安装目录。configure 脚本是一个用来生成中间文件,执行编译前的一个必备动作。contrib 这个目录呢它提供了两个 破脚本? 和 vim 的一个工具。比如我们在没有使用 vim 工具使用 vim 打开 nginx 配置文件,会发现它的色彩没有什么变化。
    image.png
    我们可以看到 nginx 的语法没有在 vim 中。这个时候我们需要把 contrib vim 目录里面的所有的文件拷贝到我们自己的目录中。

    1. cp -r contrib/vim/* ~/.vim/

    好拷贝完以后我们再来看一看。
    image.png
    我们可以看到所有的 nginx 的配置的语言语法可以很好的显示在 nginx config文件中啊。
    接下来看 html 这个目录。这里面提供了两个标准HTML文件。
    image.png
    一个是发现 500 错误的时候可以重定向到这个文件。另外是一个默认的 nginx 欢迎界面 index.html。
    那么 man 目录。这是linux对这个 nginx 的一个帮助文件,我们可以简单的看一下。

    1. cd man/
    2. man ./nginx.8

    打开以后,我们可以看到最基本的 nginx 的帮助和配置。
    image.png
    最后我们看一下 nginx 源代码,在 src 目录。也就是说它的框架都在这个目录里面的源代码中。
    image.png
    接下来我们开始进行编译。编译前我们可以先看一下config支持哪些参数。

    1. ./configure --help | more

    这里主要分为几个大块。
    image.png
    第一大块就是我们来确定 nginx 执行中他会去找哪些目录下的文件作为他的辅助的一些文件,比如如果我们用动态模块,那么这时候 —modules-path 就会产生作用。还有像 —lock-path 来确定我们的 nginx.log文件放在哪里。如果没有任何变动的话,我们只需要指定 —prefix 这个参数就可以了。所有的其他的这些文件会在 prefix 目录下面建相应的文件夹。
    第二类参数主要是确定使用哪些模块和不使用哪些模块,它的前缀通常是 —with 和 —without。我们可以看到,通常前面需要我们加 with,比如说 —with-http_ssl_module 或者 —with-http_v2_module 的时候,通常需要我们主动加 with 模块的时候,意味着这个模块默认是不会编译进 nginx 的。而模块名带 —without,比如说 —without-http_charset_module。这意味着默认这个模块会编译进 nginx 中。如果你不加这个参数,它是编译进的。你加了这个参数是把它移出默认的 nginx 模块中。
    最后我们看第三类模块。
    image.png
    第三类参数,第三类参数指定了 nginx 编译中需要的一些特殊的参数。比如说我用 gcc 编译的时候需要加一些什么样的优化参数,或者说我需要打印 debug 级别的日志,以及我需要加一些第三方的模块。
    好,下面我们开始实际编译次 nginx。首先用它的默认参数啊。

    1. ./configure --prefix=/home/geek/nginx

    我们指定了 nginx 的安装目录是在 home/geek/nginx 目录下。如果没有任何报错,那么 nginx 就已经编译成功了。这个时候所有 nginx 的配置的特性,以及 nginx 运行时的目录都会列到最下方。在config执行完成以后,我们会看到它会生成一些中间文件。中间文件会放在 objs/ 这个文件夹下。
    这里最重要的是会生成一个文件叫 ngx_modules.c 。它决定了接下来我们执行编译时候。有哪些模块会被编译进 nginx。这里我们简单浏览一下。

    1. vim ngx_modules.c

    image.png
    好我们可以看到所有的 nginx module,每一行 extern ngx_module_t,后面就是一个 nginx 模块。所有的被编译进当前的 nginx 中的模块都会列在这里,他们最后就会形成一个叫 ngx_modules[] 这样一个数组。
    image.png
    接下来我们执行 make 编译。好编译完成以后,如果没有任何错误,这个时候我们可以看到就生成了大量的中间文件,以及我们最终的运行的 nginx 二进制文件。可以在 objs/ 这个目录看到。那么为什么我们要知道 nginx 的目标文件是放在这里的呢?因为如果我们是做 nginx 版本升级,这个时候我们不能执行 make install,还需要从这里把目标文件 nginx 拷贝到安装目录中。C语言编译时生成了所有的中间文件,都会放在 objs/src 目录。如果我们使用了动态模块,那么动态模块编译会生成S动态文件也会放在同样 objs/ 这个目录下。好。最后我们进行 make instll。首次安装时可以使用这个命令。在安装完成以后,我们去到 prefix 指定的安装目录中,可以看到以下目录,这里最主要的 nginx 的二进制文件就在 sbin/ 目录下。决定 nginx 的功能的配置文件在 config 目录下,access.log 还有 error.log 在 logs/ 目录下。我们可以看到在 conf/ 的目录下,所有的文件正是在源代码中那个config目录所有的文件拷贝了一份过来,其中的内容也是完全相同的。
    以上就是编译 nginx 的主要步骤,大家可以在自己的电脑上尝试一下。