📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の6版が非表示)
17行目: 17行目:
! style="background-color:#66CCFF;" | NginX
! style="background-color:#66CCFF;" | NginX
|-
|-
| style="background-color:#EDEDED;" | 同時・複数アクセスへの対処方法  
| style="background-color:#308030;" | 同時・複数アクセスへの対処方法  
| 1アクセスに対して、1つの対応 || 複数のアクセスに対して、1つの対応にまとまる
| 1アクセスに対して、1つの対応 || 複数のアクセスに対して、1つの対応にまとまる
|-
|-
| style="background-color:#EDEDED;" | アクセス急増時のサーバへの負荷  
| style="background-color:#308030;" | アクセス急増時のサーバへの負荷  
| 一気に負荷が増す || アクセスに比例して負荷は急激に増えない
| 一気に負荷が増す || アクセスに比例して負荷は急激に増えない
|-
|-
| style="background-color:#EDEDED;" | その結果のWebサーバの挙動  
| style="background-color:#308030;" | その結果のWebサーバの挙動  
| 動作が遅くなり、ダウンしやすくなる || 処理速度を維持して、ダウンしにくい
| 動作が遅くなり、ダウンしやすくなる || 処理速度を維持して、ダウンしにくい
|}
|}
48行目: 48行目:
<br>
<br>
<center>
<center>
{| class="wikitable"
{| class="wikitable" | style="background-color:#fefefe;"
! colspan="4" style="background-color:#44CC99;" | 参考書  
! colspan="4" style="background-color:#44CC99;" | 参考書  
|- style="text-align: center; background-color:white;"
|- style="text-align: center;"
| style="width: 25%" | <html><a href="https://www.amazon.co.jp/nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%B8%A1%E8%BE%BA%E9%AB%98%E5%BF%97-ebook/dp/B01N183E3H?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1683613390&sr=8-1&linkCode=li2&tag=presire22-22&linkId=c2bce7928a72af61eeb5cfe551cafbfe&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B01N183E3H&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=presire22-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=presire22-22&language=ja_JP&l=li2&o=9&a=B01N183E3H" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></html><br>[https://www.amazon.co.jp/nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%B8%A1%E8%BE%BA%E9%AB%98%E5%BF%97-ebook/dp/B01N183E3H?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1683613390&sr=8-1&linkCode=ll1&tag=presire22-22&linkId=316efe14edfc68d79079b3ec48409b31&language=ja_JP&ref_=as_li_ss_tl nginx実践ガイド<br>IT技術者のための現場ノウハウ]
| style="width: 25%" | <center><html><a href="https://www.amazon.co.jp/nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%B8%A1%E8%BE%BA%E9%AB%98%E5%BF%97-ebook/dp/B01N183E3H?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1683613390&sr=8-1&linkCode=ll1&tag=presire2-22&linkId=043bfdc7a0aebd00eb1db639408b7d42&language=ja_JP&ref_=as_li_ss_tl" target="_blank"><img style="width: 250px; height: auto;" src="https://m.media-amazon.com/images/I/A1nwYPPNb8L._SL1500_.jpg" ></a></html><br>[https://www.amazon.co.jp/nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%B8%A1%E8%BE%BA%E9%AB%98%E5%BF%97-ebook/dp/B01N183E3H?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1683613390&sr=8-1&linkCode=ll1&tag=presire2-22&linkId=043bfdc7a0aebd00eb1db639408b7d42&language=ja_JP&ref_=as_li_ss_tl nginx実践ガイド<br>IT技術者のための現場ノウハウ]</center>
| style="width: 25%" | <html><a href="https://www.amazon.co.jp/nginx%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-WEB-DB-PRESS-plus/dp/4774178667?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1683613529&sr=8-4&linkCode=li2&tag=presire22-22&linkId=2aab94e778651e2e0eddfed8df38af4e&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4774178667&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=presire22-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=presire22-22&language=ja_JP&l=li2&o=9&a=4774178667" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></html><br>[https://www.amazon.co.jp/nginx%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-WEB-DB-PRESS-plus/dp/4774178667?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1683613529&sr=8-4&linkCode=ll1&tag=presire22-22&linkId=80ad46399788e7be696ba90261fbd3ab&language=ja_JP&ref_=as_li_ss_tl nginx実践入門<br>高速/安定稼働を実現する構築と運用のテクニック]
| style="width: 25%" | <center><html><a href="https://www.amazon.co.jp/nginx%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-WEB-DB-PRESS-plus/dp/4774178667?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1683613529&sr=8-4&linkCode=ll1&tag=presire2-22&linkId=27b398323efeb2a8b3c7dbc64e799fa1&language=ja_JP&ref_=as_li_ss_tl" target="_blank"><img style="width: 250px; height: auto;" src="https://m.media-amazon.com/images/I/61LbDMjddRL._SL1000_.jpg" ></a></html><br>[https://www.amazon.co.jp/nginx%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-WEB-DB-PRESS-plus/dp/4774178667?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1683613529&sr=8-4&linkCode=ll1&tag=presire2-22&linkId=27b398323efeb2a8b3c7dbc64e799fa1&language=ja_JP&ref_=as_li_ss_tl nginx実践入門<br>高速/安定稼働を実現する構築と運用のテクニック]</center>
| style="width: 25%" | <html><a href="https://www.amazon.co.jp/Nginx-%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-%E9%B6%B4%E9%95%B7-%E9%8E%AE%E4%B8%80/dp/4774176338?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1683613634&sr=8-3&linkCode=li2&tag=presire22-22&linkId=7bd61f1c362b86b9c860a3ccf34f1f3f&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4774176338&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=presire22-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=presire22-22&language=ja_JP&l=li2&o=9&a=4774176338" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></html><br>[https://www.amazon.co.jp/Nginx-%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-%E9%B6%B4%E9%95%B7-%E9%8E%AE%E4%B8%80/dp/4774176338?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1683613634&sr=8-3&linkCode=ll1&tag=presire22-22&linkId=85ec8e6ff1903fc755c7504f6ff942fe&language=ja_JP&ref_=as_li_ss_tl Nginx ポケットリファレンス]
| style="width: 25%" | <center><html><a href="https://www.amazon.co.jp/Nginx-%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-%E9%B6%B4%E9%95%B7-%E9%8E%AE%E4%B8%80/dp/4774176338?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1683613634&sr=8-3&linkCode=ll1&tag=presire2-22&linkId=fba35fad8e2270d7371a77b5c5a9f44e&language=ja_JP&ref_=as_li_ss_tl" target="_blank"><img style="width: 250px; height: auto;" src="https://m.media-amazon.com/images/I/61ZE51+HyfL._SL1000_.jpg" ></a></html><br>[https://www.amazon.co.jp/Nginx-%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-%E9%B6%B4%E9%95%B7-%E9%8E%AE%E4%B8%80/dp/4774176338?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1683613634&sr=8-3&linkCode=ll1&tag=presire2-22&linkId=fba35fad8e2270d7371a77b5c5a9f44e&language=ja_JP&ref_=as_li_ss_tl Nginx ポケットリファレンス]</center>
| style="width: 25%" | <html><a href="https://www.amazon.co.jp/Nginx-HTTP-Server-Harness-infrastructure-ebook/dp/B078JP4HZN?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3B65BLLSDAMIQ&keywords=Nginx+HTTP+Server&qid=1667805465&qu=eyJxc2MiOiIxLjQ3IiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sprefix=nginx+http+server%2Caps%2C340&sr=8-1&linkCode=li2&tag=presire22-22&linkId=0edb26cdeb87a7d345a5e49cbf2a52ad&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B078JP4HZN&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=presire22-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=presire22-22&language=ja_JP&l=li2&o=9&a=B078JP4HZN" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></html><br>[https://www.amazon.co.jp/Nginx-HTTP-Server-Harness-infrastructure-ebook/dp/B078JP4HZN?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3B65BLLSDAMIQ&keywords=Nginx+HTTP+Server&qid=1667805465&qu=eyJxc2MiOiIxLjQ3IiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sprefix=nginx+http+server%2Caps%2C340&sr=8-1&linkCode=ll1&tag=presire22-22&linkId=314a71169e9b78664ffbe97be08213dc&language=ja_JP&ref_=as_li_ss_tl Nginx HTTP Server<br>Nginxを利用して、高速なページ配信を実現する]
| style="width: 25%" | <center><html><a href="https://www.amazon.co.jp/Nginx-HTTP-Server-Harness-infrastructure-ebook/dp/B078JP4HZN?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3B65BLLSDAMIQ&keywords=Nginx+HTTP+Server&qid=1667805465&qu=eyJxc2MiOiIxLjQ3IiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sprefix=nginx+http+server%2Caps%2C340&sr=8-1&linkCode=ll1&tag=presire2-22&linkId=27ce6fa58f80207d2bb6d06359b505c7&language=ja_JP&ref_=as_li_ss_tl" target="_blank"><img style="width: 250px; height: auto;" src="https://m.media-amazon.com/images/I/81V8A5I4p4L._SL1500_.jpg" ></a></html><br>[https://www.amazon.co.jp/Nginx-HTTP-Server-Harness-infrastructure-ebook/dp/B078JP4HZN?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3B65BLLSDAMIQ&keywords=Nginx+HTTP+Server&qid=1667805465&qu=eyJxc2MiOiIxLjQ3IiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sprefix=nginx+http+server%2Caps%2C340&sr=8-1&linkCode=ll1&tag=presire2-22&linkId=27ce6fa58f80207d2bb6d06359b505c7&language=ja_JP&ref_=as_li_ss_tl Nginx HTTP Server<br>Nginxを利用して、高速なページ配信を実現する]</center>
|}
|}
</center>
</center>
224行目: 224行目:
   
   
  # added automatically, for details please see
  # added automatically, for details please see
# https://en.opensuse.org/openSUSE:Security_Features#Systemd_hardening_effort
  ProtectSystem=full
  ProtectSystem=full
  #ProtectHome=read-only
  #ProtectHome=read-only
725行目: 724行目:
  sudo systemctl start php-fpm
  sudo systemctl start php-fpm
  sudo systemctl start nginx
  sudo systemctl start nginx
<br><br>
== ログフォーマット ==
<center>
{| class="wikitable" | style="background-color:#fefefe;"
|+ Apache2とNginXのログフォーマット
|-
! style="background-color:#66CCFF;" | Apache2
! style="background-color:#66CCFF;" | NginX
! style="background-color:#66CCFF;" | 説明
|-
| %a || $remote_addr || リモートIPアドレス
|-
| %A || $server_addr || ローカルIPアドレス
|-
| %b || $body_bytes_sent || レスポンスのバイト数(HTTPヘッダは除く)<br>CLF書式において、0の時は-(ハイフン)になる。
|-
| %B || $body_bytes_sent || レスポンスのバイト数(HTTPヘッダは除く)
|-
| %D || - || リクエストを処理するのに掛かった時間(マイクロ秒単位)
|-
| %f || $request_filename || リクエストされたファイル名
|-
| %h || - || リモートホスト名
|-
| %H || $server_protocol || リクエストプロトコル名
|-
| %K || - || keepaliveのコネクション数
|-
| %l || - || リモートログ名
|-
| %m || $request_method || リクエストメソッド(GET)
|-
| %p || $server_port || リクエストを受けたポート番号
|-
| %P || $pid || 子プロセスID
|-
| %q || $query_string || クエリ文字列<br>例. <code>http://example.com/test.php?id=12345 -> ?id=12345</code>
|-
| %r || $request || リクエストの最初の行<br>基本的には、%m %U$q %Hとした設定と同様
|-
| %s || $status || ステータスコード
|-
| %t || $time_local || リクエストを受け付けた日時<br>[11/Aug/2017:12:34:56 +0900]
|-
| %{format}t || - || <code>format</code>で与えられた書式による時刻
|-
| %T || $request_time || リクエストを受けてから応答するまでの処理時間(秒)<br>%Dの秒数バージョン
|-
| %u || $remote_user || リモートユーザ名
|-
| %U || $request_uri || リクエストされたパス
|-
| %v || $server_name || サーバのServerNameの値
|-
| %V || $server_name || UseCanonicalNameで指定されたサーバ名
|-
| %X || $request_completion || 応答が完了したときの接続ステータス<br>書式 : aborted + = kept alive - = closed
|-
| %I || $request_length || リクエストとヘッダを含む受け取ったバイト数
|-
| %O || $bytes_sent || ヘッダを含むサーバから送信されたバイト数
|-
| %{Referer}i || $http_referer || リファラー
|-
| %{User-Agent}i || $http_user_agent || ユーザエージェント名
|}
</center>
<br>
<center>
{| class="wikitable" | style="background-color:#fefefe;"
|+ NginXのみのログフォーマット
|-
! style="background-color:#66CCFF;" | ログフォーマット
! style="background-color:#66CCFF;" | 説明
|-
| $args || リクエスト行の引数
|-
| $binary_remote_addr || $remote_addrのバイナリ出力
|-
| $connection || コネクションのシリアル番号
|-
| $connection_requests || コネクションを経由した現在のリクエスト数
|-
| $content_length || Content-Lengthのリクエストヘッダフィールド<br><br>Content-Lengthとは、HTTPヘッダの項目であり、渡すデータのサイズが入っている。
|-
| $content_type || Content-Typeのリクエストヘッダフィールド<br><br>Content-Typeとは、ヘッダで最も一般的に用いられる項目の1つであり、<br>ボディ部に積載したデータの種類や形式(メディアタイプ)を指定する。<br>主に、サーバがクライアントに送信するHTTPレスポンスの中で送信データの形式を伝えるために用いるが、<br>クライアントがフォームなどから送信するPOSTデータの形式を知らせるのにも用いられる。
|-
| $document_root || 現在のリクエストに対するルートディレクティブおよびエイリアスディレクティブの値
|-
| $document_uri || $uriと同じ
|-
| $host || サーバホスト名
|-
| $hostname || ホスト名
|-
| $https || 接続がSSLモードで動作している場合は"on"、それ以外の場合は空文字列となる。
|-
| $limit_rate || この変数を設定することにより、応答速度制限を行うことができる。
|-
| $msec || 現在の時刻をミリ秒単位で表示する。
|-
| $nginx_version || NginXのバージョン
|-
| $pipe || リクエストがパイプライン化されている場合は"p"、それ以外の場合は"."
|-
| $proxy_protocol_addr || Proxyプロトコルヘッダからのクライアントアドレスを表示する。<br>それ以外は空文字列となる。
|-
| $realpath_root || $document_rootの実パス名
|-
| $remote_port || クライアントのポート番号を表示する、
|-
| $request_body || リクエストボディを表示する。
|-
| $request_body_file || リクエストボディを格納した一時ファイル名を表示する。
|-
| $scheme || http
|-
| $sent_http_name || 任意のレスポンスヘッダフィールドを表示する。
|-
| $time_iso8601 || ローカルタイム(ISO 8601標準)を表示する。
|}
</center>
<br><br>
== NginXのその他の設定 ==
==== charset ====
値 : キャラクタ名 / off<br>
初期値 : off<br>
使用環境 : http, server, server.location, locationディレクティブのif文<br>
<br>
指定された文字セットを"Content-Type"応答ヘッダフィールドに追加する。<br>
charsetがsource_charsetディレクティブで指定されたcharsetと異なる場合は、変換が実行される。<br>
<br>
<code>off</code>に設定する場合、"Content-Type"応答ヘッダフィールドへのcharsetの追加を取り消す。<br>
<br>
設定できる値は、charset_map、charset、source_charsetディレクティブの形で、少なくとも1度は設定に存在する必要がある。<br>
utf-8、windows-1251、koi8-r文字セットについては、conf/koi-win、 conf/koi-utf、conf/win-utfを設定に含めれば十分である。<br>
その他の文字セットについては、例えば、単に架空の変換テーブルを作成することでも動作する。<br>
<br>
また、"X-Accel-Charset"応答ヘッダフィールドに文字セットを設定することができる。<br>
この機能は、proxy_ignore_headers、fastcgi_ignore_headers、uwsgi_ignore_headers、scgi_ignore_headers、grpc_ignore_headersディレクティブで無効化することができる。<br>
<br>
==== tcp_nodelay ====
値 : on / off<br>
初期値 : on<br>
使用環境 : http, server.location<br>
<br>
小さなパケットを大きなパケットに合成して、帯域幅の利用率を向上させる。(nagleアルゴリズム)<br>
TCPプロトコルでは、<u>アプリケーション層のデータが非常に少なく(1バイト程度)、かつ、トランスポート層のオーバーヘッドが40バイト(IPヘッダ20バイト + TCPヘッダ20バイト)にもなる現象</u>がある。<br>
この場合、送信データの多くは制御パケットであるため、帯域消費量が増加して、帯域利用率が悪くなる。(ネットワークに輻輳が発生しやすくなる)<br>
<br>
この問題を解決するため、新規に生成されたパケットは送信データが確認されるまで、あるいは、相手側からの確認応答があるまで、<br>
1MSSに切り上げる、または、確認応答があるまで待った後にタイムアウトまで送信する。<br>
ネットワークの輻輳を避けるため、TCPスタックは0.2秒(Unixの実装の値)までデータを待つメカニズムを実装しており、小さすぎるパケットを送信することはない。<br>
<br>
例えば、あるソフトウェアが小さなデータの送信を要求してきたとする。
すぐに送信する、または、データが生成されるのを待って再度送信するかを選択することができるとする。
もし、データをすぐに送ることができれば、インタラクティブでクライアントサーバタイプのソフトウェアは大きなメリットを得ることができる。
また、リクエストを即座に送信すれば、レスポンスも速くなる。
<br>
ただし、ネットワーク上でデータをストリーミングする必要がある場合、逆効果になる可能性がある。<br>
ファイル転送を行う場合、転送するごとにクライアント側で0.2秒の遅延を発生させるからである。<br>
<br>
==== tcp_nopush ====
値 : on / off<br>
初期値 : off<br>
使用環境 : http, server.location<br>
<br>
TCP/IPにおける転送の標準であるtcp_corkの設定である。(tcp_nodelayとは逆の働きをする)<br>
遅延を最適化する代わりに、1度に送信するデータ量を最適化する。<br>
<br>
tcp_nopushを有効にする場合、tcp_corkメソッドが呼ばれるようになるため、パケットはすぐに送信されず、パケットが最大になった時に一気に送信される。(ネットワークの輻輳や混雑を解決する)<br>
(一般的な意味は、TCP通信において、ソフトウェアがパケットを受信した時、すぐに転送することである)<br>
<br>
==== sendfile ====
値 : on / off<br>
初期値 : off<br>
使用環境 : http, server.location, server.locationのif文<br>
<br>
sendfileが有効になっている場合、NginXはデータ転送を行う時に<code>sendfile</code>関数(システムコール)を呼び出す。<br>
<code>sendfile</code>関数は、Linuxカーネル 2.0以降で導入されたシステムコールである。<br>
<br>
通常のネットワークでのデータ転送に比べて、スイッチの数が少なく、転送するデータのコピー数も少ない。<br>
<br>
<code>sendfile</code>関数は、2つのファイルディスクリプタ間で直接データを渡すため(カーネル内での動作)、カーネルバッファとユーザバッファ間のデータのコピーを回避して、<br>
ゼロコピーと呼ばれるほど効率的な処理を行うことが可能である。<br>
<br><br>
== Basic認証 ==
Basic認証のパスワードファイルを作成する。<br>
<br>
<code>htpasswd</code>コマンドを実行して、Basic認証を設定する。<br>
以下の例では、.htpasswdファイルとしているが、ファイル名は任意の名前でよい。<br>
htpasswd -c /<任意のパスワードファイルのディレクトリ>/<Basic認証ファイル名> <Basic認証時のユーザ名>
例. htpasswd -c /etc/nginx/conf.d/.htpasswd sample_user
<br>
Basic認証を有効にするため、nginx.confファイル等に以下に示す設定を追加する。<br>
<syntaxhighlight lang="nginx">
# トップページ(http://www.example.com/)にBasic認証を掛ける場合、/のlocationディレクティブに設定を追加する
location / {
    root  <ドキュメントルートのディレクトリ>;
    index  index.html index.htm;
    auth_basic "<認証名>";
              # 例. "Basic Authentication";
    auth_basic_user_file <Basic認証ファイルの絶対パス>;
                        # 例. auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
}
# トップページ以外(http://www.example.com/hoge/)にBasic認証を掛ける場合、/hoge/のlocationディレクティブを作成および設定を追加する
location /hoge/ {
    auth_basic "<認証名>";
              # 例. "Basic Authentication";
    auth_basic_user_file <Basic認証ファイルの絶対パス>;
                        # 例. /etc/nginx/conf.d/.htpasswd;
}
  </syntaxhighlight>
<br>
設定を反映する。<br>
sudo systemctl restart nginx
sudo systemctl reload  nginx
<br><br>
== Digest認証 ==
==== Digest認証とは ====
Webブラウザ等のクライアントからサーバへユーザ名やパスワード等を送信して、サーバから結果を応答する手順のことである。<br>
<br>
認証情報は平文で送信せずに、ハッシュ関数と呼ばれる一定の計算手順で逆変換できない状態に加工してから送信する。<br>
サーバ側では、クライアント側からユーザ名やパスワード等のそのものを受信することはできないが、<br>
登録済みの情報から同じようにハッシュ値を算出して、クライアントから受信したハッシュ値に一致すれば認証成功となる。<br>
<br>
より安全性を高めるため、サーバとクライアントの双方がその場限りのランダムなデータ(nonceと呼ばれる)を生成して、送信するデータに付け加えてからハッシュ値を算出する。<br>
これにより、認証情報そのものは同じでも、実際に送信するデータは毎回変化するため、秘密の情報を割り出さなくても実行できる反射攻撃などを防ぐことができる。<br>
<br>
ハッシュ関数の種類においては、ヘッダ領域の中で指定することができ、双方が対応しているアルゴリズムが採用される。<br>
<u>当初の規格(RFC 2617)ではMD5方式が使用されていたが、現在では十分な安全性が確保できないことが知られており、改訂版(RFC 7616)ではSHA-256の使用が推奨されている。</u><br>
<br>
Digest認証は、認証情報を平文のまま送受信するBASIC認証(基本認証)と比較して、クライアントとサーバ間の伝送路の安全が確保されていない状況で認証情報を保護することができるが、<br>
現代では、SSL/TLSを用いてHTTPによるデータ伝送全体を暗号化するHTTPS通信が広く普及しており、かつてより重要性は低下している。<br>
<br>
==== NnginXにおけるDigest認証モジュールの注意点 ====
Digest認証モジュールは、NginXのソースコードと一緒に配布されていないため、別途インストールする必要がある。<br>
<br>
Digest認証モジュールは、RFCに基づいて機能が完成しているが、実際の運用で使用するのに十分な安全性を確保するために、より広範な検証が必要な状態である。<br>
現在の注意点については、[https://github.com/atomx/nginx-http-auth-digest/blob/master/bugs.txt bugs.txt]ファイルと[https://github.com/atomx/nginx-http-auth-digest/issues github issue tracker]を参照すること。<br>
<br>
==== Digest認証の設定 ====
Digest認証のパスワードファイルを作成する。<br>
<br>
<code>htdigest</code>コマンドを実行して、Digest認証を設定する。<br>
以下の例では、.htdigestファイルとしているが、ファイル名は任意の名前でよい。<br>
# 初めてDigest認証ファイルを作成する場合
htdigest -c <作成するDigest認証ファイルのフルパス> "<realm名>" <Digest認証時のユーザ名>
# Digest認証ファイルに設定を追記する場合
htdigest <追記するDigest認証ファイルのフルパス> "<realm名>" <Digest認証時のユーザ名>
例. htdigest -c /etc/nginx/conf.d/.htdigest "test" sample_user
<br>
Digest認証を有効にするため、nginx.confファイル等に以下に示す設定を追加する。<br>
<syntaxhighlight lang="nginx">
# トップページ(http://www.example.com/)にDigest認証を掛ける場合、/のlocationディレクティブに設定を追加する
location / {
    root  <ドキュメントルートのディレクトリ>;
    index  index.html index.htm;
    auth_digest "<realm名>";
              # 例. "test";
    auth_digest_user_file <Digest認証ファイルの絶対パス>;
                        # 例. /etc/nginx/conf.d/.htdigest;
}
# トップページ以外(http://www.example.com/hoge/)にDigest認証を掛ける場合、/hoge/のlocationディレクティブを作成および設定を追加する
location /hoge/ {
    auth_digest "<realm名>";
                # 例. "test";
    auth_digest_user_file <Digest認証ファイルの絶対パス>;
                          # 例. /etc/nginx/conf.d/.htdigest;
}
  </syntaxhighlight>
<br>
設定を反映する。<br>
sudo systemctl restart nginx
sudo systemctl reload  nginx
<br><br>
== HTTPS(SSL)の設定 (Let's Encrypt) ==
==== Let's Encryptとは ====
[https://letsencrypt.org/ Let's Encrypt](Linux Foundationの協業プロジェクト)は、Web全体の安全性を改善することを掲げており、<br>
発行料無料のSSL/TLSサーバ証明書を取得することができる。<br>
<br>
Let's Encryptでは、 一般的なドメイン認証(DV)の証明書を無料で発行しており、<br>
その中間証明書は、大手認証局(CA)のルート証明書によってクロス署名されているため、多くの主要ブラウザ等々で信頼済みとして扱われる。<br>
<br>
なお、1回の認証で得られる証明書の有効期限は90日である。<br>
したがって、90日以内に証明書の更新を、再度実施する必要がある。<br>
<br>
==== Certbotクライアントのインストール ====
証明書を取得するため、Certbotクライアントをインストールする。<br>
sudo dnf install certbot
<br>
==== 証明書の取得 ====
<u>Apache2やNginX等のWebサーバが稼働していることが前提となることに注意する。</u><br>
<u>また、インターネット側から、証明書を使用するWebサーバ(証明書を取得するFQDNのサーバ)のTCP80番ポートを開放することも前提となる。</u><br>
<br>
* <code>--webroot -w</code>オプション
*: 稼働中のWebサーバのドキュメントルート配下を認証用の一時領域に使用する。
*: 例. <code>--webroot -w <ドキュメントルート> -d <証明書を取得するFQDN></code>
*: <br>
*: 証明書を取得するFQDNが複数ある場合は、<code>-d <証明書を取得するFQDN></code>を複数指定できる。
*: 例. hoge.comとpiyo.comの2つについて取得する場合
*: <code>-d hoge.com -d piyo.com</code>
*: <br>
* FQDN (Fully Qualified Domain Name)
*: <ホスト名>.<ドメイン名>を省略せずに記述する。
*: <br>
<br>
ドキュメントルートは、仮想ホストで複数のホスト定義がある場合、該当するホスト定義のものを指定する。<br>
ドキュメントルート指定の動作としては、指定したドキュメントルート配下に.well-knownディレクトリが作成されて、認証用のファイルが自動的かつ一時的に設置される。<br>
<br>
証明書を取得する。<br>
certbot certonly --webroot -w <ドキュメントルートのパス> -d <FQDN>
# または
sudo certbot certonly --webroot -w <ドキュメントルートのパス> -d <FQDN>
例.
sudo certbot certonly --webroot -w /srv/www/htdocs -d www.hoge.com
<br>
初回のみメールアドレスの登録と利用条件への同意が必要となる。<br>
# 受信可能なメールアドレスを指定する
(Enter 'c' to cancel): <メールアドレス>
# 利用条件に同意する
(A)gree/(C)ancel: A
# 非営利団体 Electronic Frontier Foundation にもメールアドレスを登録するか否か
(Y)es/(N)o: Y
<br>
最後に、"Congratulations"と表示されると成功である。<br>
<br>
上記のメッセージに表示される通り、/etc/letsencrypt/live/<FQDN>ディレクトリ内に、4つの証明書が保存される。<br>
* cert.pem
*: SSLサーバー証明書(公開鍵含む)
* chain.pem
*: 中間証明書
* fullchain.pem
*: cert.pemファイルとchain.pemファイルが結合されたファイル
* privkey.pem
*: 公開鍵に対する秘密鍵
<br>
証明書を使用するWebサーバが未稼働の場合でも、Certbotの簡易Webサーバ機能を使用して(<code>--standalone</code>オプションを付加する)、証明書を取得することができる。<br>
<u>この場合も、インターネット側から証明書を使用するWebサーバのTCP80番ポートを開放する必要がある。</u><br>
certbot certonly --standalone -d <FQDN>
# または
sudo certbot certonly --standalone -d <FQDN>
例.
sudo certbot certonly --standalone -d www.hoge.com
<br>
==== 取得済みの証明書の更新 ====
有効期限が30日未満の証明書を全て更新する。<br>
もし、有効期限の残り日数に関わらずに更新する場合は、<code>--force-renew</code>オプションも付加する。<br>
certbot renew
# または
sudo certbot renew
<br><br>
== エラー関連 ==
==== test failed ====
Webサイトにアクセスする時、<u>"test failed"</u>というエラーメッセージが表示される場合がある。<br>
これは、NginXの初期設定ではIPv4とIPv6をリッスンするが、使用しているWebサーバがIPv6をサポートしていない場合に起きる。<br>
<br>
nginx.confファイルにおいて、IPv6を使用しないように設定する。<br>
vi nginx.conf
<br>
# nginx.confファイル
# 編集前
listen [::]:80 default_server;
# 編集後
# listen [::]:80 default_server;
<br>
NginXを再読み込みする。<br>
sudo systemctl reload nginx
<br><br>
== HTTPS(SSL)の設定 ==
==== CSRについて ====
CSR(Certificate Signing Request)とは、証明書発行要求といい、認証局に対して行う、認証局の秘密鍵で署名してもらうためのリクエストのことである。<br>
<br>
CSRの中身を確認するためには、<code>req</code>コマンドに<code>-text</code>オプションを付加することで確認できる。<br>
openssl req -text -in <サーバ証明書のファイル名>.csr
# 出力例
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP, ST=TOKYO, L=KAWASAKI, O=Kaisha, OU=Busho, CN=common.name
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                (省略)
    Signature Algorithm: sha256WithRSAEncryption
                (省略)
<br>
上記の出力例において、[Signature Algorithm]項目は、sha256WithRSAEncryptionである。<br>
SHA-1は解読されるリスクが高まっているため、今後作成するものはSHA-2とするべきである。<br>
<br>
SHA-2には、SHA-224、SHA-256、SHA-384、SHA-512の4種類がある。<br>
SHA-512が最も安全性が高いが、クライアント端末側がSHA-512に対応している必要がある。<br>
<br>
==== 自己署名証明書の発行(サーバ側) ====
===== 秘密鍵を作成する =====
openssl genrsa -out <秘密鍵のファイル名>.key 2048
<br>
秘密鍵のファイルのアクセス権限を変更する。<br>
chmod 400 <秘密鍵のファイル名>.key
<br>
===== CSR(証明書署名要求)の作成 =====
作成した秘密鍵を使用して、クライアント側のCSRを作成する。<br>
openssl req -sha256 -new -subj "/C=JP/ST=Tokyo/L=Tokyo City/O=Company Name/OU=Department/CN=*.<ドメイン名>" -key <秘密鍵のファイル名>.key -out <CSRのファイル名>.csr
<br>
===== SAN (Subject Alternative Name)の作成 =====
サーバ証明書に自己署名証明書を使用する場合、クライアントPCに自己署名証明書をインストールしても、Webブラウザ(Chrome等)は警告を表示する。<br>
これは、Chrome等のWebブラウザは、コモンネーム(CN)ではなく、SAN(Subject Alternative Name)を確認しているからである。<br>
そのため、SANを加えて自己署名証明書を作成する必要がある。<br>
<br>
<u>※注意</u><br>
<u>DNS項目ではワイルドカードが使用できるが、IP項目では使用できないことに注意する。</u><br>
vi san.txt  # ファイル名は任意
<br>
# san.txtファイル
subjectAltName = DNS:localhost,*.localhost,*.example.com IP:127.0.0.1,172.20.0.1
<br>
===== サーバ証明書の作成 =====
作成したCSRに署名を行って、サーバ証明書を発行する。<br>
<u><サーバ証明書のファイル名>.csrファイルは、サーバ証明書を発行するためのファイルのため、後で削除してもよい。</u><br>
openssl x509 -sha256 -req -days <証明書の有効日数 例. 3650> -in <CSRのファイル名>.csr -signkey <秘密鍵のファイル名>.key \
        -extfile san.txt \
        -out <サーバ証明書のファイル名>.crt
<br>
===== Webサーバの設定 =====
Webサーバに設置するものは、秘密鍵(.key拡張子)とサーバ証明書(.crt拡張子)の2つである。<br>
<br>
SSLを有効にするため、NginXの設定ファイルを編集する。<br>
# パッケージ管理システムからインストールしている場合
sudo vi /etc/nginx/nginx.conf
# ソースコードからインストールしている場合
sudo vi /<Nginxのインストールディレクトリ>/etc/nginx.conf
<br>
<syntaxhighlight lang="nginx">
# HTTPS server
server {
    listen      443 ssl;  # HTTP/2を有効にする場合は、http2と追記する
    server_name  <ホスト名またはIPアドレスまたはドメイン名>;
    # サーバ証明書および中間証明書のファイルの指定
    ssl_certificate      <サーバ証明書のファイルのフルパス>;
    # 秘密鍵の指定
    ssl_certificate_key  <秘密鍵のファイルのフルパス>;
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;
    location / {
        root  <ドキュメントルートのパス(絶対パスまたは相対パス)>;
        index  index.html index.htm;
    }
}
</syntaxhighlight>
<br>
<u>ロードバランサにSSL証明書を設置して、SSL接続を終端することもできる。</u><br>
<u>その場合、サーバ証明書は1つ用意して、ロードバランサからWebサーバまでの通信はhttpとなる。(httpsでも可能であるが、httpの方が負荷が軽いため)</u><br>
<br>
<u>httpを使用するメリットとして、Webサーバで受けるアクセスがhttpとなるので負荷が減るためである。(暗号化された通信を複合するために、SSLの接続を受けるのは負荷が掛かる)</u><br>
<br>
==== 自己証明書の発行(クライアント側) ====
===== 秘密鍵を作成する =====
openssl genrsa -out <秘密鍵のファイル名>.key 2048
<br>
秘密鍵のファイルのアクセス権限を変更する。<br>
chmod 400 <秘密鍵のファイル名>.key
<br>
===== CSR(証明書署名要求) =====
作成した秘密鍵を使用して、クライアント側のCSRを作成する。<br>
openssl req -sha256 -new -subj "/C=JP/ST=Tokyo/L=Tokyo City/O=Company Name/OU=Department/CN=*.<ドメイン名>" \
                          -key <秘密鍵のファイル名>.key -out <CSRのファイル名>.csr
<br>
===== SAN (Subject Alternative Name)の作成 =====
サーバ証明書に自己署名証明書を使用する場合、クライアントPCに自己署名証明書をインストールしても、Webブラウザ(Chrome等)は警告を表示する。<br>
これは、Chrome等のWebブラウザは、コモンネーム(CN)ではなく、SAN(Subject Alternative Name)を確認しているからである。<br>
そのため、SANを加えて自己署名証明書を作成する必要がある。<br>
<br>
<u>※注意</u><br>
<u>DNS項目ではワイルドカードが使用できるが、IP項目ではワイルドカードが使用できないことに注意する。</u><br>
vi san.txt  # ファイル名は任意
<br>
# san.txtファイル
subjectAltName = DNS:localhost,*.localhost,*.example.com IP:127.0.0.1,172.20.0.1
<br>
===== サーバ証明書の作成 =====
作成したCSRに署名を行って、サーバ証明書を発行する。<br>
<u><サーバ証明書のファイル名>.csrファイルは、サーバ証明書を発行するためのファイルのため、後で削除してもよい。</u><br>
openssl x509 -sha256 -req -days <証明書の有効日数 例. 3650> -in <CSRのファイル名>.csr -signkey <秘密鍵のファイル名>.key \
        -extfile san.txt \
        -out <サーバ証明書のファイル名>.crt
<br>
<u>クライアントPCがWindowsの場合、Windows PCにインポートするには、サーバ証明書のファイル(.crt拡張子)をpkcs12形式に変換する必要がある。</u><br>
openssl pkcs12 -export -inkey <秘密鍵のファイル名>.key -in <サーバ証明書のファイル名>.crt \
                        -out <クライアント側にインポートするサーバ証明書のファイル名>.p12 -name <任意の識別子名>
<br>
===== Webサーバの設定 =====
<u>サーバに設置するものは、サーバ証明書のファイル(.crt拡張子)と秘密鍵(.key拡張子)の2つである。</u><br>
<u>Windows PC(クライアントPC)へ配布するものは、pkcs12形式に変換したクライアント側のサーバ証明書のファイル(.p12拡張子)である。</u><br>
<br>
Windows PCへクライアント側のサーバ証明書のファイル(.p12拡張子)をインポートする場合、ファイルを実行することによりインポート画面が起動するため、<br>
インポート画面に沿って、サーバ証明書のファイル(.p12拡張子)をインポートする。<br>
<br><br>
== Xdebugの設定 ==
PHP-FPMの初期設定では、9000番ポートを使用している。<br>
もし、古いバージョンのXdebug(バージョン2.x)を使用している場合、デフォルトのデバッグポートは9000番ポートを使用しているため、競合が発生する。<br>
そのため、古いバージョンのXdebug(バージョン2.x)を使用する場合は、Xdebugのデバッグポートを変更する必要がある。<br>
# PHP 7の場合
sudo vi /etc/php7/conf.d/xdebug.ini
# PHP 8の場合
sudo vi /etc/php8/conf.d/xdebug.ini
# ソースコードからPHPをインストールしている場合
vi /<PHPのインストールディレクトリ>/etc/php.ini
<br>
# xdebug.iniファイル  または  php.iniファイル
xdebug.remote_port=<9000以外の値  例. 9003>
<br>
NginXとPHP-FPMを再起動する。<br>
sudo systemctl restart nginx php-fpm
<br><br>
<br><br>




__FORCETOC__
__FORCETOC__
[[カテゴリ:RHEL]]
[[カテゴリ:RHEL]][[カテゴリ:Web]]