Nginx و گواهی رایگان Let's Encrypt با certbot
Nginx سریعترین و رایجترین وب سرور و reverse proxy روی لینوکس است. در این آموزش Nginx را نصب میکنید، برای دامنهی خودتان یک server block میسازید و با certbot گواهی SSL رایگان Let's Encrypt میگیرید که هر چند هفته خودکار تمدید میشود.
پیشنیازها
- یک سرور ابری یا VPS با Ubuntu 24.04 (یا 22.04) و کاربر sudo (اولین اتصال SSH و امنسازی)
- یک دامنه، مثلاً
example.com، با رکورد A که به IPv4 سرور اشاره کند (و اگر IPv6 دارید، رکورد AAAA به IPv6 همان سرور). برایwwwهم رکورد بسازید. - پورتهای ۸۰ و ۴۴۳ در فایروال ابر و ufw باز باشند
در همهی دستورها example.com را با دامنهی خودتان عوض کنید.
۱. نصب Nginx
sudo apt update
sudo apt install -y nginx
sudo ufw allow 'Nginx Full'
curl -I http://SERVER_IP باید HTTP/1.1 200 OK و Server: nginx برگرداند.
۲. ساخت پوشهی سایت
sudo mkdir -p /var/www/example.com/html
echo '<h1>example.com works</h1>' | sudo tee /var/www/example.com/html/index.html
sudo chown -R www-data:www-data /var/www/example.com
۳. ساخت server block
sudo tee /etc/nginx/sites-available/example.com > /dev/null <<'EOF'
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
nginx -t باید syntax is ok و test is successful بنویسد.
۴. بررسی DNS
پیش از گرفتن گواهی، مطمئن شوید دامنه به همین سرور میرسد:
dig +short example.com A
dig +short example.com AAAA
curl -s http://example.com
اگر رکورد AAAA دارید ولی به سرور دیگری اشاره میکند (یا سرور IPv6 ندارد)، Let's Encrypt ممکن است از راه IPv6 تلاش کند و شکست بخورد. AAAA اشتباه را پاک کنید.
۵. گرفتن گواهی با certbot
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com \
--redirect --agree-tos -m you@example.com
certbot با روش HTTP-01 مالکیت دامنه را ثابت میکند، گواهی را در /etc/letsencrypt/live/example.com/ ذخیره میکند، server block را برای پورت ۴۴۳ تغییر میدهد و با --redirect همهی درخواستهای HTTP را به HTTPS میفرستد. ایمیل برای اطلاعرسانیهای مهم Let's Encrypt است.
۶. تمدید خودکار
گواهیهای Let's Encrypt ۹۰ روز اعتبار دارند. بستهی certbot یک systemd timer نصب میکند که روزی دو بار گواهیهای نزدیک به انقضا را تمدید میکند:
systemctl list-timers | grep certbot
sudo certbot renew --dry-run
اگر --dry-run بدون خطا تمام شود، تمدید خودکار کار میکند.
بررسی نهایی
curl -I http://example.com # 301 to https://example.com/
curl -I https://example.com # HTTP/1.1 200 OK
sudo certbot certificates # domains and expiry date
خطاهای رایج
| خطا | راهحل |
|---|---|
Timeout during connect (likely firewall problem) | پورت ۸۰ از اینترنت بسته است. فایروال ابر و sudo ufw status را بررسی کنید. |
DNS problem: NXDOMAIN یا IP اشتباه | رکورد A هنوز ثبت یا منتشر نشده است. چند دقیقه صبر کنید و با dig دوباره بررسی کنید. |
too many certificates already issued | به سقف Let's Encrypt برای صدور تکراری یک گواهی رسیدهاید (۵ گواهی برای همان مجموعه دامنه در ۷ روز). برای آزمایش از --staging استفاده کنید. |
nginx: [emerg] ... conflicting server name | server_name در دو فایل تکرار شده است. فایلهای /etc/nginx/sites-enabled/ را بررسی کنید. |
502 Bad Gateway پس از گذاشتن proxy | برنامهی پشت Nginx اجرا نیست یا روی پورت دیگری است: sudo ss -tlnp. |
Nginx به عنوان reverse proxy
اگر برنامهتان (مثلاً یک کانتینر Docker) روی 127.0.0.1:8080 گوش میدهد، location / را اینطور بنویسید و دوباره nginx -t و reload کنید:
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
قدم بعدی
- نصب WordPress روی VPS با LEMP
- لود بالانسر ابر آریانت جلوی دو وب سرور
- DNS معکوس IP سرور در راهنمای پنل ابر
سرور خود را بسازید
یک سرور ابری آریانت با IPv4 و IPv6 عمومی بسازید و در چند دقیقه سایت خود را با HTTPS بالا بیاورید. در پنل آریانت از «سرور ابری / Cloud Computing ← سرور جدید» شروع کنید؛ هزینه ساعتی است.