常见的Linux系统下的网站架构
一台运行了三年没重启的系统下CentOS 7服务器,上面跑着Nginx、网站PHP-FPM和MySQL,架构撑住了日均两万PV的系统下小型电商站。这不是网站什么高深配置,就是架构最常见的LNMP。Linux下的系统下网站架构,说到底是网站在资源、成本和可靠性之间找平衡点,架构不是系统下堆技术栈。 Nginx在这套架构里干两件事:处理静态文件和转发动态请求。网站静态请求它直接读磁盘返回,架构一张压缩过的系统下JPG图片,Nginx在千兆网卡下能跑到接近线速。网站动态请求交给PHP-FPM,架构通过FastCGI协议走Unix Socket通信,比TCP回环少一层协议开销。我见过有人把Nginx和PHP-FPM分开部署,结果Socket通信变成TCP跨机调用,延迟从0.1ms涨到0.8ms,PV一高就出问题。除非有特殊隔离需求,否则两者放同一台机器更划算。 PHP-FPM的进程管理是个容易踩坑的地方。默认的 MySQL的配置更微妙。 缓存层是架构里性价比最高的部分。Redis用来存Session和热点数据,一台2GB内存的Redis实例,QPS轻松过万。但别把所有东西都往Redis里塞,我见过有人把商品详情页整个HTML缓存进去,结果内存爆了。缓存要设过期时间, 文件存储这块,小站直接用本地磁盘就行。但要注意inode数量, 监控和日志不能省。 这套架构跑个几万PV没问题,但再往上就得拆。数据库主从、读写分离、负载均衡、CDN,每一步都是钱和复杂度的权衡。我见过一个日活五千的社区,非要用Kubernetes加微服务,结果运维成本比服务器还贵。架构是长出来的,不是设计出来的,先让业务跑起来,遇到瓶颈再针对性优化。pm=dynamic模式,pm.max_children设成5,结果并发一上来就502。这个值得按内存算:每个PHP进程大概占30-50MB,8GB内存的机器,留2GB给系统和其他服务,剩下6GB能开120个左右。但别真开到120,留点余量,设80比较稳。pm.max_requests设500,让进程处理完500个请求后自动重启,避免内存泄漏累积。innodb_buffer_pool_size通常设成物理内存的50%-70%,但如果你和PHP-FPM、Nginx挤在同一台机器上,这个比例要降。我见过一台16GB的机器,buffer pool设了12GB,结果系统OOM killer把MySQL杀了。后来降到8GB,留足空间给Web服务,反而稳定了。慢查询日志一定要开,long_query_time设1秒,每周用pt-query-digest分析一次,能揪出不少全表扫描的SQL。maxmemory-policy用allkeys-lru,让Redis自己淘汰冷数据。Memcached在多核环境下性能更好,但Redis的数据结构更丰富,选哪个看业务场景。df -i看一下,有时候磁盘没满但inode用完了,照样写不进去。大站得上对象存储,或者用NFS、GlusterFS做共享。我试过用NFS存用户上传的图片,结果网络抖动时Nginx读文件超时,页面加载卡住。后来改成先写本地再异步同步到NFS,体验好很多。netstat -s看TCP重传率,超过1%就有问题。iostat -x 1看磁盘await,超过20ms说明IO有瓶颈。Nginx的access log用GoAccess实时分析,能直观看到哪些URL慢、哪些IP在刷接口。别等用户投诉了才查日志,那时候损失已经造成了。
-
上一篇
-
下一篇