HEARTBEATS

Nginx連載記事から13年で変わったこと

   

こんにちは、開発グループの鈴木です。

このブログ内で2012年に公開した全6回のnginx連載は、今なお多くの方に見ていただけています。 そこで今回は、連載当時から現在までで内容のアップデートがあった箇所をピックアップして紹介します。

結果としては、基本的な設定方法などはほとんど変わっておらず、連載で紹介した設定が今でも利用可能であることがわかりました。 その一方で、新しいプロトコルへの対応やnginx自体を取り巻く状況などが変わっていましたので紹介します。

nginxの概要

連載時(2012年)のnginxの安定版バージョンは1.0.12でした。2025年6⽉現在の最新安定バージョンは1.28.0になっています。

nginx連載当時はまだnginxが日本で流行り始めたころであり、webサーバーのシェアとしては訪問者数トップ100万サイトのサーバーで10%程度と紹介しています。 連載時にも参照したNetCraft社による調査の2024年版である「september-2024-web-server-survey」によると、2024年9月時点ではnginxはトップサーバーで20.29%のシェアになっています。 nginxは一時期26%のシェアを持っていましたが、近年はシェアが減少傾向となっています。 これは簡単にウェブページを公開できる様々なwebホスティングサービスが増え、新たにwebサーバーを自前で管理し公開するケースが全体的に減少し、nginxやApache HTTP Serverなどのシェア減少につながっていると考えられます。

また、nginxはNginx.Incによる管理でしたが、Nginx.IncがF5 Networks.Incに買収されたことにより、F5 Networks.Incの管理となっています。 2024年にコア開発者がF5社との方向性の違いなどによりnginxの開発から離れ、freenginxというnginxフォークが開発されていたりします。

nginx連載時から設定の変更があった点

nginx連載で紹介した設定のうち、変更があった点を紹介します。 ただ冒頭でも書いたように、以前の連載から大きな変更はなく、連載6回目で紹介しているSSL/TLS周りの設定で少し変更があったのみでした。

sslディレクティブの削除

sslディレクティブがver1.25.1で削除されました。 ver1.25.1以降はlistenディレクティブ内でだけsslが指定できるようになっています。

ver1.15.0からすでにsslディレクティブはdeprecatedになっており、sslディレクティブを利用すると警告が出る状態になっていました。 しかし、ver1.25.1からsslディレクティブが削除され利用できなくなりました。

listen 443;
ssl on;

ver1.25.1以降は下記のようにlistenディレクティブでのみ指定するようになりました。

listen 443 ssl;

TLS1.3の追加とデフォルトでの有効化

ssl_protocolsでは、ver1.13.0から指定できるプロトコルにTLS1.3が追加され、ver1.23.1からデフォルトでTLS1.3が有効になりました。

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

新しくできるようになったこと

以前の連載からここ数年まででの大きな変更点は、HTTP2、HTTP3、QUICプロトコルに対応したことです。 また、ver1.25.1まではHTTP2を有効にする際、listenディレクティブでhttp2と指定していましたが、ver1.25.1以降は別途http2ディレクティブon|offを指定するようになりました。

;; ver1.25.0以前
listen 443 ssl http2;
;; ver1.25.1以降
listen 443 ssl;
http2 on;

QUICとHTTP3はver1.25以降であればビルドせずに利用できます。 ただし、2025年6月現在ではどちらも実験的サポートである点には注意が必要です。 HTTP3はHTTP2と同様にhttp3ディレクティブonを指定することで有効化できます。 また、QUICはlistenディレクティブで指定することによって有効化できます。

http3    on;
listen 443 quic;

HTTP3とQUICの設定については、下記公式ドキュメントを参考にしてください。

ngx_stream_pass_moduleの追加

nginx連載では触れていない部分ですが、streamディレクティブ内でpassディレクティブが使える様になったので紹介します。 以前からstreamディレクティブでサーバーを設定した場合に、proxy_passディレクティブを利用することで通信をプロキシさせることは可能でした。 しかし、ver1.25.5よりngx_stream_pass_moduleが追加され、passディレクティブを利用することでプロキシではなくクライアントからの通信を直接上流に渡せることができるようになりました。

実際にpassディレクティブを使用したときの動作を下記の環境で確認してみました。

  • nginxサーバー(クラウド上の仮想サーバー)
    • OS: AlmaLinux OS 8.10
    • nginx: nginx 1.26.0
  • アクセス元(ローカルPC)
    • curl 8.7.1

今回の検証では、streamディレクティブ以外のnginx設定については、nginxインストール時のデフォルトのものを利用します。 そのため、80番ポートにHTTPアクセスすることでnginxのウェルカムページが表示されるようになっています。

nginx.confの末尾に下記設定を追記してstreamでリクエストを受け付け、80番ポートで受け付けている仮想サーバーに通信を受け渡すように設定します。 また、proxy_passpassの挙動の違いを確認するため、両方の設定を追加して確認していきます。

# /etc/nginx/nginx.confに追記

http {
    ## コンテンツ用(一部抜粋)
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        ...
    }
}

stream {
    ## 検証用(passディレクティブ)
    server {
        listen 8443 ssl;
        error_log /var/log/nginx/stream.log info;

        # 自己証明書を作成・指定
        ssl_certificate     /etc/nginx/ssl/crt.pem;
        ssl_password_file   /etc/nginx/ssl/password;
        ssl_certificate_key /etc/nginx/ssl/private.key;

        # ngx_stream_pass_moduleで追加されたpassディレクティブを利用する
        pass 127.0.0.1:80;
    }

    ## 検証用(proxy_passディレクティブ)
    server {
        listen 8843 ssl;
        error_log /var/log/nginx/stream_proxy.log info;

        # 自己証明書を作成・指定
        ssl_certificate     /etc/nginx/ssl/crt.pem;
        ssl_password_file   /etc/nginx/ssl/password;
        ssl_certificate_key /etc/nginx/ssl/private.key;

        # proxy_passディレクティブを利用する
        proxy_pass 127.0.0.1:80;
    }
}

設定ができたので、まずは従来どおりプロキシを行う場合でのアクセスをしてみます。 アクセスはcurlで行いますが、テスト用に自己証明書でサーバーを設定しているため、-kオプションをつけて証明書の検証をスキップさせています。

curl https://<nginxサーバーのIPアドレス>:8843 -k

ウェルカムページのアクセスログとstreamサーバーのログを確認すると、正常に通信がプロキシされていることがわかります。 また、通信がプロキシされているため、アクセスログのアクセス元IPアドレスがローカルループバックアドレスになっていることも確認できます。

### ウェルカムページのアクセスログ
127.0.0.1 - - [24/Nov/2024:14:38:16 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/8.7.1" "-"

### streamログ
2024/11/24 14:38:16 [info] 11467#11467: *2 client <ローカルPCのIPアドレス>:64922 connected to 0.0.0.0:8843
2024/11/24 14:38:16 [info] 11467#11467: *2 proxy 127.0.0.1:38972 connected to 127.0.0.1:80

今度は、passディレクティブを利用しているポートへアクセスしてみます。

curl https://<nginxサーバーのIPアドレス>:8443 -k

ウェルカムページのアクセスログではアクセス元のIPアドレスがローカルループバックアドレスではなくなり、ローカルPCのIPアドレスが表示されていることが確認できました。 また、streamのログを確認するとproxy_passを利用した場合と異なり通信をプロキシしたログがなく、通信がプロキシ処理されずに直接上流のサーバーへと渡されていることがわかります。

### ウェルカムページのアクセスログ
<ローカルPCのIPアドレス> - - [24/Nov/2024:14:41:27 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/8.7.1" "-"

### streamログ
2024/11/24 14:41:27 [info] 11467#11467: *5 client :65029 connected to 0.0.0.0:8443

passディレクティブを使うことでプロキシ処理をせずに通信が受け渡されるようになるため、streamで受け付けるサーバーでの分散や単純な後続サーバーへの通信の受け渡しだけを行っている場合は、通信のオーバーヘッドが減り処理性能向上などが見込めそうです。

おわりに

今回はnginx連載のうち主に変更があった点を紹介しました。基本的な設定は変わっておらず、引き続き運用や管理ができるのは嬉しいところです。ただ、新しいプロトコルの対応や機能の追加などもありますので、引き続き情報の収集を怠らず利用していきたいです。

参考として過去のnginx連載の記事URL一覧を記載します。 よろしければ、あわせてご覧ください。

株式会社ハートビーツの技術情報やイベント情報などをお届けする公式ブログです。



ハートビーツをフォロー

  • Twitter:HEARTBEATS
  • Facebook:HEARTBEATS
  • HATENA:HEARTBEATS
  • RSS:HEARTBEATS

殿堂入り記事