Debian
NanoPi M4 - RK3399:Apache2 + SSL:大型下載掛起
我有一個在 Debian 9 下執行的全新 Apache2 設置(NanoPi M4 上的 armbian)。一切正常,直到我嘗試通過 HTTPS 下載大文件。小文件下載成功,但較大的文件似乎在某些時候隨機失敗。 我無法使用純 HTTP 重現此問題。範例
wget
(在瀏覽器上的行為相同):wget https://xyz---/test.bin --no-check-certificate --2019-01-13 18:22:22-- https://xyz---/test.bin Resolving xyz--- (xyz---)... 85.241.xxx.xxx Connecting to xyz--- (xyz---)|85.241.xxx.xxx|:443... connected. WARNING: cannot verify xyz---'s certificate, issued by 'CN=Let\'s Encrypt Authority X3,O=Let\'s Encrypt,C=US': Unable to locally verify the issuer's authority. HTTP request sent, awaiting response... 200 OK Length: 1073741824 (1,0G) [application/octet-stream] Saving to: 'test.bin.2' test.bin.2 39%[==================> ] 403,66M 11,6MB/s eta 54s
它下載正常,直到達到 403,66M,之後沒有其他任何事情發生。在伺服器端(
error.log
)我得到這個:ssl_engine_io.c(2135): [client 85.243.xxx.xxx:59904] OpenSSL: write 16413/16413 bytes to BIO#5588cd8c50 [mem: 5588a87c23] (BIO dump follows) core_filters.c(525): [client 85.243.xxx.xxx:59904] core_output_filter: flushing because of THRESHOLD_MAX_BUFFER core_filters.c(547): (70007)The timeout specified has expired: [client 85.243.xxx.xxx:59904] core_output_filter: writing data to the network ssl_engine_io.c(2144): [client 85.243.xxx.xxx:59904] OpenSSL: I/O error, 16413 bytes expected to write on BIO#5588cd8c50 [mem: 5588a87c23] (70007)The timeout specified has expired: [client 85.243.xxx.xxx:59904] AH01993: SSL output filter write failed.
它似乎執行
core_output_filter: flushing because of THRESHOLD_MAX_BUFFER
然後沒有其他任何事情發生。有時我也注意到了這個錯誤:ssl_engine_io.c(2135): [client 95.239.xxx.xxx:9937] OpenSSL: write 45/45 bytes to BIO#55bd9e23e0 [mem: 55bd9ec213] (BIO dump follows) ssl_engine_io.c(2144): [client 95.239.xxx.xxx:9937] OpenSSL: I/O error, 5 bytes expected to read on BIO#55bd9e9d80 [mem: 55bd9ec213]
以下是為該請求提供服務的 VHost 的配置:
<VirtualHost *:443> ServerName xyz--- ServerAdmin tcb13--- DocumentRoot /test ErrorLog /test/error.log CustomLog /test/access.log combined SSLEngine on SSLCertificateFile /mnt/SU1/letsencrypt/config/live/xyz---/fullchain.pem SSLCertificateKeyFile /mnt/SU1/letsencrypt/config/live/xyz---/privkey.pem Header always set Strict-Transport-Security "max-age=15768000" LogLevel trace6 </VirtualHost>
我確定這不是網路相關問題,因為:
- 僅在啟用 SSL 的情況下發生,在我可以毫無問題地下載的非 SSL 虛擬主機上;
- 其他協議(FTP 和 SCP)也可以很好地下載相同的測試文件;
- 使用 iperf3 測試網路時沒有問題。
一些系統資訊:
lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 9.6 (stretch) Release: 9.6 Codename: stretch uname -a Linux testxyz 4.4.162-rk3399 #41 SMP Fri Oct 26 14:03:47 CEST 2018 aarch64 GNU/Linux apache2ctl -V | grep -i "Server version" Server version: Apache/2.4.25 (Debian) root@testxyz:~# dpkg -l |grep apache2 ii apache2 2.4.25-3+deb9u6 arm64 Apache HTTP Server ii apache2-bin 2.4.25-3+deb9u6 arm64 Apache HTTP Server (modules and other binary files) ii apache2-data 2.4.25-3+deb9u6 all Apache HTTP Server (common files) ii apache2-utils 2.4.25-3+deb9u6 arm64 Apache HTTP Server (utility programs for web servers) ii libapache2-mod-php7.3 7.3.0-2+0~20181217092659.24+stretch~1.gbp54e52f arm64 server-side, HTML-embedded scripting language (Apache 2 module)
我怎樣才能解決這個問題?謝謝你。
我設法發現這個問題與集成乙太網和 RK3399 CPU 的已知問題有關。使用 USB 3 轉乙太網適配器不會發生此問題。
RK3399 等闆卡需要禁用 TCP/UDP 解除安裝,以避免重傳和重置錯誤。這已經由 Ayufan 在 Rock64 和 RockPro64 Rootfs 上實現,DietPi 也需要這個。
一個簡單的解決方法是禁用解除安裝:
ethtool -K eth0 rx off tx off
之後您可以使用 來檢查解除安裝狀態
ethtool --show-offload eth0
。禁用解除安裝功能後,我不再有報告的問題。為了在重新啟動(和網路重新啟動)中倖存下來,您可以創建一個
/etc/network/if-up.d/disable-offload
類似於以下內容的腳本:#!/bin/bash /sbin/ethtool -K eth0 rx off tx off
(確保不要用 .sh 命名文件,也不要用 chmod +x 這個文件)