ติดตั้ง Nginx รองรับ http3 ด้วย BoringSSL บน AlmaLinux 9 เขียนเมื่อ 2024.01.29 โดย

Nginx ตั้งแต่เวอร์ชั่น 1.25 เป็นต้นมา มีการเพิ่ม http3_module เข้ามาใน mainline branch ไม่ต้องไปเอาใน Quic branh มาคอมไพล์แล้ว

โดย http3_module นี้เข้ากันได้กับ BoringSSL, LibreSSL และ QuicTLS

วันนี้จะมาคอมไพล์ Nginx + BoringSSL เพื่อใช้งาน HTTP3 กัน

คอมไพล์ BoringSSL
เปิดการใช้งาน Repo CRB
dnf config-manager --set-enabled crb
ติดตั้งแพ็กเกจที่จำเป็น
dnf install -y git cmake ninja-build golang gcc-c++
Git clone BoringSSL
git clone "https://boringssl.googlesource.com/boringssl"
เข้าไปยังไดเรคทอรี่ที่โคลนมา
cd boringssl
ทำการคอมไพล์
cmake -GNinja -B build
ninja -C build
เป็นอันเสร็จสิ้นสำหรับ BoringSSL

จากนั้นเราเริ่มทำการติดตั้ง Nginx 1.25.3
ติดตั้งแพ็กเกจที่จำเป็น
dnf install -y wget pcre-devel zlib-devel
ดาวน์โหลด Nginx 1.25.3 source
wget https://nginx.org/download/nginx-1.25.3.tar.gz
แตกไฟล์
tar xf nginx-1.25.3.tar.gz
เข้าไปยังไดเรคทอรี่
cd nginx-1.25.3
ตั้งค่าก่อนคอมไพล์ โดย BoringSSL และ Nginx นี้อยู่ในไดเรคทอรี่เดียวกัน
./configure --with-http_ssl_module --with-http_v2_module --with-http_v3_module --with-cc-opt=-I../boringssl/include --with-ld-opt='-L../boringssl/build/ssl -L../boringssl/build/crypto'
ทำการคอมไพล์และติดตั้ง
make
make install
จากนั้นเขียนไฟล์ service สำหรับ systemd
nano /etc/systemd/system/nginx.service
โดยใส่ข้อมูลตามนี้
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
เปิดการใช้งาน nginx.service
systemctl enable nginx.service

สร้างไฟล์ DH param เพื่อเพิ่มความปลอดภัยให้ระบบ
openssl dhparam -out /usr/local/nginx/conf/dh4096.pem 4096

ตั้งค่า Nginx
ืnano /usr/local/nginx/conf/nginx.conf
โดยแก้ไขค่าต่อไปนี้
pid        /var/run/nginx.pid;

.......

server {
        listen 443 quic reuseport;
        listen 443 ssl;
        server_name  mydomain.com;

        ssl_stapling on;
        ssl_stapling_verify on;
        ssl_trusted_certificate ca-bundle.pem;
        ssl_certificate mydomain.crt;
        ssl_certificate_key mydomain.key;

        ssl_session_timeout  5m;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256";
        ssl_prefer_server_ciphers   on;
        ssl_session_cache  builtin:1000  shared:SSL:10m;
        ssl_ecdh_curve prime256v1;
        ssl_dhparam dh4096.pem;
        ssl_buffer_size 16k;

        location / {
            add_header Alt-Svc 'h3=":443"; ma=86400';
            root   html;
            index  index.html index.htm;
        }
    }
}
ส่วนสำคัญคือ ต้องประกาศ ให้ใช้ port เดียวกับ https
listen 443 quic reuseport;
listen 443 ssl;
และทำการประกาศช่องทางเลือกสำหรับ http3 ใน header เพื่อให้ browser เลือกใช้งานได้
add_header Alt-Svc 'h3=":443"; ma=86400';

จากนั้นทำการเริ่มการทำงาน nginx
systemctl start nginx.service

ก่อนจะไปทดสอบ ต้องเปิด port ที่จำเป็นก่อน
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --reload
จากนั้นลองเข้าทดสอบที่ http3check.net



เสร็จสมบูรณ์



คำเตือนคำเตือน เนื้อหาต่างๆ ในบทความ รวมถึงรูปภาพทั้งหมดในบทความนี้ เป็นความเห็นส่วนตัวของผู้เขียนแต่ละคน ซึ่งแต่ละคนได้ทำการลงทะเบียน และเขียนบทความลงใน Modoeye Articles นี้โดยไม่มีค่าธรรมเนียมใดๆ บทความเหล่านี้เป้าหมายเพื่อการศึกษา และความบันเทิงเท่านั้น การนำส่วนหนึ่งส่วนใดของบทความไปใช้งาน ควรทำการอ้างอิงถึงผู้เขียนและแหล่งที่มาด้วย