ngx.resp.get_headers()

 lua, nginx  ngx.resp.get_headers()已关闭评论
8月 022017
 

 

syntax: headers = ngx.resp.get_headers(max_headers?, raw?)

context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, balancer_by_lua*

Returns a Lua table holding all the current response headers for the current request.

This function has the same signature as ngx.req.get_headers except getting response headers instead of request headers.

 

参考: https://github.com/openresty/lua-nginx-module#ngxrespget_headers

注意: 字段名都会转换成小写

 Posted by at 下午 2:27

关于tcp代理与keepalive

 haproxy, nginx, 代理  关于tcp代理与keepalive已关闭评论
11月 172016
 

关于tcp代理涉及3个实体:

c: client

p: proxy

s: server

 

c  <—–> p <—–> s

c 和 p建立tcp连接, p 和 s 建立tcp连接;

对于tcp来讲,很可能不是http那样ask and answer then close的, 很有可能连接上长时间没有数据,那么会出现什么问题呢?

  1. 假如 c 和 p 之间的网线短了, c 不可能再关闭这个连接了,那么p如何释放这个连接呢?
    1. p 在该连接上设置keepalive,定期检查连接是否断开,一般系统设置的间隔时间为2小时
    2. 一定程度上,c也关心这个长时间没有使用的连接是否依然可用,那么,c也可以在该连接上设置keepalive
  2. 问题:
    1. p 是否会转发c 的keepalive 数据包?
      1. p 是tcp(传输层)的代理,只有接到数据才会转发,没有数据不会转发
      2. keepalive 实际上是一个数据长度为0的ip数据包
      3. 所以: p 不会转发keepalive
    2. 既然p不会转发keepalive,那么如果p和 s 之间的链路出现问题,c 将不知道其实连接已经不可用了,然后就会数据发送失败

总结:

  1. p 有必要和c、s keepalive
 Posted by at 下午 12:02

nginx 配置点滴

 nginx  nginx 配置点滴已关闭评论
10月 192016
 
  1. 重定向
    1. rewrite可以重定向
    2. return 301 $url; 也能重定向,简单的重定向使用return 301更简介,如,强制访问443端口,80段定义如下:

       
  2. return 301 $url ; 不同于 return $url ;
    1. 后者不会导致页面跳转,而是服务器端代为请求了
  3. location = / 不能嵌套在其他的location中,虽然逻辑上似乎合理,但是执行不到
  4. nginx中常用的变量: http://nginx.org/en/docs/varindex.html
  5. lua openresty https://github.com/openresty/lua-nginx-module

关于location:

  1. location之间是互斥的,可以嵌套,但不可以继承,如:
    1. location / 嵌套在 location / 中,虽然没有语法错误,但是,内层的location不会被执行到
    2. location /sub 嵌套在 location / 中时,如果匹配到了location sub 则location / 里面 ,location /sub 外面的逻辑不会被执行到,这就是我所谓的不可以继承,效果等同于并列的两个location
 Posted by at 下午 1:58

nginx 多证书配置

 Linux & Unix, nginx  nginx 多证书配置已关闭评论
3月 162016
 

曾经的曾经,单个IP上配置多个https证书是不可以的;随着ssl的一代代的升级,得益于TLS的SNI(Server Name Indication ),现在单个IP上也可以配置多个https证书了;但是,需要client和server都支持(不过现在的浏览器或其他client都能支持了),只要sslv3或tls都可以

查看nginx是否支持多证书:

参考:

http://blog.csdn.net/cccallen/article/details/6672451

https://www.ttlsa.com/web/sni-multi-domain-virtual-host-ssl-tls-authentication/

 Posted by at 下午 6:00

nginx+fpm 之长连接问题

 nginx, PHP  nginx+fpm 之长连接问题已关闭评论
2月 112016
 

长连接避免了每次请求都重新建立连接,理论上是好事儿,欣然用之;后发现nginx偶尔会报如下错误:

而且有同事A反应,调用同事B的接口时,收到了200响应码,但是没有收到响应的其他数据,而且确认不是因为超时所致;同事B反馈说,接口执行正常,应该有数据返回,而且确认接口执行速度很快,日志为证。

双方说的都对,事实却是如此,我试图模拟这种情况的出现,模拟办法:

让接口输出响应码后,直接杀死fpm进程,nginx果然报出了几乎一样的错误;但是实际场景中,没有发现fpm猝死的任何蛛丝马迹,也找不到fpm会在响应头输出之后就猝死的理由;

按照以前的风格,我将通过看源码、调试等方式查个水落石出,现在不想了,先把长连接关掉试试吧;(凭啥直接怀疑长连接?凭直觉)

现在,长连接关了有一周时间了,没有再出现类似错误;还有好多更重要的事情要做,先不纠结这个了;服务器端建立连接的代价也没有大到不可以接受,先这样吧!

 Posted by at 下午 1:59

nginx 之unix socket

 Linux & Unix, nginx, PHP  nginx 之unix socket已关闭评论
11月 112015
 

缘起:

曾经在nginx(1.7.4)两个地方配置过unix socket;一个是nginx日志,一个是fastcgi;但是,这两个地方有所不同。

关于日志的配置,通过unix socket (/dev/log) 写到本地的syslogd,如果syslogd重启了,则/dev/log 其实是被更新了的,但是nginx却不会自动重连,然后nginx就写log失败了。 如此,重启syslogd就得重启nginx,是多么“2”的一件事情啊!

关于fastcgi的配置,通过unix socket访问本地的php-fpm,如果php-fpm重启,则 unix socket不更新,自然影响不到nignx; 如果fpm stop then start,则unix socket会更新,但是,nginx却知道自动重连,也不会影响到nginx。(难道是因为该socket走的是stream的原因?)

注: 如果你不小心将socket文件配到了/tmp 下面,则socket文件可能是660的权限,nginx(用户如果和php-fpm不同)可能就没有权限连接该unix socket

 Posted by at 下午 12:08

nginx 之fail_over

 Linux & Unix, nginx  nginx 之fail_over已关闭评论
11月 102015
 

问题: 默认情况下,nginx会自动failover,即: 其中一个上游服务器处理失败时会自动将请求转发到下一个上游服务器;有些情况下是不期望如此的(可能通过别的方式避免才是正道)

避免failover的办法:

  1. 对于fastcgi: fastcgi_next_upstream off
  2. 对于proxy:  proxy_next_upstream off

如果把 proxy_next_upstream 写到fastcgi_pass 中是不会有效果的,虽然不会报错

 Posted by at 下午 7:35

关于nginx+luajit的折腾

 lua, nginx  关于nginx+luajit的折腾已关闭评论
4月 082015
 

缘起

需要写一个lua版的SDK在nginx中使用

基本功能

  1. 通过http请求下载关于SDK的配置文件并cache起来
  2. http的响应信息是json格式的
  3. 需要用到rsa/des/rc4解密

系统环境

ubuntu14.04

相关资料

  • http://www.kyne.com.au/~mark/software/lua-cjson-manual.html
  • http://www.kyne.com.au/~mark/software/lua-cjson.php
  • zlib下载地址: http://www.zlib.net/
  • 安装luajit: http://luajit.org/install.html

学到了什么

 Posted by at 下午 7:20

luarocks 代理设置

 lua, nginx  luarocks 代理设置已关闭评论
4月 082015
 

luarocks是lua实现的一个lua包管理工具。对于包管理工具,下载操作是少不了的,对于墙内的那些人来讲,proxy自然就是少不了的。

/etc/luarocks/config.lua 中添加变量 proxy 如下:

 

 Posted by at 下午 6:56