第一次把项目部署到淘宝聚石塔的 SAE 环境时,我遇到过一个挺典型的问题:代码看起来没问题,容器就是一直重启。
后来查下来,问题其实很简单,但如果第一次接触 SAE,确实很容易踩。把这次部署过程中比较有价值的几个点记录一下。
1、先说最关键的:Nginx 监听 8080
我们平时自己搭服务器,Nginx 经常监听 80,所以第一次配置的时候,很容易顺手就这么写。但 SAE 这里不行,需要监听 8080。
这个端口是 SAE 健康检查需要的。如果应用没有监听正确端口,平台会认为应用不正常,然后你看到的结果就是:容器不断重启。
所以以后遇到"代码没报错,容器就是起不来",第一时间看看端口。
![]()
2、启动命令也别想当然
项目最后使用的启动方式是:
php-fpm -D && nginx -c /home/admin/app/nginx/default.conf -g 'daemon off;'
这里有一个小地方也挺容易踩坑:容器里使用的是 /bin/sh,不是 /bin/bash。
这种问题很典型,本地环境能运行,换到平台环境以后就不一定。所以部署到 SAE 的时候,不要完全照搬自己以前服务器上的启动脚本。
3、PHP 项目根目录也不一样
SAE 的 PHP 项目目录有自己的约定,项目里需要配合 /home/admin/app/php 作为 PHP 项目的根目录,Nginx 的配置还需要引入平台提供的相关配置文件。
也就是说,这里不是你在一台裸服务器上从零搭环境,平台本身已经有一套运行规则。
![]()
4、PHP 扩展要提前确认
项目需要的 PHP 扩展也比较多,比如:mysqli、pdo_mysql、mbstring、curl、xml、zip、bcmath、gd、fileinfo、sockets、redis。尤其 redis 是 PECL 扩展。
如果本地开发环境什么都有,到了 SAE 才发现某个扩展没有,排查起来会很浪费时间。所以我的建议是:部署之前先把运行环境依赖列出来,不要等运行时报错再补。
5、数据库和 Redis 的地域要统一
这个是云服务里面非常容易被忽略的一个问题。这个项目里涉及:SAE、MySQL RDS、Redis、EIP、CLB,这些服务的地域要保持一致。
不要 SAE 在北京,RDS 买上海,Redis 又买杭州。具体还是要按照项目环境和平台规则来配置,但至少不要默认认为"反正都是阿里云,随便买"。云服务之间的网络关系,本身就是部署的一部分。
![]()
6、EIP 要提前考虑
项目部署的时候,如果后端需要访问公网,还要考虑 EIP。我们当时的经验是:EIP 最好提前准备,实际项目里建议准备两个,方便应用运行过程中做更新等操作。
这个事情最好在项目开始部署的时候就考虑,而不是上线前一天才发现缺资源。
7、CLB 也不是最后随手配一下
如果使用 CLB,先把 CLB 创建好,再让 SAE 侧接入。另外,如果后面要做 ALB,还会涉及 VPC 和交换机。
交换机这个东西平时写业务代码的时候根本不会关注,但到了部署阶段,它们全部变成项目的一部分。这也是我做这类平台项目之后比较明显的感受:部署能力本身就是研发能力的一部分。
8、runtime 权限问题也遇到过
ThinkPHP 项目运行的时候需要写缓存、日志、编译文件,所以 runtime 目录需要有写权限。如果权限不对,会出现一些看起来莫名其妙的问题。
排查的时候不要只盯着 PHP 代码。"代码没问题"不代表"运行环境没问题"。
![]()
9、最后给一个部署排查顺序
如果以后再碰到类似问题,我一般会按照这个顺序查:
第一层,容器:应用有没有启动?Nginx 有没有启动?端口是不是 8080?
第二层,PHP:PHP-FPM 有没有起来?扩展有没有?项目根目录对不对?
第三层,权限:runtime 能不能写?日志能不能写?
第四层,网络:EIP、CLB、VPC、交换机、服务地域。
第五层,第三方 API:能不能访问淘宝 TOP API?AppKey / AppSecret 是否正确?session 是否有效?
这样查,会比"重新部署一下试试"有效得多。
最后
这次项目让我比较深的一个感受是:部署不是开发完成之后的附加工作。
尤其是这种强平台依赖的项目,你从一开始选平台、选服务、申请权限的时候,其实就已经在做部署设计了。代码只是其中一部分。
很多线上问题,最后都不是代码写错了,而是:端口、权限、网络、服务、环境变量、第三方平台。这些东西如果提前考虑清楚,项目上线会轻松很多。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.