وردپرس را با GeoDNS پیشرفته کنید! #
مقدمه #
وردپرس یک سیستم مدیریت محتوای کاربرپسند (CMS) است که به شما امکان میدهد برنامههای وب با کارایی بالا ایجاد کنید که به مخاطبان جهانی خدمات ارائه میدهد. معمولاً کاربران سایت وردپرس از مناطق مختلفی میآیند که در برخی مکانها با مشکلات عملکردی مواجه میشوند.
GeoDNS (سیستم نام دامنه جغرافیایی) یک روش توزیع ترافیک است که بسته به موقعیت مکانی کلاینت، رکوردهای DNS خاصی را برمیگرداند. با ادغام وردپرس با GeoDNS، سرورهای مختلف، سایت وردپرس شما را بسته به موقعیت مکانی کاربر، به مخاطبان مختلف ارائه میدهند.
این مقاله توضیح میدهد که چگونه میتوانید وردپرس را با GeoDNS و با استفاده از چندین سرور ارائه شده توسط نگارنوین به اوج خود برسانید. شما باید سایت وردپرس خود را در چندین مکان مستقر کنید و با همان نسخه از سایت خود با سرعتهای دسترسی به منابع مختلف، به کاربران خدمترسانی کنید.
پیشنیازها #
قبل از شروع:
- سرورهای نام دامنه خود را به یک ارائه دهنده سازگار با GeoDNS مانند CloudDNS یا Cloudflare منتقل کنید.
- سرور اصلی وردپرس را با استفاده از برنامه NegarNovin Marketplace ایجاد کنید
اگر یک سرور وردپرس موجود دارید، آن را به عنوان سرور اصلی علامت گذاری کنید تا سایر سرورهای شرکت کننده در شبکه GeoDNS شما همگام سازی شوند. این مقاله از آدرس سرور اصلی استفاده می کند
۱۹۲.۰.۲.۱، آن را با آدرس IP واقعی سرور وردپرس خود جایگزین کنید.
- سرورهای با سیستم عامل اوبونتو را در مکانهای مختلف مستقر کنیداین مقاله از ۹ سرور اوبونتو در مکانهای نگارنوین زیر استفاده میکند:
- نیوجرسی
- سائو پائولو (برزیل)
- دهلی نو (هند)
- ایران (تهران)
- پاریس (فرانسه / اروپای مرکزی)
- لندن (بریتانیا / شمال اروپا)
- ملبورن
- توکیو (ژاپن)
- ژوهانسبورگ (آفریقای جنوبی)
کلاس آدرس IP مثال را
۱۹۲.۰.۲.۰با آدرسهای IP سرور عمومی واقعی خود جایگزین کنید. - با استفاده از SSH، به هر یک از سرورها در ترمینال جداگانه دسترسی پیدا کنیدروی هر سرور مجازی:
- همان کاربر غیر ریشه را با دسترسی sudo ایجاد کنید
- به کاربر sudo جدید بروید
در این مقاله از دستور زیر استفاده شده است
sysadmin، کاربر را با حساب کاربری sudo واقعی خود جایگزین کنید. - سرور را بهروزرسانی کنید
- نصب پکیج LEMP
سرور اصلی وردپرس را تنظیم کنید #
سرور اصلی وردپرس به عنوان نقطه اتصال اصلی برای همه بازدیدکنندگان سایت عمل میکند. برای فعال کردن همه سرورهای فرزند برای کار در خوشه GeoDNS وردپرس، اقدامات زیر را روی سرور اصلی وردپرس انجام دهید.
- همگامسازی تغییرات پایگاه داده MySQL به صورت بلادرنگ با تمام سرورهای وردپرس
- همگامسازی فایلهای وردپرس با همه سرورها
- پیکربندی قوانین فایروال برای دسترسی به پورت MySQL
۳۳۰۶ - انتقال گواهینامههای SSL وردپرس به تمام سرورهای وردپرس
فعال کردن تکثیر پایگاه داده MySQL #
- به دایرکتوری فایلهای روت وب وردپرس خود بروید
$ cd /var/www/example.com - فایل را مشاهده کنید
wp-config.phpو نام پایگاه داده وردپرس را یادداشت کنید.$ cat wp-config.phpخروجی:
/** The name of the database for WordPress */ define( 'DB_NAME', 'wordpressdb' ); - به دایرکتوری فایلهای پیکربندی MySQL بروید
$ cd /etc/mysql/ - با استفاده از یک ویرایشگر متن مانند Nano، فایل پیکربندی اصلی را ویرایش کنید.
$ nano my.cnf - تنظیمات زیر را به
[mysqld]بخش اضافه کنید[mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog-do-db = wordpressdb expire_logs_days = 5فایل را ذخیره کنید و ببندید.
پیکربندی فوق، شناسه تکثیر سرور پایگاه داده MySQL را روی تنظیم میکند
۱، فایلهای لاگ را در/var/log/mysqlدایرکتوری نگه میدارد،wordpressdbپایگاه داده را به عنوان پایگاه داده تکثیر تنظیم میکند و حذف فایلهای لاگ باینری را پس از هر۵روز فعال میکند. - به دایرکتوری
mysql.conf.dیا برویدmariadb.conf.d$ cd mariadb.conf.d ۵۰-server.cnfفایل را ویرایش کنید$ sudo 50-server.cnf- بخش زیر را پیدا کنید:
# Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. bind-address = 127.0.0.1 - برای فعال کردن اتصالات از همه رابطهای سرور،
bind-addressمقدار را از به۱۲۷.۰.۰.۱تغییر دهید.۰.۰.۰.۰bind-address = 0.0.0.0فایل را ذخیره کنید و ببندید.
اعلان آدرس فوق به سرورهای فرزند اجازه میدهد تا با استفاده از آدرس IP عمومی به سرور اصلی پایگاه داده MySQL دسترسی داشته باشند.
- دایرکتوری فایلهای لاگ MySQL را ایجاد کنید
$ sudo mkdir -p /var/log/mysql/ mysqlبه کاربر امتیازات کامل برای دایرکتوری اعطا کنید$ sudo chown -R mysql:mysql /var/log/mysql- سرور پایگاه داده MySQL را مجدداً راه اندازی کنید
$ systemctl restart mysqld - پشتیبان گیری از پایگاه داده MySQL وردپرس
$ sudo mysqldump wordpressdb > wpdb.sql .sqlفایل پایگاه داده را به دایرکتوری webroot وردپرس منتقل کنید .$ sudo mv wpdb.sql /var/www/example.com/- وارد کنسول MySQL شوید
$ sudo mysql - یک کاربر جدید برای تکرار وردپرس ایجاد کنید. مثلاً
wpreplicaبا یک رمز عبور قوی> CREATE USER 'wpreplica'@'%' IDENTIFIED BY 'strong-password'; - به پایگاه داده وردپرس بروید
> use wordpressdb; - اعطای امتیازات تکثیر کاربر در پایگاه داده
> GRANT REPLICATION SLAVE ON *.* TO 'wpreplica'@'%'; - بهروزرسانی امتیازات MySQL
> FLUSH PRIVILEGES; - مشاهده وضعیت تکثیر سرور پایگاه داده
> SHOW MASTER STATUS;خروجی:
+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 655 | wordpressdb | | +------------------+----------+--------------+------------------+ ۱ row in set (0.000 sec)
برای تنظیم صحیح تکثیر پایگاه داده MySQL روی سرورهای مجازی، به فایل و موقعیت آن توجه داشته باشید .
فعال کردن همگامسازی فایلهای وردپرس #
برای همگامسازی فایلهای وردپرس از سرور اصلی به سرورهای فرزند، با استفاده از کلیدهای SSH یک اتصال SSH امن به هر یک از سرورها ایجاد کنید. در صورت فعال بودن، از یک پروتکل انتقال فایل مانند Rsync برای انتقال تغییرات دایرکتوری هر ۲۰ ثانیه به دایرکتوری ریشه وب وردپرس مقصد، همانطور که در زیر توضیح داده شده است، استفاده کنید.
- یک کلید SSH جدید ایجاد کنید
$ ssh-keygenوقتی از شما خواسته شد، Enterبرای پذیرش همه گزینههای پیشفرض، را فشار دهید و
passphraseبرای غیرفعال کردن احراز هویت با رمز عبور، فیلد را خالی نگه دارید. - کلید عمومی SSH را در سرور وردپرس فرزند خود ثبت کنید
$ ssh-copy-id 192.0.2.100وقتی از شما خواسته شد، اثر انگشت سرور راه دور را بپذیرید، سپس رمز عبور سرور را وارد کنید تا کلید SSH شما روی سرور فرزند فعال شود. در صورت موفقیت، خروجی شما باید مانند تصویر زیر باشد:
برای اطمینان از اتصال از سرور اصلی، فرآیند فوق را برای هر سرور وردپرس فرزند تکرار کنید.
- برای آزمایش کلید SSH خود، یک اتصال SSH به سرور وردپرس برقرار کنید.
$ ssh sysadmin@192.0.2.100تأیید کنید که اتصال SSH بدون احراز هویت با رمز عبور شروع میشود.
- ایجاد دایرکتوری webroot وردپرس
$ sudo mkdir -p /var/www/example.com - به وب سرور امتیازات کامل برای دسترسی به دایرکتوری را اعطا کنید.
$ sudo chown -R www-data:www-data /var/www/example.com/ - گروه اصلی کاربر غیر ریشه را به گروه وب سرور تغییر دهید
www-data. آن راsysadminبا حساب کاربری واقعی خود جایگزین کنید.$ sudo usermod -g www-data sysadmin www-dataبه گروه، امتیازات کامل برای دسترسی به دایرکتوری webroot وردپرس را اعطا کنید .$ sudo chmod -R 775 /var/www/example.com/- فهرست طولانی دایرکتوری والد برای مشاهده مجوزهای کاربر و گروه
$ ls -l /var/www/خروجی:
total 8 drwxrwxr-x 6 www-data www-data 4096 Sep 27 00:45 example.comتأیید کنید که گروه مجوزهای
write،read، و راexecuteدر دایرکتوری دارد. - یک دایرکتوری جدید Nginx SSL برای ذخیره گواهینامههای SSL ایجاد کنید
$ sudo mkdir -p /etc/nginx/ssl - به وب سرور امتیازات کامل برای دسترسی به دایرکتوری را اعطا کنید.
$ sudo chown -R www-data:www-data /etc/nginx/ssl www-dataبه گروه امتیازات کامل برای دسترسی به دایرکتوری اعطا کنید$ sudo chmod 775 /etc/nginx/ssl- اتصال SSH را ببندید
$ exit - با استفاده از Rsync، فایلها را از سرور اصلی وردپرس به سرور فرزند وردپرس منتقل کنید
$ rsync -avz /var/www/example.com/ 192.0.2.100:/var/www/example.com/در صورت موفقیت، خلاصه انتقال شما باید مانند تصویر زیر باشد:
sent 81,149 bytes received 376 bytes 10,870.00 bytes/sec total size is 69,002,299 speedup is 846.39 - برای خودکارسازی فرآیند Rsync که هر ۲۰ ثانیه اجرا شود و فایلهای وردپرس را بهروز نگه دارد، یک اسکریپت bash جدید در یک دایرکتوری سیستمی مانند زیر ایجاد کنید:
/opt/$ sudo nano /opt/wpsync.sh - محتویات زیر را به فایل اضافه کنید
#!/bin/bash while true; do rsync -avz /var/www/example.com/ 192.0.2.100:/var/www/example.com/ sleep 20 doneفایل را ذخیره کنید و ببندید.
پیکربندی بالا دستور Rsync را طوری تنظیم میکند که هر ۲۰ ثانیه با استفاده از یک حلقه while اجرا شود. این کار فایلهای وردپرس شما را در سرور فرزند هر بار که تغییرات جدیدی در دایرکتوری سرور اصلی ایجاد میشود، بهروزرسانی میکند.
- اعطای امتیازات اجرا به اسکریپت
$ sudo chmod +x /opt/wpsync.sh - یک سرویس سیستمی جدید برای خودکارسازی اسکریپت ایجاد کنید
$ sudo nano /etc/systemd/system/wpsync.service - محتویات زیر را به فایل اضافه کنید.
sysadminبا حساب کاربری واقعی خود که در سرور وردپرس فرزند موجود است، جایگزین کنید.[Unit] Description=WordPress Files From Main Server to Child Servers After=network.target [Service] Type=simple ExecStart=/opt/wpsync.sh Restart=always User=sysadmin Group=www-data [Install] WantedBy=multi-user.targetفایل را ذخیره و ببندید
پیکربندی فوق اسکریپت Rsync را به عنوان یک سرویس سیستمی اجرا میکند و فایلها را با استفاده از کاربر و گروه تنظیم شده منتقل میکند.
- دیمن systemd را مجدداً راهاندازی کنید
$ sudo systemctl daemon-reload - فعال کردن سرویس برای شروع در زمان بوت شدن
$ sudo systemctl enable wpsync.service - سرویس را شروع کنید
$ sudo systemctl start wpsync.service - وضعیت سرویس را مشاهده کنید و تأیید کنید که بدون هیچ خطایی به طور فعال در حال اجرا است
$ sudo systemctl status wpsync.serviceخروجی:
● myscript.service - WordPress Files Transfer Service Loaded: loaded (/etc/systemd/system/wpsync.service; enabled; preset: enabled) Active: active (running) since Tue 2023-09-26 20:34:09 UTC; 4h 30min ago Main PID: 54092 (wpsync.sh) Tasks: 2 (limit: 1092) Memory: 2.2M CPU: 3min 55.143s CGroup: /system.slice/wpsync.service ├─۵۴۰۹۲ /bin/bash /opt/WordPress-Sync/sync.sh └─۵۹۵۷۰ sleep 10 Sep 27 01:04:18 NEGARNOVIN-SERVER wpsync.sh[59566]: ./ Sep 27 01:04:20 NEGARNOVIN-SERVER wpsync.sh[59566]: sent 81,187 bytes received 376 bytes 14,829.64 bytes/sec Sep 27 01:04:20 NEGARNOVIN-SERVER wpsync.sh[59566]: total size is 69,832,356 speedup is 856.18
شما Rsync را برای همگامسازی فایلهای webroot وردپرس خود از سرور اصلی به سرورهای فرزند تنظیم کردهاید. فرآیند همگامسازی را برای هر سرور فرزند تکرار کنید و تأیید کنید که هر سرور دارای یک رکورد Rsync در اسکریپت خودکار برای انتقال فایلهای وردپرس است.
پیکربندی قوانین فایروال #
به طور پیشفرض، فایروال ساده (UFW) در سرورهای نگارنوین موجود است. قوانین فایروال را پیکربندی کنید تا دسترسی قابل اعتماد به تمام پورتهای لازم سرور، همانطور که در زیر توضیح داده شده است، فراهم شود.
- وضعیت فایروال را بررسی کنید
$ sudo ufw statusوقتی فعال باشد، جدول فایروال باید نمایش داده شود. وقتی غیرفعال باشد، پورت SSH را فعال کنید
۲۲و فایروال را فعال کنید.$ sudo ufw allow 22/tcp && sudo ufw allow enable - اجازه دسترسی به پورت MySQL
۳۳۰۶از سرورهای فرزند وردپرس مورد اعتماد$ sudo ufw allow from 192.0.2.100 to any port 3306 $ sudo ufw allow from 192.0.2.101 to any port 3306 $ sudo ufw allow from 192.0.2.102 to any port 3306 $ sudo ufw allow from 192.0.2.103 to any port 3306 - پورت HTTP را
۸۰از طریق فایروال مجاز کنید$ sudo ufw allow 80/tcp - پورت HTTPS را مجاز کنید
۴۴۳$ sudo ufw allow 443/tcp - برای ذخیره تغییرات، فایروال را مجدداً راهاندازی کنید
$ sudo ufw reload
تولید و همگامسازی گواهینامههای SSL وردپرس #
وردپرس برای مدیریت صحیح درخواستهای HTTPS به یک گواهی SSL معتبر نیاز دارد. گواهیهای SSL Let’s Encrypt را روی سرور اصلی ایجاد کنید و آنها را برای انتقال به سرورهای فرزند همگامسازی کنید تا از همان گواهی SSL استفاده کنند، همانطور که در زیر توضیح داده شده است.
- ابزار کلاینت رمزگذاری Certbot را نصب کنید
$ sudo snap install certbot --classic - یک گواهی SSL جدید ایجاد کنید.
example.comنام دامنه واقعی خود را جایگزین کنید.$ sudo certbot --nginx -d www.example.com -d example.com --agree-tos/etc/letsencrypt/live/در صورت درخواست، آدرس ایمیل خود را وارد کنید تا یک گواهی SSL جدید در فایل پیکربندی Nginx شما مستقر شود و در دایرکتوری ذخیره شود. - فهرست کردن فایلهای موجود در
/etc/letsencrypt/live/example.com/دایرکتوری$ sudo ls /etc/letsencrypt/live/example.com/خروجی:
cert.pem chain.pem fullchain.pem privkey.pem READMEتأیید کنید که فایلهای کلید خصوصی و کلید عمومی
.pemدر دایرکتوری موجود هستند. - مجوزهای خواندن را در
/etc/letsencrypt/archiveدایرکتوری مجاز کنید$ sudo chmod 755 -R etc/letsencrypt/archive/دایرکتوری به دایرکتوری
/etc/letsencrypt/liveارجاع میدهدarchive، برای جلوگیری از هرگونه خطای انتقال فایل، فایلها باید قابل خواندن باشند. - اسکریپت همگامسازی Rsync را ویرایش کنید
$ sudo nano /opt/wpsync.sh - دستورالعمل زیر را
while {قبل ازsleepدستورالعمل ، درون حلقه اضافه کنیدrsync -av --copy-links /etc/letsencrypt/live/example.com/ 192.0.2.100:/etc/nginx/ssl/فایل را ذخیره و ببندید
پیکربندی فوق تغییرات در گواهی SSL را بررسی میکند و
.pemفایلهای بهروز شده را به دایرکتوری SSL سرور وردپرس فرزند منتقل میکند.
سرورهای فرزند وردپرس را راهاندازی کنید #
برای فعال کردن سرورهای فرزند وردپرس برای استفاده از فایلهای همگامسازی شده، پایگاه داده MySQL را آماده کنید و سرور وب را طبق مراحل زیر پیکربندی کنید.
- به دایرکتوری webroot وردپرس بروید
$ cd /var/www/example.com - فهرست بلندی از فایلها تهیه کنید و مطمئن شوید که همه فایلهای وردپرس در دایرکتوری ریشه وب موجود هستند.
$ ls -lخروجی:
drwxr-xr-x 9 sysadmin www-data 4096 Aug 29 14:14 wp-admin -rw-r--r-- 1 sysadmin www-data 351 Feb 6 2020 wp-blog-header.php -rw-r--r-- 1 sysadmin www-data 2323 Jun 14 14:11 wp-comments-post.php -rw-r--r-- 1 sysadmin www-data 3300 Sep 26 12:22 wp-config.php -rw-r--r-- 1 sysadmin www-data 3013 Feb 23 2023 wp-config-sample.php drwxr-xr-x 5 sysadmin www-data 4096 Sep 26 15:03 wp-content -rw-r--r-- 1 sysadmin www-data 5638 May 30 18:48 wp-cron.php -rw-r--r-- 1 sysadmin www-data 830057 Sep 27 00:44 wpdb.sql drwxr-xr-x 27 sysadmin www-data 12288 Aug 29 14:14 wp-includes -rw-r--r-- 1 sysadmin www-data 2502 Nov 26 2022 wp-links-opml.phpتأیید کنید که فایل پشتیبان پایگاه داده MySQL شما
wpdb.sqlنیز در دایرکتوری موجود است - مشاهده
wp-config.phpفایل$ cat wp-config.phpنام کاربری و رمز عبور پایگاه داده وردپرس را یادداشت کنید:
/** Database username */ define( 'DB_USER', 'wpuser' ); /** Database password */ define( 'DB_PASSWORD', 'strong-password' ); - وارد کنسول پایگاه داده MySQL شوید
$ sudo mysql - پایگاه داده وردپرس را دوباره ایجاد کنید
> CREATE DATABASE wordpressdb; - کاربر پایگاه داده وردپرس را با همان رمز عبور ذکر شده در
wp-config.phpفایل ایجاد کنید. به عنوان مثالwpuser> CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'strong-password'; - به کاربر دسترسی کامل به پایگاه داده وردپرس بدهید
> GRANT ALL PRIVILEGES ON wordpressdb.* TO wpuser@localhost; - بهروزرسانی امتیازات MySQL
> FLUSH PRIVILEGES; - کنسول MySQL را ببندید
> EXIT - پایگاه داده MySQL خود را از
wpdb.sqlفایل به پایگاه داده وردپرس بازیابی کنید$ sudo mysql wordpressdb < wpdb.sql - پس از موفقیت، فایل پشتیبان MySQL را از فهرست فایلهای وردپرس خود حذف کنید.
$ sudo rm /var/www/example.com/wpdb.sql - به دایرکتوری فایلهای پیکربندی MySQL بروید
$ cd /etc/mysql/ my.cnfفایل پیکربندی اصلی را ویرایش کنید$ sudo nano my.cnf- تنظیمات زیر را به
[mysqld]بخش اضافه کنید[mysqld] server-id = 2 log_bin = /var/log/mysql/mysql-bin.log binlog-do-db = wordpressdb expire_logs_days = 5فایل را ذخیره و ببندید
پیکربندی فوق، شناسهی تکرار فرزند را
۲متفاوت از شناسهی سرور پایگاه دادهی اصلی تنظیم میکند۱. هر سرور پایگاه داده در فرآیند تکرار باید از یک مقدار شناسهی منحصر به فرد استفاده کند.wordpressdbاین پایگاه دادهی تکرار مقصد است و گزارشهای باینری هر۵روز منقضی میشوند. - ایجاد دایرکتوری لاگهای MySQL
$ sudo mkdir -p /var/log/mysql/ - به کاربر MySQL امتیازات کامل برای دسترسی به دایرکتوری اعطا کنید
$ sudo chown -R mysql:mysql /var/log/mysql - سرور پایگاه داده MySQL را مجدداً راه اندازی کنید
$ sudo systemctl restart mysqld - دسترسی به کنسول MySQL
$ sudo mysql - دستورات SQL زیر را اجرا کنید.
mysql-bin.00و را۷۶۶با جزئیات واقعی فایل و موقعیت مکانی که قبلاً در سرور اصلی پایگاه داده MySQL ایجاد کردهاید، جایگزین کنید.> CHANGE MASTER TO MASTER_HOST = '192.0.2.1', MASTER_USER = 'wpnew', MASTER_PASSWORD = 'strong-password', MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 76625;۱۹۲.۰.۲.۱با آدرس IP اصلی سرور وردپرس خود جایگزین کنید - شروع فرآیند تکثیر
> SLAVE SLAVE; - وضعیت تکثیر را تأیید کنید
> SHOW SLAVE STATUS\G;خروجی:
*************************** ۱. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.0.2.1 Master_User: wpreplica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 76950 Relay_Log_File: mysqld-relay-bin.000003 Relay_Log_Pos: 555 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yesتأیید کنید که
Slave_IO_Stateفیلد یکWaiting for master to send eventاعلان برمیگرداند. اگر وضعیت … استconnecting، فیلد را مشاهده کنیدLast_SQL_Error:و خطای نمایش داده شده را برطرف کنید تا تکثیر رکوردهای پایگاه داده از سرور اصلی وردپرس شروع شود. - به دایرکتوری فایلهای پیکربندی Nginx بروید
$ cd /etc/nginx/ - فهرست کردن فایلهای موجود در دایرکتوری SSL و تأیید وجود تمام گواهینامههای SSL وردپرس
$ ls -l ssl/خروجی:
cert.pem chain.pem fullchain.pem privkey.pem README - غیرفعال کردن فایل پیکربندی پیشفرض هاست Nginx
$ sudo rm sites-enabled/default - یک فایل پیکربندی میزبان Nginx جدید در
sites-availableدایرکتوری ایجاد کنید$ sudo nano sites-available/example.com - تنظیمات زیر را به فایل اضافه کنید.
example.comنام دامنه واقعی خود را جایگزین کنید.server { server_name example.com; root /var/www/example.com/; index index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; # Edit to your PHP version viewable with $ php -v } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } access_log /var/log/nginx/example.access.log; error_log /var/log/nginx/example.error.log; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ /\.ht { deny all; } listen 443 ssl; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; } server { if ($host = example.com) { return 301 https://$host$request_uri; } listen 80; server_name example.com; return 404; }فایل را ذخیره و ببندید
پیکربندی فوق به دایرکتوری webroot وردپرس اشاره میکند و اتصالات HTTPS را با استفاده از گواهینامههای SSL شما در این
/etc/nginx/ssl/دایرکتوری میپذیرد. - فعال کردن فایل پیکربندی وردپرس
$ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ - پیکربندی Nginx را برای خطاها آزمایش کنید
$ sudo nginx -t - برای ذخیره تغییرات، Nginx را مجدداً راهاندازی کنید
$ sudo systemctl restart nginx - وضعیت فایروال UFW را بررسی کنید
$ sudo ufw statusخروجی:
Status: active To Action From -- ------ ---- ۲۲/tcp ALLOW Anywhere ۲۲/tcp (v6) ALLOW Anywhere (v6) - پورت HTTP را
۸۰از طریق فایروال مجاز کنید$ sudo ufw allow 80/tcp - پورت HTTPS را
۴۴۳از طریق فایروال مجاز کنید$ sudo ufw allow 443/tcp - برای ذخیره قوانین جدید، فایروال را مجدداً راهاندازی کنید
$ sudo ufw reload
فرآیند فوق را روی تمام سرورهای وردپرس تکرار کنید تا آخرین فایلها و پایگاه داده MySQL از سرور اصلی همگامسازی شوند.
پیکربندی رکوردهای دامنه #
برای فعال کردن GeoDNS در سایت وردپرس خود، چندین رکورد دامنه A را پیکربندی کنید تا کاربران را در مکانهای مختلف به نزدیکترین سرور هدایت کنید. در این بخش، از ClouDNS برای پیکربندی رکوردهای دامنه خود همانطور که در مراحل زیر توضیح داده شده است، استفاده کنید.
- به حساب ClouDNS خود دسترسی پیدا کنید
- در بخش DNS Zones ، روی کلیک کنید تا رکوردهای نام دامنه وردپرس مورد نظر شما باز شود.

- روی DNS Records کلیک کنید
- در صفحه سوابق، به A بروید
- تأیید کنید که یک رکورد میزبان با برچسب مکان Default در لیست موجود است و به سرور اصلی وردپرس شما اشاره میکند.
- روی + Add new record در بخش A کلیک کنید

فعال سازی GeoDNS در وردپرس - در پنجرهی بازشو « Add New Record» ، روی منوی کشویی « Location » کلیک کنید و اولین مکان مورد نظر خود را انتخاب کنید. برای مثال
Europe - به فیلد Points to: بروید و آدرس IP سرور وردپرس را در مکان مورد نظر خود وارد کنید. به عنوان مثال
۱۹۲.۰.۲.۱۰۴برای سرور نگارنوین پاریس (فرانسه).
- برای اعمال رکورد دامنه A جدید خود، روی Saveکلیک کنید.
فرآیند فوق را برای هر رکورد دامنه A تکرار کنید و تأیید کنید که هر آدرس IP سرور نگارنوین به مکان هدف صحیح اشاره میکند.
تست #
برای تأیید اینکه پیکربندی GeoDNS وردپرس شما به خوبی کار میکند، تأیید کنید که تکثیر پایگاه داده MySQL کار میکند و دامنه شما بسته به موقعیت مکانی کاربر، همانطور که در زیر توضیح داده شده است، آدرس IP متفاوتی را برمیگرداند.
- برای آزمایش فرآیند تکثیر پایگاه داده، به کنسول MySQL در سرور اصلی وردپرس دسترسی پیدا کنید.
$ sudo mysql - به پایگاه داده وردپرس بروید
> use wordpressdb; - یک جدول جدید
testبا ستونهای زیر ایجاد کنید> CREATE TABLE test ( id INT AUTO_INCREMENT PRIMARY KEY, fname VARCHAR(50), lname VARCHAR(50) ); - کنسول MySQL را ببندید
> EXIT - به کنسول MySQL در هر یک از سرورهای فرزند پیکربندیشده وردپرس دسترسی پیدا کنید
$ sudo mysql - به پایگاه داده وردپرس بروید
> use wordpressdb; - نمایش جداول و تأیید
testوجود جدول جدید> show tables;خروجی:
+-----------------------+ | Tables_in_wordpressdb | +-----------------------+ | test | | wp_commentmeta | | wp_comments | | wp_links | | wp_options | | wp_postmeta | | wp_posts |در صورت موفقیت، سرور اصلی وردپرس تمام تغییرات پایگاه داده MySQL را به صورت بلادرنگ در پایگاه داده سرور فرزند تکرار میکند.
- در یک مرورگر وب مانند کروم، از سایت وردپرس خود بازدید کنید و تأیید کنید که به درستی بارگیری میشود.
https://example.com - VPN را روی دستگاه خود فعال کنید و دوباره به سایت وردپرس دسترسی پیدا کنید تا یک مکان جدید شبیهسازی شود. تأیید کنید که بدون هیچ خطایی به درستی نمایش داده میشود.
https://example.com - با استفاده از یک بررسیکننده انتشار DNS مانند WhatsMyDNS ، رکوردهای نام دامنه خود را جستجو کنید تا آدرس IP فعال در هر مکان را مشاهده کنید.

برای آزمایش بیشتر پیکربندی GeoDNS وردپرس خود، از یک ابزار تست سرعت سایت با مکانهای مختلف استفاده کنید تا تفاوتهای عملکرد بین سایت وردپرس خود را تشخیص دهید. نزدیکترین سرور به مکان کاربر، درخواست کاربر را مدیریت میکند که عملکرد سایت شما را بدون هیچ تغییری در عملکرد در تمام مناطق بهبود میبخشد.
عیبیابی #
خطای HTTP 500 #
هنگام استقرار رکوردهای پیکربندی Nginx در سرورهای فرزند وردپرس، وب سرور به دلیل پیکربندی نادرست در فایلهای شما، خطای بحرانی ۵۰۰ را نمایش میدهد . خطا را طبق مراحل زیر برطرف کنید.
- برای مشاهده منبع خطا، گزارش خطای میزبان وردپرس را مشاهده کنید.
$ sudo cat /var/log/nginx/example.error.logخروجی:
1", upstream: "fastcgi://unix:/var/run/php/php8.2-fpm.sock:", host: "example.com.com" ۲۰۲۳/۰۹/۲۶ ۱۹:۱۴:۲۷ [error] 55491#55491: *41 FastCGI sent in stderr: "PHP message: PHP Warning: require(/var/www/example.com/wp-includes/version.php): Failed to open stream: Permission denied in /var/www/example.com/wp-settings.php on line 33; PHP message: PHP Fatal error: Uncaught Error: Failed opening required '/var/www/example.com/wp-includes/version.php' (include_path='.:/usr/share/php') in /var/www/example.com/wp-settings.php:33 Stack trace: #۰ /var/www/example.com/wp-config.php(96): require_once() #۱ /var/www/example.com/wp-load.php(50): require_once('...') #۲ /var/www/example.com/wp-blog-header.php(13): require_once('...') #۳ /var/www/example.com/index.php(17): require('...') - بسته به منبع خطای نمایش داده شده در گزارش، مراحل رفع آن را اعمال کنید. به عنوان مثال، برای رفع خطای مجوز نمایش داده شده در خروجی بالا، فایلهای موجود در دایرکتوری webroot وردپرس را حذف کنید تا فایلهای جدید با مجوزهای صحیح از سرور اصلی وردپرس پس از ۲۰ ثانیه همگامسازی شوند.
$ sudo rm -r /var/www/example.com/* - بعد از ۲۰ ثانیه فایلهای موجود در دایرکتوری را فهرست کنید و تأیید کنید که همه فایلهای وردپرس با
www-dataمجوزهای گروه صحیح در دسترس هستند.$ ls -l /var/www/example.com/ - برای اعمال تغییرات، Nginx را مجدداً راهاندازی کنید
$ sudo systemctl restart nginx - سایت وردپرس خود را در محل مورد نظر دوباره بررسی کنید و مطمئن شوید که خطا دوباره ظاهر نمیشود.
https://example.com
خطا: ریدایرکتهای زیادی وجود دارد #
- مشاهده نسخه PHP نصب شده
$ php -vخروجی:
PHP 8.2.7 (cli) (built: Jun 9 2023 19:37:27) (NTS) Copyright (c) The PHP Group Zend Engine v4.2.7, Copyright (c) Zend Technologies - تأیید کنید که نسخه PHP-FPM نصب شده فعال و در حال اجرا است
$ sudo systemctl status php8.2-fpm - فایل پیکربندی میزبان وردپرس خود را مشاهده کنید
$ cat /etc/nginx/sites-enabled/example.com - تأیید کنید که
fastcgi_passدستورالعمل به نسخه صحیح PHP-FPM اشاره میکندfastcgi_pass unix:/var/run/php/php8.2-fpm.sock;اگر نسخه PHP-FPM ارجاع شده اشتباه است، فایل را ویرایش کنید
$ sudo nano /etc/nginx/sites-enabled/example.comfactcgi_passدستورالعمل را به نسخه صحیح تغییر دهید - برای اعمال تغییرات پیکربندی، Nginx را مجدداً راهاندازی کنید
$ sudo systemctl restart nginx
پایگاه داده فرزند وردپرس تغییرات پایگاه داده را تشخیص نمیدهد #
- دسترسی به کنسول پایگاه داده MySQL فرزند
$ sudo mysql - وضعیت تکثیر پایگاه داده Child را مشاهده کنید و خطای برگشتی را در
Last_SQL_Error:ستون مشاهده کنید> SHOW SLAVE STATUS\G;خروجی:
Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 1146 Last_SQL_Error: Error executing row event: 'Table 'wordpressdb.wp_options' doesn't exist' Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_SSL_Crl: Master_SSL_Crlpath: Using_Gtid: No Gtid_IO_Pos: Replicate_Do_Domain_Ids: Replicate_Ignore_Domain_Ids:برای مثال:
Error executing row event: 'Table 'wordpressdb.wp_options' doesn't exist'تأیید کنید که پایگاه داده وردپرس را به سرور فرزند وارد کردهاید. در غیر این صورت، به دایرکتوری webroot وردپرس بروید.$ cd /var/www/example.com/تأیید کنید که
.sqlفایل پشتیبان پایگاه داده در دسترس است$ ls *.sqlپایگاه داده وردپرس را به پایگاه داده MySQL فرزند خود وارد کنید
$ sudo mysql wordpressdb < wpdb.sqlLast_SQL_Error: Could not execute Write_rows_v1 event on table wordpressdb.پایگاه داده MySQL قادر به نوشتن برخی تغییرات نیست که میتواند ناشی از خرابی دادهها باشد. خطا را حذف کنید و فرآیند تکثیر را با اجرای دستور SQL زیر مجدداً راهاندازی کنید.Last_IO_Error: error connecting to master 'wpreplica@192.0.2.1:3306' - retry-time: 60 maximum-retries: 100000۳۳۰۶تأیید کنید که آدرس سرور فرزند از طریق فایروال سرور اصلی وردپرس به پورت MySQL دسترسی دارد.$ sudo ufw allow from 192.0.2.100 to any port 3306تأیید کنید که رمز عبور کاربر را در پیکربندی پایگاه داده فرزند خود صحیح وارد کردهاید
wpreplica. فرآیند تکثیر پایگاه داده را در سرور فرزند متوقف کنید.> STOP SLAVEجزئیات پایگاه داده اصلی را با استفاده از دستور SQL زیر تنظیم کنید
CHANGE MASTER TO MASTER_HOST = '192.0.2.1', MASTER_USER = 'wpreplica', MASTER_PASSWORD = 'strong-password', MASTER_LOG_FILE = 'mysql-bin.000003', MASTER_LOG_POS = 76625;تأیید کنید که اطلاعات کاربر و رمز عبور پایگاه داده صحیح است.
۱۹۲.۰.۲.۱برای تکرار تغییرات پایگاه داده، آدرس سرور اصلی را جایگزین کنید.دوباره عملیات کپی کردن پایگاه داده وردپرس را شروع کنید
> START SLAVECould not execute Write_rows_v1 event error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000003, end_log_posدسترسی به پایگاه داده سرور اصلی وردپرس$ sudo mysqlوضعیت تکثیر پایگاه داده را مشاهده کنید و به فایل و موقعیت آن توجه کنید
> SHOW MASTER STATUS;خروجی:
+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 235367 | wordpressdb | | +------------------+----------+--------------+------------------+ ۱ row in set (0.000 sec)از کنسول MySQL خارج شوید
> EXITبه سرور پایگاه داده فرزند خود دسترسی پیدا کنید
$ sudo mysqlتوقف تکثیر پایگاه داده
> STOP SLAVEاطلاعات تکثیر را با فیلدهای صحیح
MASTER_LOG_FILEوMASTER_LOG_POSهمانطور که در سرور پایگاه داده اصلی نمایش داده میشود، تغییر دهید.CHANGE MASTER TO MASTER_HOST = '192.0.2.1', MASTER_USER = 'wpreplica', MASTER_PASSWORD = 'strong-password', MASTER_LOG_FILE = 'mysql-bin.000003', MASTER_LOG_POS = 235367;شروع فرآیند تکثیر پایگاه داده
> START SLAVEوضعیت تکثیر را مشاهده کنید و تأیید کنید که وضعیت به … تغییر میکند.
Waiting for master to send event> SHOW SLAVE STATUS\G;خروجی:
*************************** ۱. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.0.2.1 Master_User: wpreplica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003
نتیجهگیری #
شما با استفاده از چندین مکان نگارنوین، GeoDNS را برای کار با سایت وردپرس خود پیادهسازی کردهاید. این امر هنگام رسیدگی به درخواستهای کاربران از مناطق مختلف در سراسر جهان مهم است. به جای اینکه یک سرور واحد درخواستها را دریافت کند، چندین سرور افزونگی را فعال میکنند که باعث بهبود استفاده از منابع شما هنگام رسیدگی به درخواستهای کاربران وردپرس میشود.



