
康佳,车财网CTO,毕业于电子科技大学。2013 年进入 IT 行业,在工作的过程中累计了丰富的技术、管理经验。对互联网金融行业相关技术有深入的研究,对安全攻防、加密体系、部署方案有独到的见解,带领团队完成过三级等保的系统建设。现加入 MVP 成员,希望能与大家分享交流
概述 家里闲置着一台老款的Mac mini Server,跑OS X越来越慢,索性装上了Cent OS 7,变成了一台家庭服务器,装上了Plex媒体服务器和Transmission下载服务,同时,也装上了Nginx、Mysql、MongoDB、Redis等,可以调试代码,甚至担当一些小型项目的服务器。不过,只在家庭内网使用,功能太有限,于是接下来面临的一个问题就是内网穿透。使用过花生壳和花生棒,服务相当不稳定,而且种种受限,每要多加一个端口就要多花钱,安全性也有问题。其实想想,内网穿透的最大难题无非就是家里是动态公网IP,每变换一次公网IP,需要重新解析一次域名。而阿里云等大型的云服务商,目前都已经实现了域名解析管理的API接口,而且基本都是立即就可生效 。所以我的思路就是,系统运行一个定期执行的程序,每隔一段时间扫描一下最新的公网IP,如果发现最新的公网IP与域名解析到的IP地址不一致,就通过阿里云API自动更新解析设置即可。这样的花费不过每年一个域名的费用,最贵也就几十块钱。 具体实现步骤 阿里云设置首先,要确定一个准备用于外网访问的域名,并将此域名转入到阿里云的云解析服务来解析。如图所示,添加需要管理的域名。 转入后,在解析设置中,设置一下A记录解析,解析的IP地址可以填当前的公网IP。如果不知道自己的公网IP,在CentOS系统下,可以输入使用以下命令获取当前的公网IP。 > curl ifconfig.me 获取公网IP后,在阿里云云解析中设置完A记录解析。 在阿里云账户管理后台,点击右上角的账户头像,然后点击accesskeys,或者直接登陆 https://ak-console.aliyun.com,获取阿里云的AccessKeyID和AccessKeySecret。 路由器设置阿里云的设置完成后,需要对路由器设置端口映射,使外网对公网IP的端口访问能转发到内网服务器的相应端口。绝大部分的路由器都支持端口映射。 常见的服务端口包括,用于WEB访问的80端口、SSH远程管理的22端口、Mysql数据库的3306端口、Transmission下载服务管理的9091端口和Plex媒体服务的32400端口等等。不用花生壳的好处就是没有端口数量限制,想设置多少就可以设置多少。当然,在设置端口映射之前,应确保服务器的内网IP已经设置为静态IP,而不是DHCP动态获取。 服务器设置服务器端安装好想要使用的各种服务后,别忘了在防火墙中开启相应的端口,在CentOS 7中,防火墙永久开启端口的命令是: > firewall-cmd --add-port=80/tcp --permanent 开启之后别忘了重新载入防火墙的设置以使其生效,命令如下: > firewall-cmd --reload 自动更新域名解析程序准备工作都做好了,接下来就是通过程序检测公网IP,并在公网IP发生变化时,及时更新阿里云的域名解析。 这个程序是用Python写的,先使用Python的包管理工具pip下载安装阿里云的Python SDK。如果没有安装pip,则先安装pip: > yum install pip 安装好pip后,安装阿里云的Python核心SDK以及云解析SDK: > pip install aliyun-python-sdk-core > pip install aliyun-python-sdk-alidns 导入项目所需要的包,如果缺少则使用pip安装: import os import json from urllib2 import urlopen from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest 完整代码如下: #!/usr/bin/env python # coding= utf-8 import os import json from urllib2 import urlopen from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest class DnsHandler: # 从阿里云开发者后台获取Access_Key_Id和Access_Key_Secret access_key_id = "" access_key_secret = "" # 填入自己的域名 domain_name = "" # 填入二级域名的RR值 rr_keyword = "" # 解析记录类型,一般为A记录 record_type = "A" # 用于储存解析记录的文件名 file_name = ".ip_addr" client = None record = None current_ip = '' # 初始化,获取client实例 def __init__(self): self.client = AcsClient( self.access_key_id, self.access_key_secret, self.region_id ) self.record = self.get_record() self.current_ip = self.get_current_ip() # 如果公网IP发生变化,则自动修改阿里云解析记录 def reset(self): if self.current_ip <> self.get_record_value(): print self.update_record(self.current_ip) self.get_record() # 获取阿里云域名解析完整记录,并使用文件缓存 def get_record(self): if os.path.isfile(self.file_name) : file_handler = open(self.file_name, 'r') r = file_handler.read() file_handler.close() else : request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest() request.set_PageSize(10) request.set_action_name("DescribeDomainRecords") request.set_DomainName(self.domain_name) request.set_RRKeyWord(self.rr_keyword) request.set_TypeKeyWord(self.record_type) r = self.client.do_action_with_exception(request) file_handler = open(self.file_name, 'w') file_handler.write(r) file_handler.close() return json.loads(r) # 获取阿里云域名解析记录ID def get_record_id(self) : return self.record["DomainRecords"]["Record"][0]["RecordId"] # 获取当前域名解析记录 def get_record_value(self) : return self.record["DomainRecords"]["Record"][0]["Value"] # 修改阿里云解析记录 def update_record(self, value): request = UpdateDomainRecordRequest.UpdateDomainRecordRequest() request.set_action_name("UpdateDomainRecord") request.set_RecordId(self.get_record_id()) request.set_Type(self.record_type) request.set_RR(self.rr_keyword) request.set_Value(value) return self.client.do_action_with_exception(request) # 获取当前公网IP def get_current_ip(self): return json.load(urlopen('http://jsonip.com'))['ip'] # 实例化类并启动更新程序 dns = DnsHandler() dns.reset() 将以上代码保存为dns.py文件,并赋予执行权限: > chmod +x dns.py 设置定时运行CentOS内置有强大的计划任务工具Crontab,如果系统里没有则先使用yum安装: > yum install crontabs 首先,设置执行用户的环境变量,比如,我们使用root用户来执行这一程序,则先在用户目录下建立.profile文件,或者在已有的.profile文件下加入如下一行,以使得可以使用VI来编辑cron文件: EDITOR=vi; export EDITOR 建立mycron文件,加入如下内容: */10 * * * * /root/ddns/dns.py 这意味着每10分钟执行一次任务,即扫描公网IP,若与阿里云解析不一致,则修改阿里云解析。然后,提交crontab任务: > crontab mycron 总结 程序会每隔10分钟自动扫描公网IP,然后自动更新阿里云的解析,速度、稳定性和安全性都远胜于第三方的DDNS服务。 参考文献 无需花生壳,阿里云解析实现内网穿透 版权 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6 扫码关注我,在线与我沟通、咨询 转载请保留原文链接以及版权信息
概述 本文撰写时所使用的版本:Nextcloud 16.0.4 根据 Nextcloud 控制面板安全及设置警告,解决最后一个报警,不支持 4 字节的问题时,遇到该问题,所使用的数据库为MySQL但没有对4字节字符的支持。为正确处理文件名或评论中使用的4字节字符(比如emoji表情),建议开启MySQL的4字节字符支持。详细信息请阅读相关文档页面。 问题过程 按照 Nextcloud 给出的文档需要需要进行一系列的修复,本文到最后一步执行以下命令时遇到问题: sudo -u www-data php occ maintenance:repair 异常截图: In AbstractMySQLDriver.php line 125: An exception occurred while executing 'ALTER TABLE `oc_systemtag_group` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;': SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes 经过研究,发现是因为使用 3 字节的 utf8 编码时,索引长度最大 767 可以存储 767/3 = 255 个字符。但使用 utf8mb4 时,因为是 4 字节,索引最大长度 767 不变的情况下,最多可以存储 767/4 = 191 个字符。 于是排查了数据库相关的字段,发现比较多的字段使用了 varchar(255),经过手动处理后,上面的 repair 执行成功。 以下将修复过程中使用的 SQL 进行了汇总整理,遇到此问题时,可以直接执行以下 SQL,不必手动去修复。 ALTER TABLE `oc_addressbooks` MODIFY COLUMN `principaluri` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `id` MODIFY COLUMN `uri` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `displayname`; ALTER TABLE `oc_authtoken` MODIFY COLUMN `token` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' AFTER `name`; ALTER TABLE `oc_calendarobjects` MODIFY COLUMN `uri` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `calendardata`; ALTER TABLE `oc_calendars` MODIFY COLUMN `principaluri` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `id`, MODIFY COLUMN `uri` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `displayname`; ALTER TABLE `oc_calendarsubscriptions` MODIFY COLUMN `uri` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `id`, MODIFY COLUMN `principaluri` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `uri`; ALTER TABLE `oc_dav_shares` MODIFY COLUMN `principaluri` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `id`, MODIFY COLUMN `type` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `principaluri`, MODIFY COLUMN `publicuri` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `resourceid`; ALTER TABLE `oc_login_flow_v2` MODIFY COLUMN `poll_token` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL AFTER `started`, MODIFY COLUMN `login_token` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL AFTER `poll_token`; ALTER TABLE `oc_migrations` MODIFY COLUMN `app` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL FIRST , MODIFY COLUMN `version` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL AFTER `app`; ALTER TABLE `oc_mimetypes` MODIFY COLUMN `mimetype` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' AFTER `id`; ALTER TABLE `oc_systemtag_group` MODIFY COLUMN `gid` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL AFTER `systemtagid`; ALTER TABLE `oc_trusted_servers` MODIFY COLUMN `url_hash` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'sha1 hash of the url without the protocol' AFTER `url`; 总结 我们在设计数据库时,也应该注意此问题,utf8 的情况下索引字段最大 varchar(255),utf8mb4 的情况下索引最大 varchar(191)。我们可以修改 mysql.conf 最大索引长度,但不推荐这样做,这样会导致性能下降。我们应该尽量让索引字段低于限制,索引字段太长时,我们是不是应该考虑设计上有问题了? 版权 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6 转载请保留原文链接以及版权信息
概述 在浏览 v2 社区进行学习交流时,看到了一篇 “日志的粒度请教?” 的帖子,于是仔细思考了此问题,并且将自己在工作过程中总结的经验分享给大家,欢迎大家互相讨论学习。 内容 总结了以下几点: API 的 I/O 日志,也就是请求参数和响应内容记录日志,这相当于整个系统的大门了,访问日志在排错、性能分析等方面非常有用; 第三方 API 的 I/O 日志,也就是请求第三方 API 发送了哪些参数,第三方 API 又响应了哪些参数,这有利于分析传递的数据是否正确; 异常块,所有捕获异常的位置均应当记录异常内容,除非一些用于业务逻辑判断的异常块(例如:利用异常来判断某个字符串是否能转换等); 非正常请求,例如请求某个 API 报了 403,应当记录 >= WARN 级别的日志,这里和 #1 的区别是,#1 无论正常还是异常均记录请求、响应内容,这里的应当记录更加详细的内容,例如为什么会产生 403 响应,并且日志级别应当更高,方便分析、优化; 应用启停日志,在启动应用进行初始化时,应当记录各个参数的情况,便于在启动时遇到问题进行定位。同理,在应用停止的时候(特别是异常停止),应当记录详细的运行状况、运行参数等日志; 其他日志,根据实际业务情况需要,应当记录其他日志,例如调用短信接口时记录短信用量、剩余量等,这样可以通过编写日志报警规则来实现短信余额不足预警功能; 如有有更多关于日志方面的知识和经验,欢迎留言补充 总结 记录日志的目的是为了方便事后分析、问题定位,所以我们在记录日志时应当考虑如何让其他人可以通过日志来分析问题,这类似于编写代码注释,考虑的是让别人能看懂,而不是仅仅自己能看懂。 例如有时候我们记录日志,比如短信剩余量,我们直接记录 logger.info(count) ,很显然这样的日志只能自己能看懂,其他人很难理解,良好的日志示范参考 logger.info("短信发送条数:x条,剩余条数:x条") 版权 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6 扫码关注我,在线与我沟通、咨询 转载请保留原文链接以及版权信息
概述 家里闲置着一台老款的Mac mini Server,跑OS X越来越慢,索性装上了Cent OS 7,变成了一台家庭服务器,装上了Plex媒体服务器和Transmission下载服务,同时,也装上了Nginx、Mysql、MongoDB、Redis等,可以调试代码,甚至担当一些小型项目的服务器。不过,只在家庭内网使用,功能太有限,于是接下来面临的一个问题就是内网穿透。使用过花生壳和花生棒,服务相当不稳定,而且种种受限,每要多加一个端口就要多花钱,安全性也有问题。其实想想,内网穿透的最大难题无非就是家里是动态公网IP,每变换一次公网IP,需要重新解析一次域名。而阿里云等大型的云服务商,目前都已经实现了域名解析管理的API接口,而且基本都是立即就可生效 。所以我的思路就是,系统运行一个定期执行的程序,每隔一段时间扫描一下最新的公网IP,如果发现最新的公网IP与域名解析到的IP地址不一致,就通过阿里云API自动更新解析设置即可。这样的花费不过每年一个域名的费用,最贵也就几十块钱。 具体实现步骤 阿里云设置首先,要确定一个准备用于外网访问的域名,并将此域名转入到阿里云的云解析服务来解析。如图所示,添加需要管理的域名。 转入后,在解析设置中,设置一下A记录解析,解析的IP地址可以填当前的公网IP。如果不知道自己的公网IP,在CentOS系统下,可以输入使用以下命令获取当前的公网IP。 > curl ifconfig.me 获取公网IP后,在阿里云云解析中设置完A记录解析。 在阿里云账户管理后台,点击右上角的账户头像,然后点击accesskeys,或者直接登陆 https://ak-console.aliyun.com,获取阿里云的AccessKeyID和AccessKeySecret。 路由器设置阿里云的设置完成后,需要对路由器设置端口映射,使外网对公网IP的端口访问能转发到内网服务器的相应端口。绝大部分的路由器都支持端口映射。 常见的服务端口包括,用于WEB访问的80端口、SSH远程管理的22端口、Mysql数据库的3306端口、Transmission下载服务管理的9091端口和Plex媒体服务的32400端口等等。不用花生壳的好处就是没有端口数量限制,想设置多少就可以设置多少。当然,在设置端口映射之前,应确保服务器的内网IP已经设置为静态IP,而不是DHCP动态获取。 服务器设置服务器端安装好想要使用的各种服务后,别忘了在防火墙中开启相应的端口,在CentOS 7中,防火墙永久开启端口的命令是: > firewall-cmd --add-port=80/tcp --permanent 开启之后别忘了重新载入防火墙的设置以使其生效,命令如下: > firewall-cmd --reload 自动更新域名解析程序准备工作都做好了,接下来就是通过程序检测公网IP,并在公网IP发生变化时,及时更新阿里云的域名解析。 这个程序是用Python写的,先使用Python的包管理工具pip下载安装阿里云的Python SDK。如果没有安装pip,则先安装pip: > yum install pip 安装好pip后,安装阿里云的Python核心SDK以及云解析SDK: > pip install aliyun-python-sdk-core > pip install aliyun-python-sdk-alidns 导入项目所需要的包,如果缺少则使用pip安装: import os import json from urllib2 import urlopen from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest 完整代码如下: #!/usr/bin/env python # coding= utf-8 import os import json from urllib2 import urlopen from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest class DnsHandler: # 从阿里云开发者后台获取Access_Key_Id和Access_Key_Secret access_key_id = "" access_key_secret = "" # 填入自己的域名 domain_name = "" # 填入二级域名的RR值 rr_keyword = "" # 解析记录类型,一般为A记录 record_type = "A" # 用于储存解析记录的文件名 file_name = ".ip_addr" client = None record = None current_ip = '' # 初始化,获取client实例 def __init__(self): self.client = AcsClient( self.access_key_id, self.access_key_secret, self.region_id ) self.record = self.get_record() self.current_ip = self.get_current_ip() # 如果公网IP发生变化,则自动修改阿里云解析记录 def reset(self): if self.current_ip <> self.get_record_value(): print self.update_record(self.current_ip) self.get_record() # 获取阿里云域名解析完整记录,并使用文件缓存 def get_record(self): if os.path.isfile(self.file_name) : file_handler = open(self.file_name, 'r') r = file_handler.read() file_handler.close() else : request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest() request.set_PageSize(10) request.set_action_name("DescribeDomainRecords") request.set_DomainName(self.domain_name) request.set_RRKeyWord(self.rr_keyword) request.set_TypeKeyWord(self.record_type) r = self.client.do_action_with_exception(request) file_handler = open(self.file_name, 'w') file_handler.write(r) file_handler.close() return json.loads(r) # 获取阿里云域名解析记录ID def get_record_id(self) : return self.record["DomainRecords"]["Record"][0]["RecordId"] # 获取当前域名解析记录 def get_record_value(self) : return self.record["DomainRecords"]["Record"][0]["Value"] # 修改阿里云解析记录 def update_record(self, value): request = UpdateDomainRecordRequest.UpdateDomainRecordRequest() request.set_action_name("UpdateDomainRecord") request.set_RecordId(self.get_record_id()) request.set_Type(self.record_type) request.set_RR(self.rr_keyword) request.set_Value(value) return self.client.do_action_with_exception(request) # 获取当前公网IP def get_current_ip(self): return json.load(urlopen('http://jsonip.com'))['ip'] # 实例化类并启动更新程序 dns = DnsHandler() dns.reset() 将以上代码保存为dns.py文件,并赋予执行权限: > chmod +x dns.py 设置定时运行CentOS内置有强大的计划任务工具Crontab,如果系统里没有则先使用yum安装: > yum install crontabs 首先,设置执行用户的环境变量,比如,我们使用root用户来执行这一程序,则先在用户目录下建立.profile文件,或者在已有的.profile文件下加入如下一行,以使得可以使用VI来编辑cron文件: EDITOR=vi; export EDITOR 建立mycron文件,加入如下内容: */10 * * * * /root/ddns/dns.py 这意味着每10分钟执行一次任务,即扫描公网IP,若与阿里云解析不一致,则修改阿里云解析。然后,提交crontab任务: > crontab mycron 总结 程序会每隔10分钟自动扫描公网IP,然后自动更新阿里云的解析,速度、稳定性和安全性都远胜于第三方的DDNS服务。 参考文献 无需花生壳,阿里云解析实现内网穿透 版权 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6 扫码关注我,在线与我沟通、咨询 转载请保留原文链接以及版权信息
概述 现在的家庭宽带或者部分公司的宽带都没有直接分配公网 IP ,这个给我们做开发调试时带来的很大的不便,比如我们需要对接微信公众号、支付宝等第三方系统时,第三方系统需要通过异步回调通知我们的服务,但是我们自己电脑上的应用程序都无法对外访问,这样也就通知不了,无法很好的进行联调测试。 在这样的背景下,ngrok 对于我们来说就提供了很大的帮助,他可以让我们内网的应用可以对外访问,无论是 HTTP(s) 服务还是 TCP/SSH 等场景,均可以通过 ngrok 服务内网穿透来达到对外提供访问的目的。 搭建步骤 第一步:安装 golang 环境 博主的服务器统一使用的 CentOS 7 发行版本,所以通过 yum install golang 就可以安装好 golang 环境,如果是其他操作系统可以参考官方文档 How to install golang 第二步:下载 ngrok 源码 目前 ngrok 2.x 版本已经闭源,我们能下载到的最新版本为 ngrok-1.7.1.zip,下载完成之后解压 zip 包,这里我们需要修改 src/ngrok/log/logger.go 中的源代码,将 log "code.google.com/p/log4go" 修改为 log "github.com/alecthomas/log4go",否则编译时会报错 build fails: 'package code.google.com/p/log4go: unable to detect version control system for code.google.com/ path' 第三步:生成 TLS 证书 例如我们以 4kb.cn 域名为例,我们在生成证书的时候可以指定 ngrok.4kb.cn 这个域名指定 ngrok 服务器地址(需要 DNS 解析到 ngrok 所在服务器的 IP 上),同时我们对外提供 ngrok 域名为 .4kb.cn (需要泛域名解析 .4kb.cn 到 ngrok 所在服务器的 IP 上),这里的 ngrok.4kb.cn 和 *.4kb.cn 解析并不冲突。 生成 TLS 证书的命令如下: openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.4kb.cn" -days 3650 -out rootCA.pem openssl genrsa -out device.key 2048 openssl req -new -key device.key -subj "/CN=ngrok.4kb.cn" -out device.csr openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 3650 第四步:覆盖 ngrok 默认 TLS 证书 cp rootCA.pem assets/client/tls/ngrokroot.crt cp device.crt assets/server/tls/snakeoil.crt cp device.key assets/server/tls/snakeoil.key 第五步:设置 Golang 编译目录和参数 export GOPATH=/go 为了可以在 docker 环境下运行,我们还需要运行下面的命令,否则会报错 Unable to run a go program inside docker /bin/sh: ./ngrokd: not found export CGO_ENABLED=0 第六步:编译 ngrok 服务端和客户端 Linux 32 位系统 ngrok 编译命令 export GOOS=linux GOARCH=386 make release-server release-client Linux 64 位系统 ngrok 编译命令 export GOOS=linux GOARCH=amd64 make release-server release-client Windows 32 位系统 ngrok 编译命令 export GOOS=windows GOARCH=386 make release-server release-client Windows 64 位系统 ngrok 编译命令 export GOOS=windows GOARCH=amd64 make release-server release-client macOS 32 位系统 ngrok 编译命令 export GOOS=darwin GOARCH=386 make release-server release-client macOS 64 位系统 ngrok 编译命令 export GOOS=darwin GOARCH=amd64 make release-server release-client 其他操作系统修改 GOOS 和 GOARCH 为对应的即可:Go (Golang) GOOS and GOARCH 第七步:运行 ngrokd 服务端 编译完成之后可以在 bin 目录下看到 ngrokd(服务端)和 ngrok(客户端),运行服务端时需要将 assets/server/tls/snakeoil.crt 和 assets/server/tls/snakeoil.key复制到同级目录,启动的命令参考如下: ./ngrokd -tlsKey=snakeoil.key -tlsCrt=snakeoil.crt -domain="4kb.cn" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443" 如果使用默认 80、443、4443 端口,则可以使用以下命令运行: ./ngrokd -tlsKey=snakeoil.key -tlsCrt=snakeoil.crt -domain="4kb.cn" 第八步:运行 ngrok 客户端 运行之前我们需要编写一个 ngrok.cfg 文件,内容如下 server_addr: "ngrok.4kb.cn:4443" trust_host_root_certs: false 这里的 server_addr 需要和第三步生成 TLS 时保持一致,否则服务端会报 tls: bad certificate 证书错误,编辑完成之后使用 ngrok 客户端运行即可 ./ngrok -config=ngrok.cfg 8080 指定域名运行命令 ./ngrok -config=ngrok.cfg -subdomain=xxx 8080 映射 SSH 22 端口,使用 tcp 协议 ./ngrok -config=ngrok.cfg -proto=tcp 22 总结 我们搭建完成 ngrok 服务端后,任意能连接到服务器的应用程序均可以通过 ngrok 内网穿透,不仅 Java、PHP 等开发的网站可以通过 ngrok 映射对外提供域名访问,也可以让 SSH 的 22 端口映射之后,我们连接无公网 IP 的服务器(比如在家里面搭建一个私有服务器),甚至还可以将 MySQL 的 3306 端口映射之后,在任意地点远程连接内网的数据库。这给我们带来来极大的方便,也不需要购买第三方服务(例如花生壳)。 参考文献 编译自己的ngrok服务 Go (Golang) GOOS and GOARCH Unable to run a go program inside docker /bin/sh: : not found 版权 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6 扫码关注我,在线与我沟通、咨询 转载请保留原文链接以及版权信息
前言 在安装完 CentOS 系统之后,自带的 git 版本比较老,有很多功能用不了,我们需要升级 git 到最新版本,通过 yum update git 发现并不能完成自动升级,我这里采用手动升级的方式。 操作步骤 第一步:卸载旧版的 git > yum remove git 第二步:安装 release.rpm ,CentOS 6 和 CentOS 7 使用不同的链接 CentOS 6 > rpm -ivh https://centos6.iuscommunity.org/ius-release.rpm CentOS 7 > rpm -ivh https://centos7.iuscommunity.org/ius-release.rpm 第三步:使用 yum 命令安装最新版 git 客户端 > yum install git2u 以后的升级只需要使用 yum update git2u 即可 版权 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6 扫码关注我,在线与我沟通、咨询 转载请保留原文链接以及版权信息
关联博文小微企业阿里云最佳实践系列(一):ECS 服务器与 RDS 数据库小微企业阿里云最佳实践系列(二):RDS 数据库与DMS 数据库管理(数据管理)小微企业阿里云最佳实践系列(三):OSS 图片存储(对象存储)与 CDN 内容分发小微企业阿里云最佳实践系列(四):云监控与 SLS 日志服务小微企业阿里云最佳实践系列(五):零成本使用 DMS 数据库实验室学习研究小微企业阿里云最佳实践系列(六):千万、上亿条数据在阿里云 MySQL 云数据库下的性能表现小微企业阿里云最佳实践系列(专辑) 概述 阅读对象 本博文主要写给创业团队、技术团队人数 < 5 人、没有专业运维等小微企业作为参考,需要掌握基础的服务器管理、软件开发等经验。 博文主要内容 本博文主要为大家介绍阿里云的 MySQL 云数据库性能对别,通过 1000 万条数据以及 1 亿条数据在 RDS for MySQL 上面的表现来粗略的了解数据性能,高配版选择的 8 核 16 G 内存的 MySQL 数据库,低配选择的 1 核 1 G 内存的数据库。 实践过程 第一步:在控制台购买两种配置的数据 这里我们为了测试,选择按量付费,可以看到两种配置的价格差距在 10~12 倍左右,一般我们个人博客、小型企业网站选择 1 核 1 G 的配置完全够用,这里我们为了测试 MySQL 的性能所以选择了一个 8 核 16 G 的高配,当然,阿里云也提供了更高配置的数据库,大家可以自行选择进行测试。1.一核一G内存数据库购买信息.png2.八核十六G内存数据库购买信息.png 第二步:初始化数据库配置、账号、数据库等 在数据库购买成功之后,阿里云会为了我们初始化创建数据库,这里需要耐心等待(博主等待了 5 分钟左右,比自己搭建 MySQL 还是快不少)3.耐心等待数据库创建完成.png数据库初始化完成之后我们可是开始创建账号了,这里为了测试方便,我们选择使用 root 账号并设置一个高强度的密码(生产环境不建议使用高权限 root 账号,建议使用普通账号)4.低配的数据库创建高权限账号.png在阿里云提供的 MySQL 在线管理工具首次使用时,我们需要设置管理工具的白名单,按照弹出的提示点击设置本实例即可5.设置 DMS 数据管理的白名单.png登录到 MySQL 数据库实例之后,我们需要按照以下的步骤创建数据库,这里我们以 mysql_test 命名来创建一个测试数据库6.创建测试数据库.png 第三步:创建测试表以及快速生成测试数据 完成数据库创建之后,我们需要点击左上角这里选择创建的数据(若下拉框未显示,点击旁边的刷新按钮即可),这里我们添加一些常用的字段:ID、创建时间、修改时间、姓名、手机号、身份证号、用户名、余额7.创建用于测试的表.png创建好表之后,我们接下来生成测试数据,阿里云的 DMS 数据管理工具提供了强大的“自动生成测试数据”功能,这里给我们带来了极大的方便。右键点击表名,在弹出的菜单中选择“自动生成测试数据”,然后我们为每个字段选择对应的生成方式(阿里云提供了强大的生成规则,可以在面板中灵活始终各种规则),生成行数这里最大可以选择到 100 万行,这里我们因为要测试上千万、上亿的数据,选择最大上限 100 万行。8.快速生成测试数据.png生成好了数据之后我们可以浏览生成的数据,这里可以看到生成的测试数据几乎和真实数据没有什么区别。9.查看生成的数据.png 第四步:对 MySQL 进行简单的性能测试 在我们测试之前,我们需要对测试数据进行快速复制,我们可以采用以下的 SQL 进行翻倍复制到 1600 万行数据级别 insert into pre_user(name, mobile, id_no, username, balance) select name, mobile, id_no, username, balance from pre_user; 每执行一次,数据库中的数据都会增加一倍,从 100 万行数据增加到 1600 万行数据我们需要执行 4 次,这里可能执行的时间比较长,我们可以两个数据库(高配和低配)一起执行。数据快速复制完成之后我们查询一下数据行数,显示有 1600 万行数据。10.执行简单的 SQL 查看性能.png我们为需要测试的字段增加索引(未增加索引的情况下,100 万行数据查询需要 400 毫秒,可见索引的重要性)11.为需要测试的字段建立索引.png索引创建好之后我们再次查询数据,在 1600 万行数据的级别下,查询返回 16 行数据总共耗时 28 毫秒,基本上可以满足使用12.索引创建成功之后我们再次执行查询语句.png我们分别在高配和低配的数据库上再次执行同样的查询,我们发现高配的只需要 3 毫秒,低配的也只需要 9 毫秒,这里可以看出同样的查询,第二次比第一次快两倍左右13.两边性能比较.png查看一下数据库的存储空间,我们发现数据占用了 1.8 GB,索引也占用了 1.8 GB,说明增加索引会增加数据库使用空间,我们应当按照最小化原则以及结合性能要求方面综合考量哪些字段应该增加索引,哪些字段不应该增加索引,一味的增加索引也会造成数据库的负担。14.查看存储空间.png 第五步:在 3200 万条数据以及 6400 万条数据下的 MySQL 性能表现 刚才我们简单测试了一下 1600 万条数据,这里我们把数据增加到 3200 万条以及 6400 万条数据再进行这里。由于数据量过大,1 核 1 G 的数据库复制较慢,我们这里直接测试高配的数据库(同样使用之前的快速复制 SQL,执行过程等待时间较长,需要耐心等待)。 增加到 3200 万条数据时,数据占用了 3.18 GB,索引占用了 3.86 GB,数据15.增加到 3200 万级别时的存储空间.png我们通过常规的 SQL 按照手机号查询,在 3200 万条数据中查找 32 行数据只用了 3 毫秒,可见阿里云的 MySQL 数据库性能还是非常强悍的16.在 3200 万级别下的查询性能.png 为了进一步测试性能,我们这次把数据量增加到 6400 万(同样使用快速复制 SQL),这里复制数据我们花费的时间更大。复制完成后我们查看存储空间,数据占用了 6.0 GB,索引占用了 8.32 GB17.查看 6400 万数据的存储量.png同样使用手机号查询数据,在 6400 万条数据中查找到 64 条数据,总共耗时 4 毫秒,和 3200 万行数据下耗时差距不大18.在 6400 万级别数据下的查询性能.png 第六步:测试阿里云 MySQL 在 1.2 亿条数据下的性能表现 在这一步我们要进一步复制数据,会发现等待的时间太长,甚至会超时,我们可以在原来的 SQL 下增加一个判断,每次复制 2000 万行数据来达到 1.2 亿条数据 insert into pre_user(name, mobile, id_no, username, balance) select name, mobile, id_no, username, balance from pre_user where id <= 20000000; 复制完成之后,我们发现数据占用了 9.48 GB,索引占用了 14.99 GB,索引存储空间远超过了数据存储空间19.达到 1 亿级别时的存储空间.png同样我们使用手机号来查询数据,在 1.2 亿条数据下,查找 100 行数据耗时 5 毫秒,可以看见在这个数据容量下性能相当强悍,当然我们的业务数据达到了 1 亿级别时,我们采用的架构也会更加复杂。20.精准查询数据的性能.png测试了一下 like 模糊查询,在 1.2 亿条数据下,使用 like 模糊查询(前包含)耗时 23 毫秒,基本上满足使用21.使用 like 查询 5 万条数据.png 总结 在测试的过程中,我们发现 1 核 1 G 的数据库承载能力在千万级别,我们的个人网站、小型企业网站使用低配的数据库完全满足日常需求。8 核 16 内存的数据承载上亿的数据,查询性能也不差,对于中型企业来说,基本上也是够用了,阿里云也给我们提供了其他更加强悍的数据库。 版权 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6 扫码关注我,在线与我沟通、咨询 转载请保留原文链接以及版权信息
前言 最近在使用 frp 内网穿透服务,运行了一段时间,发现 frp 挺稳定的,突发奇想,之前学习了一下 docker 的使用,何不把 frp 打包成 docker 镜像,这样在任意服务器上就能快速开启 frp 服务了,于是折腾了一下午总算是搞定了。 如果不想自己配置,可以使用 docker run -p 7000:7000 xiaoi/frp_for_docker:0.27.0 命令直接运行已经打包好的镜像。若要修改配置,覆盖镜像中的 /app/frps.ini 配置文件即可。 操作步骤 下载和配置 frp 首先我们需要下载一个 frp 服务端程序,可以在 github.com 上下载到最新发布的版本,这里下载 frp_0.27.0_linux_386.tar.gz 版本作为演示。 下载好了之后解压得到相关的应用程序和配置文件,我们只需要保留 frps 和 frps.ini 即可。若有需要可以在 frps.ini 进行自定义配置。 Dockerfile 编写 接下来我们编写 Dockerfile 文件,由于 frp 使用 golang 开发,发布的版本可以直接在 alpine 环境下运行,于是我们的工作变得非常简单,按照如下的代码编写即可 FROM alpine:latest WORKDIR /app COPY . /app EXPOSE 7000 CMD ["./start.sh"] 由于我在 frps.ini 中配置的 7000 端口,这里 EXPOSE 也设置 7000 端口保持一致。 CMD 这里填写 "./start.sh"方便启动,start.sh 内容如下 #!/bin/sh ./frps -c ./frps.ini docker 命令打包镜像 编写好 Dockerfile 和启动脚本之后,我们就可以使用 docker 命令打包了 docker build --tag=frp_for_docker . 打包好了之后使用 docker image ls 查看打包好的镜像 运行和检查镜像 使用 docker run -p 7000:7000 frp_for_docker 运行我们打包好的镜像,出现 success 等字样信息表明运行成功 上传镜像至在线仓库 如果想要在任意地方都能运行我们打包好的镜像,则需要上传镜像至 hub.docker.com 在线仓库,上传之前需要 注册 docker 账号 注册好了之后回到控制台运行 docker login 然后输入账号密码登录 然后将我们的镜像改名,格式为 用户名/镜像名:版本号 ,例如我的用户名为 xiaoi,镜像名我定义为 frp_for_docker ,版本号我这里按照 frp 版本号来定义,其中除了用户名不能自定义,镜像名和版本号都是可以任意命名,使用如下命令将本地镜像改名。 docker tag frp_by_docker xiaoi/frp_by_docker:0.27.0 改好之后使用 docker push 命令上传至在线仓库 docker push xiaoi/frp_for_docker:0.27.0 上传完成之后我们就可以在 hub.docker.com 在线仓库中查看我们的镜像了 在别处直接运行在线仓库中的镜像 在有 docker 环境的服务器或者个人电脑上使用 docker run 命令就可以运行在线仓库中的镜像,例如运行我们上传的镜像 docker run -p 7000:7000 xiaoi/frp_for_docker:0.27.0 运行命令之后,接下来的这一切都是自动化完成的,无需我们再做任何操作 总结 使用 docker 我们可以很容易的将一个应用程序分发到各个地方运行,便于后期的维护和管理,同时也不用担心跨平台的问题产生; 程序所依赖的环境我们也可以通过编写 Dockerfile 来解决,不必再为各个环境依赖重复安装运行环境,这样极大的减轻来工作量; docker 能运行的程序远不于此,我们可以将所熟悉的一切软件都使用 docker 来运行和管理; 版权 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6 转载请保留原文链接以及版权信息
关联博文小微企业阿里云最佳实践系列(一):ECS 服务器与 RDS 数据库小微企业阿里云最佳实践系列(二):RDS 数据库与DMS 数据库管理(数据管理)小微企业阿里云最佳实践系列(三):OSS 图片存储(对象存储)与 CDN 内容分发小微企业阿里云最佳实践系列(四):云监控与 SLS 日志服务小微企业阿里云最佳实践系列(五):零成本使用 DMS 数据库实验室学习研究小微企业阿里云最佳实践系列(专辑) 概述 阅读对象 本博文主要写给创业团队、技术团队人数 < 5 人、没有专业运维等小微企业作为参考,需要掌握基础的服务器管理、软件开发等经验。 博文主要内容 本博文主要为大家重点介绍 DMS 数据管理的数据库实验室功能,通过实验室我们可以快速生成想要的数据进行学习研究(例如:SQL 优化、复杂查询等),同时目前数据库实验室完全免费使用,所有阿里云用户均可免费体验。 使用教程 1、控制台进入 DMS 数据管理 2、进入实验室 3、选择数据库类型,这里我们以 MySQL 为例,选择 MySQL 点击立即进入即可 4、创建数据库名称,这里可能会遇到名称已存在,说明被其他用户占用了,建议通过 名称 + 日期 的方式,这样不容易重复,例如 learn_0429 5、创建好了之后进入数据库,这里我们点击 students 表生成测试数据 6、DMS 数据管理提供了强大的数据生成功能,这里我们可以指定 name 字段按照个人信息 + 英文姓名的方式生成 7、grade 年级和 class 班级字段我们按照指定范围生成,生成行数这里最大可以填写 100 万行 8、确认生成数据之后我们打开表可以看到生成的数据非常漂亮,和真实数据没有多大区别 9、这时我们点击 SQL 窗口来编写脚本测试数据,例如我们查询姓名为 Heda 开头的数据有多少条(注意:这里生成的测试数据前面有空白,因此需要增加空白) 这时我们看到统计出来有 838 条,耗时 282 毫秒,很显然查询效率并不高,我们接下来进行优化 10、在我们查询 SQL 前面增加 explain 查看执行计划,我们发现执行该 SQL 需要扫描 99 万行,很显然这是一条全表扫描 SQL,查询效率极低,我们需要通过索引的方式优化 11、编辑 students 表结构 12、我们为 name 字段增加索引,这里索引名为了区分以 IDX_NAME 命名,类型选择 NORMAL,索引方式选择 BTREE 13、索引添加好了之后我们回到 SQL 窗口再次运行 explain ,这时我们发现扫描的行数只有 838 行,并且使用来 IDX_NAME 索引,这表明我们的索引添加是没有问题的,并且已经生效 14、去掉 explain 执行我们最开始的查询语句,这时候我们发现同样统计了 838 条,加了索引之后只耗时 1 毫秒,大大提升了查询效率 总结 我们利用 DMS 数据库实验室可以快速生成想要的数据,并且在生成的数据上执行各种复杂查询,无需要安装其他软件,使用起来非常方便的,强烈建议大家学习和使用该功能 版权 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6 转载请保留原文链接以及版权信息
关联博文小微企业阿里云最佳实践系列(一):ECS 服务器与 RDS 数据库小微企业阿里云最佳实践系列(二):RDS 数据库与DMS 数据库管理(数据管理)小微企业阿里云最佳实践系列(三):OSS 图片存储(对象存储)与 CDN 内容分发小微企业阿里云最佳实践系列(四):云监控与 SLS 日志服务小微企业阿里云最佳实践系列(五):零成本使用 DMS 数据库实验室学习研究小微企业阿里云最佳实践系列(专辑) 概述 阅读对象 本博文主要写给创业团队、技术团队人数 < 5 人、没有专业运维等小微企业作为参考,需要掌握基础的服务器管理、软件开发等经验。 博文主要内容 本博文主要为大家介绍阿里云提供的基础云监控、日志服务两大产品,通过云监控与日志服务可以做到每天不需要时刻关注所开发的软件系统、服务器、数据库等健康状况就掌握异常情况,并能及时进行应急响应和处理。 云监控 官方介绍 云监控服务可用于收集获取阿里云资源的监控指标或用户自定义的监控指标,探测服务可用性,以及针对指标设置警报。使您全面了解阿里云上的资源使用情况、业务的运行状况和健康度,并及时收到异常报警做出反应,保证应用程序顺畅运行。 SLS 日志服务 官方介绍 日志服务(Log Service,简称LOG/原SLS)是针对实时数据一站式服务,在阿里集团经历大量大数据场景锤炼而成。提供日志类数据采集、消费、投递及查询分析功能,全面提升海量日志处理/分析能力,服务智能研发/运维/运营/安全等场景。 两款产品主要解决问题 天然集成,使用阿里云相关产品时云监控会默认设置报警规则,在出现异常例如 CPU 使用率过高时自动触发报警; 数据可视化,可以通过云监控监控大盘实时掌握各个云资源或应用的健康状况、性能指标等; 监控数据处理,可以通过编写数据收集脚本上传只云监控,并在控制台设置灵活的监控指标、纬度; 灵活报警,可以按照企业的实际情况以及所监控的资源或应用级别灵活设置报警规则,例如一般异常报警通知到开发组,重要报警通知到项目经理或技术总监等; 全托管服务,日志服务无需自建存储,通过 Agent 收集上传日志即可,不用担心服务器磁盘被日志写满导致应用系统异常; 生态丰富,无论是服务端应用(如:Java、PHP)还是浏览器应用(例如:JavaScript)等,均可以接入日志服务进行统一管理; 实时性强,写入即可消费,无需按照以往还需要登录服务器查看日志文件,使用日志服务可以在控制台实时查看和分析日志; 如何选择使用 云监控使用基础免费版即可体验丰富的功能,根据企业实际情况也可以选择付费版。 日志服务目前按量付费,也有免费额度,使用起来整体费用都比较少,几乎可以忽略不计。 案例一、云监控实时检测网站状态,宕机时第一时间响应和处理 1、控制台打开云监控,进入站点管理 2、点击右侧的新建监控任务 3、填写所监控的网址并设置监控频率,这里我们为了让监控更灵敏,设置 1分钟 4、设置报警规则这里的可用性指一个探测周期内失败率,正常情况下为 100%,我们这里设置 90% 或 95% 即可,平均响应时间指超过多少毫秒无法打开网站即判定为失败,这里我们可以设置为 3000 毫秒,连续阀值这里,有时网站因为网络抖动的原因导致探测点无法打开,这里设置为 1 的话,每次探测点探测失败均会触发报警,这里我们为了避免误报可以设置为 3 次,基本上 3 次均探测失败就不仅仅是网络抖动原因,而是网站确实无法打开了。 5、设置好之后点击创建按钮即可完成,这时我们可以通过列表直观的查看所监控的站点健康状况 案例二、日志服务收集 nginx 访问日志以及分析 1、控制台打开日志服务,未开通日志服务时需要开通后操作,点击创建 Project这里所属地域可以根据自己的 ECS 服务器或者所收集日志的目标最近区域选择 2、创建好 Project 之后还需要创建 Logstore 存储日志如果应用的日志比较少,这里的 Shard 数据可以选择 1 3、创建好 Logstore 之后进入数据接入环节根据实际情况选择对应的接入方式,这里我们使用 nginx 的访问日志做教程,这里选择 nginx 访问日志即可 4、填写配置信息,我们需要知道服务器上 nginx 日志存储的位置,例如存放于 /usr/local/nginx/logs 目录中,我们需要收集 access.log 日志这里的路径配置这样填写即可 5、打开 nginx.conf 找到 log_format 配置,如图:填入 NGINX 日志格式中,这里会自动生成 NGINX 键名称检查无误后点击下一步 6、应用到机器组,这里我们将需要添加的服务器加入到一个机器组中进行批量监控机器组标识选择 IP 地址,并且填写 ECS 服务器内网 IP 地址 7、添加完成之后确认机器状态正常若检测异常,参考文档进行解决:https://help.aliyun.com/document_detail/51458.html 8、再次点击 Logtail 配置,进行未完成的应用到机器组的操作选择我们刚添加的机器组应用到机器组即可完成 9、配置完成后回到日志库,点击预览确保我们接入正确,并且日志服务收集到 nginx 的访问日志如果有这样的数据,表明我们的所有配置都是没有问题的10、接下来我们可以点击查看查看 nginx 的访问日志,这样就不需要登录服务器查看访问日志 11、日志服务高级玩法:根据查询脚本生成报表请求报表原始脚本供复制参考 request_uri:/api/* | select request_uri, count(1) count, round(avg(request_time), 2) request, round(avg(response_time),2) response group by request_uri order by count desc limit 10 总结 通过云监控、日志服务灵活搭配可以创造我们很多想要的功能,这些需要大家深入研究学习和使用,同时也欢迎大家讨论 版权 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6 转载请保留原文链接以及版权信息
关联博文小微企业阿里云最佳实践系列(一):ECS 服务器与 RDS 数据库小微企业阿里云最佳实践系列(二):RDS 数据库与DMS 数据库管理(数据管理)小微企业阿里云最佳实践系列(三):OSS 图片存储(对象存储)与 CDN 内容分发小微企业阿里云最佳实践系列(四):云监控与 SLS 日志服务小微企业阿里云最佳实践系列(五):零成本使用 DMS 数据库实验室学习研究小微企业阿里云最佳实践系列(专辑) 概述 阅读对象 本博文主要写给创业团队、技术团队人数 < 5 人、没有专业运维等小微企业作为参考,需要掌握基础的服务器管理、软件开发等经验。 博文主要内容 本博文主要为大家介绍静态文件的存储以及使用 CDN 加速访问的热点图片。很多企业都会面临网站大图加载缓存、文件下载并发低(通常同时几个人下载服务器上的大文件就会跑满服务的带宽)等问题,本文将逐一为大家讲解如何解决此类问题。 OSS 图片存储(对象存储) 官方介绍 海量、安全、低成本、高可靠的云存储服务,提供99.999999999%的数据可靠性。使用RESTful API 可以在互联网任何位置存储和访问,容量和处理能力弹性扩展,多种存储类型供选择全面优化存储成本。 CDN 内容分发 官方介绍 将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。 两款产品主要解决问题 无限量存储空间,一次接入无需关注存储容量限制,按照实际使用容量收费 存储价格低,相比云服务器 0.3元/GB/月,OSS 存储只需要0.12元/GB/月,归档存储更是低至 0.033/GB/月 图片上传不限宽带,OSS 服务的宽带几乎不限制,使用常规的 ECS 服务器若购买 100mbps 的宽带,费用相当高,OSS 则可以无需支付高昂的宽带费用 图片下载不限宽带,图片(或文件)存储在 OSS 上,下载不受服务器的限制,一般情况下客户端带宽有多大,下载速度就有多快 无缝对接 CDN 内容分发,可搭配 CDN 产品将热点图片缓存到离用户最近的节点,进一步提高加载速度 CDN 流量包进一步降低流量费,相比于 ECS 服务器 0.72元/GB 流量费,CDN 低至 0.24元/GB,并且不占用应用服务器带宽 天然集成的图片在线处理,访问 OSS 存储的图片时可以通过参数在线处理图片大小,例如指定高度的图片,相关文档:图片缩放 如何选择使用 推荐 OSS 对象存储和 CDN 内容分发两款产品搭配使用。 案例一、使用 OSS 存储应用图片,实现动静分离 在一般项目中,大多数情况下是直接将静态文件存放在项目目录中,项目运行时上传的图片也会放入项目运行目录中例如:upload,这样存在诸多问题,不利于运维人员的管理工作。 自建 FTP 服务器来存储图片一是成本高,二是配置不当会导致 FTP 服务器不安全或者不稳定,这时我们可以通过 OSS 的 SDK 集成到项目中,将项目运行过程中用户、管理员等上传的图片统统传入 OSS 中进行存储,这样服务器上只需要放应用程序,无需再给图片分配空间,也不用担心图片过多导致服务器空间不足。 1、对接之前需要在 OSS 控制台创建 bucket,尽量选择和应用服务器一个地域的 bucket,下图 EndPoint 地域节点是 SDK 上传图片需要用到的域名,Bucket 域名为 OSS 分配的临时域名(可以自行 cname 解析到临时域名上访问,也可以直接使用临时域名访问图片) 2、创建好 bucket 之后需要在 RAM 控制台 中创建一个账号用于读写 OSS 中的文件,SDK 初始化参数是需要用到,这里建议不同环境分配不同的账号进行管理 3、在官网文档选择项目使用的语言对应的 SDK 版本,例如这里选择 Java 版本,按照文档上的安装说明以及代码初始化 OSS SDK 4、之后项目中需要用到文件上传的地方统一使用 OSS SDK 上传即可 5、上传成功后我们可以通过 OSS 控制台查看文件以及访问文件的 URL 地址 版权 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6 转载请保留原文链接以及版权信息
关联博文小微企业阿里云最佳实践系列(一):ECS 服务器与 RDS 数据库小微企业阿里云最佳实践系列(二):RDS 数据库与DMS 数据库管理(数据管理)小微企业阿里云最佳实践系列(三):OSS 图片存储(对象存储)与 CDN 内容分发小微企业阿里云最佳实践系列(四):云监控与 SLS 日志服务小微企业阿里云最佳实践系列(五):零成本使用 DMS 数据库实验室学习研究小微企业阿里云最佳实践系列(专辑) 概述 阅读对象 本博文主要写给创业团队、技术团队人数 < 5 人、没有专业运维等小微企业作为参考,需要掌握基础的服务器管理、软件开发等经验。 博文主要内容 在上一篇博文中主要介绍了 ECS 服务器与 RDS 数据库,在本篇重点为大家讲解我们的数据如何进行管理、在日常的管理过程中存在哪些风险、遇到突然事件如何通过日志分析问题以及解决问题。 DMS 数据库管理(数据管理) 官方介绍 数据管理DMS提供关系型数据库和NoSQL的统一管理。它源自阿里数据库服务平台iDB,为数万研发人员提供数据库研发支撑。您可使用数据管理DMS轻松构建企业独有的数据库DevOps,促进数据库研发自助化,提升研发效率,同时保证员工数据库访问安全及数据库高性能。 主要解决问题 统一的管理控制台,使用者无需安装任何软件 数据库内网访问,提高安全的同时降低访问延迟 操作日志留痕,可事后对人工操作的 SQL 日志进行审计,减少人工操作存在的风险 性能分析,慢日志查询,可以很方便的查看拖慢应用响应速度的相关 SQL 语句 性能监控,QPS 过高、CPU 使用率过高、数据库存储空间不足等情况,可以直接通过云监控发送通知,便于管理和维护 如何选择使用 目前数据管理分为普通版和企业版,可根据实际情况选择对应的版本,功能也会不一样,本文以普通版做功能演示 案例一、使用 DMS 数据管理查看数据库性能以及慢查询 1、使用导航菜单快捷登录数据库2、进入数据库之后可以在首页查看数据库性能指标,可以根据指标情况来做升降配置调整策略3、点击顶部性能 - SQL 趋势进入性能分析界面4、可以点击左侧菜单直接查看慢SQL趋势以及明细5、可以根据自身业务情况以及控制台给出的 SQL 明细来优化系统性能 案例二、使用 DMS 数据管理实现不同角色权限控制 有时候我们需要部分员工查询数据,但又不能让员工直接接触数据库账号密码,那么我们可以利用 DMS 的数据库账号组来实现员工与数据库账号密码零接触。 以下介绍如何使用:1、找到云账号授权管理 - 数据库账号组管理,添加新的账号组2、我们可以根据企业的管理制度来划分不同岗位使用不同账号组,例如可以这里开发测试使用一个账号组来管理,这里设置对应的登录用户以及登录密码3、我们回到左侧菜单中找到云账号管理,找到账号账号(若没有则通过 RAM 添加员工账号),点击授权用户选择我们刚创建的账号组即可4、我们回到 RDS 控制台,使用刚创建的账号组来添加账号,并且赋予账号对应数据库的读写权限,即可完成整个角色控制5、我们使用子账号登录 DMS 控制台会发现只需要选择对应的数据库进行管理即可,无需再填写账号密码非常的便捷,这样就不需要将数据库账号密码发给员工了,这样保障了数据库安全又让员工操作起来非常简单。 版权 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6 转载请保留原文链接以及版权信息
关联博文小微企业阿里云最佳实践系列(一):ECS 服务器与 RDS 数据库小微企业阿里云最佳实践系列(二):RDS 数据库与DMS 数据库管理(数据管理)小微企业阿里云最佳实践系列(三):OSS 图片存储(对象存储)与 CDN 内容分发小微企业阿里云最佳实践系列(四):云监控与 SLS 日志服务小微企业阿里云最佳实践系列(五):零成本使用 DMS 数据库实验室学习研究小微企业阿里云最佳实践系列(专辑) 概述 阅读对象 本博文主要写给创业团队、技术团队人数 < 5 人、没有专业运维等小微企业作为参考,需要掌握基础的服务器管理、软件开发等经验。 博文主要内容 本博文主要使用传统服务器架构与云服务架构进行横向对比,解决企业在搭建软件系统中所遇到等问题和痛点,以及为小微企业降低成本的同时尽可能提高软件系统的高可通、低延迟、高规范、低人力投入。 涉及的云产品 本博文主要涉及的云产品有:ECS 云服务器、RDS 云数据库、DMS 数据库管理、OSS 图片存储、云监控、日志服务以及信息安全和其他相关产品。 企业面对的问题和痛点 本博文主要介绍一般企业所面临的问题例如: 服务器购买成本高 服务器托管成本高 服务器容易被攻击 数据库响应速度慢 数据库账号权限过大 数据库存储的数据丢失 日志查询繁琐 日志过大导致服务器磁盘空间不足 图片访问速度慢(特别是高清大图) 图片容易被盗用(或者被其他网站非法引用) 网站出现异常不能及时进行响应处理 内容 ECS 云服务器 官方介绍 稳定,实例可用性达 99.95%弹性,支持分钟级别创建1000台实例 高安全,DDoS 防护、木马查杀、防暴力破解等高性能,单实例最高可选88vCPU,内存704GB易用性,丰富的操作系统和应用软件 可拓展性,ECS 可与阿里云各种丰富的云产品无缝衔接 主要解决问题 传统架构主要为企业采购硬件服务器托管至机房,主要面对的问题是采购硬件服务器价格过高,动辄上万,托管费每年几万也是一笔不小的开支。这对于小微企业、初创团队来说是一笔不小的开支,现代的各类云服务器可以根据企业所需要的最低配置进行购买,之后按照实际运营情况进行升级调整,这对于小微企业、初创团队来说可以节省一大笔开支。 另外一方面,采购硬件服务器托管的方式本身成本已经很高,更没有预算以及人力去搭建多可用区、多备份等,这样的单点架构对于数据安全方面也会变得非常薄弱。各大云服务器厂商拥有专业的技术运维团队,可以以很低的成本搭建多可用区、多备份等,这对于小微企业来说可以减少一大笔资金、人力投入去维护,这样企业的精力就可以放在业务系统的研发上。 如何选择使用 在使用云服务器(例如阿里云)时,云服务器厂商提供了多种多样的配置和计费方式,我们可以根据企业实际情况选择对应的配置和计费方式,以下主要介绍不同方式的宽带费用和配置费用 宽带付费方式 按照 5m 宽带和 100m 宽带进行对比,宽带费用差距非常大,如果不是流量类应用:直播、游戏等实时传输动态数据类应用,建议使用按量付费模式(宽带峰值可以选择 100m,并且不会收取宽带费)。电商、视频等大流量静态数据可使用 CDN 加速节省流量费,低至 0.17/GB(1TB) 服务器配置 服务器配置方面主要分为常规的服务器和 T5 突发性能实例。如果业务量比较少、业务量比较平稳,这里非常推荐 T5 突发性能实例,在系统运行中,一般不是特别高并发的系统,实际 CPU 使用率并不高(可通过云监控查看),例如以下一台生产环境的服务器CPU 的使用率基本上是低于 10% 的,如果自身的业务系统监控报表上长期低于 10% ,非常推荐使用 T5 突发性能实例。 服务器类型 规格配置 年费用 计算性 C5 2核CPU、4G内存 ¥1757.00 突发性能实例 t5 2核CPU、4G内存 ¥891.00 抢占式实例 2核CPU、4G内存 ¥613.00 使用小技巧 可以利用自动快照策略每天备份服务器,进一步方式数据丢失 可以利用镜像功能批量开通服务器或者迁移服务器 可以利用安全组统一设置所有服务器的安全策略 可以利用弹性网卡特性使内网服务器初始化完毕后取消外网 IP 进一步提高服务器安全 可以利用密钥对功能便捷登录服务器 可以搭配存储包降低快照备份费用 RDS 云数据库 官方介绍 高性能,SSD、阿里云官方优化、内网高速访问等 高安全性,访问控制策略,系统安全以及和应用隔离高可靠性,99.95% 服务可用性,99.9999% 数据可靠性, 双机热备、多可用区、自动备份等 低成本,降低人力成本的同时享受技术升级带来的红利, 按需购买,弹性扩容 主要解决问题 传统架构一般直接搭建数据库到服务器上,常常发生一些问题导致企业损失,例如: 数据库文件损坏导致无法恢复数据 数据库 root 账号安全级别低(可公网访问、若密码等)导致数据被黑客攻击和盗取 数据库访问速度拖慢软件系统,导致用户体验差 数据库管理不规范或账号权限过大,误操作导致数据丢失 如何选择使用 在阿里云平台上,提供了多种多样的数据库配置和规格,这里以 MySQL 作为参考对象进行对比。 基础版 基础版主要为单节点备份,价格比较低,一般可用于开发、测试使用,不建议企业使用基础版。选择配置时可以选择最低配置,在云厂商的优化下,最低配置已经可以满足大多数小微企业的软件系统使用了,可以根据后续运营情况升级配置,不必一开始选择过高的配置造成性能过剩、费用过高等问题。 高可用版 高可用版主要用于生产环境使用,购买时同样可以选择最低配置,这里的最低配置只是性能差别不一样、所存储的数据量不一样,在安全性方面并不会降低,可以按照实际情况选择对应的配置即可。 其他小技巧 可以只开通内网 IP 供应用服务器访问,杜绝外网访问造成数据泄漏 可以设置多个账号读写分离,不同人员操作权限不一样 可以配置 DMS 数据库管理管理数据 可以配置 SSL 加密传输数据进行异地灾备 可以使用物理备份、日志备份、实时备份等不用级别的备份策略达到数据高安全 后续将为大家提供其他系列博文 DMS 数据库管理(数据管理) 官方介绍 主要解决问题 如何选择使用 OSS 图片存储(对象存储) 官方介绍 主要解决问题 如何选择使用 云监控 日志服务 信息安全 其他产品 总结 解决方案与架构 最终效果 版权 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6 转载请保留原文链接以及版权信息
在 MySQL 官网下载 5.6 GPL 版本进行 yum install 安装的时候提示 libstdc++.so 有问题,如下图: Error: Package: MySQL-server-5.6.41-1.el7.x86_64 (/MySQL-server-5.6.41-1.el7.x86_64) Requires: libstdc++.so.6(GLIBCXX_3.4.15)(64bit) Error: Package: MySQL-server-5.6.41-1.el7.x86_64 (/MySQL-server-5.6.41-1.el7.x86_64) Requires: libc.so.6(GLIBC_2.15)(64bit) Error: Package: MySQL-server-5.6.41-1.el7.x86_64 (/MySQL-server-5.6.41-1.el7.x86_64) Requires: libc.so.6(GLIBC_2.16)(64bit) Error: Package: MySQL-server-5.6.41-1.el7.x86_64 (/MySQL-server-5.6.41-1.el7.x86_64) Requires: libc.so.6(GLIBC_2.14)(64bit) Error: Package: MySQL-server-5.6.41-1.el7.x86_64 (/MySQL-server-5.6.41-1.el7.x86_64) Requires: libc.so.6(GLIBC_2.17)(64bit) You could try using --skip-broken to work around the problem You could try running: rpm -Va --nofiles --nodigest 在网上所有了一番结果之后大概知道需要升级 gcc 版本,可是网上找对应的版本 GLIBCXX_3.4.15 很麻烦,有一个是需要下载 chrome 的 rpm 包进行安装之后获得 GLIBCXX_3.4.15 版本。 想到了阿里云有一个 yum 仓库(https://opsx.alibaba.com/mirror ),于是在仓库中搜索 libstdc 发现很多版本都有,下载了其中一个 compat-gcc-34-c++-3.4.6-19.el6.x86_64.rpm 进行安装之后发现安全一切顺利,命令: yum install ./compat-gcc-34-c++-3.4.6-19.el6.x86_64.rpm ,安装成功如图: 后来发现只需要安装 MySQL-devel-5.6.41-1.el6.x86_64.rpm 和 MySQL-shared-compat-5.6.41-1.el6.x86_64.rpm 包就可以解决了
概述 最近在实际项目中使用 p3c for eclipse 插件进行检测,发现项目中有不少不符合 “阿里巴巴 Java 编码规范” 的代码,现在已经由之前的 2000+ 个优化到 500 个以内了(还需要继续努力优化),这里就优化的过程中遇到的难点已经实践中的经验进行分享。 如何使用插件 eclipse 中可以安装 p3c 插件,可以参考官方的教程进行安装:https://github.com/alibaba/p3c/blob/master/eclipse-plugin/README_cn.md 如何优化代码 使用插件进行代码检测之后可以看到 Blocker、Critical、Major 三种级别信息,其中 Blocker 为最高级别,Major 为最低级别,如果需要优化的代码比较多的话,可以按照从高到低、从简到难到顺序进行优化。 在优化代码的过程中的一些典型的案例这里一一分享给大家 【Blocker】所有的包装类对象之间值的比较,全部使用equals方法比较 优化建议:如果是从数据库中查询出来的对象进行比较的话,重写对象的 equals 方法,方法内部使用 ID 进行比较,外部调用 equals 进行比较即可,一般情况下数据库中 ID 相同的对象就可以认为是一个对象了 【Major】不允许任何魔法值(即未经定义的常量)直接出现在代码中 优化建议:这一条规范在我们的项目中是最容易犯的,这也是容易偷懒不按照规范来进行编码的地方之一。例如我们判断身份证长度为 15 或 18 位,一般进行 if (length == 15 || length == 18) ,像银行卡长度等之类的都会用到这些数字,最好的方式是定义一个全局的常量来规范这些身份证长度、银行卡长度等,这样解决不规范的代码的同时还方便阅读代码。 手机号正则表达式验证、HTTP 请求成功响应码 200、一周 7 天、编码集字符串(例如:UTF-8)、换行符、逗号分隔符等,这些均可以定义为全局变量方便整个项目使用。 如果后端需要返回一些错误提示等,我们可以定义全局的提示 Language.java 或者使用不同的 Exception 进行错误返回。
之前在开发的时候遇到 utf-8 编码无法存储 Emoji 表情,后面经过研究之后需要用到 utf-8mb4 编码,这里网上很多教程说是要把 数据库、表、字段三个都设置为 utf-8mb4 编码,甚至有的教程需要修改 mysql.conf 配置文件,还需要重启 MySQL。 存在的问题 生产环境重启 MySQL 可不是一件小事,而且修改数据库编码影响很大,所以不建议修改数据库,mysql.conf 也是能不动就不动。 后面经过研究之后发现只需要设置字段为 utf-8mb4 编码即可注意排序规则也要对应的 utf-8mb4 规则。 数据库连接方面则不需要任何变动,数据库连接会自动识别 utf-8 和 utf-8mb4,连接地址使用以前的 utf-8 连接地址即可。
什么是 JRebel JRebel 是一套 JavaEE 开发工具。JRebel 允许开发团队在有限的时间内完成更多的任务修正更多的问题,发布更高质量的软件产品。 JRebel 是收费软件,用户可以在 JRebel 官方站点下载 30 天的评估版本。 JRebel 可快速实现热部署,节省了大量重启时间,提高了个人开发效率。 JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。JRebel 使你能即时分别看到代码、类和资源的变化,你可以一个个地上传而不是一次性全部部署。当程序员在开发环境中对任何一个类或者资源作出修改的时候,这个变化会直接反应在部署好的应用程序上,从而跳过了构建和部署的过程,每年可以省去部署用的时间花费高达 5.25 个星期。 如何安装 JRebel eclipse 安装 JRebel 打开 Help > Eclipse Marketplace 菜单; 搜索 JRebel,找到之后点击 Install 进行安装; 安装完毕之后重启 eclipse 即可完成安装。 IntelliJ IDEA 安装 JRebel 点击 Settings (Mac OS 点击 Preferences) 菜单,选择 Plugins; 点击 Browse Repositories 浏览; 找到 JRebel 之后点击 Install 进行安装; 安装完毕之后重启 IntelliJ IDEA 即可完成安装。 MyEclipse 安装 JRebel 下载最新版 JRebel: http://update.zeroturnaround.com/update-site/update-site.zip ; 点开 Help > Install New Software 菜单; 点击 Add 添加并且选择刚下载的 update-site.zip 安装包; 点击 Ok 确认之后等待安装完毕,重启 MyEclipse 即可完成安装。 其他 IDE 安装 JRebel 请参考:https://zeroturnaround.com/software/jrebel/learn/ 关于激活 相关技术交流裙:457167189
按照第一条的 SQL 查询 4 条数据,ID 分别为 3、2、4、1 然后按照第 2、3 条 SQL 进行同样的排序条件以及分页查询,预期的结果应该是 3、2 和 4、1 但是执行结果如下: ID 为 2 的数据竟然不见了,目前暂时通过 date desc, id desc 两个组合排序解决了此问题,但是又带来了新的问题,这样排序会导致索引实效。 有其他小伙伴遇到此类情况了吗?欢迎分享解决方案。
概述 本着节约为原则,一直在尝试使用最低成本运行各类应用,目前已经研究出来了一些最低成本运行 PHP 网站的方案,供广大阿里云用户参考。 所使用到的产品 1、共享虚拟主机普惠版,配置:空间:200M 流量:10GB,续费价格:39元/年2、对象存储 OSS,0.148元/GB/月,远比虚拟空间的价格便宜 如何搭建环境 第一步 共享虚拟主机中上传 PHP 代码,并且每个网站创建一个文件夹,由于空间不支持多域名,所以这里使用 .htaccess 来实现多域名多站点(曲线救国?),如下图:.htaccess 如下为了方便大家复制,这里提供文本代码: RewriteEngine On RewriteCond %{HTTP_HOST} '=site1.example.com' RewriteRule ^(\w+\.\w+) 'site1-example-com/$1' 第二步 绑定各个站点的域名如果要支持 https 则到 CDN 去绑定域名以及 DNS 解析 完成以上两步即可实现多站点并且低成本运行 PHP 网站了。 这里提一下,虚拟空间里面只存 PHP 代码,图片或者上传的文件都存在 OSS 中,成本低,并且访问速度比虚拟空间要快,因为没宽带限制。200M 的虚拟空间全部用来放 PHP 代码的话,可以运行很多个网站了,如果是开源的软件,则把 attachment 或者 resources 等放图片的目录拷贝到 OSS 去,代码中引用 OSS 上面的图片附件。20M 的数据虽然看起来小,但是用于个人网站,是可以用很久的。 暂时先写到这里,后期提供 PHP 版本的 OSS 直传代码,比虚拟空间中转上传要快很多
常用 SQL 汇总 使用索引注意事项 使用like关键字时,前置%会导致索引失效。 使用null值会被自动从索引中排除,索引一般不会建立在有空值的列上。 使用or关键字时,or左右字段如果存在一个没有索引,有索引字段也会失效。 使用!=操作符时,将放弃使用索引。因为范围不确定,使用索引效率不高,会被引擎自动改为全表扫描。 不要在索引字段进行运算。 在使用复合索引时,最左前缀原则,查询时必须使用索引的第一个字段,否则索引失效;并且应尽量让字段顺序与索引顺序一致。 避免隐式转换,定义的数据类型与传入的数据类型保持一致。 使用多列字段排序的时候,应当尽量使用同样的排序规则,否则会导致索引失效。 使用 lower 函数进行不区分大小写比较时,应当先检查字段的排序规则是否已经为 utf8_general_ci 不区分大小写排序,如果已经是,则避免使用 lower 转小写进行比较,因为 lower 会导致索引失效。 【事务】 mysql的MyISAM引擎是不支持事务的,需要更改为Innodb alter table table_name engine=InnoDB; 参考:http://www.linuxidc.com/Linux/2012-10/72884.htm 【复杂统计】 insert into web_statis(user,create_time,stone,dirt,orecoal,ironore,goldore,diamond,allore) select al.*,(stone+dirt+orecoal+ironore+goldore+diamond) as allore from (select cu.user, '2015-2-9 10:09:18' as create_time,(case when c1 is null then 0 else c1 end) as stone,(case when c2 is null then 0 else c2 end) as dirt,(case when c3 is null then 0 else c3 end) as orecoal ,(case when c4 is null then 0 else c4 end) as ironore,(case when c5 is null then 0 else c5 end) as goldore,(case when c6 is null then 0 else c6 end) as diamond from co_user cu left join (select count(*) c1,user from co_block where type in(1,4) and time >=1423353600 and time < 1423440000 group by user) tc1 on cu.rowid = tc1.user left join (select count(*) c2,user from co_block where type in(2,3) and time >=1423353600 and time < 1423440000 group by user) tc2 on cu.rowid = tc2.user left join (select count(*) c3,user from co_block where type = 16 and time >=1423353600 and time < 1423440000 group by user) tc3 on cu.rowid = tc3.user left join (select count(*) c4,user from co_block where type = 15 and time >=1423353600 and time < 1423440000 group by user) tc4 on cu.rowid = tc4.user left join (select count(*) c5,user from co_block where type = 14 and time >=1423353600 and time < 1423440000 group by user) tc5 on cu.rowid = tc5.user left join (select count(*) c6,user from co_block where type = 56 and time >=1423353600 and time < 1423440000 group by user) tc6 on cu.rowid = tc6.user) al 【根据查询结果update】 update A表 a INNER JOIN(select 字段1,字段2 from B表 b)t on t.字段2 = a.字段2 set a.字段3 = "XXX"; 格式:update table_a inner join table_b on xxx = xxx set table_a.xxx = "xxx" 【反向like查询】 SELECT id,keywords FROM wx_keywords WHERE '百度一下' LIKE CONCAT('%',keywords,'%'); 【字段数据转移】 update Devices as A left join Devices as B on A.ParentCode = B.Code set A.ParentID = B.ID; 【区分大小写查询】 select * from wx_news where url like binary("%appid%"); 【时间偏移】 时间字段 <= date_add(now(), interval - 6 MONTH) 参考:http://www.w3school.com.cn/sql/func_date_add.asp MySQL 添加索引 1.添加PRIMARY KEY(主键索引) www.2cto.com mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引) mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 3.添加INDEX(普通索引) mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 4.添加FULLTEXT(全文索引) mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 5.添加多列索引 mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` ) 【从小到大排序,0在最后】 select * from test order by seq=0,seq; 【MySQL计算时间差】 SELECT TIMESTAMPDIFF(MONTH,'2009-10-01','2009-09-01'); interval可是:SECOND 秒、MINUTE 分钟、HOUR、DAY 天、MONTH 月、YEAR 年 【按月统计数据】 select DATE_FORMAT(create_date,'%Y年%m月') months,sum(amount) amount from p2p_investment where transfer is null group by months; 参考网址:http://linkyou.blog.51cto.com/1332494/751980/ 【替换URL域名】 update p2p_ad set url = concat("https://www.51checai.com/", substr(url,LENGTH("http://test.51checai.com/")+1)) where url like "http://test.51checai.com/%"; update `p2p_borrowing_material` set large = concat("https://img-51checai.b0.upaiyun.com/", substr(large,LENGTH("https://img.51checai.com/")+1)) where large like "https://img.51checai.com/%"; 【推荐数据修复】 查询: select id,create_date,`referral_setting`,date_add(create_date, interval +180 day), CONCAT("{\"referralAmount\":10000,\"referralGift\":\"31\",\"referralGiftTwo\":\"32,33\",\"paymentTime\":\"2016-04-01\",\"finishTime\":\"" ,DATE_FORMAT(date_add(create_date, interval +180 day),'%Y-%m-%d') ,"\",\"feeRate\":0.01}") from p2p_member where create_date >= "2016-04-01" and create_date < "2016-09-22" and `referrer` is not null order by id desc; 更新: update p2p_member set `referral_setting` = CONCAT("{\"referralAmount\":10000,\"referralGift\":\"31,38\",\"referralGiftTwo\":\"32,33,39\",\"paymentTime\":\"2016-04-01\",\"finishTime\":\"" ,DATE_FORMAT(date_add(create_date, interval +180 day),'%Y-%m-%d'),"\",\"feeRate\":0.01}") where create_date >= "2016-09-22" and `referrer` is not null; 【指定数据互换】 update test t1 left join test t2 on t1.id = ((select 1+2)-t2.id ) set t1.position = t2.position where t1.id in (1,2);
2020年06月
2020年05月
2019年09月
2019年08月
2019年07月
2019年06月
除数不能为 0,在计算 x / y 之前,检查 y 是否为 0 来避免 Division by zero 的问题
具体是什么情况呢
需要你有虚拟空间或者购买服务器才可以哦
你的服务器内是否运行了防火墙等软件,可以先关掉防火墙再试试
需要你截图看一下具体情况哦
重启之后保证 crontab 开机运行了就不会影响的
具体要看网页大小,如果是 64KB 的话,支持同时 1 秒钟内两个人访问
一个页面 128KB 的话,一秒钟只能一个人访问
续费的时候建议你将宽带改成按流量计费,这样会节省不少钱
目前只能通过 CDN 来实现虚拟主机 HTTPS 访问,也希望阿里云尽快支持
1、快照备份
2、创建自定义镜像
3、购买 SSD 服务器
4、使用自定义镜像初始化系统
直接用来服务端通讯用的话,是可以不需要进行备案的。因为通讯的时候会先通过域名进行 IP 地址解析,拿到 IP 地址之后就可以通讯了,阿里云未备案的只是会影响 80 端口网站访问
具体要看你什么情况哦,可以截图发上来帮你看看
建议你使用最新版谷歌浏览器
如果你的网站可以通过类似于 112.x.x.x 这种 IP 地址访问的方式,那么只需要在域名解析的地方添加解析记录:A 记录,记录值为你服务器 IP 地址,等几分钟之后就可以使用域名访问你的网站了
推荐你使用 screen 命令即可解决你的问题。
CentOS:yum install screen 安装软件,
screen -a 创建窗口,然后运行你的程序,
ctrl+a 之后再按 c 可以创建新的窗口
ctrl+a 之后再按 n 可以在两个窗口之间切换
之后你关掉 putty 程序不会退出
下次登录服务器输入 screen -x 即可恢复,恢复之后使用 ctrl + a 再按 n 切换不同窗口
-------------------------
-------------------------