Nginx سریعترین و رایجترین وبسرور برای سرور مجازی است؛ هم سایت ایستا را مستقیم سرو میکند، هم جلوی PHP-FPM، Node.js، Python یا Docker بهعنوان Reverse Proxy قرار میگیرد. در این آموزش نصب Nginx روی Ubuntu ۲۴.۰۴، اتصال دامنه با Server Block، گرفتن گواهی SSL رایگان Let’s Encrypt با Certbot و تمدید خودکار آن را انجام میدهیم و چند تنظیم امنیتی پایه هم اضافه میکنیم.
فهرست مطالب
پیشنیازها
- یک سرور مجازی با Ubuntu ۲۴.۰۴ و دسترسی sudo. اگر سرور تازه است، ابتدا تنظیمات امنیتی اولیه VPS را انجام دهید.
- یک دامنه که رکورد A آن (و در صورت نیاز
www) به IP سرور اشاره کند. باdig +short example.irبررسی کنید. - پورتهای ۸۰ و ۴۴۳ که از اینترنت در دسترس باشند؛ Let’s Encrypt برای تأیید دامنه به پورت ۸۰ نیاز دارد.
در این آموزش بهجای example.ir دامنه خودتان را بنویسید.
نصب Nginx
sudo apt update
sudo apt install -y nginx
sudo systemctl enable --now nginx
systemctl status nginx --no-pager
nginx -v
حالا با مرورگر به http://IP-SERVER بروید؛ باید صفحه «Welcome to nginx» را ببینید. ساختار مهم فایلها:
/etc/nginx/nginx.conf: تنظیمات اصلی/etc/nginx/sites-available/: تعریف سایتها/etc/nginx/sites-enabled/: لینک سایتهای فعال/var/log/nginx/: لاگهای access و error
باز کردن پورتها در فایروال
اگر UFW فعال است، پروفایل Nginx را اجازه دهید و مطمئن شوید SSH هم باز است:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw status
مقایسه ابزارهای فایروال در UFW، iptables یا nftables.
ساخت Server Block برای دامنه
پوشه سایت و یک صفحه نمونه بسازید:
sudo mkdir -p /var/www/example.ir/html
echo '<h1>example.ir works</h1>' | sudo tee /var/www/example.ir/html/index.html
sudo chown -R www-data:www-data /var/www/example.ir
فایل /etc/nginx/sites-available/example.ir را بسازید:
server {
listen 80;
listen [::]:80;
server_name example.ir www.example.ir;
root /var/www/example.ir/html;
index index.html;
access_log /var/log/nginx/example.ir.access.log;
error_log /var/log/nginx/example.ir.error.log;
location / {
try_files $uri $uri/ =404;
}
}
سایت را فعال، تنظیمات را بررسی و Nginx را بارگذاری مجدد کنید:
sudo ln -s /etc/nginx/sites-available/example.ir /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
همیشه قبل از reload دستور nginx -t را اجرا کنید؛ اگر خطای نحوی باشد، Nginx با تنظیمات قبلی به کار ادامه میدهد و سایت قطع نمیشود. ریشه سطح دسترسی فایلها در دسترسی فایلها در لینوکس.
گرفتن SSL رایگان با Certbot
Certbot ابزار رسمی EFF برای گرفتن گواهی Let’s Encrypt است. نسخه پیشنهادی آن از طریق snap نصب میشود؛ نسخه apt اوبونتو هم کار میکند:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.ir -d www.example.ir
Certbot ایمیل شما را برای هشدارهای مهم میپرسد، شرایط را نشان میدهد، دامنه را از طریق پورت ۸۰ تأیید میکند و Server Block را خودکار برای HTTPS تنظیم میکند و ریدایرکت HTTP به HTTPS را اضافه میکند. پس از پایان، https://example.ir را باز کنید. درباره انواع گواهیها در SSL چیست.
اگر دامنه پشت CDN یا پروکسی است (مثلاً ابر نارنجی فعال)، روش HTTP-۰۱ ممکن است شکست بخورد؛ موقتاً پروکسی را خاموش کنید یا از روش DNS-۰۱ با افزونه DNS سرویسدهنده خود استفاده کنید.
تمدید خودکار گواهی
گواهیهای Let’s Encrypt عمر کوتاهی دارند و باید خودکار تمدید شوند. پکیج Certbot یک systemd timer میسازد:
systemctl list-timers | grep certbot
sudo certbot renew --dry-run
اگر --dry-run بدون خطا تمام شد، تمدید خودکار درست کار میکند. Certbot پس از تمدید، Nginx را بارگذاری مجدد میکند. برای اطلاع از شکست تمدید، تاریخ انقضای گواهی را در ابزار مانیتورینگ خود بررسی کنید؛ مثلاً در Uptime Kuma هشدار انقضای گواهی وجود دارد.
استفاده بهعنوان Reverse Proxy
اگر برنامه شما (مثلاً Node.js یا یک کانتینر) روی پورت ۳۰۰۰ گوش میدهد، بخش location / را اینطور تغییر دهید:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
برنامه را فقط روی 127.0.0.1 اجرا کنید تا مستقیماً از اینترنت در دسترس نباشد. مفاهیم در Reverse Proxy چیست. برای نصب وردپرس پشت Nginx با PHP-FPM، نصب وردپرس روی VPS را ببینید.
تنظیمات امنیتی و کارایی پایه
در بخش http فایل /etc/nginx/nginx.conf (یا یک فایل جدا در /etc/nginx/conf.d/):
server_tokens off; # نسخه Nginx در هدرها نمایش داده نشود
client_max_body_size 64m; # حداکثر حجم آپلود
gzip on;
gzip_types text/css application/javascript application/json image/svg+xml;
و در Server Block بخش HTTPS، هدرهای امنیتی پایه:
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
هدر HSTS (Strict-Transport-Security) را فقط وقتی اضافه کنید که مطمئن هستید همه زیردامنهها HTTPS دارند، چون مرورگرها آن را برای مدت طولانی به خاطر میسپارند. برای مقابله با حملات Brute Force روی مسیرهای ورود، Fail2ban را هم نصب کنید.
عیبیابی
- nginx -t خطا میدهد: شماره خط در پیام خطا را ببینید؛ معمولاً یک
;یا}جا افتاده است. - Certbot خطای Timeout یا Connection refused میدهد: پورت ۸۰ در فایروال یا رکورد A دامنه را بررسی کنید.
- ۵۰۲ Bad Gateway در حالت Proxy: برنامه پشت پروکسی اجرا نیست یا پورت اشتباه است؛ راهنمای رفع خطای ۵۰۲ و ۵۰۴.
- لاگها:
sudo tail -f /var/log/nginx/example.ir.error.log
سوالات متداول
Nginx بهتر است یا Apache؟
Nginx در اتصالهای همزمان زیاد و فایل ایستا مصرف حافظه کمتری دارد و بهعنوان Reverse Proxy استاندارد است. Apache با .htaccess برای هاست اشتراکی راحتتر است.
گواهی Let’s Encrypt برای سایت تجاری کافی است؟
بله. گواهی Let’s Encrypt از نوع DV است و همان رمزنگاری گواهیهای پولی را دارد. تفاوت گواهیهای OV و EV در احراز هویت سازمان است، نه امنیت ارتباط.
چند سایت روی یک Nginx میتوانم داشته باشم؟
هر تعداد که منابع سرور اجازه دهد؛ برای هر دامنه یک Server Block و یک گواهی جدا بسازید.
سرور مجازی آماده برای وبسرور
با سرور مجازی تراست هاست روی NVMe و دسترسی Root، Nginx و سایتهایتان را خودتان مدیریت کنید. اگر ترجیح میدهید راهاندازی و امنسازی را به متخصص بسپارید، پشتیبانی سرور در خدمت شماست.