مدت زمان زیادی بود که میخواستم مدیریت سرور و پروژه های شخصیم مثل وبلاگم رو به عهده بگیرم و وابسته به شخص یا نرم افزار خاصی نباشم. مدت زیادی بود که از دوستانم برای اینکار کمک میگرفتم و یا از سرویسهای مثل Runcloud استفاده میکردم تا اینکه به خاطر نیازی که داشتم تصمیم گرفتم شروع کنم به کار با سرور و همه چیز رو از اول راه اندازی کنم.
همانطور که میدونیم سرور اختصاصی هزینه های زیادی برای ما داره و همچنین برنامه ها و پروژه های بسیار بزرگ نیاز به سرورهای اختصاصی دارند پس از سرور مجازی یا VPS برای مدیریت پروژه های شخصی استفاده میکنیم که هم برای نیازهای ما جوابگو است و هم از لحاظ اقتصادی به صرفه تر است.
vps و vds هر دو سرور مجازی هستند با این تفاوت که در VPS چند سرور مجازی در یک زمان میتوانند از یک منبع استفاده کنند ولی در VDS هر سرور مجازی منابع اختصاصی خود را دارد و مشخصه که VDS کیفیت بالاتری دارد.
The difference between a VPS and VDS is simple. A VDS instance takes up the entire server whereas a VPS is a server configured to host multiple server instances. The VDS configuration essentially gives you the dedicated resources of a server, however, the virtualized layer sits on top of the server itself.
حالا که سرور مجازی خود را تهیه کردیم شروع به نصب و راه اندازی سیستم کنیم، همانطور که میدانیم تمام سرویس دهنده های VPS عملیات نصب نسخه های مختلف گنو/لینوکس را پشتیبانی میکنند، مثلا سرویسدهنده ای که من از آنها سرویس خریداری کردم در پروفایل کاربریم به صورت زیر این امکان را فراهم کرده اند.
حالا با استفاده از دستور زیر به راحتی از طریق ترمینال میتوانیم به سرور وصل شویم.
ssh username@ip
در صورتیکه دستور فوق را وارد کنیم باید پسورد یوزرنیم را وارد کنیم.
حالا که به سرور وصل شدیم این نکته را درنظر بگیریم که در بیشتر مواقع یوزرنیم سرور ما root است و با توجه به اینکه این یوزر دسترسیهای کاملی به تمام بخشها دارد باید مواظب باشیم که پسورد بسیار قویی داشته باشد و در جایی آن را به اشتراک نگذاریم و بهترین کار این است که یک یوزر دیگر داشته باشیم و دسترسی ریموت به یوزر root را غیرفعال کنیم و اگر احیانا در بخشی برای انجام کاری نیاز به دسترسی بیشتر داشتیم از sudo استفاده میکنیم همچنین برای ایجاد دایرکتوری پروژه ها و دسترسی فایلها منطقی تر و بهتر اینه که یک یوزر دیگه ایجاد کنیم و از آن یوزر برای انجام کارهای دیگر استفاده کنیم.
با استفاده از دستور زیر یک یوزر جدید ایجاد میکنیم.
adduser mekaeil
که با اجرای دستور فوق برای یوزر ایجاد شده رمز عبور اختصاص میدهیم. (بعد از اجرای دستور زیر رمز عبور از شما درخواست میشود)
Adding user `mekaeil' ... Adding new group `mekaeil' (1000) ... Adding new user `mekaeil' (1000) with group `mekaeil' ... Creating home directory `/home/mekaeil' ... Copying files from `/etc/skel' ... New password:
بعد از ایجاد یوزر جدید با استفاده از دستور زیر دسترسی sudo به یوزر ایجاد شده میدهیم.
usermod -aG sudo mekaeil
برای اینکه مطمئن شویم دسترسی درست اعمال شده است با استفاده از کامند su - mekaeil وارد یوزر ایجاد شده میشویم و یک دستور با استفاده از sudo اجرا میکنیم (sudo ls -la) که بعد از وارد کردن رمز عبور باید به درستی کار کند.
بعد از اینکار دسترسی ریموت به یوزر root را غیرفعال کنیم که برای اینکار باید یک فایل سیستمی را دستکاری کنیم. برای باز کردن فایل با استفاده از ادیتور vim و با دستور زیر فایل را باز میکنیم. (sudo را قبل از دستور باید وارد کنیم.)
sudo vim /etc/ ssh/ sshd_config
حالا که فایل را باز کردیم یک خطی که دستور زیر نوشته شده را از کامنت خارج میکنیم و مقدار yes را به no تغییر میدهیم. (با حذف # قبل از دستور)
#PermitRootLogin yes /// PermitRootLogin no
برای اعمال تغییرات باید سرویس ssh را ریستارت کنیم که با دستور زیر اینکار را انجام میدهیم.
sudo systemctl restart sshd OR sudo service sshd restart OR sudo systemctl reboot OR sudo reboot
اگر بخواهیم با استفاده از ssh به سرور وصل شویم باید دستور زیر را روی سرور اجرا کنیم که این پل ارتباطی برقرار شود یعنی سرویس openssh روی سرور نصب شود.
sudo apt install openssh-server
با استفاده از دستور زیر میتوانید مطمئن شوید که این سرویس به درستی فعال شده است.
sudo systemctl status ssh
که مقدار زیر را مشاهده میکنید. (با استفاده از q میتوانید خارج شوید.)
● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2020-06-01 12:34:00 CEST; 9h ago ...
ubuntu از فایروال UFW استفاده میکند اگر فایروالی روی سرور شما فعال است با استفاده از دستور زیر مطمئن میشویم که پورت ssh باز است.
sudo ufw allow ssh
حالا برای اینکه با ssh لاگین شویم و هر سری رمزعبور وارد نکنیم با استفاده از یوزری که در ابتدا ایجاد کردیم لاگین میشویم و در مسیر /home/mekaeil دستورهای زیر را اجرا میکنیم. (یک دایرکتوری به اسم .ssh میسازیم و پرمیشن 700 به آن میدهیم)
mkdir .ssh chmod 700 .ssh
حالا یک فایل به اسم authorized_keys ایجاد میکنیم و public key که روی سیستم خودمان داریم را داخل آن past میکنیم و به فایل authorized_keys پرمیشن 600 میدهیم.
chmod 600 authorized_keys
حالا اگر بخواهیم برای امنیت بیشتر میتوانیم اتصال به سرور با استفاده از رمز عبور را غیرفعال کنیم و این اتصال تنها از طریق ssh key فعال باشد. فایل /etc/ssh/ sshd_config را با sudo باز میکنیم و تغییرات زیر را اعمال میکنیم.
PasswordAuthentication no ChallengeResponseAuthentication no UsePAM no
سرورهای Ubuntu 20.04 می توانند از فایروال UFW استفاده کنند تا مطمئن شوند فقط اتصال به سرویس های خاص مجاز است. با استفاده از این برنامه می توانیم به راحتی فایروال را تنظیم کنیم.
با اجرای کامند ufw app list میتوانیم لیست اپلیکیشنها و سرویسهای مجاز را مشاهده کنیم.
Output Available applications: OpenSSH
همانطور که قبلا اشاره کردم با اجرای دستور ufw allow OpenSSH مطمئن میشویم که پورت ssh باز است.
در نهایت با اجرای کامند ufw enable فایروال سرور را فعال میکنیم. که با اجرای کامند ufw status میتوانیم وضعیت آن را مشاهده کنیم.
از آنجا که فایروال در حال حاضر همه اتصالات به غیر از SSH را مسدود کرده است، در صورت نصب و پیکربندی سرویس های اضافی، باید تنظیمات فایروال را تنظیم کنید تا بتوانید از آنها استفاده کنید.
همانطور که میدونیم برای اینکه وبسایتهای ما در دسترس باشند نیاز داریم که از وبسرورهایی همچون Apache و یا Nginx استفاده کنیم. هر کدام از این وبسرورها مزیتها و معایب خود را دارند و من ترجیح میدم که Nginx استفاده کنم.
برای نصب و راه اندازی آپاچی پیشنهاد میکنم یکی از مقالات زیر را بر اساس نیاز خود دنبال کنید:
نکته ای که حائز اهمیت است این است که ما بر روی یک سرور چندین وبسایت و اپلیکیشن داریم و وبسرور ما باید به هرکدام به صورت مجزا سرویس ارایه کند برای اینکار باید از Virtual Host آپاچی استفاده کنیم. قبلا در مقالههای ایجاد دامنه ی مجازی ( Virtual Host ) و آماده سازی مک برای یک برنامه نویس > ایجاد دامنه مجازی در این رابطه به طور مفصل صحبت کردم.
تفاوتی که ایجاد دامنه مجازی بر روی سرور با محیط لوکال ubuntu دارد این است که نیازی نیست داخل فایل hosts دامنه ها را تعریف کنید کافی است که دامنه را در پنل سرویس دهندههایی همچون cloudflare که استفاده میکنید تعریف کنید.
نکته مهم: با توجه به مقالات فوق وقتی وارد مسیر var/www شدید و خواستید دایرکتوری یا فایلی ایجاد کنید در صورتیکه با خطای Permission Denied مواجه شدید به این معناست که این اجازه به یوزر root داده شده است برای رفع این مشکل با اجرای دستور زیر مالیکت این بخش را تغییر میدهید. (با اضافه کردن -R به دستور اعلام میکنید که تمام sub directoryها هم باید تغییر کنند.)
sudo chown -R $USER:$USER /var/www/html
متغیر $USER به سرور اعلام میکنه که مالکیت را به کاربر فعلی که کامند را با آن اجرا میکنم تغییر بده. برای اینکه مطمئن شویم که مشکلی بابت اجرای فایلها پیش نخواهد آمد میتوانیم دسترسی این فایلها را به 755 یعنی دسترسی اجرایی تغییر بدم.
sudo chmod -R 755 /var/www
برای نصب nginx کامندهای زیر را اجرا میکنیم.
sudo apt update sudo apt install nginx
قبل از ادامه مراحل همانطور که قبلا در رابطه با firewall صحبت کردیم و باید مطمئن شویم که firewall به nginx اجازه اجرا را میدهد با اجرای دستور sudo ufw app list لیست اپلیکیشنهایی که فایروال شناسایی کرده است را مشاهده میکنیم.
Output Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH
همانطور که توسط خروجی نشان داده شده است، سه profile برای Nginx موجود است:
Nginx Full: این profile هم پورت 80 (ترافیک وب عادی و رمزگذاری نشده) و هم پورت 443 (ترافیک رمزگذاری شده TLS / SSL) را باز می کند.
Nginx HTTP: این نمایه فقط درگاه 80 (ترافیک وب عادی و رمزگذاری نشده) را باز می کند.
Nginx HTTPS: این نمایه فقط درگاه 443 (ترافیک رمزگذاری شده TLS / SSL) را باز می کند.
توصیه می شود محدودترین نمایه را فعال کنید در حال حاضر، ما فقط نیاز به ورود به پورت 80 داریم. پس با اجرای دستور زیر این امکان را در فایروال فعال میکنیم.
sudo ufw allow 'Nginx HTTP'
که برای مشاهده وضعیت با اجرای کامند sudo ufw status نتیجه زیر را مشاهده میکنیم:
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)
با اجرای دستور systemctl status nginx وضعت وبسرور را مشاهده میکنیم.
که در این صورت با باز کردن آدرس IP سرور خود در مرورگر (http://your_server_ip) میتوانید صفحه پیشفرض nginx را به صورت زیر مشاهده کنید.
برای مدیریت وبسرور Nginx کامندهای اجرایی زیر در دسترس هستند که هر کدام مشخص است چه کاری انجام میدهد. در این بین دو دستور آخر جزو مهمترین دستورات هستند که مشخص میکنند وقتی سرور ریستارت شد به صورت پیشفرص وبسرور اجرا و در دسترس باشد یا خیر.
// stop your web server sudo systemctl stop nginx // start the web server sudo systemctl start nginx // stop and then start the service again sudo systemctl restart nginx // If you are only making configuration changes, Nginx can often reload without dropping connections. sudo systemctl reload nginx // By default, Nginx is configured to start automatically when the server boots. If this is not what you want, you can disable this behavior sudo systemctl disable nginx // To re-enable the service to start up at boot sudo systemctl enable nginx
حالا که وبسرور راه اندازی شد در مسیر /var/www میتوانیم پروژه های خود را در دسترس قرار دهیم. که با اجرای دستور زیر دایرکتوری پروژه ما ایجاد میشود.
// using the -p flag to create any necessary parent directories sudo mkdir -p /var/www/your_domain/html
با اجرای دستور زیر سطح دسترسی پروژه را مشخص میکنیم.
sudo chown -R $USER:$USER /var/www/your_domain
برای اطمینان از صحیح بودن دسترسیهای پروژه شما و اجازه دادن به خواندن، نوشتن و اجرای فایلهای پروژه می توانید دستور زیر را اجرا کنید:
sudo chmod -R 755 /var/www/your_domain
حالا برای تنظیم دامنه در مسیر /etc/nginx/sites-available/your_domain به اسم پروژه یک فایل ایجاد میکنیم.
sudo nano /etc/nginx/sites-available/your_domain
و در فایل زیر کد زیر را قرار میدهیم که واضح و مشخصه که که root مسیر پروژه و server_name نام دامنه پروژه است.
server { listen 80; listen [::]:80; root /var/www/your_domain/html; index index.html index.php index.htm index.nginx-debian.html; server_name your_domain www.your_domain; location / { try_files $uri $uri/ =404; } }
پس از ذخیره فایل با اجرای دستور زیر یک Symblink به سایتهای در دسترس ایجاد میکنیم تا پروژه در دسترس قرار بگیرد.
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
پس از اینکار فایل کانفیگ nginx را باز میکنیم(/etc/nginx/nginx. conf) و خط زیر را از کامنت خارج میکنیم.
sudo nano /etc/nginx/nginx. conf http { ... server_names_hash_bucket_size 64; ... }
در نهایت برای اطمینان از اینکه فایلهای nginx ما syntax error ندارند دستور sudo nginx -t را اجرا میکنیم که بعد از آن، وبسرور را با دستور sudo systemctl restart nginx رستارت میکنیم تا دامنههای ما در دسترس قرار گیرند.
نکته۱: تمام رکوستهایی که به وبسرور ما ارسال میشود در مسیر /var/log/nginx/access. log قرار میگیرند مگر اینکه در فایل کانفیگ هر پروژه این مسیر را تغییر دهیم.
نکته۲: تمام خطاهای مربوط به وبسرور ما در مسیر پیشفرض /var/log/nginx/error. log ثبت میشوند.
نکته۳: در صورتیکه دامنه ای که روی سرور کانفیگ کردید برای آدرسهای مختلف با خطای ۴۰۴ روبرو شد باید روی فایل کانفیگ دامنه تغییرات زیر را اعمال کنید.
location / { try_files $uri $uri/ /index.php$is_args$args; }
و پس از آن sudo service nginx reload را اجرا کنید.
با اجرای دستورات زیر نسخه 7.4 php و برخی پیکجهای php را نصب میکنیم.
sudo apt update sudo apt install php-fpm sudo apt-get install php-cli php-curl php-mysql php-fpm php-gd php-xml php-mbstring php-zip php-soap php-dev -y
برای تکمیل مراحل نصب php روی nginx باید فایل /etc/
برای اینکه از نصب php در سرور خود مطمئن شویم کافی است که در مسیر وبسرور خود در مسیر یکی از دامنه ها یک فایل php ایجاد کنیم و دستور phpinfo را داخل آن قرار دهیم که با باز کردن آدرس مشخصات php نصب شده نمایش داده میشود.
در فایلی که مشخصات دامنه و server_name و ... را تعریف کردیم به صورت زیر بروزرسانی میکنیم.
server { listen 80; listen [::]:80; root /var/www/weprodev; index index.php index.html index.htm index.nginx-debian.html; server_name weprodev.com www.weprodev.com; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php-fpm.sock; } location ~ /\.ht { deny all; } }
فایل php.ini را باز کنید و مقدار cgi.fix_pathinfo را از کامنت خارج کنید و مقدار آن را برابر صفر قرار دهید. وقتی مقدارش برابر یک باشد به کاربر امکان اجرای اسکریپتهایی را میدهد که نباید اجرا شوند.
مطالعه این مقاله را Is the PHP option 'cgi.fix_pathinfo' really dangerous with Nginx + PHP-FPM? پیشنهاد میکنم.
بعد از آن فایل www.conf را در PHP FPM باز میکنیم و تغییرات زیر را انجام میدهیم. (فایل www.conf در مسیر /etc/php/7.4/fpm/pool.d قرار داشت)
پارامتر Listen باید برابر با مقدار listen = /run/php/php-fpm.sock باشد.
بعد از آن سرویس FPM را اجرا و سپس آن را برای Boot فعال میکنیم:
sudo service php7.4-fpm start sudo systemctl enable php7.4-fpm.service
برای نصب MySQL ابتدا دستور زیر را وارد میکنیم و سپس آن را تایید(Y) میکنیم تا آخرین ورژن MySQL نصب شود.
sudo apt install mysql-server
هنگامی که نصب به پایان رسید، توصیه می شود که یک اسکریپت امنیتی را با دستور زیر نصب کنید که این اسکریپت برخی از تنظیمات پیش فرض ناامن را از بین می برد و دسترسی به سیستم پایگاه داده شما را قفل می کند:
sudo mysql_secure_installation
بعد از اجرای دستور فوق برای هر سوال قبل از آن توضیحاتی ارایه میدهد مثلا در مورد VALIDATE PASSWORD PLUGIN پرسیده میشود که طبق توضیحات برنامه این امکان برای وادار کردن کاربر به استفاده از رمزهای عبور قوی و موردتایید سیستم برای ورود به MySQL است.
بعد از اتمام مراحل نصب با اجرای دستور sudo mysql وارد محیط mysql میشوید و میتوانید دستورات Mysql را اجرا کنید و با وارد کردن مقدار exit میتوانید از محیط mysql خارج شوید.
با اجرای دستورات زیر میتوانیم یک دیتابیس ایجاد و سپس لیست دیتابیسهای موجود را مشاهده کنیم.
CREATE DATABASE example_database; SHOW DATABASES;
بعد از ایحاد دیتابیس با دستور زیر کاربری ایجاد میکنیم و دسترسی به دیتابیس ایجاد شده را به کاربر میدهیم.
CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; GRANT ALL ON example_database.* TO 'example_user'@'%';
برای اینکه مطمئن شویم کاربر ایجاد شده به دیتابیس دسترسی دارد، ابتدا با دستور exit از محیط MySQL خارج میشویم و با دستور زیر وارد محیط MySQL میشویم و سپس با اجرای دستور مربوط به نمایش دیتابیسها مطمئن میشویم به دیتابیس موردنظر دسترسی داریم.
mysql -u example_user -p SHOW DATABASES;
برای نصب Adminer یک دایرکتوری ایجاد میکنیم و فایل آن را که در آدرس سایت اصلی Adminer است دانلود و در دایرکتوری آپلود میکنیم. برای اینکه استایل آن را به سبکهایی که در سایت آن اشاره کرده است تغییر دهیم یک فایل به اسم adminer.css ایجاد میکنیم و یکی از Demoها را دانلود و در آن قرار میدهیم. و بعد آماده استفاده است.
برای نصب composer مقاله How To Install and Use Composer on Ubuntu 20.04 را دنبال کنید. که با اجرای کد composer مشخص میشود که به درستی نصب شده است.
بعد از نصب کامپوزر به احتمال زیاد با خطای نصب پکیجهای php همچون mbstring و dom مواجه میشوید که با دستورات زیر میتوانید آنها را نصب کنید.
sudo apt-get update sudo apt install php-xml sudo apt-get install php7.4-mbstring
در لینوکس با توجه نوع توزیع لینوکسی که استفاده میکنید ابزارهای مختلفی وجود دارند که میتوانید برای مدیریت پکیجها استفاده کنید، استفاده از این ابزارها مزیت های زیادی دارد مثلا وقتی شما میخواهید پکیجی را نصب کنید و این پکیج dependencyهایی دارد این ابزارها ابتدا dependencyها را برای شما نصب و سپس پکیج موردنظر را برای ما نصب میکنند و در کل مدیریت و بروزرسانی پکیجها با این ابزارها بسیار بسیار راحتتر است.
برای مطالعه بیشتر مقاله Package Management Basics: apt, yum, dnf, pkg را مطالعه کنید.
وقتی میخواهید مثلا بکآپ دیتابیس را انتقال دهید در صورتیکه حجم آن زیاد باشد ۲ راهکار دارید، در راهکار اول فایل sql را روی مسیری از سرور قرار میدهید و با کامندلاین دیتابیس را ایمپورت کنید.
و راهکار دیگر این است که با استفاده از phpMyAdmin یا Adminer دیتابیس را ایمپورت کنید که در این حالت با مشکل زیاد بودن حجم دیتابیس مواجه میشوید که به صورت زیر میتوانیم این مشکل را حل کنیم.
ابتدا فایل php.ini را در مسیر /etc/php/7.4/fpm/php.ini باز کردم و موارد زیر را در آن جستجو و تغییر دادم و سپس PHP FPM را restart کردم :
sudo nano /etc/php/7.4/fpm/php.ini upload_max_filesize = 500M post_max_size = 500M sudo systemctl restart php7.4-fpm.service
بعد از آن در مسیری که برای subdomain مورد نظر که برای دسترسی به دیتابیس پروژه ام بود (یعنی دامنه مجازیی که ایجاد کرده بودم) آیتم زیر را اضافه کردم:
sudo nano /etc/nginx/sites-available/domain server { .... client_max_body_size 150M; .... } sudo systemctl restart nginx
در صورتیکه پروژه های مختلفی را دارید و بازدید و مصرف منابع آن زیاد نیست و مدیریت یک vps زمان زیادی ازتون میبره میتوانید از هاستهای اشتراکی (Shared Web hosts) استفاده کنید.
وقتی از این سرویسها استفاده کنید مدیریت پروژه ها و میل سرور و ... از طریق یک پنل مدیریتی بسیار راحت انجام میپذیرد که معمولا از لحاظ هزینه هم به صرفه است. همچنین اضافه کردن دامنه های جدید و فعالسازی Auto Deployment و .... نیز معمولا در این سرویسها فرآهم است. (برای مثال میتوانید از وبسایتهایی همچون hostinger.nl استفاده کنید)
نکته: وقتی یک فایل را بخواهیم روی سرور دانلود کنیم از دستور wget download_link استفاده میکنیم اگر از نوع tar.gz بود با استفاده از دستور tar xf file_name.tar.gz فایل را اکسترکت میکنیم.
1. Configuring Nginx and PHP 7 stack in Linux to increase or decrease file upload size limit
2. How to Setup FTP Server with VSFTPD on Ubuntu
3. How To Set Up an Iptables Firewall to Protect Traffic Between your Servers