8月 162018
 
  • 不能多重判断,错误写法如:
  • 不能嵌套,错误写法如:
  • 条件前件不能为字符串,只能为变量,错误写法如:

相对简单可行的办法:

还有不太严谨的做法:

因为对于多数程序来讲, /abc?var=xyz  与 /abc?var=xyz&_=123456   是一样的,但是后者就不能被不严谨的nginx写法匹配到

实际用例:

 Posted by at 上午 10:35
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
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
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
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
2月 112016
 

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

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

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

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

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

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

 Posted by at 下午 1:59
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
11月 102015
 

问题: 默认情况下,nginx会自动failover,即: 其中一个上游服务器处理失败时会自动将请求转发到下一个上游服务器;有些情况下是不期望如此的;

但是这里没有区分上游服务器的失败原因,如果是连接失败,则自动fail_over 基本是没问题的;如果是已经发送了数据然后等待响应超时失败,可能并不想fail_over

 

避免failover的办法:

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

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

 

可能在应用层来避免重复处理才是正道

 

 Posted by at 下午 7:35
10月 162015
 
  1. nginx和php-fmp保持长连接的设置
    1. 参考: http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
    2. 设置
      keepalive 8;  //数字自己定吧,只要大于0就行,但是没有就不行

      fastcgi_keep_conn on;

  2. 关于单个连接同时处理多个请求的情况:
    1. fastcgi的设计来看,单个连接是可以同时传输多个请求的;对于多线程或事件驱动型fast-cgi server 是有一定好处的
    2. 对于特定的fastcgi-server,比如: php-fpm是不会同时处理多个请求的,所以fastcgi的该特性对于php-fpm是没有用的
    3. 问题: nginx何以知道后端的fastcgi-server是不能同时处理多个请求的?没有找到相关的nginx配置来告知nginx能否同时发送多个请求给相同的后端fastcgi连接; 难道nginx只能同时在一个连接上只分发一个请求?
 Posted by at 上午 10:55
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