آنچه در این مقاله میخوانید
نحوه تنظیم لاگ و 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 را، مطالعه کنید.
سرورهای مجازی ابری لیارا یک راهحل انعطافپذیر و مقرون بهصرفه برای کسبوکارها و توسعهدهندگان فراهم میکند. با استفاده از سرور مجازی ایران لیارا، میتوانید سرورهای خود را به سادگی هر چه تمام راهاندازی کنید و از سرور مجازی ترافیک نامحدود بهرهمند شوید.
برای کسانی که نیاز به سرورهایی با هزینه پایین دارند، س سرور مجازی ارزان قیمت لیارا گزینه مناسبی هست. علاوه بر این، قابلیت سرور مجازی ساعتی به شما اجازه میدهد که سرور خود را تنها برای زمان نیاز، استفاده کنید. این ویژگیها باعث میشود که سرویسهای ابری لیارا یکی از بهترین گزینهها برای کسبوکارهای مختلف باشند.