如何在 CentOS 7 上从源代码构建 Nginx
在此页
- 稳定版与主线版
- 核心模块与第三方模块
- 静态模块与动态模块
- 从源代码构建 Nginx 的要求
- 要求
- 从源代码构建 Nginx
Nginx(读作 \engine x\)是一个开源的网络服务器软件,在设计时考虑了高并发性,可以用作 HTTP/HTTPS 服务器,反向代理服务器、邮件代理服务器、软件负载平衡器、TLS终结器、缓存服务器 ...
它是一个极其模块化的软件。甚至一些看似“内置”的软件部分(例如 GZIP 或 SSL)实际上也是构建为可以在构建期间启用和禁用的模块。
它具有由社区创建的核心(本机)模块和第三方(外部)模块。目前,我们可以使用一百多个第三方模块。
用 C 语言编写,它是一个非常快速和轻量级的软件。
从源代码安装 Nginx 相对“容易”——下载最新版本的 Nginx 源代码,配置、构建和安装它。
您需要选择是下载主线还是稳定版本,但构建它们是完全相同的。
在本教程中,我们将使用 Nginx 开源版本中的所有可用模块构建 Nginx,我们将使用 主线版本,在撰写本文时为 1.15.7。当有新版本可用时更新版本号。
稳定版与主线版
Nginx Open Source 有两个版本:
- Mainline – 包括最新功能和错误修复,并且始终保持最新状态。它是可靠的,但它可能包含一些实验模块,也可能有一些新的错误。
- 稳定 – 不包括所有最新功能,但具有始终向后移植到主线版本的关键错误修复。
核心模块与第三方模块
Nginx 有两种类型的模块可供您使用:核心模块和第三方模块。
核心模块由核心 Nginx 开发人员构建,它们是软件本身的一部分。
第三方模块由社区构建,您可以使用它们来扩展 Nginx 功能。有很多有用的第三方模块,其中最著名的有:PageSpeed、ModSecurity、RTMP、Lua 等...
静态模块与动态模块
从第一个版本开始,静态模块就存在于 Nginx 中。 2016 年 2 月,Nginx 1.9.11+ 引入了动态模块。
对于静态模块,构成 Nginx 二进制文件的模块集在编译时由 ./configure
脚本固定。静态模块使用 --with-foo_bar_module
或 --add-module=PATH
语法。
要将核心(标准)模块编译为动态,我们添加 =dynamic
,例如 --with-http_image_filter_module=dynamic
。
要将第三方模块编译为动态,我们使用 --add-dynamic-module=/path/to/module
语法,然后我们使用 load_module
指令加载它们nginx.conf
文件的全局上下文。
从源代码构建 Nginx 的要求
与其他一些 UNIX/Linux 软件相比,Nginx 非常轻量级并且没有很多库依赖项。默认构建配置仅取决于要安装的 3 个库:OpenSSL/LibreSSL/BoringSSL、Zlib 和 PCRE。
- 强制性要求:
- GNU 编译器集合 (GCC)
- BoringSSL 库
- Zlib 库版本在 1.1.3 - 1.2.11 之间
- PCRE 库版本在 4.4 - 8.42 之间
- Perl
- LibGD
- MaxMind GeoIP Legacy C 库
- libxml2
- libxslt
注意:Nginx 也可以针对 LibreSSL 和 BoringSSL 加密库而不是 OpenSSL 进行编译。
要求
- 一台运行CentOS 7系统的服务器。
- 具有 sudo 权限的非根用户。
初始步骤
检查 CentOS 版本:
cat /etc/centos-release
# CentOS Linux release 7.6.1810 (Core)设置时区:
timedatectl list-timezones
sudo timedatectl set-timezone 'Region/City'更新 CentOS 操作系统的软件包:
sudo yum update -y
安装 vim、curl、wget 和 tree 包:
sudo yum install -y vim curl wget tree
从源代码构建 Nginx
Nginx 是一个用 C 编写的程序,因此您首先需要安装一个编译工具:
sudo yum groupinstall -y 'Development Tools'
下载最新主线版本的 Nginx 源码并解压。 Nginx 源代码作为压缩存档(gzipped tarball)分发,就像大多数 Unix 和 Linux 软件一样:
wget https://nginx.org/download/nginx-1.15.7.tar.gz && tar zxvf nginx-1.15.7.tar.gz
下载强制性 Nginx 依赖项源代码并解压缩它们:
# PCRE version 8.42
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz && tar xzvf pcre-8.42.tar.gz
# zlib version 1.2.11
wget https://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz
# OpenSSL version 1.1.1a
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz && tar xzvf openssl-1.1.1a.tar.gz安装可选的 Nginx 依赖项:
sudo yum install -y perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel GeoIP GeoIP-devel
清理所有
.tar.gz
文件。我们不再需要它们了:rm -rf *.tar.gz
进入Nginx源码目录:
cd ~/nginx-1.15.7
对于使用
tree
实用程序组成 Nginx 源代码的良好度量列表目录和文件:tree -L 2 .
将 Nginx 手册页复制到
/usr/share/man/man8/
目录:sudo cp ~/nginx-1.15.7/man/nginx.8 /usr/share/man/man8
sudo gzip /usr/share/man/man8/nginx.8
ls /usr/share/man/man8/ | grep nginx.8.gz
# Check that Man page for Nginx is working:
man nginx如需帮助,您可以通过运行以下命令查看最新的 Nginx 编译时选项的完整列表:
./configure --help
# To see want core modules can be build as dynamic run:
./configure --help | grep -F =dynamic配置、编译和安装 NGINX:
./configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--user=nginx \
--group=nginx \
--build=CentOS \
--builddir=nginx-1.15.7 \
--with-select_module \
--with-poll_module \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-http_perl_module=dynamic \
--with-perl_modules_path=/usr/lib64/perl5 \
--with-perl=/usr/bin/perl \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-stream_ssl_preread_module \
--with-compat \
--with-pcre=../pcre-8.42 \
--with-pcre-jit \
--with-zlib=../zlib-1.2.11 \
--with-openssl=../openssl-1.1.1a \
--with-openssl-opt=no-nextprotoneg \
--with-debug
make
sudo make install构建 Nginx 后,导航到主目录 (
~
):cd ~
将
/usr/lib64/nginx/modules
符号链接到/etc/nginx/modules
目录。etc/nginx/modules
是 Nginx 模块的标准位置:sudo ln -s /usr/lib64/nginx/modules /etc/nginx/modules
打印Nginx版本,编译器版本,配置脚本参数:
sudo nginx -V
# nginx version: nginx/1.15.7 (CentOS)
# built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
# built with OpenSSL 1.1.1a 20 Nov 2018
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules
# . . .
# . . .创建 Nginx 系统组和用户:
sudo useradd --system --home /var/cache/nginx --shell /sbin/nologin --comment "nginx user" --user-group nginx
检查 Nginx 语法和潜在错误:
sudo nginx -t
创建 Nginx systemd 单元文件:
sudo vim /etc/systemd/system/nginx.service
将以下内容复制/粘贴到
/etc/systemd/system/nginx.service
文件中:注意:
PID
文件和 Nginx 二进制文件的位置可能会有所不同,具体取决于 Nginx 的编译方式。[Unit] Description=nginx - high performance web server Documentation=https://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/var/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID [Install] WantedBy=multi-user.target
启用 Nginx 开机启动并立即启动 Nginx:
sudo systemctl enable nginx.service
sudo systemctl start nginx.service检查 Nginx 是否会在重启后自动启动:
sudo systemctl is-enabled nginx.service
# enabled通过运行以下命令之一检查 Nginx 是否正在运行:
sudo systemctl status nginx.service
# or
ps aux | grep nginx
# or
curl -I 127.0.0.1您还可以打开浏览器并导航到您的域/IP 地址以查看默认的 Nginx 页面。这表明 Nginx 已启动并正在运行。
默认情况下,Nginx 在
/etc/nginx
中生成备份.default
文件。从/etc/nginx
目录中删除.default
文件:sudo rm /etc/nginx/*.default
将 Vim 编辑器的 Nginx 配置的语法高亮放入
~/.vim
:# For regular non-root user mkdir ~/.vim/ cp -r ~/nginx-1.15.7/contrib/vim/* ~/.vim/ # For root user sudo mkdir /root/.vim/ sudo cp -r ~/nginx-1.15.7/contrib/vim/* /root/.vim/
注意:通过执行上述步骤,您将在 Vim 编辑器中编辑 Nginx 配置文件时获得漂亮的语法高亮显示。
在
/etc/ 中创建
目录:conf.d
、snippets
、sites-available
和sites-enabled
目录nginxsudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}
更改 Nginx 日志文件的权限和组所有权:
sudo chmod 640 /var/log/nginx/*
sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log为 Nginx 创建 logrotation 配置。
sudo vim /etc/logrotate.d/nginx
使用以下文本填充文件,然后保存并退出:
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}从主目录中删除所有下载的文件:
cd ~
rm -rf nginx-1.15.7/ openssl-1.1.1a/ pcre-8.42/ zlib-1.2.11/就是这样。现在,您已经通过源代码构建安装了最新版本的 Nginx。它是针对一些重要的库(如 OpenSSL)进行静态编译的。通常,系统提供的 OpenSSL 版本已经过时。通过使用这种安装较新版本 OpenSSL 的方法,您可以利用
CHACHA20_POLY1305
等新密码和 OpenSSL 1.1.1支持的 TLS 1.3 等协议。
此外,通过编译您自己的二进制文件,您可以定制 Nginx 将提供的功能,这比安装预构建的二进制文件要灵活得多。