2

编译出适合自己的Nginx

Nginx的安装方式

安装Nginx有两种方法,除了编译以外,还可以直接用操作系统上自带的一些工具,比如yum、apt-get

但是直接安装Nginx的二进制文件会有个问题,因为Nginx的二进制文件会把模块直接编译进来。Nginx的官方模块,并不是每一个都默认开启的,如果你想添加第三方的Nginx模块,你必须通过编译Nginx这种方式才能把第三方的模块添加到Nginx中

编译安装Nginx过程

下载Nginx

Nginx下载官网

进入官网之后,点击右下角的download
image.png

可以发现Nginx有两类版本,一个是Mainline version(最新版本)、一个是Stable version(稳定版本)。我们通常会选择下载稳定版本(这里最新的是1.18.0)
image.png

选择一个稳定版本,复制下载链接,通过wget的方式下载下来即可,下载下来之后是一个压缩包,通过下边命令解压即可

tar -xzf nginx-1.18.0.tar.gz
各目录介绍

进入解压之后的源码目录中,可以看到如下结构
image.png

  • auto目录
    image.png

其中cc目录是用于编译的,还有lib库,os目录是对所有的操作系统进行判断的。其它的文件都是为了在configure脚本执行的时候,去判定Nginx支持哪些模块,当前操作系统有什么样的特性可以供Nginx使用

  • CHANGES文件

CHANGES文件记录的是每个Nginx版本中提供了哪些特性和bugfix,部分内容截图
image.png

  • CHANGES.ru文件

因为Nginx作者是一个俄罗斯人,所以这是一个俄罗斯语言的CHANGES文件

  • conf目录
    image.png

它是一个示例目录,就是把Nginx安装完成以后,为了方便运维去配置,会把conf中的示例文件拷贝到安装目录

  • configure脚本

configure脚本是一个用来生成中间文件,执行编译前的必备动作

  • contrib目录
    image.png

它提供了两个脚本和vim的一个工具,比如在没有使用它提供的vim工具时打开Nginx的配置文件,会发现色彩没什么变化(可以看到Nginx配置文件的语法,没有在vim中高亮的显示)
image.png

然后现在将contrib目录中下的所有vim文件拷贝到本地安装的vim目录中

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

然后再打开Nginx的配置文件
image.png

  • html目录
    image.png

该目录中提供了两个标准的html文件,一个是发现500错误的时候可以重定向到50x.html文件,另外一个是默认的Nginx欢迎界面

  • man目录

man目录是linux对Nginx的帮助文件(打开命令:man ./nginx.8)
image.png

  • src目录
    image.png

src目录是Nginx的源代码目录

Configure 编译

编译之前,可以看一下Configure支持哪些参数

./configure --help | more

image.png

它的参数里边主要分为几个大块:

  1. 第一类,确定Nginx执行中,它会去找哪些目录下的文件作为它的辅助文件。比如需要动态模块,此时 --modules-path=PATH 就会产生作用。如果没有任何变动的话,只需要指定 --prefix=PATH 这个参数就可以了,所有的其它的文件都会在prefix指定的目录下面建相应的文件夹
  2. 第二类,主要是确定使用和不使用哪些模块,它的前缀通常是 --with- 和 --without- 。比如说 --with-http_ssl_module 、 --with-http_v2_module,通常需要我们主动加--with模块的时候,意味着该模块默认是不会被编译进来的。而编译中需要使用 --without- ,意味着默认它会被编译进Nginx,如果你不加这个参数,他是会被编译进去,如果加了--without- ,它就不会被编译进去
  3. 第三类,指定了Nginx编译中需要的一些特殊的参数,比如用gcc编译的时候,需要加一些什么样的优化参数,或者说需要打印dubug级别的日志

image.png

下边就使用默认参数编译一下Nginx,下边指定了Nginx的安装目录

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

如果在执行的过程中没有报错,就意味着Nginx编译成功了。此时Nginx所有配置的特性,以及运行时的目录都会列在最下边
image.png

在上边编译完成之后,会生成一些中间文件

中间文件介绍

编译完成之后,生成的中间文件,会放在解压之后的nginx目录下的objs目录下
image.png

objs目录下文件结构
image.png
这里边最重要的是会生成一个文件叫ngx_modules.c,它决定了接下来执行编译的时候,有哪些模块会被编译进Nginx
image.png

每一行extern ngx_module_t 后边就是一个ngxin模块,所有会被编译进当前Nginx中的模块,都会被列在上边,他们最终会形成一个叫 *ngx_modules[]的指针数组

然后就可以执行make编译了。编译完成之后,会生成大量的中间文件,以及最终运行的Nginx二进制文件,可以在objs目录中看到
image.png

为什么需要知道Nginx的目标文件是放在这里的?

因为如果我们要做Nginx版本升级,此时不能执行make install,而是从这里把目标文件拷贝到安装目录中

C语言编译时生成的所有中间文件都会放在objs下的src目录下,如果我们使用了动态模块,编译时会生成动态文件,这个动态文件也会放在objs目录下。接下来就可以执行make install(首次安装时执行该命令)

执行完之后,就可以在--prefix执行的路径下看到如下结构
image.png
这里边最主要的Nginx二进制文件就在sbin目录下,决定Nginx功能的配置文件在conf目录下

可以看到在conf目录下,所有的文件就是在源代码中那个conf目录下所有文件copy过来了一份,内容也是一模一样的

以上便是Nginx的全部编译安装过程

Nginx配置文件通用语法介绍

  • Nginx配置文件中,已经指定了它包含了哪些模块,但每一个模块都提供独一无二的配置语法,这些所有的配置语法,会遵循同样的语法规则
  • 配置文件由指令与指令块构成
  • 每条指令以;分号结尾,指令与参数间以空格分隔
  • 指令块以{}大括号将多条指令组织在一起
  • include语句允许组合多个配置文件以提升可维护性
  • 使用#符合添加注释,提高可读性
  • 使用$符号使用变量
  • 部分指令的参数支持正则表达式

image.png

在http这个指令块下,通常有四个块:

  1. http
  2. server
  3. location
  4. upstream

http大括号下边就表示,里边所有的指令,都是由http模块去解析执行的,一个非http模块是没办法解析这里边的指令的。upstream则是表示上游服务,当Nginx需要与tomcat等其它服务交互的时候,可以定义一个upstreamserver则是对应一个域名,或者一组域名。location则是一个url表达式


书旅
125 声望32 粉丝