关于nginx的几点小事

作者:杨润炜
日期:2017/5/23 22:01

平滑升级nginx

在之前的文章说明了重新编译nginx,里面就涉及到平滑升级的问题,及不停服地更新nginx版本或者给nginx编译进新的模块。nginx提供了一种方法,即给nginx当前进程发送一个USR2信号量,启用一个新的nignx(新版本或新编译的nginx),新的请求将流入nginx新进程,而旧的nignx会继续处理之前的请求,直到请求结束,旧进程退出,新进程完全接替nignx的工作。命令如下:

  1. kill -USR2 `cat /run/nginx.pid`

然而,很多人应该会得到一个结果:完全没有效果!!!
为什么呢?查nginx/error.log日志会发现,抛出了这样的错误:
10690#0: execve() failed while executing new binary process “nginx” (2: No such file or directory)
这告诉我们,找不到nginx这个命令。这是因为我们一开始启动时就是依赖的是环境变量,但这时候nginx需要的是一个绝对的路径来找到nginx命令所在,所以出错了。
解决方法是:启动时要使用绝对路径。如:

  1. /usr/bin/nginx -c /etc/nginx.conf

以后就可以顺利用USR2来平滑升级nginx了。

访问限制

可以通过nginx提供的ngx_http_limit_conn_module模块来实现访问限制。
先从实例入手吧。如果想限制www.yangrunwei.com这个域名每个ip同时只能有一个请求,可以这样:

  1. limit_conn_zone $binary_remote_addr zone=addr:10m;
  2. server {
  3. location /www.yangrunwei.com/ {
  4. limit_conn addr 1;
  5. }
  6. }

limit_conn_zone用来指定一个存储请求的区域,请求的索引可以是ip或者server_name,语法为:limit_conn_zone $variable zone=name:size; 这里使用$binary_remote_addr,即请求ip的二进制,大小为10m,可以同时容纳16多万请求。
limit_conn:指定每个给定键值的最大同时连接数,当超过这个数字时被返回503 (Service Temporarily Unavailable)错误。

生成请求唯一标识

某些api服务,需要清晰展示请求从进入到返回的整个流程。如果以nginx作为入口的话,可以在nginx上对每个请求生成一个唯一标识,然后逐级传下去,在各级日志中打印这个标识,即可以在日志中查看到某个请求整个流程的情况。
生成方法:

perl方式

这种方式较为简单,使用的是nginx的perl模块:ngx_http_perl_module,配置如下:

  1. perl_set $request_id 'sub {
  2. return join "", map{(a..z,A..Z,0..9)[rand 62]} 0..11;
  3. }';

其中$request_id即为单次请求的唯一标识。若要调整标识位数为6,即将最后的0..11换为0..6

其它模块

nginx-x-rid-header
nginx_requestid

动态加载模块

在nginx1.9之前,模块与nginx一起编译到二进制文件中,使用时加载所有模块运行的。
1.9及之后版本,nginx支持动态模块加载,即编译nginx时可使用*_module=dynamic的形式,让模块作为动态加载使用。
使用动态模块时,需使用load_module path/to/module,加载模块。

关于upstream长连接设置

  1. upstream api-open{
  2. server 127.0.0.1:3000 max_fails=0;
  3. keepalive 200;
  4. }

对于upstream长连接配置,一般会有这样的误区,认为keepalive表示最大的长连接数,或者最小的长连接数。
其实都是错误的。
nginx默认是开启长连接的,即每个请求都会分配长连接,这里也不得不提另外一个参数,即允许多少个请求复用同一个长连接,因为这可以减少长连接数。

  1. keepalive_requests 100;

然而,upstream里的keepalive并不是限定长连接数的最大或者最小值。而是表示当前活跃的长连接数的限定值。
比如,当前有1000的请求进来,nginx需要开启1000个长连接(假如keepalive_requests为0),处理完1000个请求后,由于keepalive为200,所以另外800个长连接会释放掉,当第二次1000个请求进来时,再重新建立800个长连接。
所以当并发高时,这个值就设置大的数值,防止长连接不断释放与建立。

参考

nginx限制连接数ngx_http_limit_conn_module模块
支持keep alive长连接
Nginx总算支持动态模块了

感谢您的阅读!
如果看完后有任何疑问,欢迎拍砖。
欢迎转载,转载请注明出处:http://www.yangrunwei.com/a/83.html
邮箱:glowrypauky@gmail.com
QQ: 892413924