400番、500番のステータスコードのログのみを分けてログに出力した内容を紹介します。
今回の設定するログの分け方は、以下の通りです。
- 全てのステータスコード(400、500番含む)→/var/log/nginx/access_logに出力
- 400番、500番のステータスコードのみ →/var/log/nginx/access4xx5xx.logに出力
設定は以下のURLを参考にしました。
access_logからエラー解析したい [nginx]
目次 1 目的2 前提条件3 設定手順3.1 設定ファイルにフォーマットと出力条件式を記載3.2 ログ出力先の設定(ログフォーマットと出力条件)3.3 ログローテート3.4 nginx再起動3.5 ログ出力の確認4 今後やりたいこと 目的
環境
OS | CentOS Stream release 9 |
nginx | nginx/1.20.1 |
nginxのドキュメントルート配下に、「HELLO」というメッセージを出力するtest.htmlという名前のページを作成しています。
設定方法
nginxの設定ファイル(/etc/nginx/nginx.conf)のhttpディレクティブに以下を追記します。
http {
・・・
map $status $res_status_4xx5xx {
#レスポンスのステータスコードが4xxの場合、1をセット
~^[4|5] 1;
default 0;
}
access_log /var/log/nginx/access4xx5xx.log main if=$res_status_4xx5xx;
実際の設定ファイルは以下の通りです。
赤色マーカー部分が追記箇所になります。
[root@nginx-test nginx]# cat /etc/nginx/nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
map $status $res_status_4xx5xx {
#レスポンスのステータスコードが4xxの場合、1をセット
~^[4|5] 1;
default 0;
}
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/access4xx5xx.log main if=$res_status_4xx5xx;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2;
# listen [::]:443 ssl http2;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers PROFILE=SYSTEM;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
[root@nginx-test nginx]#
設定反映のためには、nginxのサービスの再起動が必要です。
systemctl restart nginx
または
systemctl reload nginx
動作確認
curlコマンドでステータスコードが200、404となるURLへアクセスし、400/500番台のエラーのみが/var/log/httpd/access-errors.logに出力されることを確認します。
curlコマンドで以下の通り、実行します。
[root@nginx-test html]# curl http://(サーバのIPアドレス)/test.html
HELLO
[root@nginx-test html]#
[root@nginx-test html]# curl http://(サーバのIPアドレス)/test123.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>The page is not found</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
/*<![CDATA[*/
body {
background-color: #fff;
color: #000;
font-size: 0.9em;
font-family: sans-serif,helvetica;
margin: 0;
padding: 0;
}
:link {
color: #c00;
}
:visited {
color: #c00;
}
a:hover {
color: #f50;
}
h1 {
text-align: center;
margin: 0;
padding: 0.6em 2em 0.4em;
background-color: #900;
color: #fff;
font-weight: normal;
font-size: 1.75em;
border-bottom: 2px solid #000;
}
h1 strong {
font-weight: bold;
font-size: 1.5em;
}
h2 {
text-align: center;
background-color: #900;
font-size: 1.1em;
font-weight: bold;
color: #fff;
margin: 0;
padding: 0.5em;
border-bottom: 2px solid #000;
}
h3 {
text-align: center;
background-color: #ff0000;
padding: 0.5em;
color: #fff;
}
hr {
display: none;
}
.content {
padding: 1em 5em;
}
.alert {
border: 2px solid #000;
}
img {
border: 2px solid #fff;
padding: 2px;
margin: 2px;
}
a:hover img {
border: 2px solid #294172;
}
.logos {
margin: 1em;
text-align: center;
}
/*]]>*/
</style>
</head>
<body>
<h1><strong>nginx error!</strong></h1>
<div class="content">
<h3>The page you are looking for is not found.</h3>
<div class="alert">
<h2>Website Administrator</h2>
<div class="content">
<p>Something has triggered missing webpage on your
website. This is the default 404 error page for
<strong>nginx</strong> that is distributed with
Red Hat Enterprise Linux. It is located
<tt>/usr/share/nginx/html/404.html</tt></p>
<p>You should customize this error page for your own
site or edit the <tt>error_page</tt> directive in
the <strong>nginx</strong> configuration file
<tt>/etc/nginx/nginx.conf</tt>.</p>
<p>For information on Red Hat Enterprise Linux, please visit the <a href="http://www.redhat.com/">Red Hat, Inc. website</a>. The documentation for Red Hat Enterprise Linux is <a href="http://www.redhat.com/docs/manuals/enterprise/">available on the Red Hat, Inc. website</a>.</p>
</div>
</div>
<div class="logos">
<a href="http://nginx.net/"><img
src="nginx-logo.png"
alt="[ Powered by nginx ]"
width="121" height="32" /></a>
<a href="http://www.redhat.com/"><img
src="poweredby.png"
alt="[ Powered by Red Hat Enterprise Linux ]"
width="88" height="31" /></a>
</div>
</div>
</body>
</html>
[root@nginx-test html]#
デフォルトのアクセスログ(/var/log/nginx/access_log)は以下の通りです。
[root@nginx-test html]# cat /var/log/nginx/access.log
(サーバのIPアドレス) - - [xx/Dec/2024:12:50:45 +0900] "GET /test.html HTTP/1.1" 200 6 "-" "curl/7.76.1" "-"
(サーバのIPアドレス) - - [xx/Dec/2024:12:51:16 +0900] "GET /test123.html HTTP/1.1" 404 3971 "-" "curl/7.76.1" "-"
[root@nginx-test html]#
400/500番台エラーのみ出力するアクセスログ(/var/log/nginx/access4xx5xx.log)は以下の通りです。
[root@nginx-test html]# cat /var/log/nginx/access4xx5xx.log
(サーバのIPアドレス) - - [xx/Dec/2024:12:51:16 +0900] "GET /test123.html HTTP/1.1" 404 3971 "-" "curl/7.76.1" "-"
[root@nginx-test html]#
正常に特定のステータスコードのみ出力されていることが分かります。
まとめ
今回は、mapを利用して、nginxログの特定のステータスコードのみをログに出力する設定を紹介しました。
ご参考になれば、幸いです。
以上になります。ありがとうございました。
コメント