前言
是的,我以首席架构官身份入职了海南云骏时代科技有限责任公司
上次在圆云科技是首席技术官,这次在云骏时代是首席架构官呢
祝我加油!
目前写了点文档做了套架构,之后会做更多的吧!
Main
架构
本次架构部署选用了LANMP结构
设施
- 腾讯云CVM S4.MEDIUM4
- 2 Cores
- 4 GB Memories
- 3Mbps Network
- 腾讯云TDSQL-C
- MySQL 5.7
Web Service
前端调用Nginx,若检索为动态则请求Apache,Apache调用FastCGI请求PHP解析
俗称LANMP(只不过这次MySQL外置)
主要优点是稳定、兼容好
主要缺点是资源占用大
这是伟大的 云骏时代首席技术官 CornWorld 提出的先进架构!
应用
云骏数据
云骏数据采用 魔方财务系统 搭建
框架为 ThinkPHP 5.1
WebTogether 挂机宝
未来会部署在此服务器,目前还未部署
记录
1. Authority
上次踩过的坑这次不会忘,网站目录下的文件必须给予www
或www-data
用户全权限
cd /path/of/website/
chmod -Rf 755 *
chown -Rf 755 www:www
2. Session
这次新踩坑
众所周知PHP的Session可以使用Redis
/Memcache
/Memcached
存储
配置Redis时,session.save_handler
应设为redis
配置Memcache时, session.save_handler
应设为memcache
那配置Memcached时你自然就会写memcached
上去
问题来了,这会使得PHP无法读取Session
在此处,Memcached是一个PHP扩展,但对应软件仍为Memcache
所以,应用如下设置
[Session]
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
warning 注意
由于Memcached无鉴权机制,应放置内网
3. ThinkPHP Debug
网站访问500,Apache Log和Nginx Log都没有记录
最开始我开启了php.ini
的display_errors
和error_reporting
,报错内容是
PHP Fatal error: Uncaught Error: Class 'think\\Facade\\Request' not found in /data/wwwroot/****/app/common/exception/Http.php:147
Stack trace:
#0 /data/wwwroot/****/app/common/exception/Http.php(86): app\\common\\exception\\Http->fileError(Object(app\\server\\FileExistsExctption))
#1 /data/wwwroot/****/vendor/thinkphp/library/think/Error.php(57): app\\common\\exception\\Http->render(Object(app\\server\\FileExistsExctption))
#2 /data/wwwroot/****/vendor/thinkphp/library/think/Error.php(91): think\\Error::appException(Object(think\\exception\\ErrorException))
#3 [internal function]: think\\Error::appShutdown()
#4 {main}
thrown in /data/wwwroot/****/app/common/exception/Http.php on line 147
然而 /data/wwwroot/****/app/common/exception/Http.php
被魔方加密了,我还骂了好一阵魔方
最后才发现,ThinkPHP框架的Debug应在 public/index.php
中将 APP_DEBUG
常量设为 true
我实在过于伞兵
请务必使用争取Debug方式,否则无法解决问题!
4. MySQL 5.6 & 5.7
5.7理论兼容5.6,实际也确实兼容5.6
但是我使用的时候出现报错 SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #22 of SE
(错误不完整)
去CSDN看了看才发现
一、原理层面
这个错误发生在mysql 5.7 版本及以上版本会出现的问题:
mysql 5.7版本默认的sql配置是:sql_mode=”ONLY_FULL_GROUP_BY”,这个配置严格执行了”SQL92标准”。
很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。
二、sql层面
在sql执行时,出现该原因:
简单来说就是:输出的结果是叫target list,就是select后面跟着的字段,还有一个地方group by column,就是
group by后面跟着的字段。由于开启了ONLY_FULL_GROUP_BY的设置,所以如果一个字段没有在target list
和group by字段中同时出现,或者是聚合函数的值的话,那么这条sql查询是被mysql认为非法的,会报错误。
by https://blog.csdn.net/haibo0668/article/details/99751312
所以应在 my.cnf
设置 sql_mode=""
保存并重启MySQL即可解决
至于我们使用的TDSQL-C,则需前往数据库管理-参数设置
将选项全部去除勾选,保存即可
5. 0916新增 关于TDSQL-C
搭建完测试,奇慢无比,动态加载近20秒
很明显是PHP问题,由于使用LANMP环境,我怀疑是Nginx->Apache这一步出现问题,所以做了快照改LNMP环境试试
然后发现还是这么慢
那问题就出在PHP了
于是我去百度:thinkphp响应太慢
于是看到了这篇
thinkphp 打开速度缓慢,大多由于数据库读取问题!解决方法
数据库连接配置参数DB_HOST如果原来配置的是localhost或者域名,请修改为ip地址127.0.0.1
by https://blog.csdn.net/u010766123/article/details/60573116
然后我就想起来我使用了 TDSQL-C 的 读写分离 功能
关于读写分离的必要性我会单开一篇文章,但其主要目的是增加读取速度
降速就很离谱了
我是根据 ThinkPHP 5.1 完全开发文档 配置的主从数据库
真的离谱啊,换回主数据库连接,加载速度 20s -> 2s
没有仔细排查,也不清楚是ThinkPHP的锅还是TDSQL-C的锅,总之别用读写分离就是了
成果
测试环境已经完成,我通过更改Hosts方式直接访问IP连接服务器。预计在内部人员完成全部测试后就会放到生产环境,到时候还会部署CDN、DCDN、动静分离一类的。
qpzc
啊!伟大的首席技术官!
555