Nginxビルド · 4 min read · Jan 23, 2026
Debian SqueezeでソースからNginxをビルドする
Debian SqueezeでソースからNginxをビルドする
バージョン 1.0
著者: Michel Käser
このチュートリアルでは、Debian Squeezeでソースからnginxをビルドする方法を説明します。さらに、naxsi WAF(ウェブアプリケーションファイアウォール)、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。
すべての利用可能なモジュールが含まれているわけではないので、特定のモジュールを探している場合は、nginx redis module githubのようなGoogleクエリを実行することをお勧めします - 多くのモジュールはGithubにホストされています。
5.1 モジュールのダウンロード
このチュートリアルでは、naxsi、SPDY、およびいくつかのあまり知られていない素晴らしいモジュールをダウンロードします。
headers_more
まず、headers_moreから始めましょう。これを使用して、ウェブサーバー情報を完全に隠すことができます。たとえば、サーバーのセキュリティを強化するためです:
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これにより、最新バージョンがダウンロードされ、解凍されます。新しいバージョンがあるかどうかを確認するために、公式リポジトリを時々チェックすることを忘れないでください(他のモジュールにも当てはまります)。
Cache Purge
このモジュールは、あなたのセットアップには必要ないかもしれません。ただし、Apacheの前にnginxがあり、proxy_passの結果をキャッシュしている場合、これは役立つかもしれません!そうでない場合は、スキップしてください:
wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.0.tar.gz
tar -xzvf 2.0.tar.gznaxsi
Naxsiは、nginx用のオープンソースで高性能、低ルールメンテナンスのウェブアプリケーションファイアウォールモジュールです - 機能的にはmod_securityに非常に似ています。顧客のウェブアプリケーションを保護するために使用します:
wget http://naxsi.googlecode.com/files/naxsi-core-0.49.tgz
tar -xzvf naxsi-core-0.49.tgzSPDY
SPDYは、ウェブサーバーがストリームの多重化やヘッダー圧縮などの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リポジトリを参照している場合は、上記のテキストでsqueezeをstableに置き換える必要があります。
これで、安全に実行できます:
apt-get update
apt-get -t testing install opensslこれにより、既存のOpenSSLバージョンがアップグレード/インストールされます。
パッチの適用
現在、他のモジュールのように含める方法はなく、nginxソースコードのパッチとして提供されています。公式のreadmeはここにあります: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 このメッセージを表示
--prefix=PATH インストールプレフィックスを設定
--sbin-path=PATH nginxバイナリのパス名を設定
--conf-path=PATH nginx.confのパス名を設定
--error-log-path=PATH エラーログのパス名を設定
--pid-path=PATH nginx.pidのパス名を設定
--lock-path=PATH nginx.lockのパス名を設定
--user=USER ワーカープロセスのための特権のないユーザーを設定
--group=GROUP ワーカープロセスのための特権のないグループを設定
--builddir=DIR ビルドディレクトリを設定
--with-rtsig_module rtsigモジュールを有効にする
--with-select_module selectモジュールを有効にする
--without-select_module selectモジュールを無効にする
--with-poll_module pollモジュールを有効にする
--without-poll_module pollモジュールを無効にする
--with-file-aio ファイルAIOサポートを有効にする
--with-ipv6 IPv6サポートを有効にする
--with-http_ssl_module ngx_http_ssl_moduleを有効にする
[...]
--with-http_stub_status_module ngx_http_stub_status_moduleを有効にする
--without-http_charset_module ngx_http_charset_moduleを無効にする
[...]
--without-http_browser_module ngx_http_browser_moduleを無効にする
--without-http_upstream_ip_hash_module
ngx_http_upstream_ip_hash_moduleを無効にする
--without-http_upstream_least_conn_module
ngx_http_upstream_least_conn_moduleを無効にする
--without-http_upstream_keepalive_module
ngx_http_upstream_keepalive_moduleを無効にする
--with-http_perl_module ngx_http_perl_moduleを有効にする
--with-perl_modules_path=PATH Perlモジュールのパスを設定
--with-perl=PATH perlバイナリのパス名を設定
--http-log-path=PATH httpアクセスログのパス名を設定
--http-client-body-temp-path=PATH httpクライアントリクエストボディの一時ファイルを保存するパスを設定
--http-proxy-temp-path=PATH httpプロキシの一時ファイルを保存するパスを設定
--http-fastcgi-temp-path=PATH http fastcgiの一時ファイルを保存するパスを設定
--http-uwsgi-temp-path=PATH http uwsgiの一時ファイルを保存するパスを設定
--http-scgi-temp-path=PATH http scgiの一時ファイルを保存するパスを設定
--without-http HTTPサーバーを無効にする
--without-http-cache HTTPキャッシュを無効にする
--with-mail POP3/IMAP4/SMTPプロキシモジュールを有効にする
[...]
--without-mail_smtp_module ngx_mail_smtp_moduleを無効にする
--with-google_perftools_module ngx_google_perftools_moduleを有効にする
--with-cpp_test_module ngx_cpp_test_moduleを有効にする
--add-module=PATH 外部モジュールを有効にする
--with-cc=PATH Cコンパイラのパス名を設定
[...]
--with-cpu-opt=CPU 指定されたCPU用にビルド、妥当な値:
pentium, pentiumpro, pentium3, pentium4,
athlon, opteron, sparc32, sparc64, ppc64
--without-pcre PCREライブラリの使用を無効にする
[...]
--with-pcre-jit JITコンパイルサポートでPCREをビルド
--with-md5=DIR md5ライブラリソースのパスを設定
--with-md5-opt=OPTIONS md5のための追加ビルドオプションを設定
--with-md5-asm md5アセンブラソースを使用
--with-sha1=DIR sha1ライブラリソースのパスを設定
--with-sha1-opt=OPTIONS sha1のための追加ビルドオプションを設定
--with-sha1-asm sha1アセンブラソースを使用
--with-zlib=DIR zlibライブラリソースのパスを設定
--with-zlib-opt=OPTIONS zlibのための追加ビルドオプションを設定
--with-zlib-asm=CPU 指定されたCPUに最適化されたzlibアセンブラソースを使用
妥当な値:pentium, pentiumpro
--with-libatomic libatomic_opsライブラリの使用を強制
--with-libatomic=DIR libatomic_opsライブラリソースのパスを設定
--with-openssl=DIR OpenSSLライブラリソースのパスを設定
--with-openssl-opt=OPTIONS OpenSSLのための追加ビルドオプションを設定
--with-debug デバッグログを有効にするこれにより、どのモジュールを含める/除外するか、他に何を定義できるかを決定するのに大いに役立ちます。
次のconfigureコマンドを使用します:
./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/nginxDebianスタイルのデフォルトファイルも作成できます:
nano /etc/default/nginxそして貼り付けます:
# 注意:ULIMITを設定する前に、次のページを確認することをお勧めします。
# http://wiki.nginx.org/CoreModule#worker_rlimit_nofile
# デフォルトを変更する必要がある場合は、ulimit変数を設定します。
# 例:ULIMIT="-n 4096"
#ULIMIT="-n 4096"最後に、nginxを起動時に自動起動させたい場合は、次のコマンドを実行できます:
update-rc.d nginx defaults8 特殊モジュールディレクティブ
ここではnginxの設定とvhostファイルについては触れませんが、モジュールからの次のディレクティブは興味深いです:
# SPDYモジュール(vhost)
listen 443 ssl spdy;
# more_headersモジュール(http)
more_clear_headers 'Server'; # サーバー情報を削除naxsi
naxsiは少し複雑です。まず、グローバル設定ルールをnginx設定ファイルのhttpセクションに含める必要があります:
nano /etc/nginx/nginx.confそして貼り付けます:
http {
[...]
include /etc/nginx/naxsi_core.rules;
[...]
}注意: このファイルが存在することを確認してください。ダウンロードしたアーカイブからnaxsi設定ファイルをコピーできます(追加のサードパーティモジュールを参照)。
次に、vhostテンプレート内にデフォルトルールを含める必要があります:
[...]
location / {
include /etc/nginx/naxsi.rules;
[...]
}
[...]そして、ブロックされたリクエストのためのロケーション:
[...]
location /blocked {
return 403;
#proxy_pass http://127.0.0.1:4242; # 学習モード
}
[...]注意: ブロックされたリクエストのロケーションが設定ファイル/etc/nginx/naxsi.rulesのものと一致することを確認してください:
LearningMode;
SecRulesEnabled;
#SecRulesDisabled;
DeniedUrl "/blocked";
[...]ご覧のとおり、naxsiにはいくつかの奇妙なオプションがありますが、奇妙ではありません。最適に機能させる方法を読むために、彼らのドキュメントを確認することをお勧めします。私が非常に長い間探していたヒント:学習モード中にブロックされたリクエストを渡すPythonスクリプトを実行し、誤警告のホワイトリストを作成する必要があります。
9 リンク / クレジット
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。