Back
Featured image of post 编译适合自己的Nginx

编译适合自己的Nginx

安装Nginx

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

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

  • 从仓库里面安装

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

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


下载Nginx

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

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 可用(一样是解压的啦)

介绍各目录以及部分文件

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

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


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

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

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

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

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


文件 LICENSE

/*
 * 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


Documentation is available at http://nginx.org

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


目录 auto

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库 都是为了编译的。

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 是为了判断操作系统的。

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

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

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都已经介绍了。


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/

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

html
├── 50x.html
└── index.html

0 directories, 2 files

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


目录 man

man
└── nginx.8

0 directories, 1 file

使用man ./nginx.8


目录 src

src
├── core
├── event
├── http
├── mail
├── misc
├── os
└── stream

7 directories, 0 files

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

Configure

先看看configure的命令行参数

./configure --help

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

这里主要讲几个大块:

  1. PATH
--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. 使用/禁用自身模块

--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的,需要自己手动加参数启用的。

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

--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的,一般都是默认启用该模块的。当你加上下面的参数进行编译的时候才会禁用它。

  --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. 第三方模块/编译优化
--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。执行完上一步就会出现了。

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二进制执行文件。

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一顿猛操作,并且没有报错的话,那你就安装完成了。

这个是指定安装的目录
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

comments powered by Disqus