🌐 Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΎΠ² доступа Nginx для тСстирования ΠΈ Π°Π½Π°Π»ΠΈΠ·Π°

Π‘ΠΊΡ€ΠΈΠΏΡ‚ для access log Π½Π° Nginx

by itisgood

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π›ΡŽΠ±ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ вСсти ΠΆΡƒΡ€Π½Π°Π» событий для ΠΈΡ… рСгистрации.

Π’ частности, Π»ΠΎΠ³ΠΈ доступа Nginx Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ IP-адрСса ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², URL-адрСса ΠΈ ΠΊΠΎΠ΄Ρ‹ состояния HTTP для запросов ΠΊ Π²Π΅Π±-сСрвСру.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим Python-скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΆΡƒΡ€Π½Π°Π»Π° доступа nginx для тСстирования ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

🌐 Nginx ΠΈΠ»ΠΈ Apache: Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… Π²Π΅Π΄ΡƒΡ‰ΠΈΡ… Π²Π΅Π±-сСрвСров

Π‘ΠΊΡ€ΠΈΠΏΡ‚:

 import random
import time
import argparse

# create an ArgumentParser object and set the description and default values for the optional arguments
parser = argparse.ArgumentParser(description='Generate a sample access log.')
parser.add_argument('--filename', type=str, help='Name of the log file', default='access.log')
parser.add_argument('--lines', type=int, help='Number of log lines to generate', default=2000)

# create a list of IP addresses to use in the log lines
ip_list = ['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4', '192.168.1.5',
'192.168.1.6', '192.168.1.7', '192.168.1.8', '192.168.1.9', '192.168.1.10',
'192.168.1.11', '192.168.1.12', '192.168.1.13', '192.168.1.14', '192.168.1.15',
'192.168.1.16', '192.168.1.17', '192.168.1.18', '192.168.1.19', '192.168.1.20',
'192.168.1.21', '192.168.1.22', '192.168.1.23', '192.168.1.24', '192.168.1.25',
'192.168.1.26', '192.168.1.27', '192.168.1.28', '192.168.1.29', '192.168.1.30',
'192.168.1.31', '192.168.1.32', '192.168.1.33', '192.168.1.34', '192.168.1.35',
'192.168.1.36', '192.168.1.37', '192.168.1.38', '192.168.1.39', '192.168.1.40',
'192.168.1.41', '192.168.1.42', '192.168.1.43', '192.168.1.44', '192.168.1.45',
'192.168.1.46', '192.168.1.47', '192.168.1.48', '192.168.1.49', '192.168.1.50',
'2001:db8:0:1:0:0:0:1', '2001:db8:0:1:0:0:0:2', '2001:db8:0:1:0:0:0:3',
'2001:db8:0:1:0:0:0:4', '2001:db8:0:1:0:0:0:5', '2001:db8:0:1:0:0:0:6',
'2001:db8:0:1:0:0:0:7', '2001:db8:0:1:0:0:0:8', '2001:db8:0:1:0:0:0:9',
'2001:db8:0:1:0:0:0:a', '2001:db8:0:1:0:0:0:b', '2001:db8:0:1:0:0:0:c',
'2001:db8:0:1:0:0:0:d', '2001:db8:0:1:0:0:0:e']

# create a list of user agent strings to use in the log lines
user_agents = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0', 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 OPR/45.0.2552.898', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36']

args = parser.parse_args()

# open the log file in write mode and create log lines using the specified number of lines
with open(args.filename, 'w') as f:
for i in range(args.lines):
ip = random.choice(ip_list)
timestamp = time.strftime('%d/%b/%Y:%H:%M:%S %z', time.localtime())
method = random.choice(['GET', 'POST', 'PUT', 'DELETE'])
url = '/' + ''.join(random.choices('abcdefghijklmnopqrstuvwxyz', k=random.randint(1, 10)))
refurl = random.choice(['https://www.example.com/','https://www.google.com/','https://www.ibm.com/','https://www.msn.com/'])
protocol = 'HTTP/1.1'
status_code = random.choice([200, 201, 204, 301, 302, 400, 401, 403, 404, 500])
size = random.randint(100, 10000)
user_agent = random.choice(user_agents)
# create the log line with the chosen values and write it to the file
line = f"{ip} - - [{timestamp}] \"{method} {url} {protocol}\" {status_code} {size} \"{refurl}\" \"{user_agent}\"\n"
f.write(line)

 

 

ИспользованиС

Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этот скрипт ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

python generate_logs.py --filename mylog.log --lines 5000

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрировано 5000 строк ΠΆΡƒΡ€Π½Π°Π»Π° Π² Ρ„Π°ΠΉΠ»Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ mylog.log.

Если ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ –filename ΠΈ –lines, Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ значСния access.log ΠΈ 2000 строк.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π½Π° языкС Python ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ встроСнныС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ random ΠΈ time для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ случайных Π΄Π°Π½Π½Ρ‹Ρ… для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки Π»ΠΎΠ³Π°.

Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ argparse для Π°Π½Π°Π»ΠΈΠ·Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Ρ‡Ρ‚ΠΎ позволяСт Π½Π°ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ имя Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π»ΠΎΠ³-Ρ„Π°ΠΉΠ»Π° ΠΈ количСство Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π»ΠΎΠ³-строк.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ описаниС основных частСй скрипта:

  • Π Π°Π·Π±ΠΎΡ€ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки: ΠœΠΎΠ΄ΡƒΠ»ΡŒ argparse ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π°Π·Π±ΠΎΡ€Π° Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² –filename ΠΈ –lines, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄Π°ΡŽΡ‚ имя Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π»ΠΎΠ³-Ρ„Π°ΠΉΠ»Π° ΠΈ количСство Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π»ΠΎΠ³-строк соотвСтствСнно.
  • ГСнСрация строк : Π¦ΠΈΠΊΠ» for Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ строки ΠΆΡƒΡ€Π½Π°Π»Π° ΠΏΡƒΡ‚Π΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ args.lines.
  • На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ· списка IP-адрСсов выбираСтся случайный IP-адрСс, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля time гСнСрируСтся тСкущая врСмСнная ΠΌΠ΅Ρ‚ΠΊΠ° Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, выбираСтся случайный HTTP-ΠΌΠ΅Ρ‚ΠΎΠ΄, гСнСрируСтся случайный URL-ΠΏΡƒΡ‚ΡŒ ΠΈΠ· 1-10 строчных Π±ΡƒΠΊΠ², выбираСтся случайный URL-адрСс Ρ€Π΅Ρ„Π΅Ρ€Π΅Ρ€Π°, устанавливаСтся ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» HTTP/1.1, выбираСтся случайный ΠΊΠΎΠ΄ состояния HTTP, гСнСрируСтся случайный Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ 100 Π΄ΠΎ 10000 Π±Π°ΠΉΡ‚, выбираСтся случайная строка Π°Π³Π΅Π½Ρ‚Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π­Ρ‚ΠΈ значСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для построСния строки ΠΆΡƒΡ€Π½Π°Π»Π°, которая записываСтся Π² Ρ„Π°ΠΉΠ» Π»ΠΎΠ³Π°.
  • Π—Π°ΠΏΠΈΡΡŒ строк ΠΆΡƒΡ€Π½Π°Π»Π° Π² Ρ„Π°ΠΉΠ»: ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ with ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для открытия Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ записи ΠΈ создания строк ΠΆΡƒΡ€Π½Π°Π»Π° с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ количСством строк. ΠœΠ΅Ρ‚ΠΎΠ΄ write() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для записи ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки ΠΆΡƒΡ€Π½Π°Π»Π° Π² Ρ„Π°ΠΉΠ».

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠœΡ‹ рассмотрСли Python-скрипт, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π»Π΅Π³ΠΊΠΎ ΠΈ быстро ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π»ΠΎΠ³ΠΎΠ² доступа ΠΊ Nginx для тСстирования ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

Для Ρ€Π°Π·Π±ΠΎΡ€Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки скрипт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ встроСнныС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ random ΠΈ time, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ argparse.

Π‘Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π»ΠΎΠ³-Ρ„Π°ΠΉΠ» содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запросС ΠΊ Π²Π΅Π±-сСрвСру, Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°ΠΊ IP-адрСс ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ URL ΠΈ ΠΊΠΎΠ΄ состояния HTTP, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ сСрвСром.

см. Ρ‚Π°ΠΊΠΆΠ΅:

 

You may also like

Leave a Comment