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站的视频,而规范的公司出于安全和办公效率的考虑,设置了网络策略,不允许访问视频网站,聪明的程序员不可能被这些事情所打败,只要购买一台云服务,搭建代理服务,把浏览器设置上代理,就可以轻松访问视频网站。这就是常见的代理。
那么现在问题来了:“代理”大家都懂,这里为什么强调是反向代理呢?难道还有正向代理?答案是肯定的。
正向代理就是大家常见的代理,以请求端也就是客户端的角度为正向,用户发出请求经过的代理,称为“正向代理”。这时是用户主动选择使用代理。
反向代理:先看图再解释。
主动权被反转,原来是客户端选择代理,现在是代理选择服务端节点。由于控制权的反转,这样的代理被称为“反向代理”。
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/; } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性