nginx 反向代理的典型应用场景及方案

news/2024/11/30 14:39:35/

一、场景

现有如下的的应用需求:

1.利用域名代理多个端口的应用

2.利用二级目录代理多个端口的应用

3.利用二级目录代理多个IP服务器的应用

4.利用域名代理多个服务器的应用

5.利用端口代理多个服务器应用

二、场景实现

1.利用域名代理多个端口的应用

这个实现比较简单,基本上是一些基础的配置,在我应用中,我利用docker搭建了两个应用,一个nextcloud,一个是jupyter,其中一个运行在8088端口,一个运行在8888端口。现在的利用场景一的技术进行实现,nginx的配置文件如下:

map $http_upgrade $connection_upgrade {default upgrade;'' close;}server {listen       80;server_name jupyter.test.com ;access_log  /var/log/nginx/host.access.log  main;location / {proxy_pass http://127.0.0.1:8888/;proxy_redirect / /;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_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}}server {listen          80;server_name nextcloud.test.com;access_log /var/log/nginx/nextcloud.log main;location / {proxy_pass http://127.0.0.1:8088/;proxy_redirect / /;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}

简单的解释如下:
首先建立两个server,

  1. 其监听的端口都是80
  2. 其服务器名称分别是不同的域名,这是区分两个server的关键
  3. 然后是服务器日志,这里可以定义其他日志,如错误日志等
  4. location / 一个关键,就是到根目录时如何进行操作,简单的解释如下 :

proxy_pass http://127.0.0.1:8088/; 表示所有到根目录的请求由代理到8088端口
proxy_redirect / /;表示所有重定向定向到根据目录下,这里有一个问题,就是此处是给同一个站的重定向设置的,如果是不同站点的重定向,该如何处理,以后再研究。

此处的域名都是一个本地的域名,无法进行网络的访问,但在本地还是运行的挺好的。其在进行应用区分的时候,是以请求的主机名字段来区分的,如果是请求到80端口的主机名为nextcloud.test.com,则由server_name为nextcloud.test.com的主机进行处理。另一个同理。

利用二级目录代理多个端口的应用

这个基本的思路是有,但在实现上还是有些问题的。简单的配置文件如下:

server {listen       80;server_name  localhost;#access_log  /var/log/nginx/host.access.log  main;location / {root   /usr/share/nginx/html;index  index.html index.htm;#if ( $cookie_jupyter = 'test' ){#       rewrite ^/(.*)$ /jupyter/$1 last;#}#if ( $http_referer ~* "jupyter" ){#       rewrite ^/(.*)$ /jupyter/$1 last;#}#if ( $cookie_nextcloud = 1 ){#       rewrite ^/(.*)$ /nextcloud/$1 last;#}#if ( $http_referer ~* ^.*/nextcloud/.*$ ){#       rewrite ^/(.*)$ /nextcoud/$1 last;#}rewrite ^/(.*)$ /jupyter/$1;}location /jupyter/ {proxy_pass http://127.0.0.1:8888/;proxy_redirect / /jupyter/;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_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;if ($http_cookie !~* "jupyter=test") {add_header Set-Cookie jupyter=test;}}location /nextcloud/ {proxy_pass http://127.0.0.1:8088/;proxy_redirect / /nextcloud/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;if ($http_cookie !~* "nextcloud=1") {add_header Set-Cookie nextcloud=1;}}

面临的一个困难:

在请求过程中,由于所有的请求都是向服务器IP的80端口发出的,这时,浏览器会认为这是同一个站点。同时,页面中的相对路径,请求到根目录下时,必然会发生404错误。

解决方法思路如下:

1.利用referer进行区分

  1. 基本思路:

根据请求头中的referer字段,来区分是请求那个目录下文件的,将请求到根目录下的url进行重写(rewrite),然后进行请求。

2.存在问题:

根据 referer 字段进行区分,有时有些请求不一定带referer字段,带了也不一定含有指定的目录

2.利用cookie进行解决

  1. 基本思路:

在nginx响应的时候,写入cookie,利用cookie进行区分。

  1. 存在问题:

同一个请求的IP,浏览器会认为是同一个站点,将所有的cookie全部保存,有时会解析错误。比如:我先访问 jupyter,然后访问nextcloud,jupyter的cookie还保存着,
而我在访问nextcloud的时候,如果是jupyter的cookie的规则在前面,会先将所有的url重写为/jupyter/,此时,也会出现错误。目前尚不知该如何解决。

3.利用二级目录代理多个IP服务器的应用

未进行具体的实现,但在实现的服务器建立,利用upstream的ip_hash来进行流的引导,从而实现多个目录代理的实现。

upstream server1{ip_hash;server 192.168.1.1:80;
}
upstream server2{ip_hash;server 192.168.1.2:80;
}
upstream server3{ip_hash;server 192.168.1.3:80;
}server {listen       80;server_name  localhost;location /app1/ {proxy_pass http://server1/;}
server {listen       80;server_name  localhost;location /app2/ {proxy_pass http://server2/;}
server {listen       80;server_name  localhost;location /app3/ {proxy_pass http://server3/;}

4.利用域名代理多个服务器的应用

在端口的基础上,将不同端口改为不同的服务应用即可

server {listen       80;server_name  www.exp1.com;location / {proxy_pass http://192.168.1.1/}
server {listen       80;server_name  www.exp2.com;location / {proxy_pass http://192.168.1.2/}
server {listen       80;server_name  www.exp3.com;location / {proxy_pass http://192.168.1.3/}

5.利用端口代理多个服务器应用

在nginx 端开启多个端口,直接将端口代理到相应的服务器即可

server {listen       8081;server_name  localhost;location / {proxy_pass http://192.168.1.1/}
server {listen       8082;server_name  localhost;location / {proxy_pass http://192.168.1.2/}
server {listen       8083;server_name  localhost;location / {proxy_pass http://192.168.1.3/}

http://www.ppmy.cn/news/573000.html

相关文章

利用Nginx配置反向代理

自签发SSL证书 将ssl证书统一存放在nginx配置目录下的ssl目录 [rootJumper ~]# cd /etc/nginx/ [rootJumper nginx]# mkdir ssl [rootJumper nginx]# cd ssl/生成CSR请求文件 [rootJumper ssl]# openssl genrsa -out sk3-9-ucss1.key 2048 [rootJumper ssl]# openssl req -n…

打造高可用、高效的Nginx反向代理应用 - 实战篇

前言 🏠个人主页:我是沐风晓月 🧑个人简介:大家好,我是沐风晓月,阿里云社区博客专家😉😉 💕 座右铭: 先努力成长自己,再帮助更多的人 &#xff0c…

【转载】非常详细的nginx反向代理参数配置

nginx反向代理配置详解 转载于:http://blog.51cto.com/meiling/1978482 侵删 反向代理配置 修改部署目录下conf子目录的nginx.conf文件(如/opt/nginx/conf/nginx.conf)内容,可调整相关配置。 反向代理配置示例: 1 2…

高可用nginx反向代理

高可用nginx反向代理 文章目录 高可用nginx反向代理[toc]nginx反向代理简介代理服务器的作用nginx的作用 nginx反向代理的配置访问测试 高可用nginx反向代理访问测试 高可用自动化转换主备节点测试访问 nginx反向代理简介 代理服务器是位于客户端和原始服务器的一台中间服务器…

一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(二)进一步优化,公差分析

前文的补充说明 有光学设计师的朋友,跟我说把那个程序抄完后运行,什么也得不到。 这是因为缺乏一个文件名字叫做“zoomlensdata.txt" 他的内容就是上一篇的那份代码之后的第七到第十二行的内容。 然后我对这个程序进行了注释: def st…

西门子1500的DB数据块

首先了解DB数据块的含义,然后举个简单例子,加以分析。 1.首先我建立了DB数据块,DB数据块分为绝对寻址与间接寻址 根据DB数据块的属性可以进行切换,如下图 若没有选择优化块的访问就是绝对寻址,若选择了优化块的访问&a…

解决错误1500:当访问注册表项...\TrapConfiguration 时,SNMP 服务遇到错误

事件ID: 1500 事件描述: 当访问注册表项 SYSTEM\CurrentControlSet\Services\SNMP\Parameters\TrapConfiguration 时,SNMP 服务遇到错误。 解决方法: 参考https://support.microsoft.com/en-us/help/2002303/event-1500-logged-wh…

SIEMENS S7-1500 博途V16

文章目录 环境博途V16 安装硬件组态连接设备 环境 硬件: 按键设置IP地址,若提示IP设置写保护,可能是由于plc处于运行状态,将其停止后再进行设置即可。 软件: win10 博途V16 安装 参考:链接 注意一定要…