nginx反向代理

什么是反向代理

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

如何实现反向代理

要实现反向代理服务器首先就需要一个反向代理服务器,目前常用的反向代理服务器有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获取提取的内容
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容