在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
这将安装所有必需的软件包,如gcc
和make
。
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下载模块
对于本教程,我们将下载一些非常棒的模块,如naxsi
, SPDY
和一些不那么知名的模块。
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脚本,并通过阻止的请求,在学习模式下为虚拟警报创建白名单。