nginx功能扩展整理

时间:2022-12-30 18:17:32

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;