2021.06.16
运维部署Nginx 反向代理与 HTTPS 基础:工程实战
工程实战:记录学习和项目里遇到的server block、证书、代理头、gzip 和访问日志问题,重点写理解过程、踩坑和排查方法。
Nginx 反向代理与 HTTPS 基础:工程实战
先说背景
这篇是 2021 年左右整理的一段学习记录,主题是运维部署里的「Nginx 反向代理与 HTTPS 基础」。当时不是为了追热点才写,更多是因为自己做项目、查问题或者部署服务时反复碰到类似场景,觉得有必要把来龙去脉记下来。server block、证书、代理头、gzip 和访问日志 这些点看起来分散,但真正动手时经常会串在一起:前面一个参数没想清楚,后面排查就会多花很多时间。
我写这类文章一般不会只贴命令。命令很容易过时,截图也只能说明当时跑通了。更有用的是把问题出现的环境、自己怎么判断、最后怎么验证写清楚。以后再遇到相近问题,哪怕框架版本变了,也能根据思路重新推一遍。
我当时怎么理解
刚开始看这个主题时,最容易误解的是把它当成一个单独知识点。比如只看 API、只看配置项、只看某个教程里的 demo,都会觉得不难。但放到真实项目里,它会牵扯到环境、进程、网络、日志和告警。这里面任何一环没处理好,表面上功能能跑,后面就可能出现慢、乱、难维护的问题。
所以我会先把它拆成三个问题:
- 输入从哪里来,格式是否稳定,哪些字段会影响后面的判断。
- 中间处理靠什么完成,是框架默认行为,还是自己写的逻辑。
- 结果怎么确认,不能只靠“页面看起来正常”,还要看日志、数据和异常情况。
这个拆法比较朴素,但很适合自己做项目。因为很多问题不是不会写代码,而是没有先把边界想清楚。
实际练习
我通常会先做一个很小的版本,把主流程跑通,再一点点补充异常处理和记录。比如先让接口能返回正确结果,再看参数不完整、数据为空、请求重复、服务器重启这些情况会不会出问题。这样写起来慢一点,但后面改的时候心里有底。
systemctl status app
journalctl -u app --since today
踩过的一些坑
第一类坑是路径和环境。开发机上写死的路径,到服务器上经常直接失效;本地数据库密码、端口、文件目录和线上也不一样。如果没有用环境变量或者配置文件分开,最后排查会很烦。
第二类坑是日志不够。很多时候不是程序完全报错,而是结果不符合预期。如果只看页面,很难知道问题出在数据、接口、缓存还是权限。我后来习惯在关键步骤留下简短日志,至少能看出请求有没有到、查到了多少数据、最终走了哪条分支。
第三类坑是过早追求完整。刚开始就想把所有功能做漂亮,很容易把问题做大。比较稳的做法是先保留一个能运行的版本,再去优化页面、性能和边界处理。
后面怎么用
这篇笔记对我来说更像一个备忘录。真正有价值的不是某一段代码,而是以后做类似项目时能少绕一点路:先确认数据,再确认流程,最后确认部署。技术栈可以换,但这个顺序基本不会变。
如果后面继续完善,我会把它补成三个东西:一个最小例子,一份排查清单,一段项目里的真实用法。这样文章就不只是学习记录,也能慢慢变成自己的项目经验库。
留言板 ✉️
欢迎交流技术问题。游客可以填写邮箱留言,邮箱不会在页面公开显示。
还没有评论,来做第一个留言的人吧。