最近新入职公司,同事遇到一个问题,说是线上客户一个系统,一增加产品就出现404错误,同一个URI,GET访问就没问题,用表单POST数据过去就出现404错误,讲道理来说,就算出问题,这应该是后端问题,如果报502错误我能理解,但是后端问题你给我报个404是几个意思?
讲道理我是不喜欢用这些面板的,不出问题还好,出了问题因为不是自己配置的,很难查找问题,而且因为不是自己配置的,使用起来总是觉得不顺手,所以一般Linux服务器,我都是自己手动敲命令配置的,出了问题也方便解决。当然,这是题外话,这里重点是说说宝塔引发的一个小问题导致的坑。
由于我也是新入职,服务器具体怎么配置的我也不是很清楚,我所知道的就是,一个线上的基于ThinkPHP3.2开发的类似在线商城系统,管理后台一提交商品数据上去就报404。我简单检查了下,表单页面本身和表单提交地址是同一个,看了代码,确实也是在同一个方法,很明显,先不管具体是什么错误,这个由后端产生的错误,而前端Nginx应该抛出502错误的却只抛出一个404错误,这点很明显就不合适。
我不知道宝塔官方人员是怎么考虑这个问题的,可能是出于安全原因,即使程序报错也不想将错误信息展示给用户。这点可能对新手用户比较好,但是作为一个刚上手宝塔面板的开发者来说,却非常不合适,不便于开发者查找问题。
直接结果就是,因为这个404错误,我直接花了半天多的时间断点调试具体错误在哪。最终,花了点时间搜索了下,发现注释这一行代码就能看到具体的错误信息:
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
error_page 502 /502.html;
#ERROR-PAGE-END
后端展示具体错误信息之后,最终定位在一个SQL写入方法上,于是根据报错信息修改了下代码。
你以为事情到这里就结束了么,并没有这么简单。
由于我们这个系统是类似于电商系统,其中涉及到不止一个价格类似字段,一开始修改代码之前,以为只是一个字段设置问题,就修改了下代码,让要写入的数据符合表字段结构,但是修改完之后又发现,这就跟捅了猴子窝一样,修改完一个又是一个。
而更诡异的是,同样的代码和数据库,在本地macOS系统MAMP组合运行就完全没问题,但是一到线上的宝塔面板就出问题,一开始我还以为是Nginx导致的问题,就随手找了台服务器配了个LNMP试了下,发现同样的代码并不会出现这问题,一上宝塔环境就出问题,诶哟我去,简直了。
为了测试问题到底在哪,我从本地已经写入的数据复制成一条insert语句拿到线上测试了一下,发现能正确写入数据库,但是如果通过宝塔后台的数据库管理界面就报错,报错大致如下:
ERROR 1366 (HY000): Incorrect decimal value: '0' for column 'xxx' at row xxx
上网查了下,出现这问题,貌似是因为开启了strict模式,解决办法也很简单,将strict模式关闭,然后重启MySQL就可以了。
修改my.ini或者my.cnf,将其中的sql-mode中的STRICT_TRANS_TABLES就行了,手上一台Debian 9装的MariaDB,默认就是/usr/my.cnf,其他机器没试。
说句题外话。
如开头所说,我实在是不喜欢用那些图形化的控制面板,对于服务器,我更喜欢自己一行一行敲命令手动去配置,因为我觉得,只有自己手动去实践了,对于常见配置了解其作用,出了问题也才能快速查找、定位、解决问题。虽然不能否认,那些面板能帮我们节约很多时间和精力,但是,太依赖别人写的面板,会失去很多学习的机会,