diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/Tengine 2.2.3 for openEuler22.03 LTS\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221 .md" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/Tengine 2.2.3 for openEuler22.03 LTS\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221 .md" new file mode 100644 index 0000000000000000000000000000000000000000..3f4ecbd468497c9e8e5f25699eb5809a633fd95b --- /dev/null +++ "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/Tengine 2.2.3 for openEuler22.03 LTS\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221 .md" @@ -0,0 +1,559 @@ +--- +title: "Tengine 2.2.3-migrate" +date: 2023-02-14 +category: blog +tags: + - Tengine + - Porting Guide +sig: sig-Compatibility-Infra +archives: 2023-02 +author: caesar +summary: "详细介绍了Tengine 2.2.3软件移植到openEuler操作系统的具体操作步骤" +--- + +# Tengine 2.2.3 for openEuler22.03 LTS【迁移移植案例】 + +## 软件介绍 + +**简要介绍** + +> Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问 +> +> 量网站的需求,添加了很多高级功能和特性。它的目的是打造一个高效、安全的 +> +> Web平台。 +> +> 开发语言:C +> +> 一句话描述:轻量级Web服务器 + +**建议的版本** + +| 软件 | 版本 | +| ------- | ------ | +| Tengine | 2.2.3 | +| OpenSSL | 1.1.1a | + +## 环境要求 + +## 硬件配置 + +| 项目 | 说明 | +| -------- | ----------------------------- | +| 服务器 | TaiShan 200服务器(型号2280) | +| CPU | 鲲鹏920 6426处理器 | +| 内存 | 无需求 | +| 存储 | 无需求 | +| 磁盘分区 | 无需求 | +| 网络 | 能访问 | + +## 操作系统 + +| 操作系统 | 版本 | +| --------- | ----------- | +| openEuler | 8.1 aarch64 | + +## 配置编译环境 + +### 配置yum源 + +> ![](./images/media/image1.png)**说明** +> +>配置yum源之前先执行yum list命令来检查当前yum源是否已配置,如果已配 +> +>置则忽略本步骤,如果未配置则按照以下步骤执行配置。 + +**步骤1** 备份配置文件。 + +``` +cp -a /etc/yum.repos.d/openEuler.repo /etc/yum.repos.d/openEuler.repo.bak +``` + +**步骤2** 下载新的openeuler_aarch64.repo文件到/etc/yum.repos.d/目录下。 + +> 执行如下命令: +> +> ``` +> cd /etc/yum.repos.d/ +> wget https://repo.huaweicloud.com/repository/conf/openeuler_aarch64.repo +> ``` + +**步骤3** 执行yum clean all清除原有yum缓存。 + +``` + yum clean all +``` + +**步骤4** 执行yum makecache(刷新缓存)或者yum repolist all(查看所有配置可以使用的文件,会自动刷新缓存)。 + +``` + yum makecache + yum list +``` + +### 安装依赖包 + +``` +yum install -y gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel perl-devel perl-ExtUtils-Embed wget openssl-devel +``` + +### 关闭防火墙 + +> ![](./images/media/image1.png)**说明** +> +>测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置。 +> + +**步骤1** 停止防火墙。 + +``` +systemctl stop firewalld.service +``` + +**步骤2** 关闭防火墙。 + +``` +systemctl disable firewalld.service +``` + +> ![](./images/media/image1.png)**说明** +> +>执行disable命令关闭防火墙的同时,也取消了开机自启动。 + +**步骤3** 查看防火墙状态。 + +``` +systemctl status firewalld.service +``` + +## 编译安装 + +**步骤1** 获取Tengine源码。 + +> 1\. 在本地浏览器下载Tengine源码。 + +​ Tengine源码地址:[**https://tengine.taobao.org/download/tengine-2.2.3.tar.gz**](https://tengine.taobao.org/download/tengine-2.2.3.tar.gz) + +> 2\. 将源码包上传到服务器"/home"目录下。 +> +> ![](./images/media/image1.png)**说明** +> +>​ 若服务器可以访问网络,则通过wget命令直接下载Tengine源码。 + +``` +cd /home +wget https://tengine.taobao.org/download/tengine-2.2.3.tar.gz --no-check-certificate +``` + +**步骤2** 解压Tengine安装包。 + +``` +tar -xzvf tengine-2.2.3.tar.gz +``` + +**步骤3** 进入"tengine-2.2.3"目录。 + +``` +cd tengine-2.2.3/ +``` + +**步骤4** 配置Tengine。 + +> 说明:本次使用系统默认OpenSSL不需要指定OpenSS路径,编译命令如下: + +``` + ./configure --prefix=/usr/local/tengine-nginx --with-http_ssl_module --with-openssl-async --with-cc-opt=-Wno-error +``` + +**步骤5** 编译并安装Tengine。 + +``` + make -j 90 + make install +``` + +> ![](./images/media/image1.png)**说明** + +1. 如果有报错"src/core/ngx_murmurhash.c:37:11: error: this statement may + +> fall through \[- Werror=implicit-fallthrough=\]",请参考[**src/core/ngx_murmurhash.c**](\l)[**报错**](\l)解决。 + +2. 如果有报错"src/os/unix/ngx_user.c:36:7: error: 'struct crypt_data' has no member named 'current_salt'",请参考[**src/os/unix/ngx_user.c报错**](#srcosunixngx_user.c报错)解决。 + +**步骤6** 查看安装目录。 + +``` +ll /usr/local/tengine-nginx +``` + +> ![](./images/media/image2.png) +> + +## Tengine运行 + +### 生成证书 + +> ![](./images/media/image1.png)**说明** +> +>本节产生的数字证书为OpenSSL生成的本地安全证书,该证书仅限用于设备调测阶段使用,在设备商用时需要更换为商用安全证书,商用安全证书需要向正规权威证书机构申请获取。 +> + +**步骤1** 进入"/usr/local/tengine-nginx"目录,生成秘钥key。 + +``` + cd /usr/local/tengine-nginx + openssl genrsa -des3 -out server.key 2048 +``` + +> 会有两次要求输入密码,输入同一个,会生成server.key文件。 +> +> ![](./images/media/image3.png) +> +>![](./images/media/image1.png)**说明** +> +> 可通过如下命令实现免密码使用此文件: + +``` + openssl rsa -in server.key -out server.key +``` + +**步骤2** 创建服务器证书的申请文件。 + +``` + openssl req -new -key server.key -out server.csr +``` + +> ![](./images/media/image4.png) +> +>输入步骤2设置的密码,其他的可以不填。 + +**步骤3** 重写秘钥key。 + +``` +openssl rsa -in server.key -out server.key +``` + +输入步骤1设置的密码。若已经设置免密码使用,则无需输入密码。 + +> ![](./images/media/image5.png) + +**步骤4** 生成证书。 + +``` +openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt +``` + +输入步骤2设置的密码。若已经设置免密码使用,则无需输入密码。 + +> ![](./images/media/image6.png) +> + +### 配置功能 + +#### **配置HTTPS 功能** + +**步骤1** 打开nginx.conf配置文件。 + +``` +vi /usr/local/tengine-nginx/conf/nginx.conf +``` + +**步骤2** 修改以下内容后,保存退出。 + +1. 将"#user nobody;"修改为"user root;"。 + +2. 将"# HTTPS server"模块下的"#"全部去掉。 + +3. 将"# HTTPS server"模块下的"listen 443 ssl;"修改为"listen 20000 ssl;"。 + +4. 将"# HTTPS server"模块下的"ssl_certificate_cert.pem" 修改为"ssl_certificate /usr/local/tengine-nginx/server.crt;"。 + +5. 将"# HTTPS server"模块下的"ssl_certificate_key_cert.key;" 修改为 "ssl_certificate_key /usr/local/tengine-nginx/server.key;"。 + +6. 在"# HTTPS server"模块下的"server_name localhost;"后面一行添加 "ssl_async on;",即开启异步功能。 + +> **原文件默认内容:** + +> ``` +> #user nobody; +> ... +> # HTTPS server +> # +> #server { +> # listen 443 ssl; +> # server_name localhost; +> # ssl_async on; +> +> # ssl_certificate cert.pem; +> # ssl_certificate_key cert.key; +> +> # ssl_session_cache shared:SSL:1m; +> # ssl_session_timeout 5m; +> +> # ssl_ciphers HIGH:!aNULL:!MD5; +> # ssl_prefer_server_ciphers on; +> +> # location / { +> # root html; +> # index index.html index.htm; +> # } +> # } +> ``` +> +> **修改后内容:** +> +> ``` +> user root; +> ... +> # HTTPS server +> # +> server { +> listen 20000 ssl; +> server_name localhost; +> ssl_async on; +> +> ssl_certificate /usr/local/tengine-nginx/server.crt; +> ssl_certificate_key /usr/local/tengine-nginx/server.key; +> +> ssl_session_cache shared:SSL:1m; +> ssl_session_timeout 5m; +> +> ssl_ciphers HIGH:!aNULL:!MD5; +> ssl_prefer_server_ciphers on; +> +> location / { +> root html; +> index index.html index.htm; +> } +> } +> ``` +> +> + +#### **配置Tengine的HTTP功能** + +**步骤1** 打开nginx.conf配置文件。 + +``` + vi /usr/local/tengine-nginx/conf/nginx.conf +``` + +**步骤2** 修改nginx.conf配置文件以下两处配置后,保存退出。 + +1. 定义Nginx运行的用户权限user为root。 + +2. 将"http"模块下的"listen 80;"修改为"listen 10000;"。 + +> **原文件默认内容:** + +``` +#user nobody; +http { +check_shm_size 50m; + include mime.types; + default_type application/octet-stream; + sendfile on; +#tcp_nopush on; +#keepalive_timeout 0; +keepalive_timeout 65; + server { + listen 80; + server_name localhost; + + #charset koi8-r; + + #access_log logs/host.access.log main; + #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main; + + location / { + root html; + index index.html index.htm; + } + } +} +``` + +> **修改后内容:** + +``` +user root; +... +#user nobody; +http { +check_shm_size 50m; + include mime.types; + default_type application/octet-stream; + sendfile on; +#tcp_nopush on; +#keepalive_timeout 0; +keepalive_timeout 65; + server { + listen 10000; + server_name localhost; + + #charset koi8-r; + + #access_log logs/host.access.log main; + #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main; + + location / { + root html; + index index.html index.htm; + } + } +} +``` + +### 运行Tengine + +**步骤1** 启动Nginx。 + +通过脚本命令启动。 + +``` +/usr/local/tengine-nginx/sbin/nginx -c /usr/local/tengine-nginx/conf/nginx.conf +``` + +> ![](./images/media/image1.png)**说明** + +启动时若出现"failed:no memory"报错,请参考[**7.3启动Tengine时若提示缓存不足**](#启动tengine时若提示缓存不足)解决。 + +**步骤2** 查看Nginx的进程 + +``` +ps -ef \| grep nginx +``` + +> ![](./images/media/image7.png) +> +>![](./images/media/image1.png)**说明** +> +> 关闭Nginx有3种方式,业务运行中不需要执行该命令。 + +1. 通过Service服务关闭。 + +``` + service nginx stop +``` + +> ![](./images/media/image8.png) + +2. 通过脚本命令关闭。 + +``` +/usr/local/tengine-nginx/sbin/nginx -s quit +``` + +3. 使用结束进程命令。 + +``` +pkill nginx +``` + +> 说明:RPM安装后关闭命令如下: + +``` +systemctl stop nginx +``` + +### 验证Tengine + +**步骤1** +查看Nginx的监测端口(20000是HTTPS监测端口,10000是HTTP监测端口)。 + +``` + netstat -anp | grep 10000 + netstat -anp | grep 20000 + netstat -anpt +``` + +![](./images/media/image9.png) + +**步骤2** 查看Nginx的HTML文件所在目录。 + +``` + ll /usr/local/tengine-nginx/html/ +``` + +> ![](./images/media/image10.png) + +**步骤3** 验证HTTPS功能。 + +> 通过curl本地访问Nginx的html页面。 + +``` + curl -k https://127.0.0.1:20000index.html +``` + +> ![](./images/media/image11.png) +> +> 若成功显示tengine欢迎界面则HTTPS功能配置成功。 + +**步骤4** 验证HTTP功能。 + +> 通过curl本地访问Nginx的html页面。 + +``` +curl http://127.0.0.1:10000/index.html +``` + +> ![](./images/media/image12.png) +> +>若成功显示tengine欢迎界面则HTTP功能配置成功。 +> + +## 卸载Tengine + +**步骤1** 删除对应的目录。 + +源码编译安装只是生成对应的文件,所以直接删除对应的目录即可。 + +``` +rm -rf /usr/local/tengine-nginx +ls /usr/local/tengine-nginx +``` + +## 故障排除 + +src/core/ngx_murmurhash.c报错 + +**问题现象** + +> 执行安装Tengine命令时src/core/ngx_murmurhash.c报错。 +> +> ![](./images/media/image13.png) + +**解决方法:** + +在./configure加入\--with-cc-opt=-Wno-error参数后重新执行编译安装步骤4。 + +src/os/unix/ngx_user.c报错 + +**问题现象** + +> 执行安装Tengine命令时src/os/unix/ngx_user.c报错。 +> +> ![](./images/media/image14.png) + +**解决方法** + +1. vi src/os/unix/ngx_user.c,打开报错文件ngx_user.c。 + +> 将第36行注释后,或直接删掉保存退出。 +> +> ![](./images/media/image15.png) + +启动Tengine时若提示缓存不足 + +> 如果出现"failed:no memory"报错信息如下: +> +> ![](./images/media/image16.png) +> +>需要在配置文件中设置缓存大小后再次启动即可。 +> +>运行如下命令后再次启动: + +``` +sed -i "/http {/a\check_shm_size 50m;" /usr/local/tengine-nginx/conf/nginx.conf +``` + diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image1.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image1.png" new file mode 100644 index 0000000000000000000000000000000000000000..04523ba8d653c89d1a2afa33286ff1d867a98ccd Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image1.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image10.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image10.png" new file mode 100644 index 0000000000000000000000000000000000000000..85817e48fc90f64f7aad18fccd46c43ce02e152c Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image10.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image11.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image11.png" new file mode 100644 index 0000000000000000000000000000000000000000..7519e5fb3be2a3ad83cd0561b684c31111262591 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image11.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image12.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image12.png" new file mode 100644 index 0000000000000000000000000000000000000000..ec43f2967e392a84e07ef1c7e48d84d0d7785dbb Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image12.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image13.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image13.png" new file mode 100644 index 0000000000000000000000000000000000000000..2100f2611be733d87f2e9a6444eadaa9062a32c1 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image13.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image14.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image14.png" new file mode 100644 index 0000000000000000000000000000000000000000..34ccf1c2e06b6a6e51669b9b6c644cb57a9291a2 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image14.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image15.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image15.png" new file mode 100644 index 0000000000000000000000000000000000000000..b32c070e4f393ff640f5384c156d294618e65e2b Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image15.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image16.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image16.png" new file mode 100644 index 0000000000000000000000000000000000000000..f321554abbbf9a1d7978a778c36b2e217f4e4ba9 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image16.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image2.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image2.png" new file mode 100644 index 0000000000000000000000000000000000000000..eb914ef540cc42f1a567e272f606a9cd76ce10cd Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image2.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image3.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image3.png" new file mode 100644 index 0000000000000000000000000000000000000000..96c2df1708520d76c111ee2f45bb777c1ef301c1 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image3.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image4.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image4.png" new file mode 100644 index 0000000000000000000000000000000000000000..c1a0e01709c268dd71aacab5876483ff1f8c8a52 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image4.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image5.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image5.png" new file mode 100644 index 0000000000000000000000000000000000000000..5c61931f8aab1e42d21c5d9249518988838cd101 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image5.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image6.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image6.png" new file mode 100644 index 0000000000000000000000000000000000000000..f79e5da5dce7d0b47cf948b6f61707a13164f4cc Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image6.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image7.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image7.png" new file mode 100644 index 0000000000000000000000000000000000000000..9c3edc102c539184a6adc4a1e484817876a72dd9 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image7.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image8.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image8.png" new file mode 100644 index 0000000000000000000000000000000000000000..3dc51f2f940b4e1a447e0633cfa0e1f8a65a894a Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image8.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image9.png" "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image9.png" new file mode 100644 index 0000000000000000000000000000000000000000..f17584e84a1ebb6520cf03bc219513864893e433 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/image9.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/Tengine 2.2.3 for openEuler22.03 LTS\350\277\201\347\247\273\346\244\215\346\214\207\345\215\227 .md" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/Tengine 2.2.3 for openEuler22.03 LTS\350\277\201\347\247\273\346\244\215\346\214\207\345\215\227 .md" new file mode 100644 index 0000000000000000000000000000000000000000..50f942b7fa43aa103df82bbb632ceb623cd4c379 --- /dev/null +++ "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/Tengine 2.2.3 for openEuler22.03 LTS\350\277\201\347\247\273\346\244\215\346\214\207\345\215\227 .md" @@ -0,0 +1,559 @@ +--- +title: "Tengine 2.2.3-migrate" +date: 2023-02-14 +category: blog +tags: + - Tengine + - Porting Guide +sig: sig-Compatibility-Infra +archives: 2023-02 +author: caesar +summary: "详细介绍了Tengine 2.2.3软件移植到openEuler操作系统的具体操作步骤" +--- + +# Tengine 2.2.3 for openEuler22.03 LTS迁移植指南 + +## 软件介绍 + +**简要介绍** + +> Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问 +> +> 量网站的需求,添加了很多高级功能和特性。它的目的是打造一个高效、安全的 +> +> Web平台。 +> +> 开发语言:C +> +> 一句话描述:轻量级Web服务器 + +**建议的版本** + +| 软件 | 版本 | +| ------- | ------ | +| Tengine | 2.2.3 | +| OpenSSL | 1.1.1a | + +## 环境要求 + +## 硬件配置 + +| 项目 | 说明 | +| -------- | ----------------------------- | +| 服务器 | TaiShan 200服务器(型号2280) | +| CPU | 鲲鹏920 6426处理器 | +| 内存 | 无需求 | +| 存储 | 无需求 | +| 磁盘分区 | 无需求 | +| 网络 | 能访问 | + +## 操作系统 + +| 操作系统 | 版本 | +| --------- | ----------- | +| openEuler | 8.1 aarch64 | + +## 配置编译环境 + +### 配置yum源 + +> ![](./images/media/image1.png)**说明** +> +>配置yum源之前先执行yum list命令来检查当前yum源是否已配置,如果已配 +> +>置则忽略本步骤,如果未配置则按照以下步骤执行配置。 + +**步骤1** 备份配置文件。 + +``` +cp -a /etc/yum.repos.d/openEuler.repo /etc/yum.repos.d/openEuler.repo.bak +``` + +**步骤2** 下载新的openeuler_aarch64.repo文件到/etc/yum.repos.d/目录下。 + +> 执行如下命令: +> +> ``` +> cd /etc/yum.repos.d/ +> wget https://repo.huaweicloud.com/repository/conf/openeuler_aarch64.repo +> ``` + +**步骤3** 执行yum clean all清除原有yum缓存。 + +``` + yum clean all +``` + +**步骤4** 执行yum makecache(刷新缓存)或者yum repolist all(查看所有配置可以使用的文件,会自动刷新缓存)。 + +``` + yum makecache + yum list +``` + +### 安装依赖包 + +``` +yum install -y gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel perl-devel perl-ExtUtils-Embed wget openssl-devel +``` + +### 关闭防火墙 + +> ![](./images/media/image1.png)**说明** +> +>测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置。 +> + +**步骤1** 停止防火墙。 + +``` +systemctl stop firewalld.service +``` + +**步骤2** 关闭防火墙。 + +``` +systemctl disable firewalld.service +``` + +> ![](./images/media/image1.png)**说明** +> +>执行disable命令关闭防火墙的同时,也取消了开机自启动。 + +**步骤3** 查看防火墙状态。 + +``` +systemctl status firewalld.service +``` + +## 编译安装 + +**步骤1** 获取Tengine源码。 + +> 1\. 在本地浏览器下载Tengine源码。 + +​ Tengine源码地址:[**https://tengine.taobao.org/download/tengine-2.2.3.tar.gz**](https://tengine.taobao.org/download/tengine-2.2.3.tar.gz) + +> 2\. 将源码包上传到服务器"/home"目录下。 +> +> ![](./images/media/image1.png)**说明** +> +>​ 若服务器可以访问网络,则通过wget命令直接下载Tengine源码。 + +``` +cd /home +wget https://tengine.taobao.org/download/tengine-2.2.3.tar.gz --no-check-certificate +``` + +**步骤2** 解压Tengine安装包。 + +``` +tar -xzvf tengine-2.2.3.tar.gz +``` + +**步骤3** 进入"tengine-2.2.3"目录。 + +``` +cd tengine-2.2.3/ +``` + +**步骤4** 配置Tengine。 + +> 说明:本次使用系统默认OpenSSL不需要指定OpenSS路径,编译命令如下: + +``` + ./configure --prefix=/usr/local/tengine-nginx --with-http_ssl_module --with-openssl-async --with-cc-opt=-Wno-error +``` + +**步骤5** 编译并安装Tengine。 + +``` + make -j 90 + make install +``` + +> ![](./images/media/image1.png)**说明** + +1. 如果有报错"src/core/ngx_murmurhash.c:37:11: error: this statement may + +> fall through \[- Werror=implicit-fallthrough=\]",请参考[**src/core/ngx_murmurhash.c**](\l)[**报错**](\l)解决。 + +2. 如果有报错"src/os/unix/ngx_user.c:36:7: error: 'struct crypt_data' has no member named 'current_salt'",请参考[**src/os/unix/ngx_user.c报错**](#srcosunixngx_user.c报错)解决。 + +**步骤6** 查看安装目录。 + +``` +ll /usr/local/tengine-nginx +``` + +> ![](./images/media/image2.png) +> + +## Tengine运行 + +### 生成证书 + +> ![](./images/media/image1.png)**说明** +> +>本节产生的数字证书为OpenSSL生成的本地安全证书,该证书仅限用于设备调测阶段使用,在设备商用时需要更换为商用安全证书,商用安全证书需要向正规权威证书机构申请获取。 +> + +**步骤1** 进入"/usr/local/tengine-nginx"目录,生成秘钥key。 + +``` + cd /usr/local/tengine-nginx + openssl genrsa -des3 -out server.key 2048 +``` + +> 会有两次要求输入密码,输入同一个,会生成server.key文件。 +> +> ![](./images/media/image3.png) +> +>![](./images/media/image1.png)**说明** +> +> 可通过如下命令实现免密码使用此文件: + +``` + openssl rsa -in server.key -out server.key +``` + +**步骤2** 创建服务器证书的申请文件。 + +``` + openssl req -new -key server.key -out server.csr +``` + +> ![](./images/media/image4.png) +> +>输入步骤2设置的密码,其他的可以不填。 + +**步骤3** 重写秘钥key。 + +``` +openssl rsa -in server.key -out server.key +``` + +输入步骤1设置的密码。若已经设置免密码使用,则无需输入密码。 + +> ![](./images/media/image5.png) + +**步骤4** 生成证书。 + +``` +openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt +``` + +输入步骤2设置的密码。若已经设置免密码使用,则无需输入密码。 + +> ![](./images/media/image6.png) +> + +### 配置功能 + +#### **配置HTTPS 功能** + +**步骤1** 打开nginx.conf配置文件。 + +``` +vi /usr/local/tengine-nginx/conf/nginx.conf +``` + +**步骤2** 修改以下内容后,保存退出。 + +1. 将"#user nobody;"修改为"user root;"。 + +2. 将"# HTTPS server"模块下的"#"全部去掉。 + +3. 将"# HTTPS server"模块下的"listen 443 ssl;"修改为"listen 20000 ssl;"。 + +4. 将"# HTTPS server"模块下的"ssl_certificate_cert.pem" 修改为"ssl_certificate /usr/local/tengine-nginx/server.crt;"。 + +5. 将"# HTTPS server"模块下的"ssl_certificate_key_cert.key;" 修改为 "ssl_certificate_key /usr/local/tengine-nginx/server.key;"。 + +6. 在"# HTTPS server"模块下的"server_name localhost;"后面一行添加 "ssl_async on;",即开启异步功能。 + +> **原文件默认内容:** + +> ``` +> #user nobody; +> ... +> # HTTPS server +> # +> #server { +> # listen 443 ssl; +> # server_name localhost; +> # ssl_async on; +> +> # ssl_certificate cert.pem; +> # ssl_certificate_key cert.key; +> +> # ssl_session_cache shared:SSL:1m; +> # ssl_session_timeout 5m; +> +> # ssl_ciphers HIGH:!aNULL:!MD5; +> # ssl_prefer_server_ciphers on; +> +> # location / { +> # root html; +> # index index.html index.htm; +> # } +> # } +> ``` +> +> **修改后内容:** +> +> ``` +> user root; +> ... +> # HTTPS server +> # +> server { +> listen 20000 ssl; +> server_name localhost; +> ssl_async on; +> +> ssl_certificate /usr/local/tengine-nginx/server.crt; +> ssl_certificate_key /usr/local/tengine-nginx/server.key; +> +> ssl_session_cache shared:SSL:1m; +> ssl_session_timeout 5m; +> +> ssl_ciphers HIGH:!aNULL:!MD5; +> ssl_prefer_server_ciphers on; +> +> location / { +> root html; +> index index.html index.htm; +> } +> } +> ``` +> +> + +#### **配置Tengine的HTTP功能** + +**步骤1** 打开nginx.conf配置文件。 + +``` + vi /usr/local/tengine-nginx/conf/nginx.conf +``` + +**步骤2** 修改nginx.conf配置文件以下两处配置后,保存退出。 + +1. 定义Nginx运行的用户权限user为root。 + +2. 将"http"模块下的"listen 80;"修改为"listen 10000;"。 + +> **原文件默认内容:** + +``` +#user nobody; +http { +check_shm_size 50m; + include mime.types; + default_type application/octet-stream; + sendfile on; +#tcp_nopush on; +#keepalive_timeout 0; +keepalive_timeout 65; + server { + listen 80; + server_name localhost; + + #charset koi8-r; + + #access_log logs/host.access.log main; + #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main; + + location / { + root html; + index index.html index.htm; + } + } +} +``` + +> **修改后内容:** + +``` +user root; +... +#user nobody; +http { +check_shm_size 50m; + include mime.types; + default_type application/octet-stream; + sendfile on; +#tcp_nopush on; +#keepalive_timeout 0; +keepalive_timeout 65; + server { + listen 10000; + server_name localhost; + + #charset koi8-r; + + #access_log logs/host.access.log main; + #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main; + + location / { + root html; + index index.html index.htm; + } + } +} +``` + +### 运行Tengine + +**步骤1** 启动Nginx。 + +通过脚本命令启动。 + +``` +/usr/local/tengine-nginx/sbin/nginx -c /usr/local/tengine-nginx/conf/nginx.conf +``` + +> ![](./images/media/image1.png)**说明** + +启动时若出现"failed:no memory"报错,请参考[**7.3启动Tengine时若提示缓存不足**](#启动tengine时若提示缓存不足)解决。 + +**步骤2** 查看Nginx的进程 + +``` +ps -ef \| grep nginx +``` + +> ![](./images/media/image7.png) +> +>![](./images/media/image1.png)**说明** +> +> 关闭Nginx有3种方式,业务运行中不需要执行该命令。 + +1. 通过Service服务关闭。 + +``` + service nginx stop +``` + +> ![](./images/media/image8.png) + +2. 通过脚本命令关闭。 + +``` +/usr/local/tengine-nginx/sbin/nginx -s quit +``` + +3. 使用结束进程命令。 + +``` +pkill nginx +``` + +> 说明:RPM安装后关闭命令如下: + +``` +systemctl stop nginx +``` + +### 验证Tengine + +**步骤1** +查看Nginx的监测端口(20000是HTTPS监测端口,10000是HTTP监测端口)。 + +``` + netstat -anp | grep 10000 + netstat -anp | grep 20000 + netstat -anpt +``` + +![](./images/media/image9.png) + +**步骤2** 查看Nginx的HTML文件所在目录。 + +``` + ll /usr/local/tengine-nginx/html/ +``` + +> ![](./images/media/image10.png) + +**步骤3** 验证HTTPS功能。 + +> 通过curl本地访问Nginx的html页面。 + +``` + curl -k https://127.0.0.1:20000index.html +``` + +> ![](./images/media/image11.png) +> +> 若成功显示tengine欢迎界面则HTTPS功能配置成功。 + +**步骤4** 验证HTTP功能。 + +> 通过curl本地访问Nginx的html页面。 + +``` +curl http://127.0.0.1:10000/index.html +``` + +> ![](./images/media/image12.png) +> +>若成功显示tengine欢迎界面则HTTP功能配置成功。 +> + +## 卸载Tengine + +**步骤1** 删除对应的目录。 + +源码编译安装只是生成对应的文件,所以直接删除对应的目录即可。 + +``` +rm -rf /usr/local/tengine-nginx +ls /usr/local/tengine-nginx +``` + +## 故障排除 + +src/core/ngx_murmurhash.c报错 + +**问题现象** + +> 执行安装Tengine命令时src/core/ngx_murmurhash.c报错。 +> +> ![](./images/media/image13.png) + +**解决方法:** + +在./configure加入\--with-cc-opt=-Wno-error参数后重新执行编译安装步骤4。 + +src/os/unix/ngx_user.c报错 + +**问题现象** + +> 执行安装Tengine命令时src/os/unix/ngx_user.c报错。 +> +> ![](./images/media/image14.png) + +**解决方法** + +1. vi src/os/unix/ngx_user.c,打开报错文件ngx_user.c。 + +> 将第36行注释后,或直接删掉保存退出。 +> +> ![](./images/media/image15.png) + +启动Tengine时若提示缓存不足 + +> 如果出现"failed:no memory"报错信息如下: +> +> ![](./images/media/image16.png) +> +>需要在配置文件中设置缓存大小后再次启动即可。 +> +>运行如下命令后再次启动: + +``` +sed -i "/http {/a\check_shm_size 50m;" /usr/local/tengine-nginx/conf/nginx.conf +``` + diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image1.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image1.png" new file mode 100644 index 0000000000000000000000000000000000000000..04523ba8d653c89d1a2afa33286ff1d867a98ccd Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image1.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image10.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image10.png" new file mode 100644 index 0000000000000000000000000000000000000000..85817e48fc90f64f7aad18fccd46c43ce02e152c Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image10.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image11.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image11.png" new file mode 100644 index 0000000000000000000000000000000000000000..7519e5fb3be2a3ad83cd0561b684c31111262591 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image11.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image12.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image12.png" new file mode 100644 index 0000000000000000000000000000000000000000..ec43f2967e392a84e07ef1c7e48d84d0d7785dbb Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image12.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image13.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image13.png" new file mode 100644 index 0000000000000000000000000000000000000000..2100f2611be733d87f2e9a6444eadaa9062a32c1 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image13.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image14.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image14.png" new file mode 100644 index 0000000000000000000000000000000000000000..34ccf1c2e06b6a6e51669b9b6c644cb57a9291a2 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image14.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image15.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image15.png" new file mode 100644 index 0000000000000000000000000000000000000000..b32c070e4f393ff640f5384c156d294618e65e2b Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image15.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image16.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image16.png" new file mode 100644 index 0000000000000000000000000000000000000000..f321554abbbf9a1d7978a778c36b2e217f4e4ba9 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image16.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image2.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image2.png" new file mode 100644 index 0000000000000000000000000000000000000000..eb914ef540cc42f1a567e272f606a9cd76ce10cd Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image2.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image3.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image3.png" new file mode 100644 index 0000000000000000000000000000000000000000..96c2df1708520d76c111ee2f45bb777c1ef301c1 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image3.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image4.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image4.png" new file mode 100644 index 0000000000000000000000000000000000000000..c1a0e01709c268dd71aacab5876483ff1f8c8a52 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image4.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image5.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image5.png" new file mode 100644 index 0000000000000000000000000000000000000000..5c61931f8aab1e42d21c5d9249518988838cd101 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image5.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image6.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image6.png" new file mode 100644 index 0000000000000000000000000000000000000000..f79e5da5dce7d0b47cf948b6f61707a13164f4cc Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image6.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image7.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image7.png" new file mode 100644 index 0000000000000000000000000000000000000000..9c3edc102c539184a6adc4a1e484817876a72dd9 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image7.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image8.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image8.png" new file mode 100644 index 0000000000000000000000000000000000000000..3dc51f2f940b4e1a447e0633cfa0e1f8a65a894a Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image8.png" differ diff --git "a/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image9.png" "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image9.png" new file mode 100644 index 0000000000000000000000000000000000000000..f17584e84a1ebb6520cf03bc219513864893e433 Binary files /dev/null and "b/app/zh/blog/20230213-Tengine-openEuler\347\247\273\346\244\215\346\241\210\344\276\213/images/media/image9.png" differ