从源码构建Nginx在Debian压缩

从源码构建Nginx在Debian压缩 本教程介绍如何从源代码构建nginx Debian挤压。此外,w ...

在Debian Squeeze上从源代码构建Nginx

版本1.0
作者:MichelKäser

本教程将介绍如何在Debian Squeeze上从源代码构建nginx。 另外,我们将包括一些有用的第三方模块,如naxsi WAF(Web应用程序防火墙),SPDY等。

最后你将有一个完全功能的nginx安装。

我不会保证这将为您工作!

1要求

要遵循本教程,您将需要以下内容:

  • 运行Debian Squeeze的专用服务器
  • 约30分钟时间仔细阅读

2初步注释

在本教程中,我们将使用开发版本的nginx作为我们的源代码库。 请注意,这些版本可能不稳定,不建议在生产服务器上运行。

一些模块,如SPDY,但是需要nginx版本1.3.1x或更高版本 - 我个人会说,使用开发版本的nginx或多或少是安全的,因为没有任何已知的漏洞利用。

3先决条件

由于nginx是用C编程语言编写的,所以我们需要安装一些可以帮助我们构建/编译源代码的软件包。 我是apt包管理器的大粉丝,但您也可以使用aptitude等:

apt-get -y install build-essential zlib1g-dev libpcre3 libpcre3-dev libbz2-dev libssl-dev tar unzip

这将安装所有必需的软件包,如gccmake

4下载nginx源码

最新版本的nginx可以在以下网站找到: nginx.org/en/download.html 。 在刻录时它是1.3.12 - 所以我们要下载:

cd /tmp
wget http://nginx.org/download/nginx-1.3.12.tar.gz

并解压源:

tar -xzvf nginx-1.3.12.tar.gz

我们不会建立我们的nginx版本,因为我们将首先下载一些第三方模块,稍后再介绍。

5个附加第三方模块

与Apache HTTPd不同的是,它支持模块的动态加载(这就是为什么我们可以从存储库安装它们),nginx不包括这样的功能 - 而且从我读到的这个功能,它不是更快的路线图上的东西。

我们必须及早决定我们要在我们的定制安装中包含哪些模块。 官方的nginx网站上有一个很好的概述/表,列出了最受欢迎的网站: wiki.nginx.org/3rdPartyModules
由于它不包括所有可用的模块,我建议您运行一个Google查询,如: nginx redis模块github,如果您正在寻找一个特定的模块 - 其中很多托管在Github上。

5.1下载模块

对于本教程,我们将下载一些非常棒的模块,如naxsiSPDY和一些不那么知名的模块。

headers_more

我们从headers_more开始吧。 您可以使用它来完全隐藏Web服务器信息,例如,以增强服务器的安全性:

mkdir /tmp/nginx-modules
cd /tmp/nginx-modules
wget https://github.com/agentzh/headers-more-nginx-module/archive/v0.19.tar.gz
tar -xzvf v0.19.tar.gz

这将下载最新版本并解压缩。 确保不时地检出官方的存储库,看看是否有一个新的版本(对所有其他模块也是如此)。

缓存清除

您的设置可能不需要此模块。 如果您在Apache前面有nginx,作为反向代理,并缓存proxy_pass的结果,这可能是赢家! 否则跳过它:

wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.0.tar.gz
tar -xzvf 2.0.tar.gz

纳克西

Naxsi是一个开源,高性能,低规则维护,用于nginx的Web应用程序防火墙模块 - 在功能上非常等于mod_security。 我们将使用它来保护我们的客户Web应用程序:

wget http://naxsi.googlecode.com/files/naxsi-core-0.49.tgz
tar -xzvf naxsi-core-0.49.tgz

SPDY

SPDY是一个模块,允许您的Web服务器利用SPDY功能,如流多路复用和头压缩,许多人将其视为新标准(似乎是)。

升级OpenSSL

它需要OpenSSL 1.0.1+,默认情况下我们在Squeeze机器上没有。 我们将在本教程中使用Debian的测试库进行安装。 但是,您也可以从源代码编译,也可以检查其他存储库。

nano /etc/apt/sources.list

并追逐以下几行:

deb http://ftp.debian.org/debian/ testing main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-free

我们现在应该防止我们的服务器将其他软件包升级到测试版本。 我们可以通过创建/编辑文件`/etc/apt/apt.conf.d/releases:

nano /etc/apt/apt.conf.d/releases

并粘贴:

APT::Default-Release "squeeze";

注意:如果您在sources.list中引用稳定的稳定 ,则应在上述文本中替换为stable

现在我们可以安全地运行:

apt-get update
apt-get -t testing install openssl

这将升级/安装现有的OpenSSL版本。

应用补丁

目前没有办法像其他模块一样包含它,而是作为nginx源代码的补丁提供。 官方的自述文件可以在这里找到: nginx.org/patches/spdy/README.txt

cd /tmp/nginx-1.3.12
wget http://nginx.org/patches/spdy/patch.spdy.txt
patch -p1 < patch.spdy.txt

应该为我们做所有的魔法。

6大厦nginx

到目前为止,我们已经下载了nginx源码,另外还提供了一些额外的第三方模块,并应用了SPDY补丁。 现在是建立我们的nginx安装的时候了。

这就像所有的C应用程序 - 一个3步。 我们将进一步了解第一步:

./configure --help

这将向您显示一个列表,其中包括可以禁用,启用等模块的所有可用配置选项。 我看起来像这样(缩短):

--help                             print this message
 --prefix=PATH                      set installation prefix
 --sbin-path=PATH                   set nginx binary pathname
 --conf-path=PATH                   set nginx.conf pathname
 --error-log-path=PATH              set error log pathname
 --pid-path=PATH                    set nginx.pid pathname
 --lock-path=PATH                   set nginx.lock pathname
 --user=USER                        set non-privileged user for
                                     worker processes
 --group=GROUP                      set non-privileged group for
                                     worker processes
 --builddir=DIR                     set build directory
 --with-rtsig_module                enable rtsig module
 --with-select_module               enable select module
 --without-select_module            disable select module
 --with-poll_module                 enable poll module
 --without-poll_module              disable poll module
 --with-file-aio                    enable file AIO support
 --with-ipv6                        enable IPv6 support
 --with-http_ssl_module             enable ngx_http_ssl_module
 [...]
 --with-http_stub_status_module     enable ngx_http_stub_status_module
 --without-http_charset_module      disable ngx_http_charset_module
 [...]
 --without-http_browser_module      disable ngx_http_browser_module
 --without-http_upstream_ip_hash_module
                                     disable ngx_http_upstream_ip_hash_module
 --without-http_upstream_least_conn_module
                                     disable ngx_http_upstream_least_conn_module
 --without-http_upstream_keepalive_module
                                     disable ngx_http_upstream_keepalive_module
 --with-http_perl_module            enable ngx_http_perl_module
 --with-perl_modules_path=PATH      set Perl modules path
 --with-perl=PATH                   set perl binary pathname
 --http-log-path=PATH               set http access log pathname
 --http-client-body-temp-path=PATH  set path to store
                                     http client request body temporary files
 --http-proxy-temp-path=PATH        set path to store
                                     http proxy temporary files
 --http-fastcgi-temp-path=PATH      set path to store
                                     http fastcgi temporary files
 --http-uwsgi-temp-path=PATH        set path to store
                                     http uwsgi temporary files
 --http-scgi-temp-path=PATH         set path to store
                                     http scgi temporary files
 --without-http                     disable HTTP server
 --without-http-cache               disable HTTP cache
 --with-mail                        enable POP3/IMAP4/SMTP proxy module
 [...]
 --without-mail_smtp_module         disable ngx_mail_smtp_module
 --with-google_perftools_module     enable ngx_google_perftools_module
 --with-cpp_test_module             enable ngx_cpp_test_module
 --add-module=PATH                  enable an external module
 --with-cc=PATH                     set C compiler pathname
 [...]
 --with-cpu-opt=CPU                 build for the specified CPU, valid values:
                                     pentium, pentiumpro, pentium3, pentium4,
                                     athlon, opteron, sparc32, sparc64, ppc64
 --without-pcre                     disable PCRE library usage
 [...]
 --with-pcre-jit                    build PCRE with JIT compilation support
 --with-md5=DIR                     set path to md5 library sources
 --with-md5-opt=OPTIONS             set additional build options for md5
 --with-md5-asm                     use md5 assembler sources
 --with-sha1=DIR                    set path to sha1 library sources
 --with-sha1-opt=OPTIONS            set additional build options for sha1
 --with-sha1-asm                    use sha1 assembler sources
 --with-zlib=DIR                    set path to zlib library sources
 --with-zlib-opt=OPTIONS            set additional build options for zlib
 --with-zlib-asm=CPU                use zlib assembler sources optimized
                                     for the specified CPU, valid values:
                                     pentium, pentiumpro
 --with-libatomic                   force libatomic_ops library usage
 --with-libatomic=DIR               set path to libatomic_ops library sources
 --with-openssl=DIR                 set path to OpenSSL library sources
 --with-openssl-opt=OPTIONS         set additional build options for OpenSSL
 --with-debug                       enable debug logging

这将帮助您很多地决定要包含/排除哪些模块,以及还有什么可以定义的。

我们将使用以下配置命令:

./configure \
    --prefix=/usr/share/nginx \
    --sbin-path=/usr/sbin/nginx \
    --conf-path=/etc/nginx/nginx.conf \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/access.log \
    --user=www-data \
    --group=www-data \
    --without-mail_pop3_module \
    --without-mail_imap_module \
    --without-mail_smtp_module \
    --without-http_fastcgi_module \
    --without-http_uwsgi_module \
    --without-http_scgi_module \
    --without-http_memcached_module \
    --with-ipv6 \
    --with-http_ssl_module \
    --with-http_spdy_module \
    --with-http_stub_status_module \
    --with-http_gzip_static_module \
    --add-module=/tmp/nginx-modules/headers-more-nginx-module-0.19 \
    --add-module=/tmp/nginx-modules/naxsi-core-0.49/naxsi_src \
    --add-module=/tmp/nginx-modules/ngx_cache_purge-2.0

这将排除与我们不需要的邮件和处理程序相关的所有内容(您可能需要它们,如果不是作为反向代理运行),并包括我们下载的第三方模块和SPDY补丁。

我在这里使用Debian标准路径,但是可以随意更改它们。

接下来,我们可以编译源码:

make

注意:如果这引发任何错误,您应该仔细阅读它们以查看问题在哪里,以及它是什么。

最后安装编译源码:

make install

这将将所有文件复制到正确的位置。 完成了!

7启用自动启动

Debian使用init脚本,通过它可以控制服务行为。 我正在使用官方的nginx包 - 所有的信用都属于它的维护者:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/nginx
NAME=nginx
DESC=nginx
# Include nginx default if available
if [ -f /etc/default/nginx ]; then
  . /etc/default/nginx
fi
test -x $DAEMON || exit 0
set -e
. /lib/lsb/init-functions
test_nginx_config() {
    if $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1; then
        return 0
    else
        $DAEMON -t $DAEMON_OPTS
        return $?
    fi
}
case "$1" in
    start)
        echo -n "Starting $DESC: "
        test_nginx_config
        # Check if the ULIMIT is set in /etc/default/nginx
        if [ -n "$ULIMIT" ]; then
            # Set the ulimits
            ulimit $ULIMIT
        fi
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
            --exec $DAEMON -- $DAEMON_OPTS || true
        echo "$NAME."
        ;;
    stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
            --exec $DAEMON || true
        echo "$NAME."
        ;;
    restart|force-reload)
        echo -n "Restarting $DESC: "
        start-stop-daemon --stop --quiet --pidfile \
            /var/run/$NAME.pid --exec $DAEMON || true
        sleep 1
        test_nginx_config
        # Check if the ULIMIT is set in /etc/default/nginx
        if [ -n "$ULIMIT" ]; then
            # Set the ulimits
            ulimit $ULIMIT
        fi
        start-stop-daemon --start --quiet --pidfile \
            /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
        echo "$NAME."
        ;;
    reload)
        echo -n "Reloading $DESC configuration: "
        test_nginx_config
        start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
            --exec $DAEMON || true
        echo "$NAME."
        ;;
    configtest|testconfig)
        echo -n "Testing $DESC configuration: "
        if test_nginx_config; then
            echo "$NAME."
        else
            exit $?
        fi
        ;;
    status)
        status_of_proc -p /var/run/$NAME.pid "$DAEMON" nginx && exit 0 || exit $?
        ;;
    *)
        echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest}" >&2
        exit 1
        ;;
esac
exit 0

不要忘记chmod

chmod 755 /etc/init.d/nginx

我们还可以创建Debian样式的默认文件:

nano /etc/default/nginx

并粘贴:

# Note: You may want to look at the following page before setting the ULIMIT.
#  http://wiki.nginx.org/CoreModule#worker_rlimit_nofile
# Set the ulimit variable if you need defaults to change.
#  Example: ULIMIT="-n 4096"
#ULIMIT="-n 4096"

最后但并非最不重要的是,如果你喜欢在启动时自动启动nginx,你可以运行:

update-rc.d nginx defaults

8特殊模块指令

我们不会在这里通过nginx配置和vhost文件,但是我们的模块的以下指令很有趣:

# SPDY module (vhost)
listen 443 ssl spdy;
# more_headers module (http)
more_clear_headers 'Server'; # removes server information

纳克西

纳克西斯有点复杂。 首先,全局配置规则应该包含在nginx配置文件的http部分中:

nano /etc/nginx/nginx.conf

并粘贴:

http {
	[...]
		include /etc/nginx/naxsi_core.rules;
	[...]
}

注意:确保此文件存在。 您可以从下载的归档中复制naxsi配置文件(请参阅:附加的第三方模块)。

接下来,您必须在虚拟机模板中包含默认规则:

[...]
location / {
	include /etc/nginx/naxsi.rules;
	[...]
}
[...]

以及阻止请求的位置:

[...]
location /blocked {
    return 403;
    #proxy_pass http://127.0.0.1:4242; # learning mode
}
[...]

注意:确保被阻止请求的位置与配置文件/etc/nginx/naxsi.rules匹配

LearningMode;
SecRulesEnabled;
#SecRulesDisabled;
DeniedUrl "/blocked";
[...]

正如你可以看到纳克西斯有一些奇怪的选择,但他们并不奇怪。 你应该去了解他们的文档,看看如何使其最好的工作。 一个提示我搜索很长时间:您必须运行一个python脚本,并通过阻止的请求,在学习模式下为虚拟警报创建白名单。