NGINX برای توسعهدهندگان ASP.NET Core - قسمت سوم - پیکربندیهای ضروری
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۳/۲۹ ۰۸:۱۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
certbot برای این کار استفاده میکنیم.sudo apt update sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com
certbot از شما چند سؤال میپرسد:A موافقت خود را اعلام کنید.2 (Redirect) را انتخاب کنید. این کار شدیداً توصیه میشود.certbot به صورت خودکار فایل کانفیگ NGINX شما (my-aspnet-app.conf) را پیدا کرده، گواهینامه را دریافت میکند و تنظیمات لازم برای فعالسازی HTTPS را به آن اضافه میکند./etc/nginx/sites-available/my-aspnet-app.conf را باز کنید، میبینید که certbot تغییراتی در آن ایجاد کرده است:server برای گوش دادن روی پورت 443 ssl.ssl_certificate و ssl_certificate_key).server جدید که تمام ترافیک پورت 80 را به آدرس https:// ریدایرکت میکند.sudo certbot renew --dry-run
wwwroot قرار دارند. تحویل دادن این فایلها توسط NGINX بسیار بهینهتر و سریعتر از ارسال درخواست آنها به Kestrel است. با این کار، بار کاری از روی دوش اپلیکیشن شما برداشته میشود.sudo nano /etc/nginx/sites-available/my-aspnet-app.conf
server خود را به شکل زیر تغییر دهید:server {
listen 443 ssl; # یا 80 اگر هنوز HTTPS را فعال نکردهاید
server_name your-domain.com;
# ... تنظیمات ssl که توسط certbot اضافه شده ...
# مسیر اصلی فایلهای استاتیک شما
root /var/www/my-aspnet-app/wwwroot;
location / {
# ابتدا تلاش کن فایل استاتیک را پیدا کنی. اگر نبود، درخواست را به پراکسی بفرست
try_files $uri @proxy;
}
location @proxy {
proxy_pass http://localhost:5000;
# تمام خطوط proxy_set_header را به اینجا منتقل کنید
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;
}
}root /var/www/my-aspnet-app/wwwroot;: مسیر پیشفرض برای پیدا کردن فایلها را مشخص میکند.try_files $uri @proxy;: این دستور کلیدی به NGINX میگوید:$uri) را در مسیر root پیدا کنی./api/products)، درخواست را به location نامگذاری شده @proxy ارسال کن.location @proxy { ... }: این یک بلوک ویژه است که فقط توسط try_files فراخوانی میشود و تمام تنظیمات Reverse Proxy ما اکنون در آن قرار دارد.sudo nginx -t && sudo systemctl reload nginx
server مجزا (که به آنها Virtual Host هم گفته میشود) انجام میشود. NGINX با خواندن هدر Host درخواست، تشخیص میدهد که آن را به کدام بلوک server ارسال کند.my-second-app را روی همین سرور میزبانی کنیم./var/www/my-second-app قرار دهید.systemd جدید بسازید (مثلاً kestrel-my-second-app.service) که روی یک پورت متفاوت اجرا شود (مثلاً http://localhost:5001).sudo nano /etc/nginx/sites-available/my-second-app.confserver {
listen 80;
server_name my-second-app.com; # دامنه دوم
location / {
proxy_pass http://localhost:5001; # اشاره به پورت اپلیکیشن دوم
# سایر تنظیمات proxy_set_header ...
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;
}
}sudo ln -s /etc/nginx/sites-available/my-second-app.conf /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
sudo certbot --nginx -d my-second-app.com را برای دامنه دوم نیز اجرا کنید تا امن شود.your-domain.com را به اپلیکیشن اول (روی پورت 5000) و درخواستهای my-second-app.com را به اپلیکیشن دوم (روی پورت 5001) هدایت میکند.Certbot که در این مطلب به آن اشاره شد، طراحی شده تا این فرآیند تمدید را به صورت خودکار انجام دهد. اما گاهی ممکن است این فرآیند خودکار به دلایلی (مانند تغییرات در تنظیمات سرور، مشکلات شبکه یا فایروال) با شکست مواجه شود.sudo certbot certificates
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: dntips.ir
Serial Number: 4a1b2c3d...
Key Type: ECDSA
Domains: dntips.ir www.dntips.ir
Expiry Date: 2025-09-10 08:30:15+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/dntips.ir/fullchain.pem
Private Key Path: /etc/letsencrypt/live/dntips.ir/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Expiry Date توجه کنید. این بخش تاریخ دقیق انقضا و تعداد روزهای باقیمانده از اعتبار گواهی را به شما نشان میدهد.openssl بررسی کنید. این روش تاریخ شروع و پایان اعتبار را به شما نشان میدهد.fullchain.pem اجرا کنید:sudo openssl x509 -in /etc/letsencrypt/live/dntips.ir/fullchain.pem -noout -dates
sudo: برای دسترسی به فایلهایی که در پوشه محافظت شده letsencrypt قرار دارند.openssl x509: ابزاری برای کار با گواهینامههای استاندارد X.509.-in ...: مسیر فایل گواهینامه شما.-noout: از چاپ محتوای کدگذاری شده گواهی جلوگیری میکند.-dates: فقط تاریخ شروع (notBefore) و تاریخ انقضا (notAfter) را نمایش میدهد.notBefore=Jun 12 08:30:16 2025 GMT notAfter=Sep 10 08:30:15 2025 GMT
notAfter همان تاریخ انقضای گواهی شماست.dntips.ir) را وارد کرده و روی "Submit" کلیک کنید.systemd یا یک cron job برای اجرای خودکار فرآیند تمدید ایجاد میکند.sudo systemctl list-timers | grep certbot
certbot.timer را نشان دهد.sudo certbot renew --dry-run
sudo certbot renew
sudo systemctl reload nginx
listen [::]:443 ssl ipv6only=on http2; # managed by Certbot listen 443 ssl http2; # managed by Certbot ssl_certificate /etc/letsencrypt/live/dntips.ir/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/dntips.ir/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
/etc/letsencrypt/options-ssl-nginx.conf را باز کنیم که در آن تنظیمات اختصاصی پروتکل TLS درج شدهاند، قسمتی از آن به صورت زیر تنظیم شده:ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers off;
sudo systemctl reload nginx، وب سرور را وادار به خواندن این تنظیمات جدید کنید. البته ... علاوه بر این محدودیتها، سرعت پورت 443 یا همان پورت استاندارد TLS/SSL هم بهشدت پایین آورده شده و عملا هرچند سایت باز خواهد شد، اما بهقدری کند است که بهتر است تا رفع محدودیتها صبر کنید.