変更要約: 初版(主題2.09・副主題2.09.1〜2.09.4に対応)
3.3nginxの設定と管理
nginxの基本設定とリバースプロキシとしての利用を学びます。設定ディレクトリ/etc/nginx/、nginxコマンドによる制御、ssl関連ディレクティブ(ssl_certificate・ssl_certificate_key・ssl_ciphers・ssl_protocols)によるHTTPS化、proxy_passによるバックエンドへの転送、proxy_http_version・proxy_set_headerによるプロキシ動作の調整を押さえます。
nginxは高い並行接続性能を活かし、単体のWebサーバーとしてだけでなく、複数のアプリケーションサーバーの手前に立つリバースプロキシとして広く使われています。Apacheとディレクティブ名が似て非なる点が多く、L2試験でも混同を狙った出題が定番です。
3.3.1設定ファイルと制御
- 設定ファイル一式は/etc/nginx/配下(メインは通常nginx.conf、サイト別設定はconf.dやsites-available等)。編集後はnginxコマンドの構文チェック・再読込オプションで反映します。
- HTTPS化はssl関連の複数ディレクティブを組み合わせます。ssl_certificate(証明書)・ssl_certificate_key(秘密鍵)・ssl_protocols(許可プロトコル)・ssl_ciphers(許可暗号スイート)という構成はApacheと役割対応するもののディレクティブ名が異なる点に注意します。
3.3.2リバースプロキシとしての設定
- proxy_passでリクエストを転送するバックエンドURLを指定(例:
proxy_pass http://127.0.0.1:8080;)。nginxがフロントで受け、実処理をアプリケーションサーバーへ渡す典型構成の中核ディレクティブです。 - proxy_http_versionでバックエンドとの通信に使うHTTPバージョンを指定(デフォルトはHTTP/1.0のため、WebSocket等では明示的に1.1へ変更することが多い)。
- proxy_set_headerでバックエンドへ転送するリクエストヘッダーを追加・書き換え。クライアントの元のHostやIPアドレスをバックエンドへ伝えるために使う定番ディレクティブです。
「ApacheのSSLCertificateFileに対応するnginxはssl_certificate(アンダースコア・小文字)」「ApacheのSSLProtocolに対応するnginxはssl_protocols」という名前の対応と綴りの違いが最頻出の混同ポイントです。「バックエンドへの転送=proxy_pass」「転送先へのヘッダー追加=proxy_set_header」「HTTP/1.1への切り替え=proxy_http_version」も定番の対応関係です。
典型的な「nginxをフロントに置き、背後のアプリケーションサーバーへ振り分ける」構成を追ってみます。/etc/nginx/配下のサーバーブロックにlisten 443 ssl;を書き、ssl_certificateで証明書ファイル、ssl_certificate_keyで秘密鍵ファイルを指定します。ここでApacheの経験があるとSSLCertificateFileと綴りたくなりますが、nginxではアンダースコア区切りの小文字ディレクティブである点が試験でも実務でも取り違えやすい落とし穴です。さらにssl_protocols TLSv1.2 TLSv1.3;のように許可プロトコルを絞り、ssl_ciphersで弱い暗号を除外します。TLS終端を終えたリクエストをバックエンドへ渡す部分はlocation /ブロック内にproxy_pass http://127.0.0.1:8080;と書くのが基本形です。バックエンドとの接続でHTTP/1.1の機能(WebSocketのUpgrade等)が必要な場合はproxy_http_version 1.1;を明示します(デフォルトのHTTP/1.0では対応できないため)。加えて、proxy_set_headerでクライアントの本来のHostやIPをバックエンドへ伝えます(例:proxy_set_header Host $host;・proxy_set_header X-Real-IP $remote_addr;)。これを省略すると、バックエンドのアプリケーションはすべてのリクエストがnginx自身から来たように見えてしまい、アクセス元IPに基づくログ記録やアクセス制御が意図通り機能しなくなります。
| 目的 | nginxディレクティブ | Apache相当 |
|---|---|---|
| 証明書指定 | ssl_certificate | SSLCertificateFile |
| 秘密鍵指定 | ssl_certificate_key | SSLCertificateKeyFile |
| 許可プロトコル | ssl_protocols | SSLProtocol |
| 許可暗号スイート | ssl_ciphers | SSLCipherSuite |
ひっかけ: nginxの設定に「SSLCertificateFile」「SSLProtocol」のようなApache流のディレクティブ名を書く選択肢は誤りです。nginxはssl_certificate・ssl_protocolsのようにアンダースコア区切り・小文字を使います。また「proxy_set_headerを省略してもバックエンドは元のクライアントIPを認識できる」も誤り=省略すると接続元はnginx自身に見え、X-Real-IP等を明示的に転送しない限り元のクライアントIPは失われます。
3.3.3この節のまとめ
- 設定は/etc/nginx/、TLSはssl_certificate/ssl_certificate_key/ssl_protocols/ssl_ciphers(Apacheと綴りが異なる)
- リバースプロキシはproxy_passで転送、proxy_http_versionでHTTPバージョン調整、proxy_set_headerでクライアント情報を伝搬
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. nginxでHTTPSを有効化し証明書ファイルを指定したい。正しいディレクティブは?
Q2. nginxをリバースプロキシとして、受けたリクエストをlocalhostの8080番ポートで動くアプリケーションへ転送したい。使うディレクティブは?
Q3. nginxのリバースプロキシ構成で、バックエンドのアプリケーションに接続元クライアントの本来のIPアドレスを伝えたい。使うディレクティブは?

