Nginx反向代理及配置

一、Nginx概念解读

Nginx,是engine X的缩写,发音也是'engine x',2004年由俄罗斯大神伊戈尔·赛索耶夫开发,提供了高性能而易用的HTTP反向代理功能。后期还加入了TCP的反向代理支持。

最初Nginx是为了解决早年的C10K问题而生的。什么是C10K呢?C代表Client客户、10K代表10000,即一台服务器同时保持1万链接。这在当时是一个非常棘手的问题。

通过Google搜索Nginx会得到以下解释:

Nginx是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。

从这句话中,我们可以得到下面几个关键:

  • 异步框架

  • 反向代理

  • 负载均衡

  • HTTP缓存

本专题文章将分别从这几个关键词来解读Nginx的强大之处。本文先介绍Nginx特性之反向代理及其配置实现。

二、反向代理

2.1 什么是反向代理

代理在生活中非常常见,房屋中介是代理、终端零售是代理、选举代表是代理。这些代理都可以帮助需求方减轻很多工作的复杂度,提升效率和体验。

网络里的代理服务是什么样子,我想各位读者也非常清楚,这里再简单回顾一下:假设我们想在公司上网看B站的视频,而规范的公司出于安全和办公效率的考虑,设置了网络策略,不允许访问视频网站,聪明的程序员不可能被这些事情所打败,只要购买一台云服务,搭建代理服务,把浏览器设置上代理,就可以轻松访问视频网站。这就是常见的代理。

 1573007506690086761.png

那么现在问题来了:“代理”大家都懂,这里为什么强调是反向代理呢?难道还有正向代理?答案是肯定的。

正向代理就是大家常见的代理,以请求端也就是客户端的角度为正向,用户发出请求经过的代理,称为“正向代理”。这时是用户主动选择使用代理。

反向代理:先看图再解释。

1573007514500040177.png

主动权被反转,原来是客户端选择代理,现在是代理选择服务端节点。由于控制权的反转,这样的代理被称为“反向代理”。

2.2 反向代理的优点

1)保护服务安全

  • 隐藏服务节点的IP;

  • 将服务节点置于防火墙之后,避免直接攻击业务节点服务器。

2)服务节点更专注于业务,同时提升性能

  • 由于有反向代理的存在,可以让反向代理服务器去实现比如https、gzip压缩等与业务无关的功能;

  • 提供动静态分离,将静态文件发往静态服务器或本地文件系统,避免业务节点处理这些与业务无关的请求;

  • 提供缓存机制,将一些短时间内不会变化的动态内容,在反向代理服务器这层增加缓存,降低业务服务器的请求量;

  • 由于控制权在代理服务这边,完全可以根据服务节点的性能动态分配请求,做到服务节点性能最佳。

正是由于Ngxin引入了反向代理的特性,让请求和响应都要经过Nginx,因此给Nginx带来了非常多的可能。比如负载均衡、HTTP缓存等。

三、反向代理的配置

3.1 根据不同的请求反向代理不同的地址

场景:

 1、访问“http://IP:8080/gnsts-tvdail-probe/dialAction/authentication.action”,服务反向代理至“http://192.168.1.2:8200/auth-service/client/oldAuth”

 2、访问“http://IP:8080/gnsts-tvdail-probe/”,服务反向代理至“http://10.0.0.178:10083”

vi /etc/nginx/conf.d/default.conf

vi /etc/nginx/conf.d/reve.conf

server {
    listen 8080;

    # 访问8080端口,跳转到“/gnsts-tvdail-probe/*”的地址
    location ~/gnsts-tvdail-probe/ {
        proxy_pass  http://10.0.0.178:10083;              #url 结尾不能加“/”
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

    # 访问"location匹配精准路径"跳转至“auth-*”路径
   location = /gnsts-tvdail-probe/dialAction/authentication.action {
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.1.2:8200/auth-service/client/oldAuth;
    }
}


访问页面


1. 访问 192.168.6.6:8080 跳转到“网易首页”

2. 访问 92.168.6.6:8080/readme.rd 从github上获取相应的文件

3.2、反向代理配置去除前缀

使用nginx做反向代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。设置proxy_pass请求只会替换域名,如果要根据不同的url后缀来访问不同的服务,则需要通过如下方法:

方法一:加"/"

vi /etc/nginx/conf.d/proxy.conf

#upstream tomcat-flash {
#ip_hash;
#server 113.207.127.6:8091;
#server 113.207.127.7:8091;
#server 192.168.10.6:8091;
#server 192.168.10.7:8091;
#}


server {
listen 8200;
server_name _;
access_log /var/log/nginx/access.log;
#root /web/tomcat/webapps;
index index.html;

location ^~/strategy-service/ {
proxy_pass http://10.0.0.240:9007/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location ^~/upgrade-service/ {
proxy_pass http://10.0.0.240:9011/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location ^~/publish-service/ {
proxy_pass http://10.0.0.240:9005/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location ^~/register-service/ {
proxy_pass http://10.0.0.240:9002/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location ^~/auth-service/ {
proxy_pass http://10.0.0.240:9001/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}



}
^~/strategy-service/表示匹配前缀是user的请求,proxy_pass的结尾有/, 则会把/strategy-service/*后面的路径直接拼接到后面,即移除strategy-service。

方法二:rewrite

 location ^~/user/ {
        proxy_set_header Host $host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;

        rewrite ^/user/(.*)$ /$1 break;
        proxy_pass http://user;
    }

    location ^~/order/ {
        proxy_set_header Host $host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;

        rewrite ^/order/(.*)$ /$1 break;
        proxy_pass http://order;
    }
}
proxy_pass结尾没有/, rewrite重写了url。

 四、重定向

server {
listen 80;
server_name www.yourdomain.com;
return 301 http://yourdomain.com$request_uri;
}
server {
listen 80;
server_name www.yourdomain.com;
location /redirect-url {
return 301 http://otherdomain.com;
}
}

五、前后端分离项目Nginx域名配置

server {
     listen       7001;
     server_name  iot-test.cddpi.com;    #绑定域名
     root   /var/html/;
     client_max_body_size 1024M;

     add_header X-Frame-Options 'SAMEORIGIN';

     location / {
        alias   /var/html/iot-admin-ui/;    #前端项目路径
index  /index.html; try_files $uri $uri
/ /index.html; #匹配不到任何静态资源,跳转到一个index.html页面 } location /cloud/ { #后端地址 proxy_set_header Host $http_host; proxy_pass http://192.168.0.76:7000/cloud/; } location /iot/ { valid_referers none blocked 192.168.0.41; if ($invalid_referer) { return 403; } proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:5005/iot/; } }

 

posted on 2021-01-07 15:37  uestc2007  阅读(624)  评论(0编辑  收藏  举报

导航