Ubuntu20.04下安装配置uWsgi部署Flask

安装uWsgi

默认情况下,使用pip安装uWsgi会出现错误,需要首先安装python3-dev,如果安装python-dev会提示安装的是python2.7.

sudo apt install python3-dev
pip install uwsgi

配置、运行uWsgi

进入Flask项目根目录,下创建一个配置文件 myproject.ini:

[uwsgi]    
master = true    #启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。                
http = :5000   #服务端口
socket = :5000  #用于和 nginx 进行数据交互的端口
chdir = /home/login_user/app/FlaskWeb  #项目目录
wsgi-file = /home/login_user/app/FlaskWeb/FlaskWeb.py  #flask项目运行文件
callable = app  #设置在收到请求时,uWSGI加载的模块中哪个变量将被调用,本次flask项目里为“app”。
buffer-size = 65536  #设置用于uwsgi包解析的内部缓存区大小。默认是4k。
processes = 4 #服务进程数
threads = 8 #线程数
enable-threads = true #
max-requests = 2000 #最大请求数
daemonize = flaskweb.log #使进程在后台运行,记录日志
lazy-apps=true #各个进程都创建自己的app
virtualenv = /home/login_user/app #虚拟环境目录

运行uWsgi

uwsgi --ini myproject.ini

注意事项

  1. callable中app 指的是 flask 项目启动程序中定义的 flask name 的名字,并非py文件的名字
  2. 安装运行时会提示“chdir(): No such file or directory”错误,删除掉配置文件中的注释即可。
  3. 运行中会提示找不到数据库,主要因为uwsgi启动多进程时,会启动一个主进程初始化所有的app(其中包括数据库连接),然后将所有app复制到其他进程中。这就导致所有进程全部共用一个MySQL的连接。添加lazy-apps=true解决。
  4. 如果本机使用nginx,使用socket,如果通过frp,则选择http。

设置uwsgi自启动服务

创建 uwsgi.service 文件

在/etc/systemd/system目录下创建文件:

[Unit]
Description=uWSGI
After=network.target
 
[Service]
User=user
WorkingDirectory=/your/path/summary
#Environment=FLASKR_SETTINGS=/your/path/summary/env.cfg
ExecStart=/usr/local/bin/uwsgi --ini //your/path/summary/uwsgi.ini
 
[Install]
WantedBy=multi-user.target

启动、停止、重启、查看服务

sudo systemctl start uwsgi.service
sudo systemctl stop uwsgi.service
sudo systemctl restart uwsgi.service

加入、关闭系统自启动

sudo systemctl daemon-reload
sudo systemctl enable uwsgi.service
sudo systemctl disable uwsgi.service

解决pdfminer与pdfplumber冲突问题

python处理pdf文件,网上一般推荐使用pdfminer3k和pdfplumber这两个库。但如果安装这两个库,则会发生冲突,主要是pdfplumber无法导入。卸载掉pdfminer3k也不起作用,因为系统还会保留lib/python3.8/site-packages/下的pdfminer目录。

网上的解决办法中,无论是按照先pdfminer3k后pdfplumer顺序的,还是回退pdfplumber版本的,都不起作用。

如果二者得兼,可以使用以下办法:

首先安装pdfplumber,然后将pdfminer目录改名为Newpdfminer。

再安装pdfminer3k,安装完毕后将pdfminer目录改名为newpdfminer,然后将原Newpdfminer修改回pdfminer。

Jupyterlab重新启动后,导入包的时候使用newpdfminer代替pdfminer,比如:

from newpdfminer.pdfparser import PDFParser, PDFDocument

from newpdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

from newpdfminer.converter import PDFPageAggregator

from newpdfminer.layout import LAParams, LTTextBox

from newpdfminer.pdfinterp import PDFTextExtractionNotAllowed

这样就可以解决二者冲突问题。

不过测试了一下通过程序生成的pdf文件,号称以处理文本见长,但使用繁琐的的pdfminer3k出现了乱码,而简洁明了,以处理表格见长的pdfplumber反而没有出现乱码问题。

单域名解析情况下frp服务器端的设置

假期开始前把frp设置好,为异地办公做好最后的准备。

zerotier适合内网穿透组网,如果只是单纯访问内网的机器,frp更合适一些,因为可以配合域名解析随处访问,不用记ip地址。

frp功能强,设置简单,服务端配置文件简单到只需要一行bind_port即可。

往往越是简单,坑反而越多,网上与此相关的文章帖子,自相矛盾的甚多,有的大呼出坑其实只是跳入另一个坑里。真是怀疑他们有没有实际配置运行过。

问题主要出在二级域名解析上。如果涉及到具体域名解析,而不是泛域名解析,frps端的配置文件中,需要增加一行vhost_http_port端口配置。这是frp服务器端监听的端口,绝不是可以删掉,只需要在客户端指定remote_port就可以强令服务器端开发该端口的。

如果配合Nginx做反向代理,那么监听的端口无论多少域名,都是vhost_http_port即可。

ubuntu 20.04下安装Poppler解决pdf压缩

因为昨天生成的检测报告数量多,总体的文件包大了很多,这样下载就需要非常长的时间,所以动了压缩文件的念头。

通过Python压缩pdf文件,网上一般都是推荐使用PyMuPDF包。其实原理跟我原先文字识别图片版pdf一样,就是通过将PDF文件切分转化为相应压缩率的图片,保存到本地后,再将图片合成PDF文件。

测试了几个文件后,效果并不好,体积减少一半后清晰度就非常差了。

于是转换一下方式,不再通过PyMuPDF包转化图片,而是使用原先的pdf2image包,这样可以指定图片的分辨率,能更好保证图片质量。

但运行程序的时候遇到麻烦,系统提示未安装poppler。使用pip安装总是提示失败。

上次使用这个程序,还是儿子上网课的时候,时间久远,已经忘了当时怎么解决。于是上网搜寻解决办法,基本都是git源码,然后编译,而且之前还要编译最新版的Cmake。

经过一番折腾,问题依然如同pip安装失败提示一样。

最后脑子似乎有点印象,使用sudo apt-get install poppler-utils,问题轻松解决。

换了新方法之后,在100dpi分辨率下,无论使用img2pdf,还是PyMuPDF包生成pdf文件,同体积下清晰度都有了明显提升。

商业软件价高有理

不用再跟柯基斗智斗勇,可以有足够时间开始数据库的准备工作了。

因为条件所限,目前还是使用原先伟东的服务器。原先一直使用免费的Robo 3T作为MongoDB的客户端,在下载安装之前,脑子一动,反正也是新安装,就先下载了一个网上最为推崇的Navicat试用版。

结果一试用,好家伙,商业软件就是商业软件,跟它一比,Robo 3T简直就是石器时代产品。

又到网上查询一下,破解软件虽然已经有所收敛,但仍能轻易找到,而且破解过程简单有效,不比当年的破解Delphi等难多少。

我当IT良民已经很多年了。而最初对商业收费软件敬而远之,起因就是Navicat取消lite免费版。

也就是在找到免费的heidisql作为替代品之后,感觉商业软件不过如此。

现在看来,真是贫穷限制了我的想象力。

购买欲望冷却的kindle paperwhite5

早上看新闻,kindle pw5推出,最大的变化就是面板由6寸升级为6.8寸,像素依然为300PPI,内部存储8GB,国行价格1068元。
当时第一反应就是这个价位无敌了。
但回头想想,其实提升并不显著,首先要面对,反而是自家前辈产品的竞争。
国产这个价位的电纸书,尺寸一般是7.8寸,主要针对的是漫画与需求不高的PDF,基本算是盗版的主流,这显然是kindle无意竞争的领域。
由此看,面板提升至6.8应该是无针对性的,属于发展性的提升,也是日后kindle的标配。而其他诸如Type-C接口等,都属于技术性的提升,不值一提。
这样以来,如果要看亚马逊正版图书,新产品吸引力并不大,所以价格并未上涨多少。
如此一来,这反而有些让我购买咪咕版kindle的决心有些坚定了。毕竟不足300元的原版产品,质量以阅读速度,非基于安卓系统的国产电纸书所能比的。

博阅likebook Mars电纸书刷机

前天本来想读书,结果拿出带来的博阅电纸书开机,始终停留在开机滚动状态。按照老办法,任其开机将电耗光,充电后,状况依旧。

也就是说死机了,严重点就是变砖了,唯一解决办法就是刷机。

刷机这事以前没少干,从迈拓的硬盘盒子,到败家子HP的webos平板,再到后来的小米手机。只是近些年来懒得折腾了,如果不是这个电纸书花了1000多块钱买的,我就直接扔一边换kindle了。

刷机网上攻略不少,需要的无非还是驱动、刷机工具、固件。前两个都好说,就是固件不好找。博阅官网干净得很,一点指望不上,而能下载的网站都是需要邀请码的论坛,估计是民间售后网站,只是对购买他们产品的用户提供服务。

这也难不倒咱,这是国内垄断,外国人实诚没这心眼。果然通过谷歌很快搜到了,做了一顿晚饭的功夫,下载完成。

安装好驱动,打开刷机工具后usb连接电纸书,老办法牙签顶住reset孔同时摁住开关机不松手,直到刷机工具提示找到loader设备。选择下载的T80D固件img文件,开始刷机。很快刷机提示完成,并重启机器。

重启之后,电纸书原先白屏变黑屏了,死的更彻底了。

死马当活马医,就当死白马变黑马了。

对比一下国内外的教程,发现唯一区别在刷机工具,都是瑞芯微的量产软件,只不过国外使用的是AndroidTool,国内使用的是FactoryTool。于是下载最新版的FactoryTool,重新刷机。

十分钟不到,机器满血复活了。

想想kindle用了这么多年,最多来个重启,这个博阅两年没用多少次,还时不时闹个罢工,以后国产电纸书不碰也罢。

N厂大刀小刀显卡花式多

今天到单位,有看到我在用外甥原先计算机的,很是奇怪,说原先这台机器不能用了。问其原因,说是缺少一根数据线。

原来他们把计算机跟显示器的的数据线两头搞反了。原机器用的不是HDMI数据线,而是雷电数据线,而显示器那边应该用miniDP接口才对。

等于白捡了一台计算机,外甥想要回去就难了。

对这台机器已经觊觎许久了,主要是小小的身躯里面,居然安装了gtx1060显卡。这样平时偶尔可以跑一下katago,而儿子放假有时间也可以用它玩一玩游戏。

这款显卡当时外甥说是3G显存,而p106系列的显卡一般都是6G显存,3G显存的多是p106-90,也就是矿卡,核心被砍掉一半,只有640个。

下载了一个GPU-Z测试了一下,显示的的确为p106,但是核心只有1152,小小被砍了一刀。

老黄大砍,厂商小砍,上梁不正下梁歪啊。

Oracle云服务器下配置免费ssl证书(Let’s Encrypt)

Oracle云的web服务器使用的是nginx,在打开相应端口后,就可以访问网页。如果使用HTTPS,还需要安装配置ssl证书,目前免费的证书是Let’s Encrypt,三个月需要更新一次。

ubuntu下的Let’s Encrypt证书申请是通过certbot维护,现在已经非常简单,不再像原先那么繁琐。

安装certbot

#  sudo apt install certbot

初次安装证书

# certbot certonly

第一次申请的时候,会要求输入邮箱,这是为了到期邮件提醒。然后选择证书种类。

How would you like to authenticate with the ACME CA?

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

1: Spin up a temporary webserver (standalone)

2: Place files in webroot directory (webroot)

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel):

因为是安装在服务器中,所以选择2

Please enter in your domain name(s) (comma and/or space separated) (Enter ‘c’

to cancel):

然后让输入域名。

Input the webroot for img.aaaa.net: (Enter ‘c’ to cancel):

输入域名所属网站所在的目录,如/var/www/html/img,其中域名必须已经配置完成而且目录已经建立,在此基础上,免费证书就申请成功了。

证书下载在 /etc/letsencrypt/live/相应域名目录下。

更新证书

Let’s Encrypt 签发的 SSL 证书有效期只有 90 天,证书到期前会受到邮件通知,可以通过certbot更新,更新前需要停止nginx运行。

# certbot renew

Oracle云服务器下filezilla密钥解决办法

原先ftp客户端使用的是Winscp,体积小功能齐全,界面也要比filezilla看着舒服多了。

后来使用GPU云服务器运行katago,发现Winscp的密钥只支持putty生成的密钥,究其原因是Winscp使用的是putty作为SSH登录工具,这样就无法使用windows系统ssh生成的密钥。

无奈只好启用winscp,转回界面实在难看的filezilla。

下午配置Oracle云服务器,上传文件的时候,遇到了点麻烦。其云服务器创建时如果选择密钥登录,同阿里云等一样,只认Windows系统ssh生成的密钥。国内云我一般解决这个问题,是创建后,在ssh的认证文件后面添加putyy的密钥,这样两种格式的密钥就都可以使用了。

但这一招在Oracle云上失效了。filezilla默密钥也是.ppk格式,但无法登录。使用ssh登录系统查看一下,发现认证文件内容与国内两云不同,所以老方法无效。

折腾许久,索性在选择密钥文件时,文件格式选择所有,然后选择Windows生成的密钥文件。

问题就这么解决了。