根据现有的libjpeg依赖修复ImportError

作者:matrix 发布时间:2024-06-25 分类:Linux Python

Python的Pillow库(PIL)处理图像时,可能会遇到库依赖问题,例如缺少libjpeg.so.9文件

from PIL import Image
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/work/.local/lib/python3.7/site-packages/PIL/Image.py", line 103, in <module>
    from . import _imaging as core
ImportError: libjpeg.so.9: cannot open shared object file: No such file or directory

正常来说是安装libjpeg库来解决 apt-get install libjpeg-dev / yum install libjpeg-devel 。但是我这台 CentOS机器之前有这个依赖,还有就是网络问题很麻烦

查找现有的libjpeg库文件

sudo find / -name "libjpeg.so*" 2> /dev/null

比如找到 /home/work/.jjjjbbbo/lib/libjpeg.so.9

方法 1.更新动态链接配置

软链接到系统库目录,并更新动态链接器配置

sudo ln -s /home/work/.jjjjbbbo/lib/libjpeg.so.9 /usr/lib/libjpeg.so.9
sudo ldconfig

说明:
ln -s 用于将找到的 lib 文件软链接到系统目录
ldconfig命令是更新动态链接器运行时绑定

方法 2.配置临时环境变量

不想修改系统配置,可以通过临时环境变量来解决

export LD_LIBRARY_PATH=/home/work/.jjjjbbbo/lib:$LD_LIBRARY_PATH
python3 -c 'from PIL import Image' # 执行测试,没有报错

配置LD_LIBRARY_PATH环境变量后,运行无报错,确认问题解决

验证库是否正确链接

ldd $(which python3)

ldd命令可以查看python解释器关联的依赖库路径。

还可以通过设置LD_DEBUG=libs 来输出动态链接库加载信息:

LD_DEBUG=libs python3 -c 'from PIL import Image'

开发环境配置本地自签SSL证书

作者:matrix 发布时间:2024-06-20 分类:Linux PHP Wordpress

项目地址:https://github.com/FiloSottile/mkcert

本地开发环境有时候需要模拟真实的https环境,那就必须得配置SSL证书了。自签SSL证书就可以搞定,这回尝试用mkcert工具生成和配置自签SSL证书。

安装mkcert

本地是 mac 环境,直接用brew安装

brew install mkcert

信任自签根证书

安装并让系统信任mkcert的自签根证书。

mkcert -install 

创建证书

mkcert "*.security.local"  localhost 127.0.0.1 ::1

security.local就是我本地开发环境运行的域名
127.0.0.1 ::1 是对应的本地 IPV4 IPV6
创建的证书和私钥文件会保存在当前目录中

配置Nginx

正常配置nginx文件(e.g. /etc/nginx/nginx.conf)
添加内容:

server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate /path/to/localhost.pem;
    ssl_certificate_key /path/to/localhost-key.pem;

    # ...其余配置保持不变
}

# 可以选择添加一个额外的服务器块来处理 HTTP 到 HTTPS 的重定向
server {
    listen 80;
    server_name localhost;
    return 301 https://$host$request_uri;
}

说明:

/path/to/localhost.pem
/path/to/localhost-key.pem
这俩路径是证书和密钥文件位置

之后重启或者 reload nginx就可以了。 完美~~

iStore软路由自定义DNS服务

作者:matrix 发布时间:2024-06-10 分类:零零星星

家庭网络使用iStoreOpenwrt软路由系统作为旁路网关可以更好的控制进出流量。比如拦截广告请求的域名,本地 server 域名...

局域网环境有一个常驻服务,这次给他配置一个专属域名homeserver.lan。只要设备接入家庭网络,不管客户端设置的什么DNS服务都可以使用。

静态IP配置

将常驻服务的IP固定,方便后续访问。我自己使用的 iKuai主路由配置。

iStore(Openwrt)的话可以参考下面形式自己设置:

打开iStore终端使用uci命令配置 dhcp 服务,或者自己在页面点击完成配置

命令行方式:

uci add dhcp host
uci set dhcp.@host[-1].name='homeserver.lan'
uci set dhcp.@host[-1].mac='AA:BB:CC:DD:EE:FF' # 绑定的 mac 
uci set dhcp.@host[-1].ip='192.168.11.11' # 需要访问的服务IP
uci commit dhcp

根据自己需要配置 mac 地址和 自己需要访问的IP

使用Dnsmasq配置DNS服务

目的:将软路由系统作为 DNS 服务器,自定义域名homeserver.lan映射到IP 192.168.11.11

iStore --> 网络 --> DHCP/DNS --> 主机名映射

命令行方式:

uci add dhcp domain 
uci set dhcp.@domain[-1].name='homeserver.lan'
uci set dhcp.@domain[-1].ip='192.168.11.11' #需要访问的服务IP
uci commit dhcp 

配置防火墙拦截 DNS 请求

目的是确保所有客户端的 DNS 请求都经过路由网关进行拦截,除非客户端手动配置 DNS 服务为路由网关 192.168.11.12。

iStore --> 网络 --> 防火墙 --> 端口转发

命令行方式:

uci add firewall redirect 
uci set firewall.@redirect[-1].target='DNAT'
uci set firewall.@redirect[-1].name='Redirect DNS' #自定义规则名称
uci add_list firewall.@redirect[-1].proto='udp'
uci set firewall.@redirect[-1].src='lan'
uci set firewall.@redirect[-1].src_dport='53'
uci set firewall.@redirect[-1].dest_ip='192.168.11.12' # 旁路由网关IP
uci set firewall.@redirect[-1].dest_port='53'
/etc/init.d/firewall restart

ping检测

使用ping命令检查连通性

% ping  homeserver.lan          
PING homeserver.lan (192.168.11.11): 56 data bytes
64 bytes from 192.168.11.11: icmp_seq=0 ttl=64 time=3.906 ms
64 bytes from 192.168.11.11: icmp_seq=1 ttl=64 time=4.432 ms
64 bytes from 192.168.11.11: icmp_seq=2 ttl=64 time=9.283 ms
64 bytes from 192.168.11.11: icmp_seq=3 ttl=64 time=4.778 ms

如果没通,可以清下DNS缓存

mac下清理DNS缓存信息

sudo killall -HUP mDNSResponder
sudo dscacheutil -flushcache

自定义域名注意

.local域名在 Mac、Linux、Windows系统下有特殊作用,就算DNS服务器配置了域名映射也无法正常使用。客户端可以nslookup命令查看DNS服务器配置的.local域名,但是无法完成网络请求。因为有mDNS协议的存在,.local会独立于其他域名进行处理。
如果你一定要使用.local,请遵循mDNS协议配置~ 见 利用mDNS协议使用局域网local域名服务

参考:
https://cloud.tencent.com/developer/article/1683190

利用mDNS协议使用局域网local域名服务

作者:matrix 发布时间:2024-06-05 分类:Linux

Multicast DNSmDNS)协议是一种用于网络设备自动发现的技术。通过mDNS协议,设备可以在局域网内声明自己的主机名,使其他设备不用配置域名DNS即可直接访问,非常方便~ 在Windows、Linux和Mac系统上,mDNS其实早就普及可用。

局域网中存在一台hostname为aaa的计算机,不管它是Windows还是Linux,用aaa.local可以找到它,这就是mDNS的功能


以 Debian 系统为例,为其创建局域网任何设备都可以访问的local域名。域名前缀就是机器名 hostname。我这里的名称是debianhs

Linux

Debian下需要安装avahi才能实现 mDNS 功能。avahi-daemon 可以支持 mDNS 的服务,允许设备在局域网内通过主机名相互发现和通信。

安装

sudo apt update
sudo apt install avahi-daemon

查看状态

sudo systemctl start avahi-daemon  # 运行服务
sudo systemctl enable avahi-daemon 
sudo systemctl status avahi-daemon # 查看服务状态

root@debianhs:~# systemctl status avahi-daemon
● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
     Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; preset: enabled)
     Active: active (running) since Sat 2024-06-01 19:27:36 HKT; 1h 51min ago
TriggeredBy: ● avahi-daemon.socket
   Main PID: 720 (avahi-daemon)
     Status: "avahi-daemon 0.8 starting up."
      Tasks: 2 (limit: 4644)
     Memory: 888.0K
        CPU: 149ms
     CGroup: /system.slice/avahi-daemon.service
             ├─720 "avahi-daemon: running [debianhs.local]"
             └─721 "avahi-daemon: chroot helper"

其他系统

Mac系统自带 mDNS 功能,Windows10及最新系统也都包含。
如果 Windows版本较低可以通过安装 Bonjour Print Services (Windows)来满足。

或者你觉得 mDNS 支持依然不能覆盖到局域网的所有设备,当然你可以通过软路由形式 DNS 服务器来解决。so~ 我就是这样双重覆盖😂

TIPS

mDNS使用的是 5353 端口
如果局域网下存在重复机器名debianhs,后续加入的设备域名会自动添加后缀 比如 debianhs-2.local,机器名不会自动更改

参考:

https://en.wikipedia.org/wiki/.local
https://en.wikipedia.org/wiki/Multicast_DNS
https://datatracker.ietf.org/doc/html/rfc6762
https://blog.beanbang.cn/2019/08/07/locate-hosts-using-mdns/

Windows 10如何ping计算机名之mDNS


https://wiki.noodlefighter.com/%E8%AE%A1%E7%AE%97%E6%9C%BA/Linux/linux%E7%9A%84local%E5%9F%9F%E5%90%8D/