ساخت سرور دانلود شخصی با Nginx؛ محدودیت سرعت، لینک موقت و تاریخ انقضا
اگر فایلهایی دارید که نمیخواهید لینک مستقیم آنها برای همیشه در دسترس باشد، میتوانید روی یک سرور مجازی لینوکس دانلودسنتر شخصی بسازید که برای هر فایل لینک موقت و امضاشده تولید کند. این لینک بعد از زمان مشخصی منقضی میشود و در کنار آن میتوان سرعت دانلود، تعداد اتصال همزمان و دسترسی مستقیم به فایل را نیز محدود کرد.
در این آموزش با Nginx روی Ubuntu 24.04 LTS یک سرور دانلود راهاندازی میکنیم که فایلها را از مسیر خصوصی سرو میکند، برای هر لینک تاریخ انقضا دارد، لینک دستکاریشده را رد میکند و مثلاً سرعت هر دانلود را روی 2 مگابایت بر ثانیه محدود میکند. در پایان نیز یک اسکریپت میسازیم که با یک دستور برای هر فایل لینک یکساعته، یکروزه یا هر مدت دلخواه تولید کند.
📌 چیزی که در پایان خواهیم داشت:
🔹 سرور دانلود اختصاصی روی VPS لینوکس
🔹 لینک دانلود غیرقابل حدس و امضاشده
🔹 تاریخ انقضای قابل تنظیم برای هر لینک
🔹 خطای 403 برای لینک جعلی
🔹 خطای 410 برای لینک منقضیشده
🔹 محدودیت سرعت دانلود
🔹 محدود کردن اتصال موازی دانلودمنیجر
🔹 HTTPS برای رمزنگاری ارتباط
🔹 تولید خودکار لینک موقت با Shell Script
چرا لینک دانلود معمولی کافی نیست؟
در یک دانلودسنتر ساده معمولاً فایل در مسیری مانند زیر قرار میگیرد:
https://dl.example.com/files/software.zip
هر کسی که این URL را داشته باشد میتواند آن را ذخیره، برای دیگران ارسال یا حتی ماهها بعد دوباره استفاده کند. اگر فایل برای مشتری، محصول دیجیتال، فایل خصوصی، Backup یا دانلود محدود باشد، این رفتار مناسب نیست.
بهتر است لینک چیزی شبیه این باشد:
https://dl.example.com/download/software.zip?md5=SIGNED_TOKEN&expires=1790956800
در این حالت Nginx قبل از ارسال فایل دو چیز را بررسی میکند: امضای لینک معتبر باشد و زمان انقضای آن نگذشته باشد.
معماری سرور دانلود شخصی چگونه است؟
User | | HTTPS signed URL v Nginx | +-- Check signature +-- Check expiration +-- Limit concurrent requests +-- Limit download speed | v /srv/downloads/file.zip
در این معماری PHP یا دیتابیس برای خود دانلود ضروری نیست. Nginx میتواند اعتبار لینک را مستقیماً بررسی کند و فایل را با سربار بسیار پایین به کاربر تحویل دهد.
برای ساخت دانلودسنتر چه VPSای نیاز داریم؟
برخلاف نرمافزارهای سنگین، Nginx برای سرو فایل Static به CPU و RAM بسیار زیادی نیاز ندارد. در یک دانلودسنتر، معمولاً فضای ذخیرهسازی، سرعت Disk، پهنای باند و سقف ترافیک اهمیت بیشتری دارند.
| نوع استفاده | CPU | RAM | نکته مهمتر |
|---|---|---|---|
| شخصی و چند کاربر | 1 تا 2 vCPU | 1 تا 2GB | فضای فایلها |
| دانلودسنتر کوچک | 2 تا 4 vCPU | 2 تا 4GB | شبکه و Storage |
| فایلهای حجیم و کاربران زیاد | براساس بار | براساس بار | پورت شبکه، Traffic و IOPS |
اگر قرار است فایلهای چندگیگابایتی یا تعداد دانلود زیادی داشته باشید، قبل از خرید سرور حتماً حجم Storage، سقف Traffic و ظرفیت پورت شبکه پلن را بررسی کنید.
دانلودسنتر شخصی روی سرور مجازی ایران
اگر کاربران فایلهای شما عمدتاً داخل ایران هستند، میتوانید دانلودسنتر را روی سرور مجازی ایران راهاندازی کنید. برای این کاربرد مقدار فضای دیسک، سرعت شبکه و ترافیک پلن را متناسب با حجم فایلها و تعداد کاربران انتخاب کنید.
برای پروژههای سبک یک VPS کافی است؛ اگر حجم Storage یا تعداد دانلود بسیار بالا باشد، سرور اختصاصی نیز قابل بررسی است.
📌 تماس با پشتیبانی:
021-91302460
| ایرانیکاسرور
مرحله اول: نصب Nginx روی Ubuntu 24.04
ابتدا از طریق SSH وارد سرور شوید و Packageها را بهروزرسانی کنید:
sudo apt update sudo apt upgrade -y
سپس Nginx و OpenSSL را نصب کنید:
sudo apt install nginx openssl -y
وضعیت سرویس را بررسی کنید:
sudo systemctl status nginx
بررسی فعال بودن Secure Link Module
برای ساخت لینک تاریخدار از ماژول ngx_http_secure_link_module استفاده میکنیم. قبل از ادامه بررسی کنید Nginx نصبشده با این قابلیت Compile شده باشد:
nginx -V 2>&1 | grep -- --with-http_secure_link_module
اگر عبارت زیر را مشاهده کردید، ماژول در Build فعلی وجود دارد:
--with-http_secure_link_module
اگر خروجی خالی بود، باید از Build یا Packageای از Nginx استفاده کنید که Secure Link Module در آن فعال شده باشد.
مرحله دوم: ساخت مسیر فایلهای دانلود
برای اینکه فایلها با Document Root معمولی سایت مخلوط نشوند، یک مسیر مجزا میسازیم:
sudo mkdir -p /srv/downloads sudo chown -R www-data:www-data /srv/downloads sudo chmod -R 750 /srv/downloads
برای تست میتوانید یک فایل نمونه داخل این مسیر قرار دهید:
sudo cp /path/to/test.zip /srv/downloads/test.zip sudo chown www-data:www-data /srv/downloads/test.zip
⚠️ نکته امنیتی: برای سرور عملیاتی بهتر است آپلود فایل با User یا Group جداگانه انجام شود و به کاربران عادی دسترسی Write روی کل مسیر Download داده نشود.
مرحله سوم: ساخت Secret برای امضای لینکها
Nginx برای تشخیص لینک معتبر از یک Secret مشترک استفاده میکند. یک Secret تصادفی بسازید:
openssl rand -hex 32
خروجی چیزی شبیه این خواهد بود:
4af8342e5ac2f3c9e812e39d7b7f03d26e6f95911d2e1b9b7a65e3b6b4c19f10
این مقدار را ذخیره کنید. در ادامه باید دقیقاً همان Secret هم در Nginx و هم در اسکریپت تولید لینک استفاده شود.
Secret را داخل مقاله، Git Repository یا فایل عمومی قرار ندهید.
مرحله چهارم: محدود کردن اتصالهای همزمان
دستور limit_rate در Nginx سرعت را برای هر Request محدود میکند. در نتیجه Download Manager ممکن است با چند Request همزمان سرعت مجموع را افزایش دهد.
برای کاهش این امکان، در بخش http فایل اصلی Nginx یک Zone براساس Token لینک تعریف میکنیم.
فایل را باز کنید:
sudo nano /etc/nginx/nginx.conf
داخل بلوک http این خط را اضافه کنید:
limit_conn_zone $arg_md5 zone=download_token:10m;
در ادامه برای هر Token معتبر فقط یک اتصال همزمان اجازه خواهیم داد.
مرحله پنجم: تنظیم Nginx برای لینک تاریخدار و محدودیت سرعت
یک Virtual Host جدید بسازید:
sudo nano /etc/nginx/sites-available/download-server
کانفیگ زیر را قرار دهید و مقادیر Domain و Secret را تغییر دهید:
server {
listen 80;
server_name dl.example.com;
access_log /var/log/nginx/download_access.log;
error_log /var/log/nginx/download_error.log;
location /download/ {
alias /srv/downloads/;
autoindex off;
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri YOUR_SECRET_HERE";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
limit_conn download_token 1;
limit_rate_after 5m;
limit_rate 2m;
limit_except GET {
deny all;
}
types {}
default_type application/octet-stream;
add_header X-Content-Type-Options nosniff always;
}
}
این تنظیمات دقیقاً چه کاری انجام میدهند؟
secure_link
Token و زمان انقضا را از Query String دریافت میکند:
secure_link $arg_md5,$arg_expires;
secure_link_md5
Nginx امضای لینک را از ترکیب زمان انقضا، URI فایل و Secret میسازد:
"$secure_link_expires$uri YOUR_SECRET_HERE"
اگر فردی نام فایل، زمان انقضا یا Token را دستکاری کند، امضا دیگر تطبیق نخواهد داشت.
403 برای لینک نامعتبر
اگر Signature اشتباه باشد:
return 403;
410 برای لینک منقضیشده
اگر Signature درست باشد ولی زمان لینک تمام شده باشد:
return 410;
limit_rate_after
در مثال ما 5 مگابایت ابتدایی بدون محدودیت تعیینشده توسط limit_rate منتقل میشود و بعد محدودیت سرعت فعال خواهد شد:
limit_rate_after 5m;
limit_rate
سرعت هر Request را روی حدود 2 مگابایت بر ثانیه محدود میکند:
limit_rate 2m;
برای سرعتهای مختلف چه مقداری بگذاریم؟
| تنظیم Nginx | سرعت تقریبی دانلود | معادل تقریبی شبکه |
|---|---|---|
| 256k | 0.25 MB/s | حدود 2 Mbps |
| 512k | 0.5 MB/s | حدود 4 Mbps |
| 1m | 1 MB/s | حدود 8 Mbps |
| 2m | 2 MB/s | حدود 16 Mbps |
| 5m | 5 MB/s | حدود 40 Mbps |
این مقادیر تقریبی هستند و سربار پروتکل و شرایط شبکه میتواند سرعت مشاهدهشده توسط کاربر را کمی تغییر دهد.
مرحله ششم: فعال کردن کانفیگ دانلودسنتر
sudo ln -s /etc/nginx/sites-available/download-server /etc/nginx/sites-enabled/download-server
تنظیمات را تست کنید:
sudo nginx -t
اگر خروجی Syntax OK بود:
sudo systemctl reload nginx
مرحله هفتم: اتصال دامنه به سرور دانلود
در DNS دامنه یک رکورد A بسازید:
| Type | A |
| Name | dl |
| Value | IP سرور مجازی |
بعد از انتشار DNS، آدرس زیر باید به IP VPS اشاره کند:
dl.example.com
مرحله هشتم: فعال کردن HTTPS
لینک دانلود امضاشده اگر روی HTTP ارسال شود، ممکن است در مسیر شبکه دیده شود. برای دانلودسنتر خصوصی HTTPS ضروری است.
یکی از روشهای رسمی نصب Certbot روی Linux استفاده از Snap است:
sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
سپس Certificate را برای دامنه دانلود دریافت کنید:
sudo certbot --nginx -d dl.example.com
پس از پایان کار، آدرس دانلود باید با HTTPS باز شود.
مرحله نهم: ساخت لینک دانلود یکساعته
فرض کنید فایل test.zip داخل مسیر Download قرار دارد. URI فایل در Nginx این است:
/download/test.zip
برای ساخت لینک یکساعته:
FILE="/download/test.zip"
SECRET="YOUR_SECRET_HERE"
EXPIRES=$(($(date +%s) + 3600))
MD5=$(printf '%s' "${EXPIRES}${FILE} ${SECRET}"
| openssl md5 -binary
| openssl base64
| tr '+/' '-_'
| tr -d '=')
echo "https://dl.example.com${FILE}?md5=${MD5}&expires=${EXPIRES}"
خروجی لینکی شبیه نمونه زیر خواهد بود:
https://dl.example.com/download/test.zip?md5=abc123...&expires=1790956800
بعد از گذشت یک ساعت، Nginx لینک را منقضیشده تشخیص میدهد و فایل دیگر با همان URL دانلود نمیشود.
ساخت ابزار تولید لینک موقت با یک دستور
برای اینکه هر بار چند دستور اجرا نکنید، یک Script بسازید:
sudo nano /usr/local/bin/make-download-link
محتوا:
#!/usr/bin/env bash
set -euo pipefail
BASE_URL="https://dl.example.com"
SECRET="YOUR_SECRET_HERE"
FILENAME="${1:?Usage: make-download-link filename minutes}"
MINUTES="${2:-60}"
FILE="/download/${FILENAME}"
EXPIRES=$(($(date +%s) + MINUTES * 60))
SIGNATURE=$(printf '%s' "${EXPIRES}${FILE} ${SECRET}"
| openssl md5 -binary
| openssl base64
| tr '+/' '-_'
| tr -d '=')
echo "${BASE_URL}${FILE}?md5=${SIGNATURE}&expires=${EXPIRES}"
Permission فایل را محدود کنید، چون Secret داخل آن قرار دارد:
sudo chmod 700 /usr/local/bin/make-download-link sudo chown root:root /usr/local/bin/make-download-link
اکنون برای ساخت لینک 60 دقیقهای:
sudo make-download-link test.zip 60
لینک 24 ساعته:
sudo make-download-link test.zip 1440
لینک 7 روزه:
sudo make-download-link test.zip 10080
⚠️ درباره نام فایل: برای این نسخه ساده Script بهتر است نام فایلها را با حروف انگلیسی، عدد، خط تیره و آندرلاین انتخاب کنید. اگر نام فایل Space، حروف فارسی یا کاراکترهای ویژه دارد باید URL Encoding در Generator نیز در نظر گرفته شود.
چطور تاریخ انقضا را تست کنیم؟
یک لینک با اعتبار یک دقیقه بسازید:
sudo make-download-link test.zip 1
لینک باید در دقیقه اول کار کند. بعد از پایان زمان، پاسخ مورد انتظار:
410 Gone
اگر Token را دستی تغییر دهید، پاسخ باید:
403 Forbidden
تست لینک با curl
بدون دانلود کامل فایل میتوانید Header را بررسی کنید:
curl -I "SIGNED_URL"
برای اندازهگیری سرعت واقعی:
curl -o /dev/null "SIGNED_URL"
چرا دانلودمنیجر ممکن است محدودیت سرعت را دور بزند؟
دستور limit_rate در Nginx محدودیت را برای هر Request اعمال میکند. اگر Download Manager فایل را با چند Range Request همزمان دریافت کند، بدون محدودیت Connection ممکن است مجموع سرعت از عدد مورد نظر بیشتر شود.
به همین دلیل در کانفیگ مقاله از این دستور استفاده کردیم:
limit_conn download_token 1;
در این مدل هر Signed Token تنها یک Request همزمان خواهد داشت و Download Manager نمیتواند همان لینک را به تعداد زیادی اتصال موازی تقسیم کند.
اگر میخواهید امکان Resume و چند اتصال محدود را حفظ کنید، میتوانید این مقدار را مثلاً روی 2 یا 4 تنظیم کنید؛ در این صورت باید بدانید سرعت مجموع نیز میتواند متناسب با تعداد Requestها بیشتر شود.
چطور لینک دانلود را به IP کاربر قفل کنیم؟
اگر نمیخواهید کاربر بتواند لینک را برای شخص دیگری بفرستد، میتوان IP کاربر را نیز وارد Signature کرد.
در Nginx:
secure_link_md5 "$secure_link_expires$uri$remote_addr YOUR_SECRET_HERE";
در این حالت Generator نیز باید IP کاربر را هنگام ساخت Signature وارد کند.
⚠️ قفل IP همیشه مناسب نیست: کاربران موبایل، اینترنتهای NAT، برخی ISPها و کاربران VPN ممکن است در میانه دانلود IP متفاوتی دریافت کنند. در این حالت لینک معتبر آنها نیز از کار میافتد. اگر جلوی سرور CDN یا Reverse Proxy قرار دارد نیز باید Real Client IP را بهدرستی به Nginx معرفی کنید.
آیا میتوان لینک را فقط یک بار قابل استفاده کرد؟
تاریخ انقضا با «لینک یکبارمصرف» متفاوت است. Secure Link داخلی Nginx Stateless است؛ یعنی تا زمانی که Token معتبر و منقضینشده باشد میتوان دوباره همان URL را درخواست کرد.
اگر لینک واقعاً باید پس از اولین دانلود باطل شود، نیاز به State دارید؛ برای مثال Backend کوچک PHP، Laravel، Node.js یا Python به همراه Database یا Redis میتواند Token را پس از اولین استفاده مصرفشده علامتگذاری کند و سپس فایل را از طریق Nginx تحویل دهد.
برای بیشتر دانلودسنترهای شخصی، Signed URL با زمان کوتاه و محدودیت Connection سادهتر و سبکتر است.
لایه امنیتی اضافه: رمز عبور روی دانلودسنتر
اگر فایلها بسیار خصوصی هستند میتوانید علاوه بر Signed URL، HTTP Basic Authentication نیز اضافه کنید.
ابتدا htpasswd را نصب کنید:
sudo apt install apache2-utils -y sudo htpasswd -c /etc/nginx/.download_users ali
داخل Location:
auth_basic "Private Downloads"; auth_basic_user_file /etc/nginx/.download_users;
حالا کاربر هم باید URL معتبر داشته باشد و هم Username/Password صحیح وارد کند.
مشاهده لاگ دانلود کاربران
برای مشاهده درخواستها:
sudo tail -f /var/log/nginx/download_access.log
برای مشاهده خطاها:
sudo tail -f /var/log/nginx/download_error.log
این Logها برای شناسایی لینکهای نامعتبر، خطاهای Permission، فایل گمشده و رفتار غیرعادی کاربران مفید هستند.
از فایلهای دانلودسنتر بکاپ داشته باشید
دانلودسنتر را با Backup اشتباه نگیرید. اگر فایلها فقط روی همان VPS قرار داشته باشند، خرابی Storage یا حذف اشتباه میتواند فایل اصلی را از بین ببرد.
برای فایلهای مهم حداقل یک نسخه دیگر روی Storage، سرور یا Location مستقل نگهداری کنید. اگر فایلها قابل بازتولید نیستند، Backup خارج از همان سرور ضروری است.
بهینهسازی سرعت سرور دانلود
اگر تعداد دانلودها افزایش پیدا کرد، قبل از افزایش CPU بررسی کنید Bottleneck واقعی کجاست.
🔹 پهنای باند پورت سرور
🔹 سقف Traffic پلن
🔹 سرعت و IOPS دیسک
🔹 تعداد Download همزمان
🔹 حجم فایلها
🔹 فاصله جغرافیایی کاربران از دیتاسنتر
برای سرو Static File، در بسیاری از پروژهها Network و Storage زودتر از CPU به محدودیت میرسند.
نکات امنیتی مهم برای سرور دانلود شخصی
✅ Secret لینک را طولانی و تصادفی انتخاب کنید.
✅ Secret را داخل Git یا فایل عمومی ذخیره نکنید.
✅ Directory Listing را خاموش نگه دارید.
✅ HTTPS را فعال کنید.
✅ فقط GET و HEAD را برای مسیر دانلود نیاز دارید.
✅ Permission مسیر فایلها را محدود کنید.
✅ Nginx و Ubuntu را بهروز نگه دارید.
✅ Access Log را برای رفتار مشکوک بررسی کنید.
✅ برای فایلهای بسیار حساس، Authentication دوم نیز اضافه کنید.
رفع خطاهای رایج سرور دانلود
همیشه خطای 403 دریافت میکنم
معمولاً رشتهای که Generator Hash میکند دقیقاً با secure_link_md5 یکسان نیست. فاصله قبل از Secret، URI فایل و مقدار expires باید در هر دو طرف دقیقاً یکسان باشند.
لینک بلافاصله 410 میشود
زمان سرور را بررسی کنید:
timedatectl
Expiration بر اساس Unix Timestamp محاسبه میشود. ساعت اشتباه سرور میتواند باعث رفتار غیرمنتظره شود.
فایل وجود دارد اما 404 میگیرم
مسیر alias و نام فایل را بررسی کنید:
ls -lah /srv/downloads/
همچنین Nginx باید Permission خواندن فایل را داشته باشد.
سرعت بیشتر از limit_rate است
تعداد Requestهای همزمان را بررسی کنید. limit_rate برای هر Request اعمال میشود؛ به همین دلیل استفاده از limit_conn در کنار آن اهمیت دارد.
Nginx خطای unknown directive secure_link میدهد
Build نصبشده فاقد Secure Link Module است. خروجی زیر را بررسی کنید:
nginx -V 2>&1 | grep secure_link
سؤالات متداول درباره ساخت سرور دانلود شخصی
برای ساخت سرور دانلود شخصی به چه چیزی نیاز داریم؟
یک VPS لینوکس، فضای ذخیرهسازی متناسب با فایلها، Nginx و در صورت استفاده عمومی یک دامنه و Certificate SSL کافی است.
چطور لینک دانلود تاریخ انقضا داشته باشد؟
با Secure Link Module در Nginx میتوان Timestamp انقضا را داخل لینک قرار داد و Signature را بر اساس URI، تاریخ و Secret بررسی کرد.
بعد از انقضای لینک چه اتفاقی میافتد؟
در تنظیمات این مقاله، لینک معتبر اما منقضیشده پاسخ HTTP 410 Gone دریافت میکند و دیگر فایل ارسال نمیشود.
چطور سرعت دانلود را محدود کنیم؟
دستور limit_rate در Nginx سرعت انتقال هر Request را محدود میکند. برای مثال limit_rate 2m سرعت را تقریباً روی 2 مگابایت بر ثانیه برای هر Request قرار میدهد.
آیا Download Manager میتواند محدودیت سرعت را دور بزند؟
اگر فقط limit_rate استفاده شود، چند Request همزمان میتوانند مجموع سرعت را افزایش دهند. با limit_conn میتوان تعداد Requestهای همزمان برای هر Token یا IP را محدود کرد.
آیا لینک را میتوان به IP کاربر محدود کرد؟
بله. میتوان IP را وارد محاسبه Signature کرد؛ اما تغییر IP کاربران موبایل، VPN و NAT ممکن است باعث قطع دسترسی کاربر مجاز شود.
آیا Secure Link همان لینک یکبارمصرف است؟
خیر. Secure Link بهصورت Stateless اعتبار و تاریخ انقضا را بررسی میکند. برای لینک واقعاً یکبارمصرف به Backend و ذخیره وضعیت Token در Database یا Redis نیاز دارید.
برای دانلودسنتر VPS ایران بهتر است یا خارج؟
انتخاب به محل کاربران وابسته است. اگر عمده کاربران داخل ایران هستند، قرار گرفتن فایلها در دیتاسنتر ایران میتواند مسیر شبکه مناسبتری ایجاد کند. برای کاربران بینالمللی باید محل سرور و کیفیت ارتباط آنها جداگانه بررسی شود.
برای راهاندازی دانلودسنتر یا کانفیگ Nginx کمک میخواهید؟
اگر در انتخاب VPS، نصب Nginx، SSL، ساخت لینک موقت، محدودیت سرعت یا تنظیم دامنه مشکل دارید، میتوانید درخواست بررسی و کانفیگ سرور را برای ایرانیکاسرور ارسال کنید.
📌 تماس با پشتیبانی:
021-91302460
| ایرانیکاسرور
جمعبندی
با ترکیب Nginx Secure Link، limit_rate و limit_conn میتوان بدون نصب پنلهای سنگین یک دانلودسنتر شخصی سریع و کنترلشده ساخت. هر فایل میتواند URL امضاشده داشته باشد، لینک پس از مدت مشخصی منقضی شود و سرعت دانلود نیز در سطح Nginx کنترل شود.
این معماری برای ارائه فایل به مشتری، دانلودهای خصوصی، فایلهای پروژه، نرمافزارهای اختصاصی و دانلودسنترهای کوچک بسیار کاربردی است. برای امنیت بیشتر نیز میتوان HTTPS، محدودیت IP یا Basic Authentication را به آن اضافه کرد.
اگر به لینک واقعاً یکبارمصرف، حساب کاربری، تعداد دانلود مجاز یا پنل مدیریت فایل نیاز دارید، مرحله بعدی ساخت یک Backend سبک است که Tokenها را در Database یا Redis مدیریت کند و Nginx فقط وظیفه تحویل سریع فایل را بر عهده داشته باشد.
دیدگاهها
0 دیدگاه برای این مطلب ثبت شده است.