ວິທີການ ກຳ ນົດຮູບແບບການເຂົ້າເຖິງລູກຄ້າແລະແບບຜິດພາດຂອງການເຂົ້າລະຫັດໃນ Nginx
ເຄື່ອງແມ່ຂ່າຍ Nginx HTTP ມີສະຖານທີ່ບັນທຶກການຕັດໄມ້ທີ່ ໜ້າ ປະທັບໃຈເຊິ່ງສາມາດປັບແຕ່ງໄດ້ສູງ. ໃນບົດຂຽນນີ້, ພວກເຮົາຈະອະທິບາຍວິທີການ ກຳ ນົດຮູບແບບຂອງທ່ານເອງ ສຳ ລັບການເຂົ້າເຖິງແລະບັນທຶກຂໍ້ຜິດພາດ ສຳ ລັບ Nginx ໃນ Linux.
ຈຸດປະສົງຂອງ ຄຳ ແນະ ນຳ ນີ້ແມ່ນເພື່ອຊ່ວຍໃຫ້ທ່ານເຂົ້າໃຈວິທີການສ້າງຂໍ້ມູນບັນທຶກ, ເພື່ອ ກຳ ນົດຮູບແບບການບັນທຶກທີ່ ກຳ ຫນົດເອງເພື່ອຈຸດປະສົງຂອງການແກ້ໄຂ, ການແກ້ໄຂບັນຫາຫລືການວິເຄາະກ່ຽວກັບສິ່ງທີ່ເປີດເຜີຍພາຍໃນເຄື່ອງແມ່ຂ່າຍເວັບໄຊທ໌ຂອງທ່ານແລະໂປແກຼມ ນຳ ໃຊ້ເວັບຕ່າງໆ (ເຊັ່ນ: ການຮ້ອງຂໍການຕິດຕາມ).
ບົດຂຽນນີ້ສ້າງຂື້ນເປັນສາມພາກເຊິ່ງຈະຊ່ວຍໃຫ້ທ່ານຮູ້ກ່ຽວກັບການ ກຳ ນົດບັນທຶກການເຂົ້າເຖິງ/ຂໍ້ຜິດພາດແລະວິທີການເປີດໃຊ້ການຕັດໄມ້ແບບມີເງື່ອນໄຂໃນ Nginx.
ການຕັ້ງຄ່າບັນທຶກການເຂົ້າເຖິງໃນ Nginx
ພາຍໃຕ້ Nginx, ທຸກ ຄຳ ຮ້ອງຂໍຂອງລູກຄ້າກັບເຊີບເວີແມ່ນຖືກເກັບຄືນໃນບັນທຶກການເຂົ້າເຖິງໃນຮູບແບບທີ່ລະບຸໂດຍໃຊ້ໂມດູນ ngx_http_log_module.
ເອກະສານບັນທຶກໄວ້ໃນຕອນຕົ້ນແມ່ນ log/access.log (ປົກກະຕິແລ້ວແມ່ນ/var/log/nginx/access_log ໃນລະບົບ Linux) ແລະຮູບແບບເລີ່ມຕົ້ນ ສຳ ລັບການຕັດໄມ້ໂດຍປົກກະຕິແມ່ນການລວມເຂົ້າກັນຫຼືເປັນຮູບແບບຫຼັກ (ນີ້ສາມາດແຕກຕ່າງກັນຈາກ ໜຶ່ງ distro ໄປອີກ).
ຄຳ ສັ່ງ access_log (ໃຊ້ໄດ້ໃນ http, server, ສະຖານທີ່, ຖ້າຢູ່ໃນສະຖານທີ່ແລະຂອບເຂດ ຈຳ ກັດຍົກເວັ້ນສະພາບການ) ຖືກ ນຳ ໃຊ້ເພື່ອ ກຳ ນົດແຟ້ມ log ແລະທິດທາງ log_format (ໃຊ້ໄດ້ພາຍໃຕ້ສະພາບການ http ເທົ່ານັ້ນ) ຖືກ ນຳ ໃຊ້ເພື່ອ ກຳ ນົດຮູບແບບການບັນທຶກ. ຮູບແບບການບັນທຶກຖືກອະທິບາຍໂດຍຕົວແປທົ່ວໄປ, ແລະຕົວແປຕ່າງໆທີ່ສ້າງຂື້ນໃນເວລາທີ່ບັນທຶກຖືກຂຽນ.
syntax ສຳ ລັບ ກຳ ນົດຮູບແບບການບັນທຶກແມ່ນ:
log_format format_name 'set_of_variables_to_define_format';
ແລະ syntax ສຳ ລັບ ກຳ ນົດການເຂົ້າເຖິງບັນທຶກແມ່ນ:
access_log /path/to/log_file format_name; #simplest form OR access_log /path/to/log_file [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
ຕໍ່ໄປນີ້ແມ່ນຂໍ້ອ້າງອີງຈາກເອກະສານການຕັ້ງຄ່າ Nginx ເລີ່ມຕົ້ນ /etc/nginx/nginx.conf ໃນ CentOS 7.
http { #main log format 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; }
ຮູບແບບບັນທຶກນີ້ໃຫ້ຜົນຜະລິດຕໍ່ໄປນີ້.
127.0.0.1 - dbmanager [20/Nov/2017:18:52:17 +0000] "GET / HTTP/1.1" 401 188 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"
ຕໍ່ໄປນີ້ແມ່ນຮູບແບບການຕັດໄມ້ທີ່ມີປະໂຫຍດອີກອັນ ໜຶ່ງ ທີ່ພວກເຮົາໃຊ້ ສຳ ລັບການຮ້ອງຂໍການ ນຳ ໃຊ້ກັບເວັບຂອງພວກເຮົາໂດຍໃຊ້ບາງຕົວແປທີ່ ກຳ ນົດໄວ້, ມັນ ສຳ ຄັນທີ່ສຸດແມ່ນມີ ID ການຮ້ອງຂໍແລະບັນທຶກລາຍລະອຽດສະຖານທີ່ຂອງລູກຄ້າ (ປະເທດ, ລະຫັດປະເທດ, ພາກພື້ນແລະເມືອງ).
log_format custom '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$http_x_forwarded_for" $request_id ' '$geoip_country_name $geoip_country_code ' '$geoip_region_name $geoip_city ';
ທ່ານສາມາດໃຊ້ມັນຄືດັ່ງນີ້:
access_log /var/log/nginx/access.log custom;
ນີ້ຈະຜະລິດ log log ທີ່ປາກົດໃນລັກສະນະນີ້.
153.78.107.192 - - [21/Nov/2017:08:45:45 +0000] "POST /ngx_pagespeed_beacon?url=https%3A%2F%2Fwww.example.com%2Fads%2Ffresh-oranges-1509260795 HTTP/2.0" 204 0 "https://www.suasell.com/ads/fresh-oranges-1509260795" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0" "-" a02b2dea9cf06344a25611c1d7ad72db Uganda UG Kampala Kampala
ທ່ານສາມາດລະບຸບັນທຶກຫຼາຍຂໍ້ໂດຍໃຊ້ທິດທາງ access_log ຢູ່ໃນລະດັບດຽວກັນ, ໃນທີ່ນີ້ພວກເຮົາ ກຳ ລັງໃຊ້ໄຟລ໌ບັນທຶກຫຼາຍກ່ວາ ໜຶ່ງ ໃນສະພາບການ http
http{ ##default log format log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; ##request tracing using custom format log_format custom '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$http_x_forwarded_for" $request_id ' '$geoip_country_name $geoip_country_code ' '$geoip_region_name $geoip_city '; ##this uses the default log format access_log /var/log/nginx/access.log; ##this uses the our custom log format access_log /var/log/nginx/custom_log custom; }
ຕໍ່ໄປນີ້ແມ່ນຕົວຢ່າງການຕັ້ງຄ່າການຕັດໄມ້ແບບກ້າວ ໜ້າ, ມີປະໂຫຍດຕໍ່ຮູບແບບການບັນທຶກທີ່ມີຕົວແປທີ່ກ່ຽວຂ້ອງກັບການບີບອັດແລະ ສຳ ລັບການສ້າງແຟ້ມບັນທຶກແຟ້ມ:
access_log /var/log/nginx/custom_log custom buffer 32k; access_log /path/to/log.gz compression gzip flush=5m;
ການຕັ້ງຄ່າບັນທຶກຂໍ້ຜິດພາດໃນ Nginx
ໃນກໍລະນີທີ່ Nginx ປະສົບກັບຄວາມຜິດພາດໃດໆ, ມັນຈະບັນທຶກຂໍ້ມູນກ່ຽວກັບພວກມັນໃນບັນທຶກຂໍ້ຜິດພາດ. ບັນຫາເຫຼົ່ານີ້ຕົກຢູ່ພາຍໃຕ້ລະດັບຄວາມຮຸນແຮງທີ່ແຕກຕ່າງກັນ: ການແກ້ໄຂ, ຂໍ້ມູນ, ການແຈ້ງເຕືອນ, ເຕືອນ, ຄວາມຜິດພາດ (ນີ້ແມ່ນລະດັບເລີ່ມຕົ້ນແລະເຮັດວຽກທົ່ວໂລກ), ການວິຈານ, ການແຈ້ງເຕືອນ, ຫຼືເຫດການສຸກເສີນ.
ເອກະສານບັນທຶກເລີ່ມຕົ້ນແມ່ນ log/error.log, ແຕ່ວ່າມັນມັກຈະຕັ້ງຢູ່ໃນ/var/log/nginx/ກ່ຽວກັບການແຈກແຈງ Linux. ຄຳ ສັ່ງກ່ຽວກັບ error_log ຖືກໃຊ້ເພື່ອ ກຳ ນົດເອກະສານບັນທຶກ, ແລະມັນສາມາດໃຊ້ໃນສະຖານທີ່ຕົ້ນຕໍ, http, mail, stream, server, ສະຖານທີ່ (ຕາມ ລຳ ດັບນັ້ນ).
ທ່ານຍັງຄວນສັງເກດວ່າ:
- ການຕັ້ງຄ່າໃນສະພາບການຕົ້ນຕໍແມ່ນສືບທອດໂດຍລະດັບຕ່ ຳ ກວ່າໃນ ຄຳ ສັ່ງຂ້າງເທິງ.
- ແລະການຕັ້ງຄ່າໃນລະດັບຕ່ ຳ ເກີນກວ່າການຕັ້ງຄ່າທີ່ສືບທອດມາຈາກລະດັບສູງ.
ທ່ານສາມາດ ກຳ ນົດການຕັດໄມ້ຜິດພາດໂດຍໃຊ້ ຄຳ ສັບຕໍ່ໄປນີ້:
error_log /path/to/log_file log_level;
ຍົກຕົວຢ່າງ:
error_log /var/log/nginx/error_log warn;
ສິ່ງນີ້ຈະແນະ ນຳ ໃຫ້ Nginx ເຊັນເຂົ້າທຸກໆຂໍ້ຄວາມຂອງ ຄຳ ເຕືອນປະເພດແລະລະດັບຂໍ້ມູນການເຕືອນ, ການເຕືອນແລະການແຈ້ງເຕືອນທີ່ຮຸນແຮງກວ່າເກົ່າ.
ໃນຕົວຢ່າງຕໍ່ໄປ, ຂໍ້ຄວາມຂອງລະດັບ ສຳ ຄັນ, ເຕືອນແລະລະດັບສຸກເສີນຈະຖືກບັນທຶກລົງ.
error_log /var/www/example1.com/log/error_log crit;
ພິຈາລະນາການຕັ້ງຄ່າຂ້າງລຸ່ມນີ້, ນີ້, ພວກເຮົາໄດ້ ກຳ ນົດການເຂົ້າລະບົບຜິດພາດໃນລະດັບຕ່າງໆ (ໃນສະພາບການຂອງ http ແລະ server). ໃນກໍລະນີທີ່ມີຂໍ້ຜິດພາດ, ຂໍ້ຄວາມຈະຖືກຂຽນໄວ້ໃນບັນທຶກຂໍ້ຜິດພາດເທົ່ານັ້ນ, ເຊິ່ງຢູ່ໃກ້ກັບລະດັບທີ່ຂໍ້ຜິດພາດໄດ້ປາກົດຂື້ນ.
http { log_format compression '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" "$gzip_ratio"'; error_log /var/log/nginx/error_log crit; server { listen 80; server_name example1.com; #this logs errors messages for example1.com only error_log /var/log/nginx/example1.error_log warn; …... } server { listen 80; server_name example2.com; #this logs errors messages for example2.com only error_log /var/log/nginx/example1.error_log; ……. } }
ຖ້າທ່ານໃຊ້ ຄຳ ແນະ ນຳ ກ່ຽວກັບຂໍ້ຜິດພາດຫຼາຍກວ່າ ໜຶ່ງ ລາຍການທີ່ຢູ່ໃນການຕັ້ງຄ່າຂ້າງລຸ່ມນີ້ (ລະດັບດຽວກັນ), ຂໍ້ຄວາມຈະຖືກຂຽນໃສ່ບັນທຶກທີ່ລະບຸໄວ້ທັງ ໝົດ.
server { listen 80; server_name example1.com; error_log /var/www/example1.com/log/error_log warn; error_log /var/log/nginx/example1.error_log crit; …... }
ການຕັ້ງຄ່າການຕັດໄມ້ທີ່ມີເງື່ອນໄຂໃນ Nginx
ໃນບາງກໍລະນີ, ພວກເຮົາອາດຈະຕ້ອງການໃຫ້ Nginx ດຳ ເນີນການບັນທຶກຂໍ້ຄວາມທີ່ມີເງື່ອນໄຂ. ບໍ່ແມ່ນຂໍ້ຄວາມທຸກຢ່າງຕ້ອງໄດ້ຮັບການເຂົ້າສູ່ລະບົບໂດຍ Nginx, ດັ່ງນັ້ນພວກເຮົາສາມາດບໍ່ສົນໃຈຂໍ້ມູນບັນທຶກທີ່ບໍ່ ສຳ ຄັນຫລືມີຄວາມ ສຳ ຄັນ ໜ້ອຍ ຈາກບັນທຶກການເຂົ້າເຖິງຂອງພວກເຮົາໂດຍສະເພາະ.
ພວກເຮົາສາມາດໃຊ້ໂມດູນ ngx_http_map_module ເຊິ່ງສ້າງຕົວແປທີ່ຄ່າຂອງມັນຂື້ນກັບຄຸນຄ່າຂອງຕົວແປອື່ນໆ. ຕົວກໍານົດການທີ່ຢູ່ພາຍໃນຕັນແຜນທີ່ (ເຊິ່ງຄວນຈະມີຢູ່ໃນເນື້ອຫາ http ເທົ່ານັ້ນ) ລະບຸການສ້າງແຜນທີ່ລະຫວ່າງແຫຼ່ງຂໍ້ມູນແລະຄ່າທີ່ໄດ້ຮັບ.
ສຳ ລັບການຕັ້ງຄ່າແບບນີ້, ຄຳ ຮ້ອງຂໍຈະບໍ່ໄດ້ຮັບການລົງທະບຽນຖ້າສະພາບການປະເມີນເປັນ “ 0”
ຫລືສາຍເປົ່າ. ຕົວຢ່າງນີ້ຍົກເວັ້ນການຮ້ອງຂໍດ້ວຍລະຫັດສະຖານະ HTTP 2xx ແລະ 3xx.
http{ map $status $condition { ~^[23] 0; default 1; } server{ access_log /path/to/access.log custom if=$condition; } }
ນີ້ແມ່ນຕົວຢ່າງທີ່ມີປະໂຫຍດອີກຢ່າງ ໜຶ່ງ ສຳ ລັບການແກ້ໄຂບັນດາໂປແກຼມເວັບໃນໄລຍະພັດທະນາ. ນີ້ຈະບໍ່ສົນໃຈຂໍ້ຄວາມທັງ ໝົດ ແລະພຽງແຕ່ລົງຂໍ້ມູນ debug ເທົ່ານັ້ນ.
http{ map $info $debuggable { default 0; debug 1; } server{ …….. access_log /var/log/nginx/testapp_debug_access_log debug if=$debuggable; #logs other requests access_log /var/log/nginx/testapp_access.log main; ……. } }
ທ່ານສາມາດຊອກຫາຂໍ້ມູນເພີ່ມເຕີມ, ລວມທັງການເຂົ້າສູ່ລະບົບ syslog ຢູ່ທີ່ນີ້.
ດຽວນີ້ ໝົດ ແລ້ວ! ໃນ ຄຳ ແນະ ນຳ ນີ້, ພວກເຮົາໄດ້ອະທິບາຍວິທີການ ກຳ ນົດຮູບແບບການຕັດໄມ້ທີ່ ເໝາະ ສົມ ສຳ ລັບການເຂົ້າເຖິງແລະບັນທຶກຂໍ້ຜິດພາດໃນ Nginx. ໃຊ້ແບບຟອມ ຄຳ ເຫັນຂ້າງລຸ່ມນີ້ເພື່ອຖາມ ຄຳ ຖາມຫຼືແບ່ງປັນຄວາມຄິດຂອງທ່ານກ່ຽວກັບບົດຂຽນນີ້.