nginx Proxy 代理

article/2025/9/23 2:51:43

1、代理原理

  • 反向代理产生的背景:

    在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的接入请求蜂拥而入时,会造成服务器忙不过来的局面,可以使用多个服务器来共同分担成千上万的用户请求,这些服务器提供相同的服务,对于用户来说,根本感觉不到任何差别。

  • 反向代理服务的实现:

    需要有一个负载均衡设备(即反向代理服务器)来分发用户请求,将用户请求分发到空闲的服务器上。

    服务器返回自己的服务到负载均衡设备。

    负载均衡设备将服务器的服务返回用户。

 

 

 

2、正/反向代理的区别

那么问题来了,很多人这时会问什么是反向代理?为什么叫反向代理?什么是正向代理?我们来举例说明

  • 正向代理:

    举例:贷款

    正向代理的过程隐藏了真实的请求客户端,服务器不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替请求。我们常说的代理也就是正向代理,正向代理代理的是请求方,也就是客户端;比如我们要访问youtube,可是不能访问,只能先安装个FQ软件代你去访问,通过FQ软件才能访问,FQ软件就叫作正向代理。

 

反向代理:

反向代理的过程隐藏了真实的服务器,客户不知道真正提供服务的人是谁,客户端请求的服务都被代理服务器处理。反向代理代理的是响应方,也就是服务端;我们请求www.baidu.com时这www.baidu.com就是反向代理服务器,真实提供服务的服务器有很多台,反向代理服务器会把我们的请求分转发到真实提供服务的各台服务器。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。

 

反向代理中,proxy和server同属一个LAN

反向代理中代理的对象是服务端,proxy和server同属一个LAN,对client透明。

 

正向代理和反向代理对比示意图

正向代理中代理的对象是客户端,proxy和client同属一个LAN,对server透明;

 

 

3、知识扩展

  1. HTTP Server和Application Server的区别和联系

    Apache/nignx是静态服务器(HTTP Server):

    Nginx优点:负载均衡、反向代理、处理静态文件优势。nginx处理静态请求的速度高于apache;

    Apache优点:相对于Tomcat服务器来说处理静态文件是它的优势,速度快。Apache是静态解析,适合静态HTML、图片等。

    HTTP Server 关心的是 HTTP 协议层面的传输和访问控制,所以在 Apache/Nginx 上你可以看到代理、负载均衡等功能

    HTTP Server(Nginx/Apache)常用做静态内容服务和代理服务器,将外来请求转发给后面的应用服务(tomcat,jboss,jetty等)。

    应用服务器(tomcat/jboss/jetty)是动态服务器(Application Server):

    应用服务器Application Server,则是一个应用执行的容器。它首先需要支持开发语言的 Runtime(对于 Tomcat 来说,就是 Java,若是Ruby/Python 等其他语言开发的应用也无法直接运行在 Tomcat 上)。

  2. 但是事无绝对,为了方便,应用服务器(如tomcat)往往也会集成 HTTP Server 的功能,nginx也可以通过模块开发来提供应用功能,只是不如专业的 HTTP Server 那么强大,所以应用服务器往往是运行在 HTTP Server 的背后,执行应用,将动态的内容转化为静态的内容之后,通过 HTTP Server 分发到客户端。

  3. 常用开源集群软件有:lvs,keepalived,haproxy,nginx,apache,heartbeat

    常用商业集群硬件有:F5, Netscaler,Radware,A10等

4、nginx Proxy 配置

1、代理模块

ngx_http_proxy_module

2、代理配置

代理
Syntax:     proxy_pass URL;                #代理的后端服务器URL
Default:    —
Context:    location, if in location, limit_except
​
​
头信息
Syntax:     proxy_set_header field value;
Default:    proxy_set_header Host $proxy_host;      #设置真实客户端地址proxy_set_header Connection close;
Context:    http, server, location
​
超时
Syntax:     proxy_connect_timeout time;
Default:    proxy_connect_timeout 60s;              #链接超时
Context:    http, server, location
​
Syntax:     proxy_read_timeout time;
Default:    proxy_read_timeout 60s;
Context:    http, server, location
​
Syntax:     proxy_send_timeout time; #nginx进程向fastcgi进程发送request的整个过程的超时时间
Default:    proxy_send_timeout 60s;
Context:    http, server, location

3、启用 nginx proxy 代理

环境两台nginx真实服务器

a、nginx-1 启动网站(内容)(作为网站服务器)·

nginx-1的ip:192.168.62.157
已经编译安装好,检查nginx是否启动是否可以访问
[root@nginx-server ~]# cat /home/www/html/index.html 
1000phone
​
[root@nginx-server ~]# cat /etc/nginx/conf.d/aa.conf
server {listen 80;server_name localhost;location / {root /home/www/html;index index.html index.hml;}
}

b、nginx-2 启动代理程序

nginx-2的ip:192.168.62.159
配置nginx的yum源直接yum安装
启动
编辑nginx的配置文件(编辑之前,删除/注释掉之前的配置):
[root@nginx-server ~]# vim /etc/nginx/conf.d/default.conf
server {listen       80;server_name  localhost;
​location / {proxy_pass http://192.168.62.157:80;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
​proxy_connect_timeout 30;proxy_send_timeout 60;proxy_read_timeout 60;}
}
重新加载nginx配置文件
[root@nginx-server ~]# nginx -s reload

c、nginx proxy 具体配置详解

proxy_pass :真实服务器的地址,可以是ip也可以是域名和url地址
proxy_set_header:重新定义或者添加发往后端服务器的请求头
proxy_set_header X-Real-IP :启用客户端真实地址(否则日志中显示的是代理在访问网站)
proxy_set_header X-Forwarded-For:记录代理地址
​
proxy_connect_timeout:后端服务器连接的超时时间发起三次握手等候响应超时时间
proxy_send_timeout:后端服务器数据回传时间就是在规定时间之内后端服务器必须传完所有的数据
proxy_read_timeout :nginx接收upstream(上游/真实) server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭。像长连接。

 

proxy_set_header X-Real-IP 
未配置
Nginxbackend 的日志:记录只有192.168.107.112
配置
Nginxbackend 的日志,记录的有192.168.107.16 192.168.107.107 192.168.107.112

注意:proxy_pass http:// 填写nginx-1服务器的地址。

d、 使用PC客户端访问nginx-2服务器地址 浏览器中输入http://192.168.62.159/ (也可以是nginx-2服务器的域名)

成功访问nginx-1服务器页面 e、 观察nginx-1(192.168.62.157)服务器的日志。

192.168.62.159 代理服务器地址

  1. 168.62.1 客户机地址。

访问成功。 记录了客户机的IP和代理服务器的IP

5、Nginx负载均衡

1、负载均衡的作用

如果你的nginx服务器给2台web服务器做代理,负载均衡算法采用轮询,那么当你的一台机器web程序关闭造成web不能访问,那么nginx服务器分发请求还是会给这台不能访问的web服务器,如果这里的响应连接时间过长,就会导致客户端的页面一直在等待响应,对用户来说体验就打打折扣,这里我们怎么避免这样的情况发生呢。这里我配张图来说明下问题。

 

如果负载均衡中其中web2发生这样的情况,nginx首先会去web1请求,但是nginx在配置不当的情况下会继续分发请求到web2,然后等待web2响应,直到我们的响应时间超时,才会把请求重新分发给web1,这里的响应时间如果过长,用户等待的时间就会越长。

2、upstream配置

首先给大家说下 upstream 这个配置的,这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法。这里的被代理服务器地址有2种写法。

upstream youngfitapp { server 192.168.62.157:8080;server 192.168.62.158:8080;}server {listen 80;server_name localhost;location / {         proxy_pass  http://youngfitapp;}
}

 

3、负载均衡算法

upstream 支持4种负载均衡调度算法:

A、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器;

B、ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。

C、url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。后台服务器为缓存的时候效率。

D、fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。

3、配置实例

1、热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB.....

upstream myweb { server 192.168.62.157:8080; server 192.168.62.158:8080 backup;  #热备     }

2、轮询:nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB....

upstream myweb { server 192.168.62.157:8080; server 192.168.62.158:8080;      }

3、加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB....

upstream myweb { server 192.168.62.157:8080 weight=1;server 192.168.62.158:8080 weight=2;
}

4、ip_hash:nginx会让相同的客户端ip请求相同的服务器。

upstream myweb { server 192.168.62.157:8080; server 192.168.62.158:8080;ip_hash;
}

5、nginx负载均衡配置状态参数

  • down,表示当前的server暂时不参与负载均衡。

  • backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。

  • max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回错误。

  • fail_timeout,在经历了max_fails次失败后,暂停服务的时间单位秒。max_fails可以和fail_timeout一起使用。

 upstream myweb { server 192.168.62.157:8080 weight=2 max_fails=2 fail_timeout=2;server 192.168.62.158:8080 weight=1 max_fails=2 fail_timeout=1;    }

如果你像跟多更深入的了解 nginx 的负载均衡算法,nginx官方提供一些插件大家可以了解下。


http://chatgpt.dhexx.cn/article/fe5dktEU.shtml

相关文章

python-proxy

代码: # -*- coding: utf-8 -*- # Time : 2020/4/15 17:44 # Author : Oneqq # File : 11.proxy.py # Software: PyCharmfrom urllib.request import Request, urlopen from fake_useragent import UserAgent from urllib.request import ProxyHandler, build_open…

but was actually of type 'com.sun.proxy.$Proxy7'

but was actually of type ‘com.sun.proxy.$Proxy7’ 标签(空格分隔): spring 二月 11, 2018 12:24:02 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.…

Ubuntu Proxy

2019年3月5日15:52:14(3[▓▓] 晚安Ubuntu 环境下的代理配置 在公司有代理的情况下上网,很多时候需要给一些命令单独设置代理。# 注:这里假设 10.111.10.18:80 为你的上网代理ip设置基本代理 1、打开Settings -> Network -> Network Proxy 设置为…

Linux--Configure Proxy

ProxyChains遵循GNU协议的一款适用于linux系统的网络代理设置工具。强制由任一程序发起的TCP连接请求必须通过诸如TOR 或 SOCKS4, SOCKS5 或HTTP(S) 代理。支持的认证方式包括:SOCKS4/5的用户/密码认证,HTTP的基本认证。允许TCP和DNS通过代理隧道&#x…

proxy(代理)用法

1、什么是Proxy? Proxy 也就是代理,可以帮助我们完成很多事情,例如对数据的处理,对构造函数的处理,对数据的验证,说白了,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必…

什么是 Proxy ?

一、写在前面 Proxy的意思是代理,我们可以把它理解为一个拦截器,就是当我们操作对象时,它都会对对象的操作进行拦截,从而进行监测和改写。 为什么要存在Proxy? 因为在ES6之前,我们使用Object.defineProperty()来设置监…

DataTable的AcceptChanges()方法和DataRow的RowState属性

这个属性是一个只读属性的枚举类型,一共有五个值,Detached,Unchanged,Added,Deleteed,Modified, 属性名值备注Detached1已创建该行,但是该行不属于该表,要么刚刚创建该行…

AcceptChanges()和RejectChanges()原理

AcceptChanges()和RejectChanges()原理 今天我遇到一个题目,是关于AcceptChanges()和RejectChanges()方法的,考虑到可能很多人不清楚这些概念。 所以拿出来讲讲。由这个问题我们也深入了解一下这两个方法。 为了不在显示略文时显示出代码来,我…

AcceptChanges()和RejectChanges基础题,你能做吗?(转)

今天我遇到一个题目,是关于AcceptChanges()和RejectChanges()方法的,考虑到可能很多人不清楚这些概念。 所以拿出来讲讲。由这个问题我们也深入了解一下这两个方法。 为了不在显示略文时显示出代码来,我就在刚开始多打一点字了。呵。。。 题目…

科学计算机病毒代码大全,计算机病毒代码有哪些

计算机病毒也是要生成的,那么计算机病毒代码有些什么呢?下面由学习啦小编给你做出详细的计算机病毒代码介绍!希望对你有帮助! 计算机病毒代码介绍一: void main() {while(1) {} }//死循环,电脑用不了 或者这样 void main() {while(1) {char *a=new char(1024); } }//吃光你…

html自动增加vbs代码,vbs脚本病毒代码大全编步骤四个

应用程序通过ActiveX的属性HTMLPageTextWithTags(主页不嵌有HTML代码时用属性HTMLPageTextWithOutTags)读页面文本交互模式;允许显示用户提示和脚本错误 2.ntlm.vbs *************** ntlm.vbsby黑嘿黑 *************** dimwsh setwshCreateObject("WScript.She…

科学计算机病毒代码大全,有哪些计算机病毒代码

计算机病毒也是要生成的,那么计算机病毒代码有些什么呢?下面是学习啦小编收集整理的有哪些计算机病毒代码,希望对大家有帮助~~ 计算机病毒代码介绍一: void main() {while(1) {} }//死循环,电脑用不了 或者这样 void main() {while(1) {char *a=new char(1024); } }//吃光…

c语言计算机病毒程序代码,bat电脑病毒代码

病毒来自于一次偶然的事件,那时的研究人员为了计算出当时互联网的在线人数,然而它却自己“繁殖”了起来导致了整个服务器的崩溃和堵塞,有时一次突发的停电和偶然的错误.下面是学习啦小编收集整理的bat电脑病毒代码,希望对大家有帮助~~ bat电脑病毒代码 rem (注:原来站长我在…

vbs恶作剧(病毒)程序代码

恶作剧(病毒)的vbs代码,这里提供的都是一些死循环或导致系统死机的vbs对机器没坏处,最多关机重启一下就可以了 打开记事本,把代码复制粘贴进去,再另存为*.vbs格式即可 操作方法:把代码另存为*.VBS运行即可 经本人亲…

vbs计算机病毒代码,求最全的vbs病毒代码,要破坏性的。谢谢,回答的好我多给分。...

满意答案 mioscat 2017.08.23 采纳率:45% 等级:9 已帮助:1467人 那废话不说,问这个如何?不懂可以问我 On Error Resume Next dim avest,xufso,wscrt Set avest = WScript.Createobject("WScript.Shell") Set wscrt = WScript.Createobject("WScript.She…

制作一个VBS病毒

在这里给大家制作一个VBS病毒,还望大家笑纳。 (后面还会说解毒VBS代码) 工具/原料 电脑 方法/步骤 首先创建VBS文档。 右键编辑,进入记事本。 输入如下代码: On Error Resume Next Set fsCreateObject("S…

LAMP 安装部署

LAMP 安装部署 准备好一台虚拟机网络一切正常 开始安装apache mysql php 启动mysql和apache以及php 书写php测试页:【vim /var/www/html/index.php】 重启apache 进入浏览器测试是否出现php测试页

CentOS中LAMP的安装

1.安装LAMP时应先安装相应的安装包,安装httpd mariadb mariadb-server php php-mysql。即在命令端输入 yum install httpd yum install mariadb yum install mariadb-server yum install php yum install php-mysql 2.随后输入下面的命令启动服务。 启动…

LAMP YUM安装配置实战

今天继续给大家介绍Linux运维的相关知识,本文主要内容是LAMP的YUM安装与配置实战。 一、YUM源配置 在进行本次实验之前,我们先要对设备的YUM源进行配置,在本次实验中,我们使用的YUM源是阿里云的YUM源,该YUM源下载地址…