آموزش سرور

نصب Nginx و SSL رایگان Let's Encrypt روی اوبونتو

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۴ دقیقه

https://example.comNginxSSLLet'sآموزش سرورنصب Nginx و SSLرایگان Let's Encrypt رویاوبونتومجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

برای راه‌اندازی سایت با HTTPS روی سرور اوبونتو: Nginx را با apt نصب کنید، پورت‌های ۸۰ و ۴۴۳ را در فایروال باز کنید، رکورد A دامنه را به آی‌پی سرور بزنید، یک server block بسازید و با certbot --nginx گواهی رایگان Let's Encrypt بگیرید. Certbot تمدید خودکار را هم تنظیم می‌کند. برای اپلیکیشن‌های Node یا Python، Nginx را به‌عنوان reverse proxy جلوی آن قرار دهید.

پیش‌نیازها

  • سرور Ubuntu 24.04 (یا 22.04) با دسترسی sudo.
  • یک دامنه یا ساب‌دامنه که رکورد A آن به آی‌پی سرور اشاره کند. با dig +short example.com بررسی کنید.
  • پورت‌های ۸۰ و ۴۴۳ آزاد. صدور گواهی با روش HTTP-01 نیاز دارد سرورهای Let's Encrypt از اینترنت به پورت ۸۰ شما دسترسی داشته باشند.

گام ۱: نصب Nginx

sudo apt update
sudo apt install -y nginx
sudo systemctl enable --now nginx

اگر UFW فعال است:

sudo ufw allow 'Nginx Full'

حالا با باز کردن http://IP-سرور باید صفحهٔ پیش‌فرض Nginx را ببینید.

گام ۲: ساخت server block برای دامنه

sudo mkdir -p /var/www/example.com
echo '<h1>example.com works</h1>' | sudo tee /var/www/example.com/index.html

فایل /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.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

همیشه پیش از reload، nginx -t را اجرا کنید و فقط در صورت موفقیت reload کنید (&& همین کار را انجام می‌دهد).

گام ۳: گرفتن گواهی SSL با Certbot

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

Certbot ایمیل شما را برای اعلان‌های انقضا می‌پرسد، گواهی را می‌گیرد و server block را برای HTTPS و ریدایرکت از HTTP به HTTPS ویرایش می‌کند.

تست تمدید خودکار

گواهی‌های Let's Encrypt حدود ۹۰ روز اعتبار دارند و Certbot یک تایمر systemd برای تمدید خودکار نصب می‌کند:

systemctl list-timers | grep certbot
sudo certbot renew --dry-run
root@server: ~
$ sudo apt install -y certbot python3-certbot-nginx$ sudo certbot --nginx -d example.com -d www.example.comSuccessfully received certificate.$ sudo certbot renew --dry-run$ 
شکل ۱ صدور گواهی Let's Encrypt و تست تمدید خودکار.

گام ۴: Nginx به‌عنوان reverse proxy

اگر اپلیکیشن شما (Node.js، Python، داکر و …) روی پورتی مثل ۳۰۰۰ اجرا می‌شود، بخش 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;
    # برای WebSocket:
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

اپلیکیشن را فقط روی 127.0.0.1 گوش‌به‌زنگ نگه دارید تا مستقیم از اینترنت در دسترس نباشد.

443HTTP داخلیکاربرHTTPSNginxSSL و پورت ۴۴۳برنامه127.0.0.1:8000443HTTP داخلیکاربرHTTPSNginxSSL و پورت ۴۴۳برنامه127.0.0.1:8000
شکل ۲ Nginx اتصال امن را می‌گیرد و درخواست را به برنامهٔ داخلی می‌رساند؛ برنامه مستقیم در اینترنت باز نیست.

بهینه‌سازی‌های پایه

# داخل بلوک http در /etc/nginx/nginx.conf یا یک فایل در conf.d
gzip on;
gzip_types text/css application/javascript application/json image/svg+xml;
client_max_body_size 20m;
server_tokens off;

برای فایل‌های ثابت (تصویر، CSS، JS) هدر کش طولانی بگذارید:

location ~* \.(css|js|png|jpg|jpeg|webp|svg|woff2)$ {
    expires 30d;
    add_header Cache-Control "public";
}

رفع خطاهای رایج

خطا علت محتمل راه‌حل
Certbot: Timeout during connect پورت ۸۰ بسته یا رکورد A اشتباه فایروال و DNS را بررسی کنید
Certbot: unauthorized / 404 درخواست به سرور دیگری می‌رسد رکورد A و AAAA را بررسی کنید؛ AAAA اشتباه هم مشکل‌ساز است
nginx -t: duplicate default server دو بلوک default_server یکی را حذف کنید
502 Bad Gateway اپلیکیشن پشت proxy اجرا نیست وضعیت اپ و پورت را بررسی کنید
Too many redirects ریدایرکت دوطرفه (مثلاً پشت CDN) تنظیم SSL در CDN و سرور را هماهنگ کنید

سرور ایران و Let's Encrypt

روی سرورهای داخل ایران، دسترسی سرورهای Let's Encrypt به پورت ۸۰ شما و دسترسی Certbot به API آن از مسیر بین‌الملل انجام می‌شود. در زمان اختلال‌های بین‌المللی ممکن است صدور یا تمدید با خطا روبه‌رو شود؛ در این حالت بعداً دوباره تلاش کنید. اگر از CDN کلودیفای با دامنهٔ شخصی استفاده می‌کنید، گواهی لبه‌ها خودکار صادر و تمدید می‌شود (اتصال دامنه به CDN).

سؤالات متداول

SSL رایگان Let's Encrypt برای سایت فروشگاهی کافی است؟

از نظر رمزنگاری بله؛ همان سطح رمزنگاری گواهی‌های پولی را دارد. تفاوت گواهی‌های پولی در نوع اعتبارسنجی سازمان و خدمات جانبی است.

گواهی wildcard (*.example.com) می‌توانم بگیرم؟

بله، اما فقط با روش DNS-01 که نیاز به ساخت رکورد TXT دارد؛ روش --nginx برای wildcard کار نمی‌کند.

بعد از گرفتن گواهی، سایت هنوز «ناامن» نشان داده می‌شود؟

احتمالاً محتوای ترکیبی (Mixed Content) دارید؛ آدرس تصاویر و اسکریپت‌ها باید با https باشند.

Nginx بهتر است یا Apache؟

برای reverse proxy و فایل‌های ثابت، Nginx سبک‌تر و رایج‌تر است. Apache هم انتخاب معتبری است، به‌خصوص اگر به .htaccess نیاز دارید.

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.