نحوه تنظیم لاگ و rotation در Nginx در سرور مجازی لینوکس
۴ بهمن ۱۴۰۳
برای جلوگیری از بروز مشکلات در وب سرور خود، میتوانید یک سیستم لاگگیری، پیکربندی کنید. اطلاعات لاگگیریشده روی سرور مجازی ابری، به شما امکان دسترسی به دادههایی را میدهد که در رفع مشکلات و ارزیابی شرایط پیشآمده، کمککننده هستند.
در این آموزش، قابلیتهای لاگگیری Nginx را بررسی کرده و نحوه پیکربندی ابزارهای مرتبط با آن را، خواهیم آموخت. در این مثال، از یک سرور مجازی سفارشی Ubuntu استفاده میشود، اما هر توزیع مدرن دیگری نیز، عملکرد مشابهی خواهد داشت.
پیشنیازها
برای دنبال کردن این آموزش، به موارد زیر نیاز دارید:
- یک سرور Ubuntu نسخه 22.04 به بعد با یک فایروال و یک کاربر غیر روت (non-root) که دارای دسترسی sudo است. برای این کارها، میتوانید مقاله نحوه راهاندازی اولیه سرور مجازی با اوبونتو Ubuntu را در ابتدا، مطالعه کنید.
- یک نسخه نصبشده از Nginx روی سرور.
با اجرای Nginx روی سرور مجازی تست خود، آماده شروع خواهید بود. در ادامه بخوانید:
درک دستور error_log
در Nginx
Nginx از چند دستور مختلف برای مدیریت لاگگیری سیستم استفاده میکند. یکی از دستورات موجود در ماژول اصلی Nginx، دستور error_log
است.
سینتکس دستور error_log
دستور error_log
برای مدیریت و ثبت پیامهای خطای عمومی استفاده میشود. اگر با Apache آشنا هستید، این دستور، مشابه دستور ErrorLog
در Apache است. ساختار دستور error_log
به صورت زیر است:
/etc/nginx/nginx.conf
error_log log_file log_level
در دستور فوق، log_file
مشخص میکند که لاگها در کدام فایل نوشته شوند. log_level
نیز مشخص میکند پایینترین سطح لاگگیری که میخواهید ثبت شود، چه باشد.
سطوح لاگگیری (Logging Levels)
دستور error_log
را میتوان بهگونهای پیکربندی کرد که بسته به نیاز، اطلاعات بیشتر یا کمتری را ثبت کند. سطح لاگگیری میتواند یکی از موارد زیر باشد:
- emerg: موقعیتهای اضطراری، که سیستم در وضعیت غیرقابل استفادهای قرار دارد.
- alert: شرایط بحرانی که نیاز به اقدام فوری دارند.
- crit: مشکلات مهمی که باید برطرف شوند.
- error: خطایی رخ داده و چیزی موفقیتآمیز نبوده است.
- warn: چیزی غیرعادی رخ داده، اما نگرانکننده نیست.
- notice: رویدادی عادی رخ داده است که ارزش ثبت شدن را دارد.
- info: پیامهای اطلاعاتی که ممکن است دانستنشان مفید باشد.
- debug: اطلاعات عیبیابی که میتواند برای شناسایی محل بروز مشکل مفید باشد.
سطوح بالاتر در لیست فوق، دارای اولویت بیشتری هستند. اگر سطح خاصی را انتخاب کنید، لاگها شامل آن سطح و تمام سطوح با اولویت بالاتر از آن خواهد بود. برای مثال، اگر سطح error را انتخاب کنید، لاگها شامل پیامهای با سطح error و crit و alert و emerg خواهند بود.
در فایل اصلی تنظیمات Nginx، میتوانید مثالی از دستور error_log
را ببینید. با ویرایشگر متن موردنظرتان، فایل پیکربندی زیر را باز کنید. در این مثال از nano استفاده میشود:
sudo nano /etc/nginx/nginx.conf
در فایل، به بخش # Logging Settings
اسکرول کنید تا دستورات زیر را مشاهده کنید:
. . .
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
. . .
اگر نمیخواهید error_log
چیزی را ثبت کند، میتوانید خروجی آن را به /dev/null
تغییر دهید:
. . .
error_log /dev/null crit;
. . .
در ادامه این مقاله، در مورد دستور access_log
نیز، بحث خواهد شد.
درک دستورات لاگگیری HttpLogModule
در Nginx
در حالی که دستور error_log
بخشی از ماژول اصلی است، دستور access_log
بخشی از HttpLogModule
(ماژول لاگگیری HTTP) است. این ماژول، امکان شخصیسازی لاگها را فراهم میکند و شامل چند دستور دیگر برای پیکربندی لاگهای سفارشی است.
دستور log_format
دستور log_format
برای تعریف فرمت یک فایل لاگ استفاده میشود. این دستور از plain text و متغیرها برای توصیف فرمت لاگ، استفاده میکند.
یکی از فرمتهایی که به صورت پیشفرض در Nginx تعریف شده، combined
است. این قالب در بسیاری از سرورها رایج است.
در ادامه، یک مثال از فرمت combined
قرار گرفته است (با فرض اینکه این فرمت از قبل توسط Nginx تعریف نشده و باید با دستور log_format
، تعریف شود):
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
تعریف فوق شامل چند خط است و تا زمانی که به نقطهویرگول (;
) برسد، ادامه دارد. خطوطی که با علامت دلار ($
) شروع میشوند نشاندهنده متغیرها هستند. کاراکترهایی مانند -
و [
و ]
به صورت ثابت و بدون تغییر، در لاگها، نمایش داده میشوند.
سینتکس کلی دستور log_format
در فایل /etc/nginx/nginx.conf
به صورت زیر است:
log_format format_name string_describing_formatting;
شما میتوانید از متغیرهای پشتیبانیشده توسط Core Module برای ایجاد رشتههای لاگگیری استفاده کنید.
درک دستور access_log
در Nginx
دستور access_log
از لحاظ سینتکس، مشابه دستور error_log
است، اما انعطاف بیشتری دارد و برای پیکربندی لاگهای سفارشی استفاده میشود. ساختار دستور به صورت زیر است:
access_log /path/to/log/location [ format_of_log buffer_size ];
در دستور فوق، /path/to/log/location
مسیر فایل لاگ است و لاگها در آن ذخیره خواهند شد. مقدار format_of_log
فرمت لاگ را مشخص میکند و میتواند یکی از فرمتهای تعریفشده توسط دستور log_format
باشد اما به صورت پیشفرض، فرمت combined
است. مقدار buffer_size
حداکثر اندازه دادهای است که Nginx قبل از نوشتن، در فایل لاگ نگه میدارد.
میتوانید با اضافه کردن کلمه کلیدی gzip
به دستور فوق، فایل لاگ را فشرده کنید:
access_log /path/to/log/location format_of_log gzip;
بر خلاف دستور error_log، اگر نمیخواهید لاگگیری انجام شود، میتوانید access_log
را در فایل تنظیمات غیرفعال کنید:
. . .
##
# Logging Settings
##
access_log off;
error_log /var/log/nginx/error.log;
. . .
در این حالت، نیازی به ارسال خروجی به /dev/null
نیست.
مدیریت چرخش لاگ (Log Rotation) در Nginx
با رشد و حجیمتر شدن اندازه فایلهای لاگ، استفاده از مکانیزمهای لاگگیری برای جلوگیری از پر شدن فضای دیسک، امری ضروری است. چرخش لاگ (Log Rotation) فرآیندی است که در آن، فایلهای لاگ جابهجا شده و ممکن است فایلهای قدیمی برای مدت زمان مشخصی، آرشیو شوند.
Nginx ابزار مستقیمی برای مدیریت فایلهای لاگ ارائه نمیدهد، اما شامل مکانیزمهایی برای کمک به log rotation است.
چرخش لاگ بهصورت دستی
برای چرخش لاگها بهصورت دستی، میتوانید یک اسکریپت برای این کار بنویسید. به عنوان مثال، فایل لاگ فعلی را به یک فایل جدید منتقل کنید تا آرشیو شود. یک روش رایج این است که جدیدترین فایل را با پسوند .0
نامگذاری کرده و فایلهای قدیمیتر را با .1
و … نامگذاری کنید:
mv /path/to/access.log /path/to/access.log.0
دستوری که عملیات Log Rotation را اجرا میکند، kill -USR1 /var/run/nginx.pid
است. این دستور فرآیند Nginx را kill نمیکند، بلکه باعث بارگذاری مجدد فایلهای لاگ میشود و درخواستهای جدید، در فایلی جدید، ثبت میشوند:
kill -USR1 `cat /var/run/nginx.pid`
فایل /var/run/nginx.pid
شامل PID فرآیند اصلی Nginx است. این فایل، در ابتدای فایل پیکربندی /etc/nginx/nginx.conf
قرار گرفته و با دستور pid
مشخص شده است:
sudo nano /etc/nginx/nginx.conf
خروجی:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
...
پس از اجرای عملیات Log Rotation، دستور sleep 1
را اجرا کنید تا فرآیند انتقال، کامل شود. سپس، میتوانید فایلهای قدیمی را فشرده کرده یا هر عملیات دیگری را روی آنها انجام دهید:
sleep 1
[ post-rotation processing of old log file ]
چرخش لاگ با استفاده از logrotate
ابزار logrotate
، یک ابزار برای چرخش خودکار لاگها است. این برنامه به طور پیشفرض روی Ubuntu نصب شده و Nginx در اوبونتو، دارای یک اسکریپت سفارشی logrotate است. برای دسترسی به اسکریپت rotation، از ویرایشگر متن موردنظر خود استفاده کنید. این مثال از nano
استفاده میکند:
sudo nano /etc/logrotate.d/nginx
اولین خط این فایل مشخص میکند که دستورات خطوط بعدی بر روی کدام مسیر اعمال شوند. اگر مکان لاگگیری را در تنظیمات Nginx تغییر دادید، این مورد را در این فایل نیز، بهروزرسانی کنید. سایر خطوط مشخص میکنند که لاگها روزانه rotate شوند و 52 نسخه قدیمیتر نگهداری شود.
در این فایل، بخش postrotate
شامل دستوری است که به Nginx میگوید پس از تکمیل rotation، فایلهای لاگ را مجدداً بارگذاری کند:
. . .
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
. . .
دستور فوق، مشابه مکانیزم عملیات rotation بهصورت دستی است و تضمین میکند که فایلهای لاگ جدید، به درستی بارگذاری شوند.
نتیجهگیری
پیکربندی و مدیریت صحیح لاگها میتواند در هنگام بروز مشکل در سرور مجازی، زمان و انرژی شما را ذخیره کند. دسترسی به اطلاعاتی که در تشخیص مشکل، کمک میکنند، مرز بین یک مشکل ساده و یک چالش طولانی را رقم میزنند.
نظارت بر لاگهای سرور برای حفظ عملکرد سایت و جلوگیری از افشای اطلاعات حساس، اهمیت زیادی دارد. این راهنما تنها مقدمهای برای آشنایی شما با لاگگیری بود. برای آشنایی بیشتر با لاگها و نحوه پیکربندی آنها، مقاله ما در مورد نحوه مشاهده و تنظیم لاگهای لینوکس در سرور مجازی اوبونتو Ubuntu را، مطالعه کنید.
سرورهای مجازی ابری لیارا یک راهحل انعطافپذیر و مقرون بهصرفه برای کسبوکارها و توسعهدهندگان فراهم میکند. با استفاده از سرور مجازی ایران لیارا، میتوانید سرورهای خود را به سادگی هر چه تمام راهاندازی کنید و از سرور مجازی ترافیک نامحدود بهرهمند شوید.
برای کسانی که نیاز به سرورهایی با هزینه پایین دارند، س سرور مجازی ارزان قیمت لیارا گزینه مناسبی هست. علاوه بر این، قابلیت سرور مجازی ساعتی به شما اجازه میدهد که سرور خود را تنها برای زمان نیاز، استفاده کنید. این ویژگیها باعث میشود که سرویسهای ابری لیارا یکی از بهترین گزینهها برای کسبوکارهای مختلف باشند.