编译适合自己的Nginx

安装Nginx

一般来说,安装Nginx无非就是那几种方式,从仓库里面安装,拿别人编译好的二进制文件,自己源码进行编译。

下面这两个方式无疑都是较快的安装方式。

  • 从仓库里面安装

  • 拿别人编译好的二进制文件

但是里面的模块,不是你自己能够定制的。一般来说,这种编译好的,都是不能够满足于个性化需求的。所以需要我们自己从源码里面去编译Nginx。


下载Nginx

先从Nginx的开源官网下载最新的stable版本

1
2
3
4
5
wget http://nginx.org/download/nginx-1.14.2.tar.gz

tar xzf nginx-1.14.2.tar.gz

x nginx-1.14.2.tar.gz #装有 zsh 插件x 可用(一样是解压的啦)

介绍各目录以及部分文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
nginx-1.14.2
├── CHANGES
├── CHANGES.ru
├── LICENSE
├── README
├── auto d
├── conf d
├── configure
├── contrib d
├── html d
├── man d
└── src d

6 directories, 5 files

文件 CHANGES

1
2
3
4
5
6
7
8
9
10
11
Changes with nginx 1.14.2                                        04 Dec 2018

*) Bugfix: nginx could not be built by gcc 8.1.

*) Bugfix: nginx could not be built on Fedora 28 Linux.

*) Bugfix: in handling of client addresses when using unix domain listen
sockets to work with datagrams on Linux.

*) Change: the logging level of the "http request", "https proxy
....

记录的是Nginx的一些版本的Bugfix,一些feature。


文件 CHANGES.ru

1
2
3
4
5
6
7
8
9
10

Изменения в nginx 1.14.2 04.12.2018

*) Исправление: nginx не собирался gcc 8.1.

*) Исправление: nginx не собирался на Fedora 28 Linux.

*) Исправление: в обработке адресов клиентов при использовании unix
domain listen-сокетов для работы с датаграммами на Linux.
.....

记录的是Nginx的一些版本的Bugfix,一些feature。
因为Nginx的作者是一个俄罗斯人,有个俄罗斯文的说明很正常。


文件 LICENSE

1
2
3
4
5
6
7
8
9
10
11
/*
* Copyright (C) 2002-2018 Igor Sysoev
* Copyright (C) 2011-2018 Nginx, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
....

Nginx的开源协议说明


文件 README

1
2

Documentation is available at http://nginx.org

告诉你可以在哪里找到文档。


目录 auto

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
auto
├── cc d
├── define
├── endianness
├── feature
├── have
├── have_headers
├── headers
├── include
├── init
├── install
├── lib d
├── make
├── module
├── modules
├── nohave
├── options
├── os d
├── sources
├── stubs
├── summary
├── threads
├── types d
└── unix

4 directories, 19 files

cc,lib库 都是为了编译的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
cc

total 96
drwxr-xr-x 13 hello staff 416 Dec 4 22:52 .
drwxr-xr-x 25 hello staff 800 Dec 4 22:52 ..
-rw-r--r-- 1 hello staff 201 Dec 4 22:52 acc
-rw-r--r-- 1 hello staff 1275 Dec 4 22:52 bcc
-rw-r--r-- 1 hello staff 1324 Dec 4 22:52 ccc
-rw-r--r-- 1 hello staff 1799 Dec 4 22:52 clang
-rw-r--r-- 1 hello staff 5269 Dec 4 22:52 conf
-rw-r--r-- 1 hello staff 3588 Dec 4 22:52 gcc
-rw-r--r-- 1 hello staff 2874 Dec 4 22:52 icc
-rw-r--r-- 1 hello staff 3285 Dec 4 22:52 msvc
-rw-r--r-- 1 hello staff 1568 Dec 4 22:52 name
-rw-r--r-- 1 hello staff 1862 Dec 4 22:52 owc
-rw-r--r-- 1 hello staff 3516 Dec 4 22:52 sunc

lib

total 16
-rw-r--r-- 1 hello staff 952B Dec 4 22:52 conf
drwxr-xr-x 3 hello staff 96B Dec 4 22:52 geoip
drwxr-xr-x 3 hello staff 96B Dec 4 22:52 google-perftools
drwxr-xr-x 4 hello staff 128B Dec 4 22:52 libatomic
drwxr-xr-x 3 hello staff 96B Dec 4 22:52 libgd
drwxr-xr-x 3 hello staff 96B Dec 4 22:52 libxslt
-rw-r--r-- 1 hello staff 482B Dec 4 22:52 make
drwxr-xr-x 6 hello staff 192B Dec 4 22:52 openssl
drwxr-xr-x 7 hello staff 224B Dec 4 22:52 pcre
drwxr-xr-x 4 hello staff 128B Dec 4 22:52 perl
drwxr-xr-x 7 hello staff 224B Dec 4 22:52 zlib

os 是为了判断操作系统的。

1
2
3
4
5
6
7
total 56
-rw-r--r-- 1 hello staff 2.6K Dec 4 22:52 conf
-rw-r--r-- 1 hello staff 3.0K Dec 4 22:52 darwin
-rw-r--r-- 1 hello staff 2.3K Dec 4 22:52 freebsd
-rw-r--r-- 1 hello staff 5.4K Dec 4 22:52 linux
-rw-r--r-- 1 hello staff 1.4K Dec 4 22:52 solaris
-rw-r--r-- 1 hello staff 892B Dec 4 22:52 win32

其他的都是为了辅助脚本configure执行时候,去判定当前的Nginx支持哪些模块,当前的操作系统有哪些特性可以提供给Nginx使用。


目录 conf

1
2
3
4
5
6
7
8
9
10
11
12
conf
├── fastcgi.conf
├── fastcgi_params
├── koi-utf
├── koi-win
├── mime.types
├── nginx.conf
├── scgi_params
├── uwsgi_params
└── win-utf

0 directories, 9 files

这个目录都是一些示例文件,方便运维去配置。在make install的时候会拷贝到安装目录。


文件 configure

用来生成中间文件,进行编译前的必须操作。

稍后有详细的解析….


目录 contrib

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
contrib
├── README
├── geo2nginx.pl
├── unicode2nginx
│   ├── koi-utf
│   ├── unicode-to-nginx.pl
│   └── win-utf
└── vim
├── ftdetect
│   └── nginx.vim
├── ftplugin
│   └── nginx.vim
├── indent
│   └── nginx.vim
└── syntax
└── nginx.vim

6 directories, 9 files

这里的README都已经介绍了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

geo2nginx.pl by Andrei Nigmatulin

The perl script to convert CSV geoip database ( free download
at http://www.maxmind.com/app/geoip_country ) to format, suitable
for use by the ngx_http_geo_module.


unicode2nginx by Maxim Dounin

The perl script to convert unicode mappings ( available
at http://www.unicode.org/Public/MAPPINGS/ ) to the nginx
configuration file format.
Two generated full maps for windows-1251 and koi8-r.


vim by Evan Miller

Syntax highlighting of nginx configuration for vim, to be
placed into ~/.vim/.

两个用于转换的perl脚本,一个vim的Nginx高亮配置。

没有配置vim前,打开Nginx的配置文件:

现在将高亮的配置丢到~/.vim/

1
2
3
4
5
6
7
mkdir -p ~/.vim/
cp -r contrib/vim/* ~/.vim/

注意文件的移动放置,仅仅盯住命令是没有用的。

- Copy a directory recursively to another location:
cp -r path/to/directory path/to/copy

其实这里我是在centos7里面截图的233,因为我在macOS下面踩了坑,没配出来。


目录 html

1
2
3
4
5
html
├── 50x.html
└── index.html

0 directories, 2 files

一个是碰到50x错误的时候的页面,一个是安装好Nginx时候正常加载的页面。


目录 man

1
2
3
4
man
└── nginx.8

0 directories, 1 file

使用man ./nginx.8


目录 src

1
2
3
4
5
6
7
8
9
10
src
├── core
├── event
├── http
├── mail
├── misc
├── os
└── stream

7 directories, 0 files

源代码,Nginx的整个框架就在里面。

Configure

先看看configure的命令行参数

1
./configure --help

可以上面的命令得到它的命令行参数.

这里主要讲几个大块:

  1. PATH
1
2
3
4
5
6
7
--prefix=PATH                      set installation prefix ## Nginx的安装路径
--sbin-path=PATH set nginx binary pathname
--modules-path=PATH set modules path
--conf-path=PATH set nginx.conf pathname
--error-log-path=PATH set error log pathname
--pid-path=PATH set nginx.pid pathname
--lock-path=PATH set nginx.lock pathname

这里是指定在编译之后,文件存放的地方。

一般就是直接指定--prefix=PATH这个参数就好了。

nginx binarymodulesnginx.conferror lognginx.pidnginx.lock,这些文件都会自己在指定的prefix目录下,自己建个文件夹来安顿好自己。

  1. 使用/禁用自身模块
1
2
3
4
5
6
7
8
9

--with-select_module enable select module
--without-select_module disable select module
--with-poll_module enable poll module
--without-poll_module disable poll module

--with-threads enable thread pool support

--with-file-aio enable file AIO support

前面带without的,基本都是禁用模块的。

而带with的,一般都是启用模块的。

而且通常,像下面的这种带with的,需要自己手动加参数启用的。

在默认编译里面,一般都是不启用该模块的。

1
2
3
4
5
6
7
8
--with-http_ssl_module             enable ngx_http_ssl_module
--with-http_v2_module enable ngx_http_v2_module
--with-http_realip_module enable ngx_http_realip_module
--with-http_addition_module enable ngx_http_addition_module
--with-http_xslt_module enable ngx_http_xslt_module
--with-http_xslt_module=dynamic enable dynamic ngx_http_xslt_module
--with-http_image_filter_module enable ngx_http_image_filter_module
--with-http_image_filter_module=dynamic enable dynamic ngx_http_image_filter_module

而下面这种带without的,一般都是默认启用该模块的。当你加上下面的参数进行编译的时候才会禁用它。

1
2
3
4
5
6
7
8
9
10
--without-http_charset_module      disable ngx_http_charset_module
--without-http_gzip_module disable ngx_http_gzip_module
--without-http_ssi_module disable ngx_http_ssi_module
--without-http_userid_module disable ngx_http_userid_module
--without-http_access_module disable ngx_http_access_module
--without-http_auth_basic_module disable ngx_http_auth_basic_module
--without-http_mirror_module disable ngx_http_mirror_module
--without-http_autoindex_module disable ngx_http_autoindex_module
--without-http_geo_module disable ngx_http_geo_module
--without-http_map_module disable ngx_http_map_module
  1. 第三方模块/编译优化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
--with-cc=PATH                     set C compiler pathname
--with-cpp=PATH set C preprocessor pathname
--with-cc-opt=OPTIONS set additional C compiler options
--with-ld-opt=OPTIONS set additional linker options
--with-cpu-opt=CPU build for the specified CPU, valid values:
pentium, pentiumpro, pentium3, pentium4,
athlon, opteron, sparc32, sparc64, ppc64

--without-pcre disable PCRE library usage
--with-pcre force PCRE library usage
--with-pcre=DIR set path to PCRE library sources
--with-pcre-opt=OPTIONS set additional build options for PCRE
--with-pcre-jit build PCRE with JIT compilation support

--with-zlib=DIR set path to zlib library sources
--with-zlib-opt=OPTIONS set additional build options for zlib
--with-zlib-asm=CPU use zlib assembler sources optimized
for the specified CPU, valid values:
pentium, pentiumpro

这里的参数,你可以指定像c c++编译器的位置,以及优化的参数。以及一些第三方库的位置设定以及优化参宿等等。

开始执行Configure生成中间文件

这里指定位置

./configure --prefix=/home/jane/preview

在执行的过程中,可能需要安装相关依赖。

yum install gcc gcc-c++ -y

http_rewrite_module需要PCRE library

需要的话这个模块,就装PCRE library

如果不需要,加上参数--without-http_rewrite_module即可。

就是关掉这个模块,就不用相关的依赖啦。

http_gzip_module需要zlib library

如果不需要,加上参数--without-http_gzip_module即可。

我知道你们都是要装的了=。=

yum install pcre-devel zlib-devel

在出现各种Nginx的路径的时候就执行完了。


中间文件,都放在了objs。执行完上一步就会出现了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
objs/
├── autoconf.err
├── Makefile
├── ngx_auto_config.h
├── ngx_auto_headers.h
├── ngx_modules.c
└── src
├── core
├── event
│ └── modules
├── http
│ ├── modules
│ │ └── perl
│ └── v2
├── mail
├── misc
├── os
│ ├── unix
│ └── win32
└── stream

这里比较重要的就是 ngx_modules.c,里面记录了将要编译进去Nginx的模块。

编译

现在make,进行编译。

编译完成之后在objs目录里面,就会生成大量的中间文件以及我们最终需要运行的Nginx二进制执行文件。

1
2
3
4
5
6
7
8
9
10
total 3780
-rw-rw-r--. 1 jane jane 17763 Feb 15 13:51 autoconf.err
-rw-rw-r--. 1 jane jane 39349 Feb 15 13:51 Makefile
-rwxrwxr-x. 1 jane jane 3746432 Feb 15 14:36 nginx
-rw-rw-r--. 1 jane jane 5329 Feb 15 14:36 nginx.8
-rw-rw-r--. 1 jane jane 6798 Feb 15 13:51 ngx_auto_config.h
-rw-rw-r--. 1 jane jane 657 Feb 15 13:51 ngx_auto_headers.h
-rw-rw-r--. 1 jane jane 5725 Feb 15 13:51 ngx_modules.c
-rw-rw-r--. 1 jane jane 31872 Feb 15 14:36 ngx_modules.o
drwxrwxr-x. 9 jane jane 91 Feb 15 13:51 src

为什么需要知道这个目录,因为在你升级的时候,只是更换Nginx的二进制文件,其他的都不用变。

C语言编译生成的中间文件都会放在src目录。

如果使用了动态模块,则会生成动态文件so,ngx_modules.o

安装

首次安装可以使用make install

如果是版本升级则不在本篇文章中。

看到make一顿猛操作,并且没有报错的话,那你就安装完成了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
这个是指定安装的目录
preview/
├── conf #控制Nginx的文件在这里
│ ├── fastcgi.conf
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types
│ ├── mime.types.default
│ ├── nginx.conf
│ ├── nginx.conf.default
│ ├── scgi_params
│ ├── scgi_params.default
│ ├── uwsgi_params
│ ├── uwsgi_params.default
│ └── win-utf
├── html
│ ├── 50x.html
│ └── index.html
├── logs #Nginx的日志文件在这里
└── sbin
└── nginx
0%