之前学习了nginx的基本配置后 个人项目运用过 正好最近公司的项目需要将手上的工作独立拆分出来 于是就需要我这独立配置一套新的nginx 在过程中也发现了不少之前没注意到的问题 (所以说实践还是检验问题的唯一方法啊 汗(lll¬ω¬) )话不多说 我们快速进入正题
1. 关于时间相关设置
我们公司的架构是有个上层的nginx服务器 然后转发到我们前端部署的nginx服务器 之前一直以为上层服务器只负责转发到前端的nginx 配置并不会互相影响 但是在实际操作中才意识到 当上层服务器设置时间 比如proxy_send_timeout proxy_read_timeout 等小于 缓存服务器时 则会影响,接口会报超时,所以要注意上层服务器最好是不要设置时间,如果设置时间一定要比缓存服务器的时间大
2.关于文件权限
之前在测试环境部署的时候一直是配置user root 但是在生产环境里面并没有配置 结果导致试运行的时候 文件上传超过一定大小就直接报错了 后来发现 文件下载的时候也有这个问题 经过科学上网了解到 nginx 默认proxy_buffering 是开启的状态就是说对于文件流类型超过设置的大小proxy_buffer_size 缓冲区大小 会将其存放在nginx的临时文件这个值只会走应用的前端服务器 不会根据上流服务器的设置变化路径是在proxy_temp 如果没有设置 user root 在配置了nginx 进行reload以后 文件的属主会变成nobody从而接口在超过一定大小的时候由于没有写入临时文件的权限就会报错,而下载则是会将后端返回的base64直接截断问题排查:可以通过ls- l 查看文件的权限码 属组 属主 可以通过chown -R 属主:属组 文件名 修改 chmod -R 权限码 文件名 进行权限码的修改 通常使用755
3.关于nginx直接执行不带sudo 报文件权限错误(仅用于本地开发环境和测试环境!!,生产环境还是需要sudo运行,因为master必须是root权限,才能绑定80 443端口)
前提:如果某些情况下 不能修改nginx.conf主配置文件的user
whoami查看当前用户
ls - l查看报错文件的权限 属主 属组
将当前用户添加到文件的属组
sudo usermod -a -G 【属组】 $(whoami)
newgrp 【属组】使配置生效
再看下当前文件的权限码 依然使用ls -l 查看第一列
权限码含义:【所有者权限】-【所属组权限】-【普通用户权限】
将所属组权限改为可读写chmod -R 644 【文件名】
还需要注意:当conf里设置user后 直接运行命令 提示the "user" directive makes sense only if the master process runs with super-user privileges是因为在设置user时 文件权限只能为root,此时可以进行隐式提权:1. 将运行的二进制文件权限改为root:root 2.添加 setuid 权限 给普通用户提权 chmod u+s 运行的二进制文件
4. nginx的热部署
这个问题是在部署jenkins 的时候 发现有可能已经 jenkins和当前版本的java 不对应 或者说当前发布的版本已经不支持已经安装的过旧版本 所以需要进行版本升级 从而联想到了之前看过的nginx 热部署场景 (因为之前一直没理解说为什么会需要nginx 版本升级) 从而特此再梳理下
1.将当前的nginx 二进制文件cp备份
2.将新的nginx二进制cp到原有的nginx 二进制文件路径
3.启动新的nginx进程kill USR2 <当前master进程的pid>
4.停止旧进程kill WINCH <旧master进程的pid 即 执行kill USR2之前的master 进程的pid>
5.如果热部署错误需要版本回退 可以对旧主进程发送 kill HUP 对新主进程 发送kill QUIT
nginx -s reload 等价于 kill HUP
nginx -s reopen 等价于 kill USR1
关于nginx相关配置 见笔者另一篇文章
https://blog.csdn.net/goldfish_333/article/details/160230085?sharetype=blogdetail&sharerId=160230085&sharerefer=PC&sharesource=goldfish_333&spm=1011.2480.3001.8118