پرش به مطلب اصلی

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 nameserver_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;
}

قدم بعدی​

سرور خود را بسازید​

یک سرور ابری آریانت با IPv4 و IPv6 عمومی بسازید و در چند دقیقه سایت خود را با HTTPS بالا بیاورید. در پنل آریانت از «سرور ابری / Cloud Computing ← سرور جدید» شروع کنید؛ هزینه ساعتی است.