编译出适宜本人的Nginx

Nginx的装置形式

装置Nginx有两种办法,除了编译以外,还能够间接用操作系统上自带的一些工具,比方yum、apt-get

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

编译装置Nginx过程

下载Nginx

Nginx下载官网

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

能够发现Nginx有两类版本,一个是Mainline version(最新版本)、一个是Stable version(稳固版本)。咱们通常会抉择下载稳固版本(这里最新的是1.18.0)

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

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

进入解压之后的源码目录中,能够看到如下构造

  • auto目录

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

  • CHANGES文件

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

  • CHANGES.ru文件

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

  • conf目录

它是一个示例目录,就是把Nginx装置实现当前,为了不便运维去配置,会把conf中的示例文件拷贝到装置目录

  • configure脚本

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

  • contrib目录

它提供了两个脚本和vim的一个工具,比方在没有应用它提供的vim工具时关上Nginx的配置文件,会发现色调没什么变动(能够看到Nginx配置文件的语法,没有在vim中高亮的显示)

而后当初将contrib目录中下的所有vim文件拷贝到本地装置的vim目录中

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

而后再关上Nginx的配置文件

  • html目录

该目录中提供了两个规范的html文件,一个是发现500谬误的时候能够重定向到50x.html文件,另外一个是默认的Nginx欢送界面

  • man目录

man目录是linux对Nginx的帮助文件(关上命令:man ./nginx.8)

  • src目录

src目录是Nginx的源代码目录

Configure 编译

编译之前,能够看一下Configure反对哪些参数

./configure --help | more

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

  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级别的日志

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

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

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

在上边编译实现之后,会生成一些两头文件

两头文件介绍

编译实现之后,生成的两头文件,会放在解压之后的nginx目录下的objs目录下

objs目录下文件构造

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

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

而后就能够执行make编译了。编译实现之后,会生成大量的两头文件,以及最终运行的Nginx二进制文件,能够在objs目录中看到

为什么须要晓得Nginx的指标文件是放在这里的?

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

C语言编译时生成的所有两头文件都会放在objs下的src目录下,如果咱们应用了动静模块,编译时会生成动静文件,这个动静文件也会放在objs目录下。接下来就能够执行make install(首次装置时执行该命令)

执行完之后,就能够在--prefix执行的门路下看到如下构造

这里边最次要的Nginx二进制文件就在sbin目录下,决定Nginx性能的配置文件在conf目录下

能够看到在conf目录下,所有的文件就是在源代码中那个conf目录下所有文件copy过去了一份,内容也是截然不同的

以上便是Nginx的全副编译装置过程

Nginx配置文件通用语法介绍

  • Nginx配置文件中,曾经指定了它蕴含了哪些模块,但每一个模块都提供举世无双的配置语法,这些所有的配置语法,会遵循同样的语法规定
  • 配置文件由指令与指令块形成
  • 每条指令以;分号结尾,指令与参数间以空格分隔
  • 指令块以{}大括号将多条指令组织在一起
  • include语句容许组合多个配置文件以晋升可维护性
  • 应用#合乎增加正文,进步可读性
  • 应用$符号应用变量
  • 局部指令的参数反对正则表达式

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

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

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