一般的なNginxの文法エラー
以下の文章を日本語で自然に言い換えてください。一つのオプションで結構です。
「Introduction」
Nginxは、多くの大規模で高トラフィックなウェブサイトをインターネット上でホストできる人気のあるウェブサーバーです。Nginxウェブサーバーの設定では、一般的にはドメインブロックを作成し、設定の詳細を確認して、サイトが受信リクエストを処理できるようにします。Nginxの設定時によくあるエラーの一つに、構成ファイル内の構文が有効であることを確認するというものがあります。
このガイドの例は、Ubuntu 22.04サーバーでテストされましたが、標準化された設定ファイル内での作業がほとんどであるため、ほとんどのNginxのインストールに適用されるはずです。ディレクトリとパスは少し異なる場合もあります。
このチュートリアルでは、Nginxの設定ファイルで発生する可能性のある構文エラーについて学び、それを確認する方法と修正する方法について学びます。
Nginxのエラーログの検査
このチュートリアルで提示されているエラーと解決策は一般的なケースですが、完全なものではありません。構文エラーがNginxが正当なステートメントと認識する構造を崩すため、以下のエラーはNginxの応答方法のガイドラインに過ぎません。しばしば、1つのエラーが別のエラーを引き起こすこともあり、エラーはより大きな問題や別の問題の症状である可能性もあります。あなたの具体的な状況や設定によって異なる可能性があります。
Nginxのエラーログを常に参照することで、実行中のリストを確認できることに注意してください。
- sudo cat /var/log/nginx/error.log
このチュートリアルでは、後で Nginx のエラーメッセージのパーツを分解して理解する方法について説明します。
エラーのある構成ファイルのテストを行ってください。
このチュートリアルでは、設定ファイルにさまざまなエラーがあるNginxのドメインブロックの例を参照します。これらのエラーは意図的に配置されており、それらを修正する方法を示すためです。一般的に、構文エラーがあるかどうかを確認するためには、次のコマンドを実行することができます。
- sudo nginx -t
エラーがない場合、出力のメッセージは次の通りになります。
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
もしエラーがある場合、エラーが発生している正確なファイルとコードの行を示すメッセージと、解決する必要がある具体的な構文の問題が表示されます。
Nginx設定ファイルにおける構文エラーの特定 – セミコロン、波括弧、およびパラメータの識別
Nginxに関する一般的なエラーの1つは、文字の欠落や正しくない構文構造に関係があります。Nginxの設定ファイルはディレクティブを中心に構成されており、これらのディレクティブは特定の方法で宣言される必要があります。そうしなければ、設定ファイルは構造的に無効となります。
指令は2つの異なるタイプに分けることができ、それぞれに特定の構文があります。指示の名前とパラメーターを含む単純な指令があり、それはセミコロンで終わります。また、ブロック指令も存在し、単一の指令と似ていますが、波括弧 { } で区切られ、他のブロックを含むことさえできます。
ディレクティブが適切に構造化されていない場合、Nginxはそれを意図したディレクティブとして認識できず、以下のエラーが発生する可能性があります。
Nginxの無効なパラメーターエラー
Nginxの設定ファイルは、正しい構造と構文に非常に注意が必要です。実際、構文に関連する問題の一つはセミコロン「;」です。例えば、以下のエラーメッセージを考えてみてください。
[emerg] invalid parameter "root" in /etc/nginx/sites-enabled/example.com:5
nginx: configuration file /etc/nginx/nginx.conf test failed
この例の問題を解決する前に、Nginxのエラーメッセージの構成要素を理解する必要があります。エラーメッセージには、エラーの原因を特定するのに役立つヒントがあります。この場合、[emerg]という表記は「緊急」という意味で、システムが不安定な状態であることを示すエラーメッセージです。この文脈では、Nginxが問題に遭遇して動作できなくなったことを意味します。
このエラーメッセージは、エラーが発生した場所をさらに特定します。Nginxのセットアップでは、/etc/nginx/nginx.confにシンボリックリンクされたカスタムの設定ファイルがあることに注意してください。たとえば、Ubuntu 22.04にNginxをインストールする方法のガイドに従った場合、ステップ5が具体的にこれを示しています。設定ファイル内のエラーが発生している正確な行は、/etc/nginx/sites-enabled/example.comの5行目です。また、そのファイル内には”root”という無効なパラメーターがあることもわかります。
あなたがエラーの場所を見つけるための情報を持っている今、お好みのテキストエディタでファイルを開くことができます。ここでは、nanoを使用します。
Note
- sudo nano /etc/nginx/sites-available/example.com
一度中に入ったら、エラーメッセージが指摘した5行目を見つけてください。その行は以下の通りにハイライトされています。
「/etc/nginx/sites-available/example.com」
server {
listen 80;
listen [::]:80;
root /var/www/example.com/html
index index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
}
ここで発生しているエラーは明確ではないかもしれません。エラーメッセージから思い出していただくと、無効なパラメータがあります。パラメータとは、Nginxのディレクティブに提供する引数のことです。このシナリオでは、/var/www/example.com/htmlが提供されているパラメータですが、無効です。この場合、構文の構造から見逃されている文字があります。行の末尾にセミコロンが欠落しています。
このファイルの他の多くの行もセミコロンで終わっていることに気づくかもしれません。セミコロンは、行にディレクティブが含まれている場合に必要です。この特定の例は、ファイルを検索する際に使用されるルートディレクティブであり、Nginxが特定のURLパスを見つけるためにはこのルートディレクティブが必要です。ディレクティブの重要性については、後のセクションで説明します。
要するに、このエラーを修正するために、この行の最後にセミコロンを追加して、指示が有効になるようにします。アップデートは次の通りです。
「/etc/nginx/sites-available/example.com」
…
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
…
更新が完了したら、ファイルを保存して閉じてください。nanoを使用している場合は、CTRL + X、Y、ENTERを押すことで保存と閉じることができます。
「sudo nginx -t」というコマンドを実行することで、構文エラーが修正されていることを確認することができます。
Nginxの予期しない「}」エラー
Nginxの構文構造に関するもう一つのよくあるエラーは、波括弧({})が起因して発生することがあります。前のエラーとは異なり、このエラーは無効なパラメータを修正する方法を明示的に提供する代わりに、エラーの理由を明確に示します。
nginx: [emerg] unexpected "}" in /etc/nginx/sites-enabled/example.com:15
nginx: configuration file /etc/nginx/nginx.conf test failed
このエラーメッセージは再び[emerg]タイプであり、15行目で前回の設定ファイルと同じく予期しない中括弧があることを示しています。お好みのテキストエディタを使用してこのファイルを開くと、内容は以下の通りです。
以下の文を日本語で自然な表現に書き換えてください。1つのオプションで構いません。
「/etc/nginx/sites-available/example.com」
server {
listen 80;
listen [::]:80;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
このファイルの最後には、カーリーブレース “}” が強調表示されています。初めの見た目では、予期しない “}” が存在しているため、問題がわかりにくいかもしれません。しかし、よく見ると、その後に実際にはカーリーブレースが1つ欠けていることが分かります。正しい数のカーリーブレースは、Nginxの設定ファイルにおいて重要であり、特定のブロックの開始と終了を示すものです。しっかりと注目すれば、ファイルの最後のカーリーブレースは、次のネストされたロケーションブロックの終了カーリーブレースであることがわかります。
「/etc/nginx/sites-available/example.com」
…
location / {
try_files $uri $uri/ =404;
}
…
もし設定ファイルの内容をさらに見直すと、閉じカーリーブラケットがサーバーブロックに欠けていることがわかります。 Nginxのサーバーブロックは重要です。なぜなら、それはNginxがどの仮想サーバーが受信したさまざまなリクエストを処理するかを認識するために必要な設定の詳細を提供するからです。 適切な位置ブロックは、サーバーブロックにネストされていることに注意してください。なぜなら、サーバーブロックは受信したリクエストの処理に優先順位を持つからです。 これを考慮して、ファイルの最後に閉じカーリーブラケットを追加してサーバーブロックを完了させることができます。 このファイルの内容は以下のようになります。
「/etc/nginx/sites-available/example.com」
server {
listen 80;
listen [::]:80;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
}
作業が終了したら、ファイルを保存して閉じることを忘れないでください。sudo nginx -tを実行して、この構文エラーが解決されていることを確認してください。
エンジックスの無効なホストエラー
この次のエラーは、前の2つと異なるのは、エラーが指示に渡される不正なパラメータに起因していることです。セミコロン ; で行を終了させ、全ての波括弧 { を } で閉じることによって構成ファイルの全体的な構造に対処しますが、パラメータはセットアップのニーズに応じて変化するカスタム入力です。
このシナリオでは、被害を受けるディレクティブはホストであることに注意すべきですが、無効なパラメータが提供される場合は、他のいかなるディレクティブもこのエラーの対象になり得ます。エラーメッセージはそれに応じて変化します。有効なパラメータを提供することで、以下のようなシナリオに起因するエラーを回避できます。
[emerg] invalid host in "[::]80" of the "listen" directive in /etc/nginx/sites-enabled/example.com:3
nginx: configuration file /etc/nginx/nginx.conf test failed
この例の緊急エラーは、ホストに設定されているポート80の指示が無効であることを説明しています。このエラーメッセージは、さらにこのエラーが見つかる場所と設定ファイルの正確な行を特定しています:/etc/nginx/sites-enabled/example.comの3行目です。エラーを見つけるための情報を手に入れたので、お好みのテキストエディタでファイルを開くことができます。開いたら、エラーメッセージが参照している3行目を探します。以下に示されているように、その行は強調表示されています。
以下は、日本語での表現例です。「/etc/nginx/sites-available/example.com」
「/etc/nginx/sites-available/example.com」
server {
listen 80;
listen [::]80;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
}
ブラケット内の2つのコロンは、IPv6の表記法、または0.0.0.0を表します。ブラケットの後ろに追加のコロンがない場合、ポート80にバインドすることができません。そのため、リッスンディレクティブは動作せず、どのポートでサーバーをリッスンさせたいのかが明確ではありません。
要するに、ここで発生している具体的な構文エラーは、[::]の後にコロンが抜けていることです。そのため、パラメータ自体が無効になっています。抜けているコロンを追加すると、ファイル内のコードの断片は以下のようになります。
「/etc/nginx/sites-available/example.com」
server {
listen 80;
listen [::]:80;
…
この行を更新した後、ファイルを保存して閉じ、次にsudo nginx -tを実行してこの構文エラーが修正されたことを確認してください。
全体的に、パラメータやセミコロン ;、波括弧 { } に関連する構文エラーが発生した場合、[emerg] メッセージで提供される詳細な場所と詳細に注意することをおすすめします。
Nginx設定ファイルにおけるキーワードを使用した指示の誤用の識別
コロンや波かっこが欠けることから生じる構文エラー以外にも、設定ファイル中のディレクティブに関連するキーワードのスペルミスなど、エラーの可能性があります。前のセクションでもディレクティブについて簡単に触れましたが、ここで改めて説明します。
「Nginxの未知のディレクティブエラー」
以前に述べたように、Nginxの設定ファイルの基盤はディレクティブによって構築されています。Nginxには多数のディレクティブがありますが、設定ファイルにはいくつかの主要なものが必要です。ただし、ディレクティブ自体にはエラーが発生することがあります。特に、キーワードが正確に記述されていない場合にはエラーメッセージが表示されます。以下は、エラーメッセージの例です。
nginx: [emerg] unknown directive "serve_name" in /etc/nginx/sites-enabled/example.com:8
nginx: configuration file /etc/nginx/nginx.conf test failed
このエラーは、設定ファイルの8行目において不明なディレクティブserve_nameが特定されました。お好みのテキストエディタで設定ファイルを開くと、次の内容がリストされます。
以下のファイルを日本語で表現してください:/etc/nginx/sites-available/example.com
エルエルシーヌジンクスサイトアベイラブルスペースエグザンプルドットコム
server {
listen 80;
listen [::]:80;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
serve_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
}
この例では、「server_name」ディレクティブのスペルミスによりエラーが発生しています。この場合、「r」が抜けているため、この単一のディレクティブは認識されません。これは重要なエラーです。なぜなら、server_nameディレクティブは、リクエストが行われた際にサーバーブロックが参照する特定のサーバー名を提供するからです。このディレクティブが正しく機能しないと、リクエストを完了させることができません。これは見かけ上小さなタイポエラーかもしれませんが、構文を混乱させ、エラーを引き起こします。設定ファイルのこのコードスニペットを次のように更新できます。
/etc/nginx/sites-available/example.com例えば:
ドメイン「example.com」の設定ファイル「/etc/nginx/sites-available/example.com」
…
server_name example.com www.example.com;
…
このファイルを保存して閉じたら、sudo nginx -t コマンドで動作を確認できます。
Nginxのディレクティブがここでは許可されていません エラー
今度は同じ指示にエラーがありましたと仮定しましょう。しかしこの場合、メッセージは以下の通りです。
nginx: [emerg] "server" directive is not allowed here in /etc/nginx/sites-enabled/example.com:8
nginx: configuration file /etc/nginx/nginx.conf test failed
前回と同じ場所でエラーが発生しているにもかかわらず、このメッセージでは問題の原因が詳細に説明されています。したがって、エラーメッセージが示している内容を理解することが重要です。「未知の指示」という前のエラーメッセージとは対照的に、このエラーメッセージでは「server」指示が許可されていないと述べられています。お好きなテキストエディタで構成ファイルを開くことで、その内容を確認することができます。
「/etc/nginx/sites-available/example.com」というディレクトリの中にある「example.com」
server {
listen 80;
listen [::]:80;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
server name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
}
ここでは、単語「サーバー」は正しく綴られていますが、指示そのものはアンダースコアの区切りが抜けているserver_name指示の正確な記述ではありません。そのため、サーバーは重複と見なされ、エラーメッセージに述べられているように許可されていません。これは、以前に取り上げたシングルディレクティブとブロックディレクティブの区別に関連しています。
ここで発生しているエラーは、単一のディレクティブの server name が server のみを読み込んでおり、結果としてファイルの先頭にある最初の server block ディレクティブと衝突しているためです。これは、Nginx の設定ファイル内のブロックディレクティブやネストした単一ディレクティブの中で発生する可能性のある厄介な構文エラーです。server_name の正確なディレクティブキーワードを表すために、アンダースコア _ を追加することでこのエラーを修正することができます。
/etc/nginx/sites-available/example.comExample.com の場所にある /etc/nginx/sites-available のファイル
…
server_name example.com www.example.com;
…
この修正を行った後、ファイルを保存して閉じてください。その後、sudo nginx -tで構文が有効か確認してください。設定ファイルに他のエラーがなければ、構文は正しいメッセージが返されるはずです。
Note
最後の注意点は、もし設定ファイルに複数のエラーが含まれている場合、受け取るエラーメッセージは連続した順番で一度に一つだけ返されるということです。つまり、ある問題のエラーメッセージを受け取り、それを修正して再度構文チェックコマンドを実行すると、次のエラーが出力されます。これはすべてのエラーが修正されるまで続きます。
あなたは今、設定ファイル内で特定の指示によって発生する可能性のある他の構文エラーについて学びました。これらの例はすべてターミナル環境で表示されていますことに留意してください。もし好みであれば、Visual Studio Codeのようなコードエディタを使用する選択肢もあります。そうすることで、複数のエラーメッセージをトリガーせずにコード内のエラーをチェックおよび強調表示し、一度に修正するか、初期段階で回避することができます。
結論を見つけました。 (Ketsuron o mitsukemashita.)
このチュートリアルでは、Nginxの一般的な構文エラーとその修正方法について学びました。Nginxの構文エラーは多岐にわたる可能性がありますが、これらの例は最も一般的なものに対するいくつかの可能性と解決策を提供しています。Nginxの設定ファイルについてもっと学びたい場合は、当社のチュートリアルをご覧ください。また、Nginxに関する他のコンテンツを当社のタグ付けされたコミュニティページでチェックしたり、Ubuntu 22.04にNginxをインストールする方法を学ぶこともできます。