menu

Chancel - 陷阱

rss_feed lightbulb_outline

陷阱列表(24)

Transmission - Transmission-daemon.service: Main process exited, code=killed, status=9/KILL

最近给一台 256M Ubuntu VPS安排上Transmission,结果启动之后总是莫名其妙崩溃了

使用 sudo journalctl -u transmission-daemon 从日志里只能看到下面的输出,这输出来跟没输出了似的..

Jun 01 15:25:41 chancel systemd[1]: transmission-daemon.service: Main process exited, code=killed, status=9/KILL
Jun 01 15:25:41 chancel systemd[1]: transmission-daemon.service: Failed with result 'signal'.
Jun 01 15:25:50 chancel systemd[1]: Starting Transmission BitTorrent Daemon...

大致猜测跟内存有关系,因为安装还是以往那样安装,这台唯一奇葩的地方就是内存小

先看看内存情况 free -h,输出如下

chancel@chancel:~$ free -h
              total        used        free      shared  buff/cache   available
Mem:           229M        191M        3.4M          8K         34M         30M

尝试创建swapfile文件来缓存

sudo touch /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1024 count=1024000
sudo mkswap /swapfile
sudo swapon /swapfile

重启之后果然就正常了,此时内存输出如下

chancel@chancel:~$ free -h
              total        used        free      shared  buff/cache   available
Mem:           229M        191M        3.4M          8K         34M         30M
Swap:          999M        202M        797M

为了正常使用,建议最好开机挂载swapfile

Other2020-06-01 23:44:17

Proxmox - PVE虚拟Windows10 CPU 占用高

使用PVE虚拟Windows10时,发现CPU占用特别高,于是更改了虚拟机的Processors设置,改为HOST并调整核心数一致,此时Windows理论性能应等同于物理机

但奇怪的是开启Windows之后CPU占用依旧非常高,开个Chrome都能占用100%,查看系统设置,发现Windows系统属性处仍然显示KVM CPU

很明显更改没生效,已确认重启过,最后思来想去,发现是快速启动的问题

控制面板-硬件和声音-电源选项-选择电源按钮功能处关闭快速启动之后重启即正常(奇怪的是他那里写着快速启动不影响重启),如下图

Other操作系统2020-05-07 15:14:44

Firewalld - 端口转发且只允许指定IP访问该端口

给服务器做备份时候遇到一个比较复杂的Firewalld防火墙转发问题,先描述一下问题背景

A机器是准备用来备份数据库的机器,网卡IP假设是

  • 224.24.24.24

B机器是应用服务器,有两张网卡它们IP假设分别是

  • 223.23.23.23(外网)
  • 192.168.1.20(内网)

C机器是数据库服务器,只有有一张网卡且IP假设是

  • 192.168.1.24

数据库位于C机器且只监听 192.168.1.24这张网卡,应用部署于A服务器,直接通过内网网卡与B机器数据库交互

现在希望用A服务器来备份C服务器的数据库,那么思路是分为2步

  1. B机器某个端口进行转发,转发到C机器上的数据库端口
  2. B机器允许A机器的访问第1步里设置的转发端口,且也只允许来源为A机器的IP进行访问

按照这个思路动手,首先是Firewalld要转发端口要用到的IP伪装功能,查询IP伪装开启状态

sudo firewall-cmd --query-masquerade # 输出如果是NO说明没开启

firewall-cmd --add-masquerade --permanent # 开启IP伪装

然后将端口进行转发,假设C服务器的数据库端口是3306,我们要把B机器的33306转发到C机器的3306

在B机器上执行2个步骤如下

# 1. 将A机器访问的端口进行转发,转发到C机器上
sudo firewall-cmd --add-forward-port=port=33306:proto=tcp:toaddr=192.168.1.24:toport=3306 --permanent
# 2. 允许A机器的访问自己的转发端口且只允许来源为A机器的IP
sudo firewall-cmd --add-rich-rule="rule family="ipv4" source address="224.24.24.24" port protocol="tcp" port="33306" accept" --permanent

# 重新载入配置
sudo firewall-cmd --reload 

思路觉得是没问题的,执行之后使用 sudo firewall-cmd --list-all 可以查看规则效果

但测试之后发现即使来源IP不是A机器也能访问B机器的33306端口,显然第2步的设置无效

对于防火墙的原理了解不多,猜测是直接开启端口流量转发之后是RICH规则不再对端口进行限制了

那么思路应该还是没问题的,在设置上考虑了下,也许转发可以直接在 rich rules写明才有效?于是取消掉了前面设置的端口转发

# 1. 取消 允许A机器的访问自己的某个端口且只允许来源为A机器的IP
sudo firewall-cmd --remove-rich-rule="rule family="ipv4" source address="224.24.24.24" port protocol="tcp" port="33306" accept" --permanent
# 2. 取消 将A机器访问的端口进行转发,转发到C机器上
sudo firewall-cmd --remove-forward-port=port=33306:proto=tcp:toaddr=192.168.1.24:toport=3306 --permanent

那么尝试改成

sudo firewall-cmd --add-rich-rule = "rule family="ipv4" source address="224.24.24.24" forward-port port="33306" protocol="tcp" to-port="3306" to-addr="192.168.1.24""

再测试下,发现现在只有IP为 224.24.24.24才能访问 B机器的33306端口,其他机器访问会直接显示faild

Other2020-04-03 15:53:49

单臂路由 - 访问国内网站不正常

最近一段时间使用Hyper-v虚拟的Openwrt单臂路由总是访问国内网站速度慢到不正常,即便改了DNS配置也是一样的表现

相反另外一台的双网口Openwrt就没有这种表现,于是上网查找了一番,发现有一个方法是可靠的,在Openwrt中的Lan防火墙自定义规则中加入

iptables -t nat -I POSTROUTING -j MASQUERADE

暂时不明白这句话的作用,但实际是有效果的,留个坑日后来填!

Other2020-03-22 02:13:57

invalid privatekey: [B@3e50d0c8 - DBeaver

使用SSH通道连接测试服务器的Mariadb服务出现提示

invalid privatekey: [B@3e50d0c8

这种情况是在使用非对称加密的私钥登录时出现,在确定密钥可以正常SSH连接服务端,排除密钥问题发现可能是OpenSSL生成的密钥版本问题

重新生成对钥,添加参数 -m PEM 生成证书之后连接一切正常

完整指令参考

ssh-keygen -t rsa -b 2048 -m PEM

DATABASE2020-03-15 19:41:18

Cent7OS安装指定版本MySQL方法

MySQL有许多版本,分为付费跟收费的版本,简单罗列如下

  • MySQL Community Server
    • 社区版本,开源免费,但不提供官方技术支持。
  • MySQL Enterprise Edition
    • 企业版本,需付费,可以试用30天。
  • MySQL Cluster
    • 集群版,开源免费。可将几个MySQL Server封装成一个Server。
  • MySQL Cluster CGE
    • 高级集群版,需付费。
  • MySQL Workbench(GUI TOOL)
    • 一款专为MySQL设计的ER/数据库建模工具。它是著名的数据库设计工具DBDesigner4的继任者。
  • MySQL Workbench OSS
    • MySQL Workbench社区版
  • MySQL Workbench SE
    • MySQL Workbench商用版
  • MySQL Community Server
    • 开源免费的,这也是我们通常用的MySQL的版本。根据不同的操作系统平台细分为多个版本

安装指定版本的方法也很简单

  1. MySQL官网下载合适系统版本的repo库

  2. 将下载的repo包安装到仓库

     # 先查看repo包包含哪些包
     rpm -qpl mysql80-community-release-el7-1.noarch.rpm
     # 安装repo
     rpm -ivh mysql80-community-release-el7-1.noarch.rpm
  3. 指定我们要的版本,编辑完成后保存即可

     # enabled=0禁用版本,enabled=1启用指定版本
     vim /etc/yum.repos.d/mysql-community.repo
  4. 查询已经启用的版本

     yum repolist enabled | grep mysql
  5. 如果输出里面有你要的版本,那就直接安装就OK了

     yum install mysql-community-server

DATABASE2020-01-08 14:33:37

Flask SQLAIchemy - 给Model对象添加to_dict方法让让所有查询带上外键对象

后台项目使用SQLAIchemy作为ORM框架,为了方便直接返回数据对象,在Model处加了一个自定义的 to_dict方法

to_dict方法将所有的colunm转换成键值类型

这样一来,根据条件查询结果之后只需要直接 to_dict() 并dump成Json即可返回给前台所有数据对象

示例代码如下

from flask_sqlalchemy import SQLAlchemy
Model = SQLAlchemy().Model
Model.to_dict = lambda self: {c.name: getattr(self, c.name, None) for c in self.__table__.columns}

# 文章类型表
class TArticleType(Model):
    __tablename__ = 't_article_type'

    id = Column(INTEGER(3), primary_key=True)
    t_type = Column(String(255), nullable=False)

# 文章表
class TArticle(Model):
    __tablename__ = 't_articles'

    id = Column(INTEGER(10), primary_key=True)
    a_title = Column(String(50), nullable=False)
    a_type = Column(ForeignKey('t_article_type.id'),
                    nullable=False, index=True)
    update_time = Column(DateTime)

    t_article_type = relationship('TArticleType')

但这样有个缺陷,我返回文章列表的时候,前台需要根据 a_type 的值再次请求查询文章类型名称,后台需要增加接口提供给前台查询对应ID的文章类型名称

显而易见,在查询文章的时候,我希望直接返回文章的类型信息(包括id和类型名称),一开始做的方案是直接在查询的时候手动添加一次查询文章类型表的操作,如下

articles = TArticle.query.filter().order_by(desc(table_obj.id)).limit(10)
for art in articles:
    art.a_type = TArticleType.query.filter(TArticleType.id == art.a_type).first()
_list = []
for _new in articles:
    _list.append(_new.to_dict())
return json.dumps(_list, ensure_ascii=False, default=lambda obj: obj.__dict__)

然而分页已经做了全局封装,没有机会这样手动修改返回对象代码,更多的情况是调用封装好的分页方法将对象传进去,如下

 return get_table_page_data(TArticle)

即使我们修改了 get_table_page_data 方法,还需要修改to_dict()方法,目前to_dict()方法只是转换了所有的colunm,并不包含自定义元素

那么既然要修改to_dict方法,不如直接在to_dict里将外键列表也转换成一个属性,代码如下

def to_dict(self):
    _dict = {}
    for c in self.__table__.columns:
        _dict[c.name] =  getattr(self, c.name, None)
    # 循环遍历属性,获取Model对象的属性
    for attr in dir(self):
        if isinstance(getattr(self,attr),Model):
            _dict[attr] = getattr(self,attr).to_dict()
    return _dict

Model.to_dict = to_dict

至此,完成了一个自动将Model子类对象转换成包含外键对象的键值类型对象

PYTHON2020-01-07 17:08:15

Mariadb - 配置远程访问显示"connect reset"错误

今天在内网机器上搭建一个测试MariaDB数据库,按照习惯配置远程访问

CREATE USER chancel@chancel IDENTIFIED BY 'chancel';
GRANT ALL PRIVILEGES ON chancel_api.* TO 'chancel'@'192.168.11.13' IDENTIFIED BY 'chancel' WITH GRANT OPTION;

然后在远程机器上访问到时候弹出了connect reset,这很明显说连接到端口就被拒绝了,看了下防火墙也是打开3306的默认端口,猜测下可能是MariaDB的问题

查查3306端口的情况

chancel@chancel-nas /etc/mysql/mariadb.conf.d » netstat -ntulp | grep 3306
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      127.0.0.1:3306            0.0.0.0:*               LISTEN 

显然说db绑定了127.0.0.1的本地端口导致外网连接不了,找一下MariaDB到配置文件,编辑‘127.0.0.1’并改成'0.0.0.0'即可

chancel@chancel-nas ~» vim  /etc/mysql/mariadb.conf.d/50-server.cnf

...
bind-address        = 0.0.0.0 # 编辑‘127.0.0.1’并改成'0.0.0.0'即可
...

DATABASE2020-01-07 17:05:19

Widnows - HTTPS双向认证客户端证书无法正常显示问题

因为工作项目牵扯到一个客户端认证,网站做了一个基本的HTTPS双向认证,测试没有问题,测试效果如下

结果正式使用之后发现部分Windows7无法在访问网站的时候正确出现证书选择,明明证书已经安装了,Google了很久也没有查到相关资料(可能自定义客户端证书用的人不多)

访问网站之后直接被判定为没有证书,效果如下

这个问题困扰了整整一周,连chrome都差编译出来看看到底里面为什么没调到证书,最后发现一个规律

在重启之后的前半分钟(不太固定)证书是能正确显示的,这个线索很重要,提示了应该是某个服务破坏了证书的验证机制,遂逐个逐个服务关掉

在关掉一个服务之后果然证书就正常了,如图

至于原因还没有找到,后面再详细看看这个服务是做什么的(但其实应该是某些流氓软件篡改了系统设置,因为测试正常安装的Windows7并没有这个问题)

Other操作系统2019-12-20 17:14:45

Gnome - 设置默认打开文件/文件夹的程序

最近Gnome从Chrome打开下载文件的文件夹总是用VSCODE打开让我惊呆了

查了一下资料,根据reddit.com提供的资料我们可以重新设置打开文件夹的工具为 org.gnome.Nautilus.desktop

在终端执行

gio mime inode/directory org.gnome.Nautilus.desktop

Other操作系统2019-10-29 15:13:05

搜索

分类

19 Other
1 JavaScript
3 DATABASE
1 PYTHON

标签