基于腾讯云Lighthouse自建论坛及图片预处理工具
网站图片是影响用户体验和网站性能的重要因素之一。如果图片过大、过多或者格式不合适,会导致网页加载缓慢、占用流量和存储空间,甚至影响网站的SEO排名。为了解决这些问题,我们可以使用图片预处理工具,对网站图片进行优化和处理,例如:
转换图片格式为webp或avif,这两种格式可以在保持图片质量的同时,大幅减少图片大小。
智能压缩图片,根据图片内容和场景,自动调整图片质量和尺寸,达到最佳的平衡。
自由裁剪图片,根据不同的设备和屏幕尺寸,动态生成适合的图片版本,避免浪费带宽和空间。
添加水印图片,为网站图片增加版权保护和品牌宣传的效果。
购买并配置Lighthouse服务器
k3s。编写Flarum和Imgproxy配置文件
这里有必要提醒一下,文件中的换行符应是 LF,否则可能会导致脚本无法正常工作。
1)Nginx 配置文件
/srv/etc/nginx/host.d/flarum.conf,请注意修改为你的域名。server {
listen 80;
server_name bbs.opentdp.org;
set $pool default;
set $pooldir /var/www/$pool;
set $sitedir $pooldir/org.opentdp.bbs;
root $sitedir/public;
index index.php index.htm index.html;
try_files $uri $uri/ /index.php?$query_string;
include http.d/server_fastcgi_php;
location ~ ^/(assets/files/.+(png|jpg|jpeg|webp|avif|gif|ico|svg|heic|bmp|tiff))$ {
set $image local:///org.opentdp.bbs/public/$1;
proxy_pass http://127.0.0.1:8080/$image_option/plain/$image;
}
}
map $args $image_option {
~^xs g:sm/rs:auto:320;
~^sm g:sm/rs:auto:640/wm:1:soea:::0.2;
~^md g:sm/rs:auto:800/wm:1:soea:::0.2;
~^lg g:sm/rs:auto:1024/wm:1:soea:::0.2;
~^xl g:sm/rs:auto:1280/wm:1:soea:::0.2;
~^xxl g:sm/rs:auto:1600/wm:1:soea:::0.2;
~^3xl g:sm/rs:auto:2048/wm:1:soea:::0.2;
~^4xl g:sm/rs:auto:2560/wm:1:soea:::0.2;
~^5xl g:sm/rs:auto:3264/wm:1:soea:::0.2;
~^6xl g:sm/rs:auto:4080/wm:1:soea:::0.2;
default g:sm/rs:auto:1024/wm:1:soea:::0.2;
}
2)Flarum 自动安装脚本
/srv/etc/wkit.d/s7-flarum#!/bin/sh
#
if [ ! -x /usr/bin/composer ]; then
wget -qO composer-setup.php https://getcomposer.org/installer
php composer-setup.php --install-dir=/usr/bin --filename=composer
rm composer-setup.php
fi
if [ ! -f /var/www/default/org.opentdp.bbs/composer.json ]; then
mdkir -p /var/www/default/org.opentdp.bbs
## install flarum ##
cd /var/www/default/org.opentdp.bbs
composer create-project flarum/flarum .
composer require flarum-lang/chinese-simplified
fi
3)Flarum 计划任务脚本
/srv/etc/periodic/5min/flarum-cron#!/bin/sh
#
cd /var/www/default/org.opentdp.bbs
php flarum schedule:run
chown -R 2:2 .
4)添加水印和回退图片
/srv/htdocs/fallback.png,找不到图片时使用这个图作为回退/srv/htdocs/watermark.svg,务必使用svg格式,否则会水印可能变形或模糊5)kubernetes 配置文件
/srv/myforum.yamlkind: Deployment
apiVersion: apps/v1
metadata:
name: &name myforum
labels:
app: *name
spec:
selector:
matchLabels:
app: *name
template:
metadata:
labels:
app: *name
spec:
containers:
- name: nginx-php8
image: rehiy/webox:nginx-php8.1
ports:
- containerPort: 80
volumeMounts:
- name: *name
subPath: etc
mountPath: /var/config
- name: *name
subPath: htdocs
mountPath: /var/www/default
- name: imgproxy
image: darthsim/imgproxy
env:
- name: IMGPROXY_READ_TIMEOUT
value: "30"
- name: IMGPROXY_WRITE_TIMEOUT
value: "30"
- name: IMGPROXY_MAX_SRC_RESOLUTION
value: "1200"
- name: IMGPROXY_WATERMARK_PATH
value: /htdocs/watermark.svg
- name: IMGPROXY_FALLBACK_IMAGE_PATH
value: /htdocs/fallback.png
- name: IMGPROXY_LOCAL_FILESYSTEM_ROOT
value: /htdocs
- name: IMGPROXY_IGNORE_SSL_VERIFICATION
value: "true"
- name: IMGPROXY_JPEG_PROGRESSIVE
value: "true"
- name: IMGPROXY_PNG_INTERLACED
value: "true"
- name: IMGPROXY_ENFORCE_AVIF
value: "true"
- name: IMGPROXY_ENFORCE_WEBP
value: "true"
ports:
- containerPort: 8080
volumeMounts:
- name: *name
subPath: htdocs
mountPath: /htdocs
volumes:
- name: *name
hostPath:
path: /srv
type: DirectoryOrCreate
---
kind: Service
apiVersion: v1
metadata:
name: &name myforum
labels:
app: *name
spec:
selector:
app: *name
ports:
- name: http
port: 80
targetPort: 80
---
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
name: &name myforum
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
rules:
- host: bbs.opentdp.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: *name
port:
name: http
IMGPROXY_READ_TIMEOUT 设置从源读取图像的超时时间(以秒为单位) IMGPROXY_WRITE_TIMEOUT 设置将图像写入客户端的超时时间(以秒为单位) IMGPROXY_MAX_SRC_RESOLUTION 设置源图像的最大分辨率(以像素为单位),超过此分辨率的图像将被拒绝 IMGPROXY_WATERMARK_PATH 设置水印图像的本地路径,如果启用了水印功能,imgproxy将使用此图像作为水印 IMGPROXY_FALLBACK_IMAGE_PATH 设置备用图像的本地路径,如果源图像无法加载或处理,imgproxy将使用此图像作为替代 IMGPROXY_LOCAL_FILESYSTEM_ROOT 设置本地文件系统的根目录,如果源URL以 local://开头,imgproxy将从此目录中查找文件IMGPROXY_IGNORE_SSL_VERIFICATION 设置是否忽略SSL证书验证,如果为 true,imgproxy将不检查源服务器的SSL证书是否有效IMGPROXY_JPEG_PROGRESSIVE 设置是否生成渐进式JPEG图像,如果为 true,imgproxy将生成可以逐步显示的JPEG图像IMGPROXY_PNG_INTERLACED 设置是否生成交错PNG图像,如果为 true,imgproxy将生成可以逐步显示的PNG图像IMGPROXY_ENFORCE_AVIF 设置是否强制使用AVIF格式,如果为 true,imgproxy将忽略请求中指定的格式,并始终生成AVIF图像(浏览器不支持则忽略)IMGPROXY_ENFORCE_WEBP 设置是否强制使用WEBP格式,如果为 true,imgproxy将忽略请求中指定的格式,并始终生成WEBP图像(浏览器不支持则忽略)
部署Flarum和Imgproxy服务
kubectl apply -f /srv/myforum.yaml
测试Imgproxy图片优化能力
https://bbs.opentdp.org/assets/files/2023-08-18/1692350245-285421-img30.jpg,观察图片是否正常显示。无论原图尺寸多大,默认将输出最大宽度为 1024px的图片查看图片右下角,将会显示我们添加的水印,且占最长边始终占图片对应边长的20%大小。 查看响应头信息,如果浏览器支持将包含 Content-Disposition: inline; filename="1692350245-285421-img30.webp"等类型信息。添加缩放参数,例如在图片地址后面添加 ?sm,将会生成一个最大宽度为640px的缩略图。更多参数如下:xs -- 320px sm -- 640px md -- 800px lg -- 1024px xl -- 1280px xxl -- 1600px 3xl -- 2048px 4xl -- 2560px 5xl -- 3264px 6xl -- 4080px