注:本教程在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.2
— 1.1.1
要么 LibreSSL 图书馆或 无聊的SSL 图书馆
Zlib 之间的库版本 1.1.3
— 1.2.11
聚四氟乙烯 之间的库版本 4.4
— 8.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-essential
, git
和 tree
。
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.d
, snippets
, sites-available
和 sites-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