برای راهاندازی سایت با 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
$ 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$
گام ۴: 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 گوشبهزنگ نگه دارید تا مستقیم از اینترنت در دسترس نباشد.
بهینهسازیهای پایه
# داخل بلوک 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 نیاز دارید.
از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی



