编译安装 Nginx

0、环境

本文操作系统: CentOS 7.2.1511 x86_64

1. 下载nginx

http://nginx.org/en/download.html

Nginx 官网提供了三个版本,区别如下

Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版
Stable version:最新稳定版,生产环境上建议使用的版本
Legacy version:遗留的老版本的稳定版

下载

[root@centos-linux ~]# wget http://nginx.org/download/nginx-1.10.1.tar.gz

2. 编译 Nginx

解压下载的包,进入目录,准备编译。

如果是升级 Nginx,编译时最好带上原来 Nginx 的编译参数。

查看 Nginx 的编译参数,用原来的 Nginx 执行以下命令,configure arguments 即是该 Nginx 的编译参数。

[root@centos-linux nginx-1.10.1]# nginx -V
nginx version: nginx/1.10.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
built with OpenSSL 1.0.2g  1 Mar 2016
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx2 --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module --with-pcre --with-zlib=/usr/local/zlib --with-stream --with-stream_ssl_module --with-http_v2_module --with-threads --with-openssl=/usr/local/ssl

如果需要 Nginx 支持 HTTPS,请先看第 4 步。

[root@centos-linux ~]# tar zxvf nginx-1.10.1.tar.gz  
[root@centos-linux ~]# cd nginx-1.10.1  
[root@centos-linux nginx-1.10.1]# ./configure //有其它编译参数这里就带上参数

如果编译配置脚本正常运行,会在最后报告出 Nginx 将要安装的位置以及其他相关信息。阅读过之后直接编译就好。如果报错,请看第 3 步。

Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + using builtin md5 code
  + sha1 library is not found
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"
[root@centos-linux nginx-1.10.1]# make  
[root@centos-linux nginx-1.10.1]# sudo make install

至此 Nginx 安装完毕。

然后启动 Nginx

[root@centos-linux nginx]# cd /usr/local/ngxin
[root@centos-linux nginx]# sbin/nginx

访问服务器 ip 看到 Nginx 环境页面或者执行 curl http://127.0.0.1得到如下结果则证明启动成功。CentOS 7 注意设置好防火墙 firewalld。

[root@centos-linux nginx]# curl http://127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

3. 编译 Nginx 报错

Nginx 默认开启了 gzip 模块和 rewrite 模块,这两个模块分别依赖 zlib 库和 PCRE 库。如果系统没有安装这两个库,在编译 Nginx 时就会报错。下面的库安装完后再去编译 Nginx,就能成功了。

3.1 未安装 PCRE 库

./configure: error: the HTTP rewrite module requires the PCRE library.  
You can either disable the module by using --without-http_rewrite_module  
option, or install the PCRE library into the system, or build the PCRE library  
statically from the source with nginx by using --with-pcre=<path> option.

这个错误表示系统中缺少 PCRE 库。该库是实现正则表达式的基础,如果缺少此库,Nginx 无法支持 HTTP 中的 URL 重写功能。如果你不需要此功能,可以在执行编译配置脚本时加入 --without-http_rewrite_module。如果需要这个功能,则需要安装。

3.1.1 编译安装 PCRE 库

PCRE库是实现Perl式正则表达式的基础。如果系统中缺少此库需要编译安装。PCRE 官网 http://www.pcre.org。目前最新版本是8.39。 仍然是下载后解压、配置、编译和安装:

[root@centos-linux ~]# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz
[root@centos-linux ~]# tar zxvf pcre-8.39.tar.gz   
[root@centos-linux ~]# cd pcre-8.39  
[root@centos-linux ~]# ./configure  
[root@centos-linux ~]# make  
[root@centos-linux ~]# make install
3.1.2 yum 安装 PCRE 库

我的系统是 CentOS,也可以直接从 yum 安装该库。不过这样安装的 PCRE 版本会低一些。

如果是其它系统,请自行搜索使用相应包管理器的安装方法。

3.2 未安装 zlib 库

./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.

zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函数,可用于网页的数据压缩,如果不想使用该库则给 Nginx 添加编译参数 --without-http_gzip_module

3.2.1 编译安装 zlib 库
[root@centos-linux ~]# wget http://zlib.net/zlib-1.2.8.tar.gz
[root@centos-linux ~]# tar zxvf zlib-1.2.8.tar.gz
[root@centos-linux ~]# cd zlib-1.2.8
[root@centos-linux ~]# ./configure  
[root@centos-linux ~]# make  
[root@centos-linux ~]# make install

4. HTTPS 支持问题

如果需要 Nginx 支持 HTTPS(大部分都是需要的吧),则要安装 openssl 包,如上面第 2 步编译完后的提示中有这样一句 OpenSSL library is not used,表示并没有支持 SSL,这里我们手动安装 openssl 包。

去官网下载最新的 openssl 源码,

[root@centos-linux nginx-1.10.1]# wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz
[root@centos-linux nginx-1.10.1]# tar zxvf openssl-1.0.2h.tar.gz
[root@centos-linux nginx-1.10.1]# mv openssl-1.0.2h /usr/local //将源码包移动到一个目录,这个目录可以自己选择,我选择放在 /usr/loca/ 下

然后在 Nginx 的编译参数里加上这句 --with-http_ssl_module --with-openssl=/usr/local/openssl-1.0.2h 这里openssl后的值是刚刚放置 openssl 源码的位置。

编译后就可以看到如下结果

Configuration summary
  + using system PCRE library
  + using OpenSSL library: /usr/local/openssl    //这里应用了我们的 openssl
  + md5: using OpenSSL library
  + sha1: using OpenSSL library
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

然后同第二步中的 make,make install 即可。

5. Nginx: error while loading shared libraries: libpcre.so.1

我的在启动 Nginx 时报错

[root@centos-linux nginx-1.10.1]# /usr/local/nginx/sbin/nginx  
/usr/local/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file:No such file or directory

确认已经安装 PCRE

[root@centos-linux nginx-1.10.1]# cd /lib  
[root@centos-linux nginx-1.10.1]# ls *pcre*  
libpcre.so.0  libpcre.so.0.0.1  
[root@centos-linux nginx-1.10.1]# find / -type f -name *libpcre.so.*   
/lib/libpcre.so.0.0.1
/usr/pcre-8.36/.libs/libpcre.so.1.2.4
/usr/local/lib/libpcre.so.1.2.4

添加软链接

[root@centos-linux nginx-1.10.1]# ln -s /lib/libpcre.so.0.0.1 /lib/libpcre.so.1

前面在一般的linux上可以解决此问题。

注:在有的操作系统上面,安装 PCRE 后,安装的位置为 /usr/local/lib/pcre,在 Redhat 64位机器之上有这样的情况。在 Redhat 64位机器上,Nginx 可能读取的 PCRE 文件为 /lib64/libpcre.so.1 文件. 所以在改用下面的软连接

[root@centos-linux nginx-1.10.1]# ln -s /usr/local/lib/libpcre.so.1 /lib64/

参考自:
http://www.cnblogs.com/sprinng/p/3443737.html
http://www.2cto.com/os/201304/199770.html