AHdark
一个多语种开发蒟蒻
AHdark Blog

云骏数据 Server Group Main 踩坑记录

前言

是的,我以首席架构官身份入职了海南云骏时代科技有限责任公司

上次在圆云科技是首席技术官,这次在云骏时代是首席架构官呢

祝我加油!

目前写了点文档做了套架构,之后会做更多的吧!

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

上次踩过的坑这次不会忘,网站目录下的文件必须给予wwwwww-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.inidisplay_errorserror_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、动静分离一类的。

赞赏
本文链接:https://ahdark.com/technology/984.shtml
本文采用 CC BY-NC-SA 3.0 Unported 协议进行许可
欢迎加入Q群交流:654022768

AH Dark

文章作者

本博客的运营者、主要开发者、主要作者 深度学习算法工程师,后端工程师,嵌入式软件开发工程师 Azure认证 运维工程师

发表评论

textsms
account_circle
email

AHdark Blog

云骏数据 Server Group Main 踩坑记录
新入职海南云骏时代科技有限责任公司,担任首席架构官。现调试主要服务器组环境,记录踩坑日志
扫描二维码继续阅读
2021-09-15