nginx功能扩展整理
0、基本负载均衡配置
编辑/etc/nginx/nginx.conf,加入负载平衡配置:
http {
upstream tomcat {
server localhost:8080;
server localhost:8081;
}
include /etc/nginx/mime.types;
default_type application/octet-stream;
更新/etc/nginx/conf.d/default.conf,配置反向代理:
location / {
proxy_pass http://tomcat;
}
重新启动Nginx:
sudo service nginx restart
1、子请求
当一个请求发起一个“子请求”的时候,依照 Nginx 的术语,习惯把前者称为后者的“父请求”(parent request)。
location /main { echo_location /foo; # echo_location发送子请求到指定的location echo_location /bar; } location /foo { echo foo; } location /bar { echo bar; }
输出:
$ curl location/main
$ foo 03. bar
这里,main location就是发送2个子请求,分别到foo和bar。这就类似一种函数调用。
“子请求”方式的通信是在同一个虚拟主机内部进行的。所以 Nginx 核心在实现“子请求”的时候,就仅仅调用了若干个 C 函数,全然不涉及不论什么网络或者 UNIX 套接字(socket)通信。我们由此能够看出“子请求”的运行效率是极高的。
2、ngx_lua简单例子
Hello Lua!
# nginx.conf worker_processes 4; events { worker_connections 1024; } http { server { listen 80; server_name localhost; location=/lua { content_by_lua ‘ ngx.say("Hello, Lua!") '; } } }
输出:
$ curl 'localhost/lua'
Hello,Lua。
3、配置session粘滞
需要配置Tomcat存储会话到Redis,我们需要使用 tomcat-redis-session-manager开源库包,具体需要一些调整,下载这个项目的源码项目,重新构建,本文使用版本为commons-pool2-2.2.jar 和 jedis-2.6.1.jar.复制这些Jar到tomcat的lib目录。将你的commons-pool, jedis 更新版本和tomcat版本在tomcat-redis-session-manager的build.gradle中配置一下,然后重新构建项目,将构建结果 tomcat-redis-session-manager-1.2.jar 复制到tomcat lib目录下,两个实例都要复制,修改每个tomcat的conf/content.xml文件,在tomcat的context.xml中配置:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="localhost"
port="6379"
database="0"
maxInactiveInterval="60" />
重新启动tomcat一切完成,你现在可以看到tomcat会话存储在redis中,使用先前tomcat内置案例,试验两个tomcat开机和关机不同情况进行测试,会话数据都不会受到影响。
4、nginx集群设置方向
如果有多台NGINX想实现负载均衡的话,
1、每台nginx都有公网地址,在域名处设置同个域名多个指向,最简单实现轮洵。但故障切负会慢一点。
2、一台公网nginx通过upstream功能,轮洵、ip、url多方式分发到内网多台nginx。但公网的nginx如果down机的话,内网全段。
3、一对公网nginx加三个公网ip,通过keepalive实现高可用,再upstream到内网(就是我们刚刚上一节讲的主从备份)。
一般来说,上面1、2、3种方法基本可以解决,建议用2或3;
如果并发量真的巨大的话,一般就要借助硬件F5等设备做负载均衡,跟DNS、CDN等服务商合作做域名解析转发、缓存配置,这也是目前大多数大厂的架构配置。
5、失效转移设置
如果后端tomcat服务器处理超时,则nginx不请求下一个tomcat节点,而是直接返回。nginx默认,会重复尝试所有的节点以后,才会返回给浏览器错误。例如:在location设置参数(默认值也是如此):
proxy_next_upstream http_502 http_504 error timeout invalid_header;
其中有一个参数值 timeout,这个参数代表如果超时,则尝试其他节点。因此要去掉这个参数,修改后如下
proxy_read_timeout 1;
proxy_next_upstream http_502 http_504 error invalid_header;