استک LEMP (Linux, Nginx, MySQL/MariaDB, PHP) یکی از محبوبترین ترکیبهای نرمافزاری برای میزبانی وبسایتهای مدرن است. این استک به دلیل کارایی بالا، مصرف کم منابع و انعطافپذیری، انتخاب بسیاری از توسعهدهندگان و مدیران سیستم میباشد. در این آموزش، نصب و پیکربندی استک LEMP روی سرور ابری اوبونتو را به صورت گامبهگام بررسی میکنیم.
پیشنیازها
قبل از شروع نصب استک LEMP، به موارد زیر نیاز دارید:
- یک سرور ابری یا VPS با سیستمعامل اوبونتو 20.04 یا 22.04
- دسترسی root یا کاربر با مجوز sudo
- حداقل 1GB RAM (2GB یا بیشتر توصیه میشود)
- حداقل 10GB فضای دیسک
- یک نام دامنه (اختیاری، اما برای تنظیم SSL توصیه میشود)
- دانش پایهای از خط فرمان لینوکس
نصب و پیکربندی Nginx
Nginx یک وبسرور قدرتمند و کارآمد است که برای سرعت، پایداری و مصرف منابع کم شناخته شده است. برای نصب Nginx، مراحل زیر را دنبال کنید:
ابتدا سیستم را بهروزرسانی کنید:
sudo apt update
sudo apt upgrade -y
سپس Nginx را نصب کنید:
sudo apt install nginx -y
پس از نصب، وضعیت Nginx را بررسی کنید:
sudo systemctl status nginx
اگر Nginx به درستی نصب شده باشد، باید به صورت خودکار اجرا شود. برای مشاهده صفحه خوشآمدگویی Nginx، آدرس IP سرور خود را در مرورگر وارد کنید.
اگر فایروال UFW فعال است، باید اجازه دسترسی به پورت HTTP و HTTPS را بدهید:
sudo ufw allow 'Nginx Full'
تنظیمات پایه Nginx
تنظیمات اصلی Nginx در فایل /etc/nginx/nginx.conf قرار دارد. برای بهینهسازی اولیه، میتوانید برخی تغییرات را اعمال کنید:
sudo nano /etc/nginx/nginx.conf
در بخش http{} تنظیمات زیر را ویرایش یا اضافه کنید:
http {
# تنظیمات پایه
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
# گزینههای بافر
client_max_body_size 64m;
client_body_buffer_size 128k;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
# تنظیمات Gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# ادامه تنظیمات پیشفرض
...
}
پس از ذخیره تغییرات، پیکربندی را بررسی کرده و Nginx را راهاندازی مجدد کنید:
sudo nginx -t
sudo systemctl restart nginx
نصب و تنظیم MySQL/MariaDB
برای ذخیرهسازی دادهها، به یک پایگاه داده نیاز داریم. در این آموزش از MariaDB استفاده میکنیم که یک نسخه متنباز و پیشرفته از MySQL است:
sudo apt install mariadb-server -y
پس از نصب، اسکریپت امنیتی را اجرا کنید تا تنظیمات امنیتی پایه را انجام دهید:
sudo mysql_secure_installation
در طول این فرآیند، به سوالات زیر پاسخ دهید:
- رمز عبور فعلی root را وارد کنید (معمولاً خالی است، پس Enter بزنید)
- آیا میخواهید رمز عبور root را تغییر دهید؟ Y (بله)
- یک رمز عبور قوی تعیین کنید
- کاربران ناشناس را حذف کنید؟ Y (بله)
- ورود root از راه دور را غیرفعال کنید؟ Y (بله)
- پایگاه داده آزمایشی را حذف کنید؟ Y (بله)
- جدول امتیازات را مجدداً بارگذاری کنید؟ Y (بله)
برای آزمایش نصب MariaDB، وارد خط فرمان MySQL شوید:
sudo mysql
حالا میتوانید یک پایگاه داده و کاربر جدید ایجاد کنید:
CREATE DATABASE mywebsite;
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'secure_password';
GRANT ALL PRIVILEGES ON mywebsite.* TO 'myuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
جایگزین کردن 'secure_password' با رمز عبور قوی خود را فراموش نکنید!
نصب و پیکربندی PHP-FPM
PHP-FPM (FastCGI Process Manager) یک پیادهسازی جایگزین PHP FastCGI است که عملکرد بهتری نسبت به روشهای قدیمی دارد. برای نصب PHP-FPM و برخی افزونههای ضروری:
sudo apt install php8.1-fpm php8.1-mysql php8.1-common php8.1-mbstring php8.1-xml php8.1-curl php8.1-gd php8.1-zip php8.1-intl php8.1-bcmath -y
نسخه PHP نصب شده ممکن است متفاوت باشد (مثلاً 7.4 یا 8.2). دستور زیر را اجرا کنید تا نسخه نصب شده را ببینید:
php -v
در نتیجه، دستور نصب را با نسخه مناسب PHP تطبیق دهید.
برخی تنظیمات PHP را برای بهبود امنیت و عملکرد بهینهسازی کنیم:
sudo nano /etc/php/8.1/fpm/php.ini
تنظیمات زیر را پیدا کرده و تغییر دهید:
upload_max_filesize = 32M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 300
max_input_time = 300
display_errors = Off
expose_php = Off
PHP-FPM را مجدداً راهاندازی کنید:
sudo systemctl restart php8.1-fpm
تنظیم Nginx برای کار با PHP
حالا باید Nginx را پیکربندی کنیم تا درخواستهای PHP را به PHP-FPM ارسال کند:
sudo nano /etc/nginx/sites-available/default
محتویات فایل را با کد زیر جایگزین کنید:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~ /.ht {
deny all;
}
}
پیکربندی را بررسی کرده و Nginx را مجدداً راهاندازی کنید:
sudo nginx -t
sudo systemctl restart nginx
برای آزمایش PHP، یک فایل info.php در مسیر /var/www/html ایجاد کنید:
sudo nano /var/www/html/info.php
و کد زیر را در آن وارد کنید:
<?php
phpinfo();
?>
حالا با مراجعه به http://your_server_ip/info.php در مرورگر، باید اطلاعات PHP را مشاهده کنید.
به دلایل امنیتی، پس از بررسی، فایل info.php را حذف کنید:
sudo rm /var/www/html/info.php
نصب گواهی SSL با Let's Encrypt
برای ایمنسازی وبسایت خود با HTTPS، از Let's Encrypt استفاده میکنیم که گواهیهای SSL رایگان ارائه میدهد. ابتدا Certbot را نصب کنید:
sudo apt install certbot python3-certbot-nginx -y
سپس پیکربندی مناسب برای دامنه خود را ایجاد کنید:
sudo nano /etc/nginx/sites-available/example.com
با محتوای زیر:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~ /.ht {
deny all;
}
}
دامنه example.com را با دامنه واقعی خود جایگزین کنید. پوشه ریشه را ایجاد کنید:
sudo mkdir -p /var/www/example.com
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com
یک پیوند نمادین ایجاد کرده و Nginx را مجدداً راهاندازی کنید:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
اکنون Certbot را اجرا کنید تا گواهی SSL را دریافت و نصب کند:
sudo certbot --nginx -d example.com -d www.example.com
دستورالعملهای روی صفحه را دنبال کنید. Certbot به طور خودکار پیکربندی Nginx را بهروزرسانی میکند و HTTPS را فعال میکند.
تنظیم Virtual Hosts برای چندین سایت
اگر میخواهید چندین وبسایت را روی یک سرور میزبانی کنید، باید برای هر دامنه یک Virtual Host جداگانه تنظیم کنید. مراحل زیر را برای هر دامنه تکرار کنید:
- یک فایل پیکربندی ایجاد کنید:
sudo nano /etc/nginx/sites-available/site2.com
- پیکربندی مشابه بالا را با تغییر دامنه و مسیر ریشه اضافه کنید
- پوشه ریشه را ایجاد کنید:
sudo mkdir -p /var/www/site2.com
- مجوزها را تنظیم کنید:
sudo chown -R www-data:www-data /var/www/site2.com sudo chmod -R 755 /var/www/site2.com
- پیوند نمادین ایجاد کنید:
sudo ln -s /etc/nginx/sites-available/site2.com /etc/nginx/sites-enabled/
- Nginx را بررسی و راهاندازی مجدد کنید:
sudo nginx -t && sudo systemctl restart nginx
- گواهی SSL را برای سایت جدید نصب کنید
تنظیمات امنیتی
برخی تنظیمات امنیتی توصیه شده:
1. نصب و پیکربندی Fail2Ban
Fail2Ban از سرور شما در برابر تلاشهای ورود به سیستم محافظت میکند:
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
یک پیکربندی سفارشی ایجاد کنید:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
تنظیمات پایه را تغییر دهید:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
[sshd]
enabled = true
[nginx-http-auth]
enabled = true
Fail2Ban را راهاندازی مجدد کنید:
sudo systemctl restart fail2ban
2. تنظیم هدرهای امنیتی در Nginx
هدرهای امنیتی را به پیکربندی سایت خود اضافه کنید:
sudo nano /etc/nginx/sites-available/example.com
در بخش server{} هدرهای زیر را اضافه کنید:
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "strict-origin-when-cross-origin";
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
3. محدود کردن دسترسی به فایلهای حساس
اضافه کردن قوانین زیر به پیکربندی Nginx:
location ~ /.(?!well-known) {
deny all;
}
location ~* (?:.(?:bak|conf|dist|fla|in[ci]|log|psd|sh|sql|sw[op])|~)$ {
deny all;
}
بهینهسازی عملکرد
برای بهبود عملکرد سرور LEMP، چند اقدام موثر میتوان انجام داد:
1. فعالسازی کش FastCGI در Nginx
کش FastCGI میتواند عملکرد سایتهای PHP را بهبود بخشد. برای فعالسازی آن، در پیکربندی سایت خود:
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=MYAPP:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache MYAPP;
fastcgi_cache_valid 200 60m;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
}
2. افزایش محدودیت فایلهای باز برای Nginx
ایجاد فایل پیکربندی سیستمی:
sudo nano /etc/systemd/system/nginx.service.d/limits.conf
با محتوای زیر:
[Service]
LimitNOFILE=30000
بارگیری مجدد سیستم و راهاندازی مجدد Nginx:
sudo systemctl daemon-reload
sudo systemctl restart nginx
3. بهینهسازی تنظیمات MariaDB
فایل پیکربندی را ویرایش کنید:
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
تنظیمات زیر را در بخش [mysqld] اضافه یا ویرایش کنید:
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M
innodb_flush_method = O_DIRECT
query_cache_type = 1
query_cache_size = 32M
query_cache_limit = 1M
key_buffer_size = 32M
MariaDB را راهاندازی مجدد کنید:
sudo systemctl restart mariadb