چند راهکار اصلی برای دیباگ وردپرس

ابزارهای دیباگ (Debug tools) مهمترین و جذاب ترین ابزارهای هر برنامه نویس و توسعه دهنده ایی است. بسیاری از طراحان قالب و پلاگین وردپرس از پتانسیل های این CMS در دیباگ مطلع نیستند.در این نوشتار سعی می کنیم بطور خلاصه و مفید راهکار هایی که برای دیباگ وردپرس وجود دارد را بیان کنیم:

آپدیت نوشت : راه های فراوانی برای دیباگ وردپرس وجود دارد که به مرور به لیست اضافه خواهیم کرد.

1- ثابت WP_DEBUG

شناخته شده ترین ابزار دیباگ وردپرس همین WP_DEBUG است. در فایل wp-config.php وردپرس می توانید خط زیر را بیابید :

define( 'WP_DEBUG', true );

معمولاً همه توسعه دهنده های وردپرس عاشق همین یک خط کوچک هستند 🙂 . تغییر مقدار ثابت WP_DEBUG به true باعث می شود کلیه خطاهای PHP از جمله Notices , Warnings , errors و همچین خطاهای دیباگ وردپرس از جمله توابع منسوخ وردپرس (deprecated functions) در هنگام اجرای وردپرس نمایش داده شود.

توجه : deprecated code ها را جدی بگیرید چون ممکن از در آپدیت های بعدی وردپرس غیرفعال شوند.

در صورت فعال بودن دیباگ وردپرس می توان به کمک دو ثابت زیر از نمایش پیغام های خطا در سایت جلوگیری کرد تا وردپرس آنها را در یک فایل log به نام debug.log در فولدر wp-content ذخیره کند.

دو خط زیر در فایل wp-config.php وجود ندارند و باید آنها را به این فایل اضافه کنید.

define( 'WP_DEBUG_LOG', true );

define( 'WP_DEBUG_DISPLAY', false );

این ویژگی برای دیباگ کردن سایت هایی که در حالت توسعه نیستند و سایت هایی که در حالت انتشار قرار دارند و لازم است بدون down شدن دیباگ شوند بسیار کاربردی است.

این دو ثابت فقط در صورتی که مد دیباگ وردپرس فعال باشد (WP_DEBUG برابر با true) قابل استفاده هستند.

توضیحات توسعه دهندگان وردپرس در مورد مد دیباگ وردپرس را بخوانید.

WP_DEBUG مشکلات موجود در کدنویسی شما را آشکار می کند تا بتوانید کُدی استاندارد داشته باشید. متغیرها و ثابت های تعریف نشده و یا چک نشده (چک کردن متغیرها و آرایه ها به کمک توابع isset و empty) مشکلات عمومی فراموش دشه برنامه نویسان PHP است.

در روند دیباگ وردپرس حتی ممکن است مشکلی در هسته وردپرس پیدا کنید که می توانید یک گزارش خطا برای توسعه دهندگان وردپرس ارسال کنید.

2- SCRIPT_DEBUG

اگر میخواهید باگ های مربوط به JavaScript یا احیاناً css را رهگیری کنید می توانید ثابت SCRIPT_DEBUG را در فایل wp-config.php به true تعریف کنید:

define( 'SCRIPT_DEBUG', true );

قضیه از این قراره که وردپرس کلیه فایل های CSS و JavaScript رو برای لود توی داشبورد (wp-admin) یکپارچه سازی و فشرده میکنه.

با فعال سازی SCRIPT_DEBUG به نحوی که در بالا اشاره شد وردپرس کلیه فایل های CSS و JavaScript رو جداگانه و فشرده نشده (development version) فراخوانی میکنه و کار رو برای رهگیری های مربوط به دیباگ Front-end آسون تر میکنه.

توی دو اسکرین شات زیر که یکی در حالت فعال بودن و دیگری غیرفعال بودن SCRIPT_DEBUG از تب console ابزار developer tools مرورگر کروم گرفته شده، این مساله خیلی روشن تر هستش:

3- آنالیز کوئری ها

ثابت SAVEQUERIES کوئری های دیتابیس را در یک آرایه ذخیره می کند. با نمایش دادن اطلاعات این آرایه دیتای هر کوئری را می توانیم ببینیم.

برای فعال کردن این امکان ابتدا مقدار ثابت SAVEQUERIES را با افزودن خط زیر در فایل wp-config.php به true تغییر دهید:

define( 'SAVEQUERIES', true );

سپس بعد از حلقه ی اصلی وردپرس می توانید این آرایه را پرینت بگیرید:

global $wpdb;

var_dump( $wpdb->queries );

می توانید این قطعه کد را در فوتر (footer.php) بنویسید تا مطمدن شوید در همه صفحات وب سایت بعد از حلقه اصلی اجرا می شود.

نکته : بعد از اتمام کار حتماً مقدار SAVEQUERIES به false تغییر دهید. چون میزان مصرف منابع سرور شما را به شدت بالا خواهد برد.

4- پلاگین Core Control برای دیباگ وردپرس

پلاگین های زیادی برای خطایابی وردپرس وجود دارد ولی پلاگین Core Control یکی از جامع ترین اونهاست که خود شامل چند ماژول است.

چرا از ادیتور sublime text استفاده می کنم؟

اگر هنوز ابزار باب میل خود رو برای ویرایش کدهای HTML , CSS , JQuery تون پیدا نکردید به احتمال زیاد مشتری Sublime text 3 بشید.

Sublime text 3 یک ادیتور فوق العاده جذاب و سریع است که به زبان Python نوشته شده و روی پلتفرم های ویندوز ، لینوکس و مک نصب می شود.

حدوداً ۷ سال گذشته رو بصورت مداوم از sublime text  برای کدنویسی استفاده کردم و واقعاً به نسبت ادیتورهای دیگر رضایت خیلی بیشتری نسبت به آن دارم.

در این نوشتار تعدادی از ویژگی های جذاب و برجسته sublime text 3 را معرفی و به شما کمک میکنم یک شروع سریع و خوب با این ادیتور داشته باشید.

نصب Sublime text3

خب در حال حاضر آخرین نسخه موجود sublime ورژن 3 می باشد که هنوز در حالت بتا می باشد ولی من تا کنون مشکلی با این نسخه نداشته ام و کلیه ویژگی ها و پلاگین های نسخه پایدار 2 روی 3(بتا) هم پاسخگو است.

Sublime text 3 را میتوانید از وب سایت رسمی این ویرایشگر دانلود کنید.

دانلود Sublime text 3

نصب پکیج کنترل Package Control

اگر بار اولتان هست که با این ویرایشگر آشنا می شوید احتمالاً یک علامت سوال با شنیدن عنوان Package Control در ذهنتان بوجود آمده است. از دست من عصبانی نشوید لطفاً و ادامه رو بخوانید:

درباره Package Control Sublime text

جالب است بدانید ویرایشگر Sublime text به تنهایی ابزار قدرتمندی نیست و چیزی که این ویرایشگر را بسیار مطرح و جذاب کرده است متن باز بودن و امکان توسعه آن است. برنامه نویسان زیادی در سرتاسر دنیا پکیج های توسعه و افزونه هایی برای Sublime text نوشته اند که براحتی می توان آنها را به Sublime text اضافه کرد.

ابزاری که امکان جستجو در همه بسته ها ، دانلود و نصب آنها روی Sublime text را برای ما فراهم می کند همین Package Control می باشد که در حالت پیش فرض روی Sublime text شما فعال نیست و برای بهره برداری از پلاگینها لازم است ابتدا آن را فعال کنیم.

دو روش برای فعال سازی Package Control وجود دارد:

روش اول (آسان)

  • کنسول ویرایشگر Sublime را از مسیر View > Show Console باز کنید و یا از کلیدهای ترکیبی Ctrl + ` برای این کار استفاده کنید.
  • کد های زیر را در این قسمت کپی کنید و اینتر بزنید.

روش دوم (دستی)

  • منوی Preferences > Browse Packages… را کلیک کنید.
  • یک up بزنید تا به فولدر Installed Packages وارد شوید.
  • فایل Package Control.sublime-package را دانلود و در این قسمت قرار دهید.
  • نرم افزار Sublime text خود را ریستارت کنید.

کلیدهای ترکیبی CTRL + SHIFT + P را بزنید. یک باکس در محیط Sublime text برای شمات باز خواهد شد که به آن Command pallete میگویند. Command pallete امکان دسترسی به کلیه تنظیمات ، تکه کدها (snippets) ، فایل های پروژه و مشاهده لیست پکیج های موجود را فراهم میکند.

برای انجام اولین کار عملی در این باکس عبارت Install package را تایپ کنید و بعد پیدا شدن عنوان آن اینتر بزنید. چند لحظه صبر کنید تا لیست کلیه بسته های موجود برای Sublime text بارگذاری شوند.

حال با تایپ عنوان یک بسته می توانید براحتی آن را پیدا و نصب کنید.

با دستور list packages می توانید لیست بسته های نصب شده را ببینید.

بسته های کاربردی Sublime text

پیش تر یک لیست کامل از پلاگین های کاربردی sublime text منتشر کرده ایم که می توانید با مراجعه به آن sublime text خود را مجهز کنید.

  • Alignment
  • BracketHighlighter
  • ColorPicker
  • Emmet
  • Docblocker
  • Git
  • Gitgutter
  • Gist
  • Sidebar Enhancement

پشتیبانی از زبان فارسی

احتمالاً تا کنون متوجه شده اید که sublime text3 زبان فارسی را به درستی پشتیبانی نمیکند و حروف را جدا از هم و برعکس نمایش می دهد.فعلاً که sublime text3 در حالت بتا قرار دارد، امیدواریم در نسخه نهایی این مساله رفع شود. البته من طی 4 سالی که با این نرم افزار مداوم کار می کنم تا کنون این مورد برایم مساله قابل توجه ایی نبوده است، چون واقعاً کم پیش می آید که در روند طراحی نیاز به تایپ یک عبارت فارسی باشد و در صورتی که نیاز بود می توان عبارت را در notepad تایپ و در Sublime text کپی کرد.

برای sublime text 2 یک پلاگین وجود دارد که با نصب آن می توانید عبارات فارسی یا عربی را (bidi language ) را به درستی مشاهده کنید.

https://github.com/praveenvijayan/Sublime-Text-2-BIDI

کلیدهای میانبر در Sublime text

General

F11Full Screen
shift + F11Distraction Free Mode
ctrl + shift + pCommand Palette
ctrl + `Show Console
ctrl + k + bShow/Hide Sidebar
ctrl + /Comment
ctrl + shift + /Block Comment
ctrl + k + uUppercase
ctrl + k + lLowercase

Selections

ctrl + dSelect Word
ctrl + dUse multiple times to select next instance of the selected word
ctrl + clickCreate multiple cursors for multi-editing
ctrl + shift + spaceExpand selection to scope. Repeating keeps expanding.
ctrl + shift + mExpand to brackets
ctrl + shift + jExpand to indentation

Go To

ctrl + pOpen file based on name
ctrl + gGo to line number
ctrl + rGo to symbol
ctrl + p THEN @Open file based on name and search for symbol
ctrl + mGo to matching bracket

Lines

ctrl + lSelect line
ctrl + shift + kDelete line
ctrl + ]Indent
ctrl + [Unindent
ctrl + enterInsert line after
ctrl + shift + enterInsert line before
ctrl + shift + ↑Swap line up
ctrl + shift + ↓Swap line down
ctrl + shift + dDuplicate line
ctrl + jJoin Line

Code Folding

ctrl + shift + [Fold
ctrl + shift + ]Unfold
ctrl + k + jUnfold All

Search / Find / Replace

ctrl + fFind
F3Find next
shift + F3Find previous
ctrl + shift + fSearch all files in a folder
ctrl + hReplace
ctrl + f THEN alt + enterFind a certain term then select them all for multi-editing

Tabs and Window Panes

ctrl + shift + nNew Window
ctrl + nNew Tab
alt + #Select a Tab (ie alt + 3)
ctrl + wClose Tab
ctrl + shift + #Move tab to a Pane (ie ctrl + shift + 2)
ctrl + #Focus on a Pane (ie ctrl + 2)
alt + shift + 1One Column
alt + shift + 2Two Columns
alt + shift + 3Three Columns
alt + shift + 4Four Columns
alt + shift + 8Two Rows
alt + shift + 9Three Rows
alt + shift + 5Two x Two Grid

Bookmarks

ctrl + F2Create Bookmark
F2Next Bookmark
shift + F2Previous Bookmark
ctrl + shift + F2Clear Bookmarks

پلاگین های کاربردی در Sublime text

همانطور که می دانید Sublime text در حال حاضر یکی از محبوب ترین IDE های طراحان وب در دنیا می باشد که از مهمترین ویژگی های آن متن باز بودن است که باعث شده تعداد زیادی پلاگین توسط برنامه نویسان سرتاسر دنیا نوشته شود و Sublime text را به ابزاری بسیار قدرتمند با قابلیت شخصی سازی بالا تبدیل کند.

در این نوشتار تعدادی از پلاگین های کاربردی و ضروری نرم افزار sublime text که بیشتر مورد نیاز طراحان وب هستند را معرفی می کنم و در تلاشم این لیست را مرتباً بروزرسانی کنم.

#Emmet

Emmet ابزاری است که به طراح کمک میکند سرعت بیشتری در کدنویسی داشته باشد. ایده اصلی Emmet این است که با نوشتن قطعه ای از کد و فشردن کلیدی خاص ادامه کد نوشته شود.

این ابزار بصورت پلاگین برای ادیتورهای مختلف توسعه داده شده است که Sublime text نیز از این قاعده مستثنی نیست.

میانبرهای Emmet را خیلی سریع می توانید از این لیست ببینید و فرا بگیرید:

#Alignment

سخت مشغول انجام پروژه هستید، مشکلی ساعتها شما را درگیر می کند و تازه متوجه می شوید که مشکل از جا انداختن یک کاراکتر ساده (معمولاً سِمی کلن 😀 ) بوده است. پلاگین ساده Alignment را بر روی Sublime text خود نصب کنید و براحتی کدهای خود را مرتب کنید:

روش استفاده :

  1. کدهای مورد نظر را انتخاب کنید.
  2. کلیدهای ترکیبی CTRL + ALT + a را بفشارید.

#AutoFileName

در هر پروژه با فایل های زیادی سر و کار داریم و باید آنها را مرتباً به هم الحاق کنیم. به عنوان مثال هر پلاگینی که به پروژه اضافه میکنیم یک یا چند فایل js و css هم باید به پروزه الحاق شوند.

این پلاگین لیستی از فایلهای پروژه در اختیار ما قرار می دهد تا این عمل را با سرعت و دقت بیشتری انجام دهیم.

به عنوان مثال می خواهیم تگ link زیر را کامل کنیم:<link rel="stylesheet" type="text/css" href="|">

با زدن کلیدهای ترکیبی CTRL + Space لیستی از فالیهای پروژه را خواهیم دید و می توانیم فایل css مورد نظر را انتخاب کنیم.

جلوگیری از حذف کاربر admin در django

Django در حالت عادی اجزاه همه کاربرها رو میده. خیلی راحت کاربر ادمین از داشبود مدیریت میتونه همه کاربرها رو انتخاب و حذف کنه 🙂

خب خوشبینانه حتما دلیل برای این مورد وجود داره که من نمیدونم. ولی خب این مورد برای ما مساله ساز شده بود.

مشتری ما که اطلاعات فنی زیادی نداره چند بار اشتباها برای حذف یوزرهای تستی که بعد از تحویل پروژه ایجاد کرده بود کل یوزرها رو انتخاب و حذف کرده بود. در این حالت براحتی از طریق ترمینال با دستور زیر میتونید یک یوزر admin ایجاد کنید.

python manage.py createsuperuser

حالا راهکار برای جلوگیری از بروز این مشکل چیه؟

تو django یه ویژگی بسیار کاربردی به نام signal وجود داره و کارش اینه که میتونه هوک بشه به یکسری رویدادهای از پیش تعیین شده یا رویدادهای کاستوم که خودمون تعریف میکنیم.
مثلا میتونیم هوک کنیم به رویداد pre_delete که توسط خود Django ایجاد شده.در این حالت میتونیم قبل از حذف رکورد/رکوردهای یک مدل مشخص یک پردازش انجام بدیم و در یک شرایط خاص (مثلا اینکه رکورد مورد نظر ما یک کاربر ادمین هستش) نذاریم action در حال اجرا به اتمام برسه (یوزر پاک بشه).

طبق مثالی که زدم برای جلوگیری از حذف کاربر admin میتونیم از سیگنال pre_delete استفاده کنیم.

قطعه کد زیر رو توی models.py اپلیکیشن users قرار بدید و در ادامه توضیح کد رو بخونید:

@receiver(pre_delete, sender=User)
def delete_user(sender, instance, **kwargs):
    if instance.is_superuser and instance.username == 'admin':
        raise PermissionDenied

تو خط اول متدمون رو هوک میکنیم به سیگنال pre_delete و مدل User رو به عنوان پارامتر sender معرفی می کنیم. یعنی مدل User رو چک کن و قبل از حذف هر ریکورد متد من رو یکبار اجرا کن.

پارامترهای sender که اینجا همون مدل User هستش و instance که رکورد در حال حذف هستش به متد ما پاس داده میشه.

در خط های بعد نام کاربری رو(به شرط سوپریوزر بودن) چک میکنیم و اگر برابر admin بود PermissionDenied میدیم که در نتیجه صفحه permission denied به کاربر نشون داده میشه.

خوش باشی دولوپر جان 🙂

محافظت از یک دایرکتوری وب با پسورد، به کمک Nginx

این راهکار برای زمانی هستش که بخواید یک دایرکتوری وب رو خیلی سریع و ساده با username / password محافظت کنید.

برای انجام این راهکار موارد زیر رو نیاز دارید:

  • nginx نصب شده روی سرور و آشنایی عمومی با کانفیگ
  • دسترسی روت سرور

مرحله ۱- ایجاد نام کاربری و پسورد

نام کاربری و رمز عبوری که میخواید برای محافظت از دایرکتوری استفاده بشه باید تو فایلی به نام با ۲ روش میتونید این کار رو انجام بدید:

۱- اگر آپاچی دارید روی سرور میتونید از یکی از ابزارهاش به نام htpasswd برای این کار استفاده کنید. دستور زیر رو توی ترمینال بنویسید:

htpasswd -c /path/to/file/.htpasswd username

بعد از اینتر کردن از شما پسورد رو میخواد.

۲- اگر ابزار فوق رو ندارید می تونید دستی این کار رو انجام بدید. یک فایل به نام .htpasswd در مسیر دلخواه (مثلا تو home میتونید بذارید) ایجاد کنید.

محتوای فایل به این صورت باید باشه:

username:encrypted-password
با استفاده از ابرزارهای آنلاین (پیشنهاد : http://aspirine.org/htpasswd_en.html ) می تونید یک پسور encrypt شده ایجاد کنید. در نهایت محتوای فایل شما به این شکل باید بشه:
hamed:$apr1$sOiSeo04$l8WffD3EX7shHf290HHPX/
  مرحله ۲ : کانفیگ nginx

یکی از فایل های کانفیگ nginx رو باز کنید و انتهای بلاک دایرکتوری مورد نظرتون این دو خط رو اضافه کنید:

auth_basic "Limited access!";
auth_basic_user_file /path/to/file/.htpasswd;

اگر دقیقا متوجه نشدید میتونید در انتها فایل مثال رو ببنید. حتما متوجه خواهید شد. چون فایل کانفیگ nginx رو تغییر دادیم لازمه یه بار nginx رو ریستارت کنیم:

service nginx restart

من یه مثال نوشتم که میتونید ازش استفاده کنید برای تست: روی سروری که داشتم یه دایرکتوری تو مسیر /home/admin به نام files ایجاد کردم. محتوای فایل .htpasswd که توی home گذاشتم:

client:$apr1$sOiSeo04$l8WffD3EX7shHf290HHPX/

محتوای فایل کانفیگ nginx:

server{
listen 138.1.1.1:80;
server_name mydomain.ir;

location /files {
autoindex on;
alias /home/admin/files;
auth_basic "Limited access";
auth_basic_user_file /home/.htpasswd;
}
}
با این کانفیگ آدرس mydomain.ir/files محدود به وارد کردن یوزرنیم/پسورد هستش.

موفق باشید.

کانفیگ سرویس گانیکارن برای یک پروژه django روی Centos

ایجاد سرویس در لینوکس با یک فایل کانفیگ با پسوند service امکان پذیره. الان میخوایم یه سرویس برای گانیکارن ایجاد کنیم.

۱- یه فایل به نام gunicorn.service در مسیر system به صورت زیر ایجاد می کنیم.

nano /etc/systemd/system/gunicorn.service

۲- فایل های سرویس شامل یک سری بلوک هستند که هر بلوک تنظیماتی رو برای سرویس ما نگه داری میکنه. اولین بلوک Unit هستش که بصورت زیر نوشته میشه:

[Unit]
Descripttion=gunicorn daemon
After=network.target

۳- بلوک دوم Service هستش که بصورت زیر نوشته میشه

[Service]
User=unixusername
Group=nginx
WorkingDirectory=/home/unixusername/django_application
ExecStart=/home/unixusername/django_application/venv/bin/gunicorn -b 127.0.0.1:9001 --access-logfile '-' -w 1 django_application.wsgi &

تو بلوک سرویس ابتدا کاربر و گروهی که قراره پروسس اپلیکیشن رو برای ما انجام بدن و دسترسی به دایرکتوری پروژه رو داشته باشه معرفی می کنیم.

بعد از اون برای پارامتر WorkingDirectory آدرس دایرکتوری پروژه رو به سرویس میدیم. این آدرس مسیری هستش که فایل mange.py توش قرار گرفته.

و در انتها برای پارامتر ExecStart کامند اجرای Gunicorn با پارامترهای مد نظر خودمون رو قرار میدیم. توضیحات پارامترهای Gunicorn رو می تونید از داکیومنتش بخونید.

۴- بلوک آخر Install هستش که به systemd لینوکس میگه که اگر سرویس enable شد چه زمانی باید اجرا بشه. که ما بهش میگم هر وقت multi-user بوت شد و در حال اجرا بود سرویس ما رو هم ران کن. دقیقا به صورت زیر بنویسید:

[Install]
WantedBy=multi-user.target

در نهایت فایل gunicorn.service بصورت زیر میشه:

[Unit]
Descripttion=gunicorn daemon
After=network.target

[Service]
User=unixusername
Group=nginx
WorkingDirectory=/home/unixusername/django_application
ExecStart=/home/unixusername/django_application/venv/bin/gunicorn -b 127.0.0.1:9001 --access-logfile '-' -w 1 django_application.wsgi &

[Install]
WantedBy=multi-user.target

۵- با دستو زیر می تونید سرویس رو استارت کنید

systemctl start gunicorn

۶- و با دستور زیر سرویس رو فعال کنید که بعد از ریبوت سیستم عامل بتونه مجدد اجرا بشه

systemctl enable gunicorn

۷- با استارت سرویس gunicron باید اپلیکیشن django روی پورت مورد نظر(تو این مثال 9001) در دسترس باشه. یکبار برای اطمینان از عملکرد صحیح سرویسی که ایجاد کردید سیستم عامل رو ریبوت کنید.

آپگرید PostgreSQL 9.2 به 9.6 در CentOS 7

نسخه ۹.۶ دیتابیس postgresql ویژگی های مفیدی داره که احتمالا مورد نیازتون باشه. آپگرید نسخه ۹.۲ به ۹.۶ کار پیچیده ایی نیست به شرطی که به درستی و طبق مراحل زیر پیش برید:

#0 : قبل از نصب

ابتدا چک کنید ورژن postgresql دقیقا چی هستش الان. با دستور زیر

psql --version

با یوزر postgres که به کل دیتابیس ها دسترسی داره لاگین کنید و یه بک آپ کامل از کل دیتای فعلی بگیرید و به یه جای امن منتقل کنید:

su - postgres
pg_dumpall > backup_all_postgresql_data.sql

وقتی که این آموزش رو دارم می نویسم آخرین نسخه ۹.۶ هستش. شما می تونید هر ورژنی بالاتر از ورژن ۹.۶ رو نصب کنید با همین روندی که در ادامه هست. فقط جاهایی که لازمه تو دستورات ورژن رو باید تغییر بدید.

#1 : مرحله اول نصب postgresql 9.6

# download last package from official postgresql website
cd /tmp
wget https://yum.postgresql.org/9.6/redhat/rhel-7.4-x86_64/pgdg-centos96-9.6-3.noarch.rpm

# install postgresql9.6
rpm -ivh pgdg-centos96-9.6-3.noarch.rpm
yum install postgresql96-server postgresql96-contrib

# initial 
/usr/pgsql-9.6/bin/postgresql96-setup initdb

mv /usr/bin/pg_ctl{,-orig}
echo '#!/bin/bash' > /usr/bin/pg_ctl
echo '"$0"-orig "${@/unix_socket_directory/unix_socket_directories}"' >> /usr/bin/pg_ctl
chmod +x /usr/bin/pg_ctl

#2 : آپدیت/ایمپورت دیتای موجود روی ورژن قبل به ورژن جدید

systemctl stop postgresql
# At this point both servers are stoped

# As Postgres user
su postgres
cd ~
/usr/pgsql-9.6/bin/pg_upgrade -v -b /usr/bin/ -B /usr/pgsql-9.6/bin/ -d /var/lib/pgsql/data/ -D /var/lib/pgsql/9.6/data/
exit

# Back to root user
 # Rollback pg_ctl
 mv -f /usr/bin/pg_ctl{-orig,}

#### APPLY OLD postgresql config params to postgresql-9.6 (pg_hba.conf, postgresql.conf) (manually), maybe use pgtune for postgresql.conf...

#3 : استارت سروریس جدید (نسخه ۹.۶) و غیر فعال کردن نسخه قبل

systemctl start postgresql-9.6
 systemctl enable postgresql-9.6
 systemctl disable postgresql

# temporary
 ln -s /usr/pgsql-9.6/bin/psql /usr/bin/psql --force
 ln -s /usr/pgsql-9.6/bin/pg_dump /usr/bin/pg_dump --force

# Postgres user
 su postgres
 cd ~
 ./analyze_new_cluster.sh
 exit

# back as root
 # remove old postgresql
 yum remove postgresql

# Export new path
 echo 'export PATH=$PATH:/usr/pgsql-9.6/bin' >> /etc/bashrc

در نهایت می تونید فولدر دیتای ورژن قبل رو به اختیار حذف کنید یا نگه دارید.