一、
这一篇讲述一些最后部署中遇到的一些问题,比如云服务器的防火墙问题,在服务器上使用pip3下载库以及定时运行python脚本,和mysql不同版本之间导入sql文件存在的问题等。
二、
首先是关于云服务器中防火墙的问题,阿里云首先提供了安全组,在之前的博客中我们也曾经介绍过,需要对入方向组添加对应端口才能访问到云服务器,安全组,就是为了服务器安全设置的。其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
在购买阿里云ECS服务器的时候,阿里云默认安全组只放行了ICMP协议、SSH 22端口、RDP 3389端口三个端口,访问网站的80或443端口并没有放行
这里我们添加了我们所需的几个端口:
协议类型,我们选择自定义的TCP;
端口范围,这里要求填写的是一个范围,所以我们要写80/80。
授权对象,这里我们要让所有人都可以访问,所以我们要写0.0.0.0/0
优先级,填一到一百的数字,数字越小,优先级越高好了。
源,0.0.0.0/0代表允许所有ip访问该端口
点击确定我们在安全组里的80端口就已经打开了。除了以上场景,安全组还用于设置内网互通拦截特定的IP和端口,只允许特定的IP来登录服务器,或者只允许读取访问公网上的某个特定的IP。
下面是一些常用端口:
- 22:SSH(安全登录)、SCP(文件传输)、端口号重定向
- 21:FTP(文件传输)协议代理服务器常用端口
- 39000/40000:FTP被动模式常用端口
- 80/8080/3128/8081/9098:HTTP协议代理服务器常用端口号
- 23:Telnet(不安全的文本传送)
- 3389:windows RDP远程登录
- 1521:Oracle数据库
- 3306:MySQL
我们这里选择了一个非常用端口8443作为我们后端服务器接口 。
但是在我们实际部署项目的时候发现即使添加了安全组,仍然无法访问到我们所需要访问的接口,经过一系列的实验,最后我们把问题锁定在云服务器操作系统上,很显然,如果操作系统拒绝了对端口的访问,那我们从外部也无法通过端口访问到服务器。
那么接下来就是对服务器的防火墙进行设置,centos7默认的防火墙从原来的iptables变为了firewalld(阿里云的centos默认没有开启防火墙,但不知道为什么我们的系统开启了)。因此,在使用阿里云服务器时,不仅要在阿里云后端开放端口,同时在关闭centos的防火墙或者在操作系统中也开放对应的端口,才能进行访问。
1、 /usr/lib/firewalld/services 系统配置目录
目录中存放定义好的网络服务和端口参数,系统参数,不能修改
2、 /etc/firewalld/ 用户配置目录
3、自定义添加端口的方法:
firewall-cmd --permanent --add-port=9527/tcp
参数如下:
1、firewall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为持久;
3、--add-port:标识添加的端口;
4、常用的firewall命令
systemctl start firewalld # 启动,
systemctl enable firewalld # 开机启动
systemctl stop firewalld # 关闭
systemctl disable firewalld # 取消开机启动
service firewalld restart # 重启firewall-cmd --state # 查看firewall状态
firewall-cmd –list-all # 查看防火墙规则
根据自己的要求添加端口即可。
下面是有关在阿里云服务器上使用pip3的方法,其实主要是介绍使用镜像的方式,否则会导致在下载库的时候十分缓慢
进入根目录下(~),查看.pip文件夹是否存在,不存在则创建,进入该目录,创建pip.conf文件,写入如下内容,即可在下载时使用阿里云的镜像:
python查询数据库时可能会出现 当小数点较长时,python会自动将其转为科学技术法,如下:
[{'merchant_price': Decimal('14.00000000'), 'platform_price': Decimal('15.0000000'), 'user_id': 3, 'supplier_price': Decimal('2.00000000')}]
即使用Decimal对象保存的形式,这样常导致数据不是我们所期望的样式。
解决方式:
在写SQL语句时使用如下转换函数:
CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型。CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。
语法:CAST (expression AS data_type)
expression:任何有效的SQServer表达式。
可以转换的类型是有限制的。这个类型可以是以下值其中的一个:
二进制 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED
最后在python中获取的数据就是我们所需要的类型了。
下面是有关mysql版本问题导致的sql文件无法执行的问题,因为在本地开发是使用的是本地的数据库,在将本地数据库导出为sql文件,再向服务器数据库导入sql文件是最方便的的方式。这里本地使用的mysql 8.0.22,服务器使用的是mysql 5.6
在迁移时报错:
ERROR 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci'
也就是编码的问题,因为高版本mysql和低版本所使用字符集不同导致,因此需要我们将从本地 服务器导出的sql文件中的编码更改:
utf8mb4_0900_ai_ci替换为utf8_general_ci
utf8mb4替换为utf8
重新保存后即可在在低版本的mysql中运行sql文件。
下面是有关在centos操作系统下定时运行python脚本的问题,关于定时运行python程序的问题,其实python自己也提供了调度器完成这个任务。不过这里我觉得直接使用操作系统的定时方法也是简单便捷
centos中的定时任务:
在centos中使用crontab进行定时任务的处理,高版本的centos已经安装有crontab。
在正式使用 crontab 前,需要提前了解一下 crond , crond 和 crontab 是密切相关了, crond 是 linux 中用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows的计划任务类似, crontab 是一个编辑或者说是管理定时任务的工具。
简单理解就是 crond是一个服务,crontab是一个命令。
下面是与之相关的命令:
yum install crontabs
systemctl enable crond (开机启动)
systemctl start crond(启动 `crond` 服务)
systemctl stop crond(停止服务)
systemctl restart crond (重启服务)
systemctl reload crond (重载配置文件)
systemctl status crond (查看状态)
crontab文件:
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
crontab -l # 查看已经开启了哪些定时任务
crontab -u # 设定某个用户的crond服务
crontab -e # 编辑crontab文件(编辑定时任务)
crontab -r # 删除crontab文件(删除定时任务)
crontab -i # 删除crontab文件提醒用户(删除定时任务)
下面是介绍具体的定时任务如何设置,上面已经提到,crontab设置定时任务有如下的格式:
minute hour day month week command
分别代表:分,时,日,月,周,命令
每个字段的具体设置如下:
第1列表示分钟1~59 每分钟用 * 或者 */1 表示;
第2列表示小时1~23(0表示0点);
第3列表示日期1~31;
第4列表示月份1~12;
第5列标识号星期0~6(0表示星期天);
第6列要运行的命令;
* :任意时间,可以代表00-23小时或者00-12每月或者00-59分,例如 0 9 * * * cmd 表示每月每周每日的 9:00 都执行cmd任务;
- :表示一个范围,例如 00 17-19 * * * cmd,就是每天17, 18, 19点的整点执行命令;
, :是分割时段,例如 30 1,3,5 * * * cmd,就是每天凌晨1点30,3点30,5点30都执行命令;
/n :n 为数字,表示分割,每隔 n 单位时间,可以看成除法,*/6 * * * * cmd,每隔6分钟执行一次。
下面是设置定时任务 ,使用如下命令打开任务文件,向任务文件中写入上述定时命令,一行代表一个定时任务。
crontab -e # 直接写入定时任务
service crond reload # 重新加载配置
service crond restart # 重启crontab
如下命令
*/1 1-2 * * * root python3 test1.py > test1.log
*/1 1-2 * * * root python3 test2.py > test2.log
注意要将所要执行文件的路径写全,> 待表将标准输出定向到后面所指向的文件中。
文章评论