nginx是一个反向代理服务器,可以利用它所许多事情,最常见的就是利用nginx做服务器端的负载均衡,访问认证,限流,静态数据缓存等。下面看一下nginx的基本操作。
nginx既然是一个方向的代理服务器,那么其访问代理配置方式是必须要了解的。在nginx.conf配置文件中的http节点中,进行配置。
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server{
listen 80;
server_name 192.168.0.15;
location /{
root html;#文件夹
index index.html;#文件
}
location /status{
stub_status;
}
}
关键的信息是server节点,这里面配置了监听访问80端口且访问reffer是192.168.0.15的请求,如果是,就根据location的配置匹配对应的路径映射,原理上类似于路由的功能。其中location的配置和匹配方式有一套完整规范。规范如下。
按优先级先后顺序,如下
= /abc/index.html
,这种方式是一般精准匹配,匹配指定的路径这种匹配方式的优先级最高,配置方式如下
location /abc/index.html{
}
^~ /article/
,这种配置方式叫前缀匹配,特点是使用 ^~
开头,标明使用前缀匹配,这里能够匹配uri以article
开头的路径,例如/article/ab、/article/aab、/article/cd,配置方式如下,优先级第二
location ^~ /article/{
}
~ \.(js)$
,这种方式称为正则匹配,特点是以~
开头标明配置,配置方式如下,下面表示匹配.js结尾的访问请求,表示不区分大小写的匹配,~*
开头表示区分大小写
location ~ \.(js)${
}
/abc
属于前缀匹配的一种,不过优先级比正则匹配要低一点。
/表示通用匹配能够匹配任务路径,但是优先级最低,如果有其他规则匹配,就不会使用/进行匹配,配置方式如下
location /{
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server{
listen 8080;
server_name 192.168.0.15;
location /{
root html;#文件夹
index index.html;#文件
}
location /status{
stub_status;
}
}
基于ip的配置改一下端口,变成监听访问8080端口的请求
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server{
listen 80;
server_name garine.com;
location /{
root html;#文件夹
index index.html;#文件
}
location /status{
stub_status;
}
}
基于ip的配置,把server_name改成对应的域名,当用户通过访问garine.com
来解析为ip然后访问服务器时,会把域名reffer传到服务器,就能基于域名进行代理了。
上面提到的虚拟主机是代理请求然后访问nginx服务器上的资源,但是实际使用中更多是访问别的服务器的资源,通过nginx服务器,转发请求访问别的服务器,然后再通过nginx服务器,返回信息给客户端。这种基本的代理配置方式如下。
在server节点下面增加一个location配置,启动对应192.168.0.15:8080的tomcat
server{
listen 80;
server_name garine.com;
location /status{
proxy_pass http://192.168.0.15:8080;
}
表示对于garine.com路径的请求,转发到http://192.168.0.15:8080
nginx通过拦截代理请求,能够实现服务器端的请求分流,从而达到负载均衡。
在nginx中实现了比较常见的集中负载均衡算法,跟阿里的Dubbo框架的负载均衡算法一样,有以下几种:
上面提到基本的代理方式能够转发请求,根据负载算法来有策略的转发请求,那就是负载均衡。
配置方式
upstream tomcat{
server 192.168.0.15:8080 max_fails=1 fail_timeout=90s;
server 192.169.0.13:8080 max_fails=1 fail_timeout=90s;
}
server{
listen 80;
server_name garine.com;
location /status{
stub_status;
}
location /{
proxy_pass http://tomcat;
}
}
与基本代理方式其实差不多,不过就是多配置一个upstream节点,然后再在server中引用即可,这种方式配置,默认是轮询算法。
upstream tomcat{
server 192.168.0.15:8080 max_fails=1 fail_timeout=90s;
server 192.169.0.13:8080 max_fails=1 fail_timeout=90s weight=2;
}
server{
listen 80;
server_name garine.com;
location /status{
stub_status;
}
location /{
proxy_pass http://tomcat;
}
}
upstream tomcat{
ip_hash;
server 192.168.0.15:8080 max_fails=1 fail_timeout=90s;
server 192.169.0.13:8080 max_fails=1 fail_timeout=90s;
}
server{
listen 80;
server_name garine.com;
location /status{
stub_status;
}
location /{
proxy_pass http://tomcat;
}
}
当然在upstream中还有许多配置,可以参考官方文档进一步了解。