记一次Nginx性能调优过程

最近在运维上接触到的Nginx比较多,也从中遇到了一些Nginx配置上的一些问题,在此总结一下两个问题,一个是由于预留连接数过大导致的内存占用过大的问题,一个是权限不足而导致的403的问题。

Part1: 占用内存高

在docker中部署前端web项目时,发现加入了前端项目之后内存整整提升了1G左右,这很诡异,因为就算一个后端项目(就与之后端的项目),占用的内存也没有这个高,所以初步怀疑是Nginx的问题,于是各种ps -aux | grep nginx或者直接top查看,但是仍然发现其实进程本身占用的内存不高,那到底是为何使得整个docker容器占用的内存高呢?

通过一系列的排查与实验,终于发现了罪魁祸首,原因是Nginx的几个默认配置:

# nginx.conf
worker_processes  auto;
worker_connections 484000;

原来,Nginx分为masterworker模式,即nginx启动之后会生成一个master进程,然后由这个主进程fork出来n个worker进程,并由每个worker进程来负责外部请求,那这个master进程有什么用呢?

其实它是一个管理进程,管理着所有的worker,但它本身不负责任何请求处理,当我们使用nginx -s reload时,会通过master分发通知到各个worker,从而实现配置的平滑更新。

所以,这个worker_processes就代表了产生多少个worker进程,如果为auto,则你的机器有多少个核就会产生多少个worker。通过按需设置这个值,可以减少nginx的内存占用。

另外,worker_connections表示每个worker进程可以host多少个并发的请求连接,默认这个值会使得一个worker耗费500m以上的内存,所以,通过按需设置这个值,可以大幅度减少nginx的内存占用。

总而言之,按需减少这两个配置,可以达到降低nginx内存的效果.

Part2: Nginx host web 403

另外,如果nginx作为web容器出现访问403的时候,一般可以在nginx的错误日志中找到如下:

 [error] 50#0: *86 open() "/usr/local/openresty/nginx/html/js/xx.js.gz" failed (13: Permission denied), client: xx.xx.xx.xx, server: xx-xx-xx.xx.cn, request: "GET /js/xx.js HTTP/1.1", host: "xx.cn", referrer: "http://xx.cn/xx.html?callback=http://xx.cn/"

这里的原因很简单,其实就是权限的问题,首先,通过nginx的配置修改nginx的用户

#nginx.conf
user  nginx www;

这里的nginx表示一个用户,www表示一个用户组,通过这样配置,nginx的master进程的所有者会是root,而所有的worker进程的所有者会是nginx,当目录权限不够的时候,就会产生403,解决方式为修改目录权限

chown -R nginx:www /usr/local/openresty/nginx/html/

当然,网上也列举了一些其他可能的问题,但这里不作描述。

赞赏我吗