如何在 CentOS 7 上从源代码构建 Nginx如何在 CentOS 7 上从源代码构建 Nginx如何在 CentOS 7 上从源代码构建 Nginx如何在 CentOS 7 上从源代码构建 Nginx
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 CentOS 7 上从源代码构建 Nginx

在此页

  1. 稳定版与主线版
  2. 核心模块与第三方模块
  3. 静态模块与动态模块
  4. 从源代码构建 Nginx 的要求
  5. 要求
  6. 从源代码构建 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 目录nginx 目录:

    sudo 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 将提供的功能,这比安装预构建的二进制文件要灵活得多。

©2015-2025 艾丽卡 support@alaica.com