美文网首页
nginx反向代理

nginx反向代理

作者: KuiSAhn | 来源:发表于2021-11-18 17:48 被阅读0次

    什么是反向代理

    在我看来,反向代理的过程就像运输快递,反向代理服务器就是小区里的菜鸟驿站或蜂巢,卖家就是客户端,买家就是服务端。卖家(客户端)发出去菜鸟驿站(代理服务器)的请求,菜鸟驿站(代理服务器)接收到请求后,再根据请求里的信息,菜鸟驿站(代理服务器)根据特定的规则将快递分发给不同的买家(服务端)。图解:
    
    图解

    如何实现反向代理

    要实现反向代理服务器首先就需要一个反向代理服务器,目前常用的反向代理服务器有Nginx、HAproxy等等,各有优劣。这里我使用nginx来作为反向代理服务器。
    

    准备工作以及安装nginx

    这里我用Ubuntu环境演示,版本为20.04
    
    sudo apt-get install nginx
    
    安装完成后用命令`nginx -v`来检查是否安装成功,如果出现版本信息就说明已经安装成功,我的环境里的nginx版本信息如下
    
    nginx version: nginx/1.18.0 (Ubuntu)
    
    然后我在我的环境里新建两个web服务器serve1和seve2,serve1的地址为`localhost:8001`,serve2的地址为`localhost:8002`,访问这两个服务器分别返回当前请求的url,如图
    
    serve1 serve2

    配置nginx

    安装完成后就可以进行配置了,配置文件的目录是`/etc/nginx/nginx.conf`,打开这个文件
    
    sudo /etc/nginx/nginx.conf   # 如果没有修改这个文件的所有者或者读写权限的话就需要用root账户打开
    

    nginx的初始配置文件去掉注释后的内容如下

    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        sendfile        on;
      
        keepalive_timeout  65;
    
        server {
            listen       80;
            server_name  localhost;
    
            location / {
                root   html;
                index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
    

    要实现反向代理,就需要在http下的server里进行配置。

    具体配置如下:

    ...
    http {
        ...
        server {
            listen 8974;                            # nginx的监听端口
            server_name localhost;                  # nginx的监听地址
                                                   
            location /serve1 {                      # nginx的路由配置,也是配置反向代理的地方, 可以精确匹配也可以写正则表达式
                proxy_pass http://localhost:8001;    # 需要nginx代理的服务器
            }
            
            location /serve2 {                      # 可以定义多个路由配置
                proxy_pass http://localhost:8002;
            }
        }
    }
    

    目前这样就已经算是简单的配置完了一个反向代理规则,然后启动nginx服务器,直接在终端输入nginx,然后访问http://localhost:8974/serve1,nginx接收到请求后,根据配置好的规则:如果以/serve结尾,则请求就被转发到http://localhost:8001,转发的完整请求是http://localhost:8001/serve1,serve2同理。

    转发请求

    rewrite路径重写

    有时候请求的URI在转发时想修改下,就需要用到rewrite,rewrite会根据正则表达式重写URI,rewrite的格式如下:
    
    rewrite  reg     replace   flag
    # reg就是进行匹配时的规则
    # replace会将reg匹配的内容替换掉
    # rewrite的标记说明,分别为:
        last(让当前rewrite为最后一个rewrite,不再匹配后边的rewrite规则)、
        break(让当前location为最后一个location,不再匹配后边的location规则)、
        redirect(返回302临时重定向)、
        permanent(返回301永久重定向)
    

    比如说我请求的是http://localhost:8974/serve1/test1/test2,然后我想重写成http://localhost:8001/test1/test2,也就是用/test1/test2替换/serve1/test1/test2,所以rewrite就该这样写:

    ...
    http {
        ...
        server {
            listen 8974;                            # nginx的监听端口
            server_name localhost;                  # nginx的监听地址
                                                   
            location /serve1 {                      # nginx的路由配置,也是配置反向代理的地方, 可以精确匹配也可以写正则表达式
                proxy_pass http://localhost:8001;    # 需要nginx代理的服务器
                 rewrite '/serve1(.*)$' '$1' break;   # 重写的规则
            }
            
            location /serve2 {                      # 可以定义多个路由配置
                proxy_pass http://localhost:8002;
                 rewrite '/serve2(.*)$' '$1' break;
            }
        }
    }
    

    reg部分为/serve1(.*)$,这个正则表达式匹配/serve1和其后边的所有字符,其中(.*)为匹配括号内所有字符并提取其值。

    replace部分为$1,其表示reg部分用圆括号提取的值。

    所以如果请求是http://localhost:8974/serve1/test1/test2,根据匹配规则,会先匹配出/serve1/test1/test2,其中/test1/test2被提取出来,然后用提取出来的值/test1/test2替换匹配到的/serve1/test1/test2。所以转发后的请求就变成了http://localhost:8001/test1/test2

    重写URI

    常用正则表达式说明

    字符 说明
    \ 将其后变的字符从关键字变成普通字符
    ^ 匹配输入字符的起始位置
    $ 匹配输入字符的结束位置
    * 匹配其前边字符零次或多次
    + 匹配其前边字符一次或多次
    ? 匹配其前边字符零次或一次
    . 匹配除换行符外的所有字符
    () 匹配括号内的内容并提取之,在后边可以用1至9获取提取的内容

    相关文章

      网友评论

          本文标题:nginx反向代理

          本文链接:https://www.haomeiwen.com/subject/bsqjtrtx.html