如何在Debian 10上从源代码编译Nginx

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com

介绍

Nginx的 是一款专为高并发性而设计的开源Web服务器软件,可以用作HTTP / HTTPS服务器,反向代理服务器,邮件代理服务器,软件负载平衡器,TLS终结器,缓存服务器等等!

这是一个高度模块化的软件。实际上,甚至软件的某些看似“内置”部分(例如GZIP或SSL)实际上都是作为模块创建的,可以在构建期间启用和禁用这些模块。

它具有核心(本机)模块和 第三方(外部)模块 由社区创建。目前,我们可以使用一百多个第三方模块。

它使用C语言编写,是一种快速,轻便的软件。

从源代码安装Nginx相对容易-下载最新版本的Nginx源代码,进行配置,构建和安装。

您需要选择是下载主线版本还是稳定版本,但是构建它们是相同的。

在本指南中,我们将在Debian 10(破坏者)上编译Nginx的主线版本。我们将使用Nginx开源版本中的所有可用模块。

为什么要从源代码编译和安装Nginx

您可能会问,为什么可以使用准备好的软件包从源代码编译Nginx。您可能要自行编译特定软件的一些原因如下:

控制配置选项。
在您喜欢的任何位置安装软件。您甚至可以安装同一软件的多个不同版本。
控制您安装的版本。发行版并不总是与所有软件包的最新版本保持最新,尤其是软件包的附加组件。
为了更好地了解软件的工作原理。

稳定版与主线版

Nginx开源有两个版本:

Mainline –包括最新功能和错误修复,并且始终保持最新状态。它是可靠的,但它可能包含一些实验性模块,并且可能还包含一些新的错误。
稳定-不包含所有最新功能,但具有一些重要的错误修复程序,这些错误始终会移植到主线版本中。

核心模块与第三方模块

Nginx有两种类型的模块可供您使用:核心模块和第三方模块。

Nginx核心开发人员构建了核心模块,它们是软件本身的一部分。

该社区构建了第三方模块,您可以使用它们来扩展功能。有很多有用的第三方模块。

静态模块与动态模块

从第一个版本开始,静态模块就存在于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)
的OpenSSL 之间的库版本 1.0.21.1.1 要么 LibreSSL 图书馆或 无聊的SSL 图书馆
Zlib 之间的库版本 1.1.31.2.11
聚四氟乙烯 之间的库版本 4.48.43

可选要求:

佩尔
LibGD
MaxMind GeoIP旧版C库
libxml2
libxslt

注意注意:Nginx也可以针对LibreSSL和BoringSSL加密库而不是OpenSSL进行编译。

在你开始之前

检查Debian版本。

lsb_release -ds
# Debian GNU/Linux 10 (buster)

用以下方式创建普通用户 sudo 访问。

adduser johndoe --gecos "John Doe"
usermod -aG sudo johndoe

注意:更换 johndoe 使用您的用户名。

切换到新用户。

su - johndoe

设置时区。

sudo dpkg-reconfigure tzdata

更新您操作系统的软件。

sudo apt update && sudo apt upgrade -y

安装必要的软件包。

sudo apt install -y software-properties-common ufw

从源代码构建Nginx

Nginx是用C编写的程序,因此您首先需要安装编译器工具。安装 build-essentialgittree

sudo apt install -y build-essential git tree

下载Nginx源代码的最新主线版本,并解压缩源代码档案。与大多数Unix和Linux软件一样,Nginx源代码以压缩存档的形式分发。

wget https://nginx.org/download/nginx-1.17.2.tar.gz && tar zxvf nginx-1.17.2.tar.gz

下载强制性Nginx依赖项的源代码并解压缩。

# PCRE version 8.43
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz && tar xzvf pcre-8.43.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.1c
wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz && tar xzvf openssl-1.1.1c.tar.gz

安装可选的Nginx依赖项。

sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev

清理所有 .tar.gz 文件。我们不再需要它们了。

rm -rf *.tar.gz

输入Nginx源目录。

cd ~/nginx-1.17.2

为了获得良好的效果,请列出与Nginx源代码组成的目录和文件 tree

tree -L 2 .

将手册页复制到 /usr/share/man/man8/

sudo cp ~/nginx-1.17.2/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 built as dynamic run:
./configure --help | grep -F =dynamic

配置,编译和安装Nginx。

./configure --prefix=/etc/nginx 
            --sbin-path=/usr/sbin/nginx 
            --modules-path=/usr/lib/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=Debian 
            --builddir=nginx-1.17.2 
            --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/share/perl/5.26.1 
            --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.43 
            --with-pcre-jit 
            --with-zlib=../zlib-1.2.11 
            --with-openssl=../openssl-1.1.1c 
            --with-openssl-opt=no-nextprotoneg 
            --with-debug

make
sudo make install

编译后,导航到您的家(~) 目录。

cd ~

符号链接 /usr/lib/nginx/modules/etc/nginx/modules。这是Nginx模块的标准位置。

sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules

打印Nginx版本,编译器版本并配置脚本参数。

sudo nginx -V

# nginx version: nginx/1.17.2 (Debian)
# built by gcc 8.3.0 (Debian 8.3.0-6)
# built with OpenSSL 1.1.1c  28 May 2019
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules . . .
# . . .
# . . .

创建一个Nginx系统组和用户。

sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx
# Check that user and group are created
sudo tail -n 1 /etc/passwd /etc/group /etc/shadow

检查Nginx语法和潜在错误。

sudo nginx -t
# Will throw this error -> nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (2: No such file or directory)

# Create NGINX cache directories and set proper permissions
sudo mkdir -p /var/cache/nginx/client_temp /var/cache/nginx/fastcgi_temp /var/cache/nginx/proxy_temp /var/cache/nginx/scgi_temp /var/cache/nginx/uwsgi_temp
sudo chmod 700 /var/cache/nginx/*
sudo chown nginx:root /var/cache/nginx/*

# Re-check syntax and potential errors. 
sudo nginx -t

创建一个Nginx systemd单元文件。

sudo vim /etc/systemd/system/nginx.service

填充 /etc/systemd/system/nginx.service 文件包含以下内容。

[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

检查状态。

sudo systemctl status nginx.service

注意:您可以通过在网络浏览器中转到站点的域或IP地址来验证Nginx是否正在运行。您将看到Nginx欢迎页面。这表明Nginx已在您的VPS上启动并正在运行。

创建UFW Nginx应用程序配置文件。

sudo vim /etc/ufw/applications.d/nginx

将以下内容复制/粘贴到 /etc/ufw/applications.d/nginx 文件。

[Nginx HTTP]
title=Web Server (Nginx, HTTP)
description=Small, but very powerful and efficient web server
ports=80/tcp

[Nginx HTTPS]
title=Web Server (Nginx, HTTPS)
description=Small, but very powerful and efficient web server
ports=443/tcp

[Nginx Full]
title=Web Server (Nginx, HTTP + HTTPS)
description=Small, but very powerful and efficient web server
ports=80,443/tcp

验证是否已创建并识别UFW应用程序配置文件。

sudo ufw app list

# Available applications:
  # Nginx Full
  # Nginx HTTP
  # Nginx HTTPS
  # OpenSSH

Nginx默认情况下会生成备份 .default 文件在 /etc/nginx。去掉 .default 来自的文件 /etc/nginx 目录。

sudo rm /etc/nginx/*.default

将Vim编辑器的Nginx配置的语法突出显示放入 ~/.vim

# For regular non-root user
mkdir ~/.vim/
cp -r ~/nginx-1.17.2/contrib/vim/* ~/.vim/
# For root user
sudo mkdir /root/.vim/
sudo cp -r ~/nginx-1.17.2/contrib/vim/* /root/.vim/

注意注意:通过执行上述步骤,在Vim编辑器中编辑Nginx配置文件时,将突出显示语法。

创建 conf.dsnippetssites-availablesites-enabled 目录在 /etc/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创建一个日志轮转配置。

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.17.2/ openssl-1.1.1c/ pcre-8.43/ zlib-1.2.11/

摘要

而已。现在,您已经安装了最新版本的Nginx。它是根据一些重要的库(如OpenSSL)静态编译的。通常,系统提供的OpenSSL版本已过时。通过使用此方法与较新版本的OpenSSL进行安装,您可以利用现代密码,例如 CHACHA20_POLY1305 以及OpenSSL中可用的协议(如TLS 1.3) 1.1.1。此外,通过编译自己的二进制文件,您可以定制Nginx将提供的功能,这比安装预构建的二进制文件要灵活得多。

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com