رز نشسته پشت میز آزمایش QUIC در آکادمی ویونیکس، کنار نمایشگر مفاهیم HTTP/3 و تجهیزات شبکه؛ صحنهٔ آموزشی ساخته‌شده.

WIUNIX ACADEMY

راه‌اندازی Nginx با HTTP/3 و بررسی واقعی QUIC

از نصب Nginx تا اثبات HTTP/3 واقعی، قدم‌به‌قدم.

متوسط35 دقیقه مطالعهبه‌روزرسانی
محیطت را انتخاب کن

آموزش متناسب با محیط تو

کجا اجرا می‌کنی؟

سیستم‌عامل و نسخه را انتخاب کن تا مراحل، دستورها و راه‌حل‌ها برای همان محیط نمایش داده شوند.

Ubuntu 26.04بررسی‌شده با مستندات رسمی ·

از اینجا شروع کن

در پایان چه چیزی خواهی داشت؟

در پایان یک سایت نمونه با گواهی معتبر داری که Nginx آن، هم HTTPS روی TCP و هم HTTP/3 روی UDP 443 ارائه می‌دهد. مسیر بررسی از بیرون شبکه، تمدید گواهی و برگشت به تنظیمات سالم هم مشخص است.

01دستگاه بیرون شبکهدامنهٔ معتبر · درخواست اجباری HTTP/3
02دو مسیر انتقالUDP 443 برای QUIC · TCP 443 برای HTTPS
03سرور اصلی Nginxمنبع امضاشده · گواهی TLS · صفحهٔ نمونه
سیستم‌عامل‌ها و نسخه‌های پوشش‌داده‌شده

مسیر ساخت از منبع برای Ubuntu 26.10، نسخه‌های LTS یعنی 26.04، 24.04 و 22.04 و Debian 13/12 با مستندات رسمی بررسی شده است. چون فرایند ساخت مشترک است، دستورها تکرار نشده‌اند. این وضعیت به معنی اجرای عملی روی همهٔ نسخه‌ها یا پشتیبانی بسته‌های nginx.org از Ubuntu 26.10 نیست. Fedora، ویندوز، macOS و کانتینر بدون systemd در محدودهٔ این آموزش نیستند.

قبل از شروع

  • ماشین مجازی تمیز با یکی از نسخه‌های Ubuntu یا Debian موجود در انتخابگر، دسترسی sudo، systemd، اینترنت و منابع کافی برای کامپایل.
  • دامنهٔ واقعی و دسترسی به DNS، فایروال میزبان و ارائه‌دهنده و NAT؛ پورت‌های TCP 80/443 و UDP 443 باید در اختیار این آزمایش باشند.
  • یک دستگاه در شبکه‌ای دیگر با curl دارای قابلیت HTTP/3، اتصال مدیریتی دوم و راه بازگشت در صورت خطا.
01

قدم بعدی

محیط و مسیر شبکه را مشخص کن

این بار معیار موفقیت فقط باز شدن صفحه نیست؛ باید ثابت کنیم HTTP/3 واقعاً تا سرور اصلی کار می‌کند. QUIC از UDP استفاده می‌کند، درحالی‌که HTTP/1.1 و HTTP/2 روی TCP هستند. شمارهٔ پورت می‌تواند برای هر دو 443 باشد، چون نوع انتقال متفاوت است. این آزمایش ادعای سریع‌تر شدن سایت ندارد.

روی ماشین مجازی تازه و مطابق انتخابگر کار کن. خروجی دستورها باید systemd را به‌عنوان پردازش شمارهٔ یک نشان بدهد. نصب جداگانهٔ این آموزش در /opt/nginx-quic قرار می‌گیرد؛ نباید سایت موجود را از پورتش بیرون کند. h3.example.com نمونه است و باید در تمام فایل‌ها و دستورها با دامنهٔ واقعی عوض شود.

رکورد A را به IPv4 همین سرور بده و دامنهٔ آزمایش را بدون proxy/CDN نگه دار؛ ممکن است CDN خودش HTTP/3 را پاسخ بدهد و وضعیت origin پنهان بماند. فایل نمونه فقط IPv4 را پوشش می‌دهد. برای انتشار AAAA باید listenerهای [::]:80 و [::]:443 ssl و [::]:443 quic، مسیریابی و فایروال IPv6 را هم جداگانه اضافه و بررسی کنی.

Bash

ترمینال سرور · دستورهای دارای sudo نیازمند دسترسی مدیریتی‌اند

cat /etc/os-release
uname -m
ps -p 1 -o comm=
sudo ss -lntup
از کجا بدانم درست انجام شد؟

نسخهٔ سیستم‌عامل درست است، systemd فعال است و پورت‌های TCP 80/443 و UDP 443 برای این آزمایش آزادند.

02

قدم بعدی

وابستگی‌ها و فایل انتشار را دریافت کن

در بررسی ۲۰ اکتبر ۲۰۲۶، نسخهٔ پایدار رسمی Nginx برابر 1.30.6 است و یادداشت انتشار آن اصلاح‌های امنیتی دارد. جدول بسته‌های nginx.org، نسخه‌های Ubuntu 22.04، 24.04 و 26.04 را آورده اما 26.10 را ندارد. استفاده از مخزنِ کدنیم نسخه‌ای دیگر، راه‌حل این فاصله نیست.

برای یکدست بودن مسیر، در همهٔ محیط‌های این آموزش از منبع رسمی می‌سازیم. کامپایلر، کتابخانه‌های PCRE2 و zlib، فایل‌های توسعهٔ OpenSSL و Certbot از توزیع نصب می‌شوند. بعداً apt خودِ باینری Nginx ساخته‌شده را ارتقا نمی‌دهد؛ پیگیری اصلاح‌های امنیتی و ساخت نسخهٔ بعدی بر عهدهٔ مدیر سرور است.

فعلاً فقط آرشیو، امضای جداگانه و کلید توسعه‌دهنده را بگیر. امضای این انتشار متعلق به Sergey Kandaurov است. اثر انگشت کامل کلید باید D6786CE303D9A9022998DC6CC8464D549AF75C0A باشد؛ آن را با منبع رسمی کلید توسعه‌دهنده هم تطبیق بده. کلید امضای مخزن بسته‌ها کاربرد دیگری دارد.

Bash

ترمینال سرور · دستورهای دارای sudo نیازمند دسترسی مدیریتی‌اند

sudo apt update
sudo apt install build-essential libpcre2-dev zlib1g-dev libssl-dev curl ca-certificates gnupg certbot
mkdir -p ~/academy-nginx-source
cd ~/academy-nginx-source
curl -fSLO https://nginx.org/download/nginx-1.30.6.tar.gz
curl -fSLO https://nginx.org/download/nginx-1.30.6.tar.gz.asc
curl -fsS https://nginx.org/keys/pluknet.key -o pluknet.key
gpg --show-keys --with-fingerprint pluknet.key
از کجا بدانم درست انجام شد؟

فایل‌ها کامل دریافت شده‌اند و اثر انگشت کلید دقیقاً با مرجع رسمی تطبیق دارد؛ در صورت اختلاف ادامه نده.

03

قدم بعدی

امضا را تأیید و ماژول HTTP/3 را کامپایل کن

بعد از تطبیق اثر انگشت، کلید را وارد کن. بررسی امضا باید برای همین آرشیو و امضا موفق شود. اتصال دستورها در پنل باعث می‌شود پس از امضای نامعتبر، استخراج و ساخت اجرا نشود. هشدار دربارهٔ تأیید نکردن شخصی مالک کلید با امضای نامعتبر فرق دارد؛ هویت کلید همچنان باید بررسی شده باشد.

این نصب جدا از بستهٔ Nginx سیستم قرار می‌گیرد و workerها با حساب www-data کار می‌کنند. پنل از دو کار کامپایل استفاده می‌کند؛ در ماشین کم‌حافظه، تعداد کارهای هم‌زمان را به یک کاهش بده.

در خروجی -V، نسخهٔ 1.30.6، گزینهٔ --with-http_v3_module و کتابخانهٔ TLS هنگام ساخت و اجرا را بررسی کن. QUIC به TLS 1.3 نیاز دارد. پیشنهاد upstream، OpenSSL 3.5.1 یا تازه‌تر است؛ نسخه‌های قدیمی‌ترِ قابل استفاده از لایهٔ سازگاری بدون early data استفاده می‌کنند. در این آموزش 0-RTT خاموش می‌ماند و وضعیت آزمایشی ماژول HTTP/3 هم باید در تصمیم استفادهٔ واقعی لحاظ شود.

Bash

ترمینال سرور · دستورهای دارای sudo نیازمند دسترسی مدیریتی‌اند

cd ~/academy-nginx-source
gpg --import pluknet.key
gpg --verify nginx-1.30.6.tar.gz.asc nginx-1.30.6.tar.gz &&
tar -xzf nginx-1.30.6.tar.gz &&
cd nginx-1.30.6 &&
./configure --prefix=/opt/nginx-quic --user=www-data --group=www-data --with-http_ssl_module --with-http_v2_module --with-http_v3_module &&
make -j2 &&
sudo make install
/opt/nginx-quic/sbin/nginx -V 2>&1
از کجا بدانم درست انجام شد؟

باینری همین مسیر، نسخهٔ 1.30.6 و گزینهٔ ماژول HTTP/3 را نشان می‌دهد. ساخت موفق بدون این ماژول کافی نیست.

فایل تنظیمات اولیه را باز کن

با دستور زیر ویرایشگر را باز کن. محتوای فایل در بخش بعد آمده است؛ آن را پس از جایگزینی دامنه و مسیرهای لازم ذخیره کن.

Bash

ترمینال سرور · ویرایشگر باز می‌شود

sudoedit /opt/nginx-quic/conf/nginx.conf
04

قدم بعدی

ابتدا سایت HTTP را آماده کن

محتوای زیر را با دامنهٔ واقعی ذخیره کن. فقط تنظیمات تولیدشدهٔ نصب آزمایشی تازه را جایگزین کن؛ اگر آن را قبلاً تغییر داده‌ای، ابتدا نسخهٔ پشتیبان نگه دار.

شروع با پورت 80 ترتیب کار را ساده می‌کند: ACME ابتدا دامنه را از طریق HTTP تأیید می‌کند و بعد فایل TLS را می‌نویسیم. پوشهٔ webroot فقط فایل نمونه و فایل‌های تأیید دامنه را نگه می‌دارد.

Nginx · /opt/nginx-quic/conf/nginx.conf

محتوای فایل · در ویرایشگر ذخیره کن

user www-data;
worker_processes auto;
pid /opt/nginx-quic/logs/nginx.pid;
error_log /opt/nginx-quic/logs/error.log warn;
events { worker_connections 1024; }
http {
    include mime.types;
    default_type application/octet-stream;
    server {
        listen 80;
        server_name h3.example.com;
        root /var/www/academy-quic;
        location / { try_files $uri $uri/ =404; }
    }
}
از کجا بدانم درست انجام شد؟

دامنهٔ واقعی و پوشهٔ مخصوص آزمایش در فایل قرار گرفته‌اند.

فایل سرویس را باز کن

با دستور زیر ویرایشگر را باز کن. محتوای فایل در بخش بعد آمده است؛ آن را پس از جایگزینی دامنه و مسیرهای لازم ذخیره کن.

Bash

ترمینال سرور · ویرایشگر باز می‌شود

sudoedit /etc/systemd/system/academy-nginx-quic.service
05

قدم بعدی

برای نصب تازه سرویس جدا بساز

محتوای زیر را در فایل سرویس ذخیره کن. سرویس فقط باینری همین نصب را صدا می‌زند، فایل PID جدا دارد و پیش از شروع یا بارگذاری، اعتبار تنظیمات را می‌سنجد.

پردازش master با root شروع می‌شود تا پورت پایین و کلید محافظت‌شدهٔ گواهی را بخواند؛ workerها با www-data اجرا می‌شوند. برای رفع خطا، کلید خصوصی را عمومی‌خوان نکن. این unit حداقلیِ آموزشی جای بررسی امن‌سازی محیط اصلی را نمی‌گیرد.

systemd · /etc/systemd/system/academy-nginx-quic.service

محتوای فایل · در ویرایشگر ذخیره کن

[Unit]
Description=WIUNIX Academy Nginx QUIC lab
After=network.target

[Service]
Type=forking
PIDFile=/opt/nginx-quic/logs/nginx.pid
ExecStartPre=/opt/nginx-quic/sbin/nginx -t
ExecStart=/opt/nginx-quic/sbin/nginx
ExecReload=/bin/sh -c '/opt/nginx-quic/sbin/nginx -t && /opt/nginx-quic/sbin/nginx -s reload'
ExecStop=/opt/nginx-quic/sbin/nginx -s quit
TimeoutStopSec=30

[Install]
WantedBy=multi-user.target
از کجا بدانم درست انجام شد؟

unit به باینری و فایل PID همین آزمایش اشاره دارد.

06

قدم بعدی

سایت HTTP و مسیر بیرونی را بررسی کن

صفحهٔ نمونه را با دستورهای زیر ایجاد و سرویس را پس از بررسی فایل اجرا کن. دسترسی SSH و سایت‌های دیگر باید حفظ شوند.

پیش از دسترسی بیرونی، فایروال میزبان، فایروال ارائه‌دهنده و NAT باید برای TCP 80، TCP 443 و UDP 443 هماهنگ باشند. پنل‌های بعد، بررسی UFW و قواعد موردنیاز را جدا نشان می‌دهند.

Bash

ترمینال سرور · دستورهای دارای sudo نیازمند دسترسی مدیریتی‌اند

sudo install -d -m 755 /var/www/academy-quic
printf '%s\n' 'WIUNIX Academy: QUIC lab' | sudo tee /var/www/academy-quic/index.html
sudo /opt/nginx-quic/sbin/nginx -t && sudo systemctl daemon-reload && sudo systemctl enable --now academy-nginx-quic
systemctl is-active academy-nginx-quic
از کجا بدانم درست انجام شد؟

سرویس active است، HTTP بیرونی پیام WIUNIX Academy: QUIC lab را برمی‌گرداند و سایت دیگری پورتش را از دست نداده است.

فایروال فعال را بررسی کن

این دستور برای میزبانی است که UFW از قبل فایروال آن را مدیریت می‌کند. وضعیت و قوانین فعلی را بخوان. اگر مدیر دیگری فعال است، همان را بررسی کن؛ مدیر فایروال را عوض نکن.

Bash

ترمینال سرور · بررسی وضعیت

sudo ufw status verbose

فقط مسیرهای لازم وب را مجاز کن

فقط اگر UFW از قبل فعال است و این دسترسی‌ها وجود ندارند، قواعد زیر را اضافه کن. UFW را بی‌بررسی فعال نکن. قواعد ارائه‌دهنده و NAT هم باید UDP را جداگانه پوشش بدهند.

Bash

ترمینال سرور · فقط برای UFW فعال

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 443/udp

HTTP را از بیرون شبکه بررسی کن

نام نمونه را با دامنهٔ واقعی عوض کن و دستور را روی دستگاهی در شبکهٔ دیگر اجرا کن. قبل از درخواست گواهی باید پیام نمونه برگردد؛ پاسخ محلی دسترسی ACME را ثابت نمی‌کند.

Bash

دستگاهی در شبکهٔ دیگر · دامنه را عوض کن

curl http://h3.example.com/
از کجا بدانم درست انجام شد؟

WIUNIX Academy: QUIC lab

07

قدم بعدی

گواهی معتبر را از مسیر webroot بگیر

نام واقعی را در هر دو گزینهٔ --cert-name و -d بگذار. Certbot فایل HTTP-01 را در webroot می‌نویسد تا از TCP 80 خوانده شود. درخواست‌های تعاملی مربوط به ایمیل، حساب و توافق‌نامهٔ مشترک را پس از مطالعه پاسخ بده.

فهرست گواهی‌ها در پنل زیر، مرجع نام و مسیر نهایی است. اگر نام از قبل وجود داشته باشد ممکن است پسوند بگیرد؛ در فایل TLS همان مسیر گزارش‌شده را استفاده کن. خطای صدور را با DNS، CAA و دسترسی بیرونی مسیر تأیید بررسی کن.

نسخه‌ای از تنظیمات HTTP سالم ذخیره می‌شود. کلید خصوصی گواهی باید در پوشهٔ محافظت‌شدهٔ مدیریت گواهی بماند و وارد تیکت یا مخزن عمومی نشود.

Bash

ترمینال سرور · دستورهای دارای sudo نیازمند دسترسی مدیریتی‌اند

sudo certbot certonly --webroot -w /var/www/academy-quic --cert-name h3.example.com -d h3.example.com
sudo certbot certificates
sudo cp -a /opt/nginx-quic/conf/nginx.conf /opt/nginx-quic/conf/nginx.conf.http-before
از کجا بدانم درست انجام شد؟

گواهی معتبر و منقضی‌نشده برای دامنه صادر شده و نسخهٔ تنظیمات HTTP سالم محفوظ است.

فایل تنظیمات TLS و QUIC را باز کن

با دستور زیر ویرایشگر را باز کن. محتوای فایل در بخش بعد آمده است؛ آن را پس از جایگزینی دامنه و مسیرهای لازم ذخیره کن.

Bash

ترمینال سرور · ویرایشگر باز می‌شود

sudoedit /opt/nginx-quic/conf/nginx.conf
08

قدم بعدی

TCP و QUIC را کنار هم فعال کن

فایل کامل زیر را جای تنظیمات آزمایش بگذار و همهٔ دامنه‌ها و مسیرهای گواهی را اصلاح کن. مسیر challenge همچنان روی HTTP قابل دسترس است؛ درخواست‌های دیگر به hostname ثابتِ HTTPS هدایت می‌شوند.

یک listener برای TLS روی TCP و دیگری برای QUIC روی UDP ساخته می‌شود. TCP می‌تواند TLS 1.2 داشته باشد، ولی QUIC با TLS 1.3 مذاکره می‌کند. reuseport برای همین آدرس و پورت UDP یک‌بار آمده است؛ اگر virtual host اضافه می‌کنی، گزینه‌های listener مشترک باید هماهنگ باشند.

هدر Alt-Svc فقط دسترس‌پذیری h3 را اعلام می‌کند؛ سالم بودن UDP را ثابت نمی‌کند. عمر ۳۰۰ثانیه‌ای آن برای شروع کوتاه نگه داشته شده است. لاگ، پروتکل واقعی درخواست را ثبت می‌کند. 0-RTT را تا بررسی مستقل رفتار درخواست‌های قابل بازپخش خاموش نگه دار.

Nginx · /opt/nginx-quic/conf/nginx.conf

محتوای فایل · در ویرایشگر ذخیره کن

user www-data;
worker_processes auto;
pid /opt/nginx-quic/logs/nginx.pid;
error_log /opt/nginx-quic/logs/error.log warn;
events { worker_connections 1024; }
http {
    include mime.types;
    default_type application/octet-stream;
    log_format transport '$remote_addr [$time_local] "$request" $status protocol=$server_protocol h3=$http3';
    access_log /opt/nginx-quic/logs/access.log transport;
    server {
        listen 80;
        server_name h3.example.com;
        root /var/www/academy-quic;
        location ^~ /.well-known/acme-challenge/ { try_files $uri =404; }
        location / { return 308 https://h3.example.com$request_uri; }
    }
    server {
        listen 443 ssl;
        listen 443 quic reuseport;
        http2 on;
        http3 on;
        server_name h3.example.com;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_certificate /etc/letsencrypt/live/h3.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/h3.example.com/privkey.pem;
        ssl_early_data off;
        add_header Alt-Svc 'h3=":443"; ma=300' always;
        root /var/www/academy-quic;
        location / { try_files $uri $uri/ =404; }
    }
}
از کجا بدانم درست انجام شد؟

دو listener، مسیر درست گواهی و تبلیغ کوتاه h3 در فایل هستند و دامنهٔ نمونه باقی نمانده است.

09

قدم بعدی

اعتبار فایل و هر دو پورت را ببین

بارگذاری فقط پس از موفقیت بررسی تنظیمات انجام می‌شود. دستورهای TCP و UDP در پنل جدا هستند، چون فهرست سوکت‌های TCP، سوکت QUIC را نشان نمی‌دهد. خطاهای سرویس و Nginx را از مسیر مناسب بررسی کن.

خطای خواندن گواهی، directive ناشناخته یا اشغال بودن آدرس باید حل شود. active بودن سرویس و وجود سوکت فقط بررسی محلی است؛ مرحلهٔ بعد باید مسیر بیرونی را هم ثابت کند.

Bash

ترمینال سرور · دستورهای دارای sudo نیازمند دسترسی مدیریتی‌اند

sudo /opt/nginx-quic/sbin/nginx -t && sudo systemctl reload academy-nginx-quic
systemctl is-active academy-nginx-quic
sudo ss -lntp 'sport = :443'
sudo ss -lnup 'sport = :443'
sudo tail -n 20 /opt/nginx-quic/logs/error.log
خروجی نمونه
nginx: configuration file /opt/nginx-quic/conf/nginx.conf test is successful
active
از کجا بدانم درست انجام شد؟

فایل معتبر است، سرویس active می‌ماند و Nginx موردنظر روی هر دو نوع پورت 443 گوش می‌دهد.

10

قدم بعدی

HTTP/3 را بدون برگشت پنهان به TCP ثابت کن

روی دستگاهی دیگر، فهرست قابلیت‌های curl را با دستور اول ببین؛ باید HTTP3 داشته باشد. اگر ندارد، طبق راهنمای رسمی از کلاینت دارای این قابلیت یا ستون پروتکل مرورگر سازگار استفاده کن.

ابتدا HTTPS معتبر روی TCP و سپس درخواست اجباری HTTP/3 را بررسی کن. درخواست دوم اجازهٔ برگشت پنهان به HTTP/2 یا HTTP/1.1 نمی‌دهد. بررسی اعتبار گواهی را غیرفعال نکن. خروجی زیر نمونه است و ادعای اجرای همهٔ نسخه‌ها نیست.

پاسخ CDN ممکن است فقط وضعیت لبهٔ شبکه را نشان بدهد. پنل‌های بعد، بررسی لاگ سرور اصلی و آزمون اختیاری اتصال مستقیم به origin را جدا می‌کنند.

Bash

دستگاهی در شبکهٔ دیگر · curl دارای HTTP/3 · دامنه را عوض کن

curl -V
curl --http1.1 -I https://h3.example.com/
curl --http3-only --fail --show-error --max-time 15 -w '\nHTTP version: %{http_version}\n' https://h3.example.com/
خروجی نمونه
WIUNIX Academy: QUIC lab
HTTP version: 3
از کجا بدانم درست انجام شد؟

درخواست اجباری موفق است، متن نمونه و HTTP version: 3 برمی‌گردند و در لاگ origin مقدار h3=h3 دیده می‌شود؛ HTTP/2 یا صرف وجود هدر کافی نیست.

پروتکل درخواست را در لاگ سرور اصلی ببین

دستور را در سرور اجرا کن و همان درخواست بیرونی را در لاگ پیدا کن. خروجی نمونه، مقدارهایی را نشان می‌دهد که باید برای درخواست HTTP/3 دیده شوند؛ تطبیق درخواست واقعی لازم است.

Bash

ترمینال سرور

sudo tail -n 20 /opt/nginx-quic/logs/access.log
خروجی نمونه
protocol=HTTP/3.0 h3=h3

در صورت نیاز، origin را مستقیم بررسی کن

دامنه و نشانی نمونه را عوض کن. کلاینت مستقیماً به IPv4 سرور وصل می‌شود ولی نام واقعی برای SNI و اعتبار گواهی حفظ می‌شود. این بررسی برای جداکردن مسیر CDN مفید است.

Bash

دستگاهی در شبکهٔ دیگر · دامنه و IP را جایگزین کن

curl --resolve h3.example.com:443:YOUR_SERVER_IPV4 --http3-only --fail --show-error --max-time 15 https://h3.example.com/

خطا را در لایهٔ درست پیدا کن

آزمون TCP و آزمون اجباری QUIC را جدا نگه دار. ابتدا اولین لایهٔ خراب را پیدا کن؛ تغییر هم‌زمان تنظیمات نامرتبط تشخیص را سخت‌تر می‌کند.

خطای unknown directive یا invalid quic parameter

نسخه و گزینه‌های ساخت باینری و مسیر باینری داخل unit را با دستورهای زیر ببین. اگر ماژول ساخته نشده یا سرویس باینری دیگری را اجرا می‌کند، ساخت یا unit را اصلاح کن. حذف QUIC به معنی تکمیل HTTP/3 نیست.

Bash
/opt/nginx-quic/sbin/nginx -V 2>&1
systemctl cat academy-nginx-quic
HTTPS باز می‌شود ولی --http3-only timeout می‌دهد

سوکت UDP، فایروال میزبان و ارائه‌دهنده و NAT را از شبکه‌ای دیگر بررسی کن. بعضی شبکه‌ها UDP 443 را می‌بندند. هدر Alt-Svc می‌تواند وجود داشته باشد، درحالی‌که UDP نمی‌رسد. IPv4، IPv6 و مسیر origin را تفکیک کن.

Bash
sudo ss -lnup 'sport = :443'
sudo tail -n 40 /opt/nginx-quic/logs/error.log
curl گزینهٔ HTTP/3 را نمی‌شناسد

فهرست قابلیت‌های کلاینت را با دستور زیر ببین. HTTP3 به build و کتابخانهٔ مناسب نیاز دارد؛ تغییر تنظیمات سرور این قابلیت را به کلاینت اضافه نمی‌کند. از راهنمای رسمی curl یا مرورگر سازگار استفاده کن.

Bash
curl -V
گواهی صادر نمی‌شود یا اعتبار TLS رد می‌شود

DNS، CAA، مسیر challenge، نام گواهی و زنجیرهٔ کامل را بررسی کن. AAAA اشتباه می‌تواند با وجود کار کردن IPv4 باعث خطا شود. خطای اعتماد را با -k پنهان نکن.

Bash
sudo certbot certificates
مجوز فایل، اشغال پورت یا پاسخ اشتباه

اعتبار تنظیمات و خطاهای تازه را با دستورهای زیر بخوان. دسترسی worker به webroot و مالک سوکت را بررسی کن. سایت‌های موجود را حفظ کن و اگر مالکیت پورت روشن نیست از ماشین جدا استفاده کن.

Bash
sudo /opt/nginx-quic/sbin/nginx -t
sudo tail -n 40 /opt/nginx-quic/logs/error.log
sudo ss -lntup

فایل اسکریپت تمدید گواهی را آماده کن

پس از تمدید گواهی، Nginx باید گواهی تازه را بارگذاری کند. یک اسکریپت به Certbot معرفی می‌کنیم تا پس از تمدید موفق اجرا شود.

دستور اول پوشهٔ لازم را می‌سازد و دستور دوم فایل اسکریپت را در ویرایشگر باز می‌کند. محتوای پنل بعدی را داخل فایل قرار بده؛ سپس ذخیره کن و از ویرایشگر خارج شو.

Bash

ترمینال سرور · دستور دوم ویرایشگر را باز می‌کند

sudo install -d -m 755 /etc/letsencrypt/renewal-hooks/deploy
sudoedit /etc/letsencrypt/renewal-hooks/deploy/academy-nginx-quic.sh

محتوای اسکریپت پس از تمدید را ذخیره کن

فقط محتوای زیر را در فایلی که باز کردی بگذار. اسکریپت ابتدا اعتبار تنظیمات Nginx را بررسی می‌کند و در صورت موفقیت، سرویس همین آزمایش را دوباره بارگذاری می‌کند. اگر بررسی خطا بدهد، ادامه نمی‌دهد.

بعد از ذخیره و خروج از ویرایشگر، مجوزها را با دستورهای پنل بعد تنظیم کن.

sh · /etc/letsencrypt/renewal-hooks/deploy/academy-nginx-quic.sh

محتوای فایل · در ویرایشگر ذخیره کن

#!/bin/sh
set -eu
/opt/nginx-quic/sbin/nginx -t
systemctl reload academy-nginx-quic

مجوزها، تمدید و بارگذاری را بررسی کن

ابتدا مالک فایل را root قرار بده و اجازهٔ اجرا را تنظیم کن. کاربر عادی نباید بتواند این اسکریپت را تغییر دهد.

آزمون تمدید، روش webroot ذخیره‌شده در Certbot را بررسی می‌کند. این آزمون معمولاً اسکریپت پس از تمدید را اجرا نمی‌کند؛ اجرای اسکریپت را جداگانه هم بررسی می‌کنیم.

در پایان، فهرست زمان‌بندی‌ها را ببین و مطمئن شو زمان‌بندی تمدید Certbot فعال است. اگر وجود ندارد، طبق راهنمای رسمی Certbot آن را تنظیم کن. پورت TCP 80 و مسیر تأیید دامنه برای تمدید باید قابل دسترس بمانند.

Bash

ترمینال سرور · هر گروه را اجرا و نتیجه را بررسی کن

sudo chown root:root /etc/letsencrypt/renewal-hooks/deploy/academy-nginx-quic.sh
sudo chmod 755 /etc/letsencrypt/renewal-hooks/deploy/academy-nginx-quic.sh

# Check certificate renewal
sudo certbot renew --dry-run

# Check the post-renewal script
sudo /etc/letsencrypt/renewal-hooks/deploy/academy-nginx-quic.sh

# Inspect renewal timers
systemctl list-timers --all
از کجا بدانم درست انجام شد؟

مالک فایل root است، فایل اجازهٔ اجرا دارد، آزمون تمدید و بارگذاری موفق‌اند و زمان‌بندی فعال تمدید تأیید شده است.

نسخهٔ Nginx و وضعیت سرویس را پیگیری کن

به‌روزرسانی بسته‌های سیستم، کتابخانه‌های توزیع را نگهداری می‌کند؛ اما باینری Nginx که در این آموزش ساختی، خودکار دوباره ساخته نمی‌شود. خبرهای امنیتی upstream را دنبال کن، امضای نسخهٔ بعدی را بررسی کن و ارتقا را ابتدا در محیط آزمایشی انجام بده. باینری و تنظیمات قبلی را برای بازگشت نگه دار.

پس از به‌روزرسانی کتابخانهٔ TLS، راه‌اندازی مجدد سرویس را برنامه‌ریزی کن تا Nginx کتابخانهٔ تازه را بارگذاری کند؛ سپس آزمون بیرونی HTTP/3 را تکرار کن.

انقضای گواهی، پاسخ بیرونی HTTPS و HTTP/3، رشد لاگ و سلامت سرویس را پایش کن. پیش از استفادهٔ اصلی، چرخش و مدت نگهداری لاگ را مشخص کن. این آزمایش ظرفیت، کاهش تأخیر، دسترس‌پذیری بالا یا امن‌سازی کامل برنامه را ثابت نمی‌کند.

QUIC را خاموش کن و HTTPS سالم را نگه دار

از تنظیمات فعلی نسخه بگیر و ویرایشگر را با پنل زیر باز کن. تغییر لازم در بخش بعد آمده است. listener مربوط به TCP، گواهی و مسیر تأیید دامنه را نگه دار؛ فقط بعد از اصلاح و بررسی موفق، بارگذاری کن.

کلاینتی که clear را دریافت کند، مسیر جایگزین ذخیره‌شده را کنار می‌گذارد؛ برای بقیه عمر قبلی ۳۰۰ثانیه‌ای را در نظر بگیر. فقط قانون UDP اضافه‌شده برای این آزمایش را، پس از اطمینان از مشترک نبودن، برگردان. TCP 80 برای تمدید و TCP 443 برای HTTPS لازم می‌مانند.

نسخهٔ پشتیبان HTTP قبلی، HTTPS را حذف می‌کند؛ فقط اگر این کاهش سرویس عمدی است از آن استفاده کن. برای جمع‌کردن کامل آزمایش، بخش جداگانهٔ پایان کار را دنبال کن و تنظیمات سایت‌های دیگر را حفظ کن.

Bash

ترمینال سرور · فقط فایل نصب آزمایشی را تغییر بده

sudo cp -a /opt/nginx-quic/conf/nginx.conf /opt/nginx-quic/conf/nginx.conf.quic-before
sudoedit /opt/nginx-quic/conf/nginx.conf
از کجا بدانم درست انجام شد؟

نسخهٔ پشتیبان ذخیره شده و فایل برای اعمال تغییر بخش بعد باز است.

تغییر لازم در فایل را اعمال کن

دو خط اولِ مشخص‌شده را از بخش TLS موجود بردار و دستور تبلیغ قبلی را با خط آخر جایگزین کن. این پنل فقط تغییر موضعی فایل است و جای کل تنظیمات را نمی‌گیرد.

Nginx · /opt/nginx-quic/conf/nginx.conf

ویرایش موضعی فایل · در shell اجرا نکن

# Remove these existing lines:
# listen 443 quic reuseport;
# http3 on;

# Replace the previous Alt-Svc directive with:
add_header Alt-Svc clear always;

تنظیمات بازگشت را بررسی و بارگذاری کن

بعد از ذخیره، این پنل را اجرا کن. بارگذاری تنها پس از موفقیت بررسی انجام می‌شود. HTTPS را با دامنهٔ واقعی از دستگاه دیگر هم دوباره بررسی کن.

Bash

ترمینال سرور

sudo /opt/nginx-quic/sbin/nginx -t && sudo systemctl reload academy-nginx-quic
از کجا بدانم درست انجام شد؟

تنظیمات معتبرند، بارگذاری موفق است و HTTPS روی TCP از بیرون پاسخ می‌دهد.

اگر آزمایش را جمع می‌کنی

این بخش اختیاری است و endpoint آزمایش را متوقف می‌کند. ابتدا اسکریپت اختصاصی تمدید را از پوشهٔ فعال خارج و در مسیر محافظت‌شده نگه می‌داریم؛ سپس سرویس متوقف و شروع خودکار آن غیرفعال می‌شود. فقط برای همین نصب جداگانه اجرا کن.

DNS و قواعد فایروال مخصوص آزمایش را هم تطبیق بده. گواهی‌ها و وضعیت خصوصی را تا تصمیم روشن دربارهٔ چرخهٔ عمرشان حفظ کن؛ پوشهٔ مشترک مدیریت گواهی را یکجا پاک نکن.

Bash

ترمینال سرور · اختیاری؛ endpoint را متوقف می‌کند

sudo install -d -m 700 /root/academy-nginx-retired
sudo mv -- /etc/letsencrypt/renewal-hooks/deploy/academy-nginx-quic.sh /root/academy-nginx-retired/academy-nginx-quic.sh
sudo systemctl disable --now academy-nginx-quic

تمرین بعدی را آگاهانه انتخاب کن

اکنون نصب Nginx از منبع امضاشده، سرویس مشخص و آزمونی داری که HTTP/3 واقعی را از fallback جدا می‌کند. بعد از تغییر شبکه، گواهی یا باینری، همین بررسی را تکرار کن.

آموزش کامل Caddy در پایین، تمرین دیگری برای گواهی خودکار و برنامهٔ خصوصی پشت reverse proxy است. دو آزمایش را بدون برنامهٔ مهاجرت روی یک پورت عمومی اجرا نکن.

پشتوانهٔ این آموزش

منابع رسمی

وضعیت بررسی هر محیط بالای صفحه مشخص است؛ بررسی مستندات به معنی اجرای عملی همهٔ نسخه‌ها نیست.

ادامهٔ مسیر

قدم بعدی تو

همهٔ آموزش‌های آکادمی ↗