ວິທີການ ກຳ ນົດຮູບແບບການເຂົ້າເຖິງລູກຄ້າແລະແບບຜິດພາດຂອງການເຂົ້າລະຫັດໃນ 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. ໃຊ້ແບບຟອມ ຄຳ ເຫັນຂ້າງລຸ່ມນີ້ເພື່ອຖາມ ຄຳ ຖາມຫຼືແບ່ງປັນຄວາມຄິດຂອງທ່ານກ່ຽວກັບບົດຂຽນນີ້.