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.gz

naxsi

Naxsiは、nginx用のオープンソースで高性能、低ルールメンテナンスのウェブアプリケーションファイアウォールモジュールです - 機能的にはmod_securityに非常に似ています。顧客のウェブアプリケーションを保護するために使用します:

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

SPDY

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/nginx

Debianスタイルのデフォルトファイルも作成できます:

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 defaults

8 特殊モジュールディレクティブ

ここでは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 リンク / クレジット

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。