ningx反向代理

331 阅读4分钟

1.何为方向代理?

简单理解为用户直接访问反向代理服务器就可以获得目标服务器的资源。这一过程叫反向代理。 image.png

2.何为正向代理?

简单理解就是“科学上网”,代理的是你的电脑 image.png

3.反向代理和正向代理的区别?

最重要的其实就是代理对象和实现功能。

代理不同:正向代理是客户端,而反向代理是服务器。

功能不同:正向代理主要用来解决访问问题(但是可以记录用户访问信息,笔者自己感觉其实和你用公司内网访问互联网会被记录行为一个道理)。反向代理主要用于解决负载均衡、安全防护,但二者都能提高访问速度。

其他的不再累述,不然就成八股文了

3.Ningx如何配置反向代理?

(其实笔者也只用过两次Ningx,相隔半年了,哈哈哈哈)

1.如何安装?

自行百度,一般这种就两种方法:

法一:下个压缩包,拖到Linux上解压,然后一串命令启动。(ningx下载地址:nginx: download

法二:用docker拉个镜像,然后启动时把你需要的配置文件挂载出来。(笔者用的后者,文章就不再讲述了,比较简单)

2.ningx常见命令(适用于第一种比较麻烦的启动):

说穿了这种方法就是下载解压看一下ningx进程,然后再进入类似于bin目录再启动看一眼ningx进程来验证启动是否成功

cd /usr/local/nginx/sbin
./nginx

查看是否启动成功命令:ps -ef | grep nginx

3.配置文件里怎么写?(其实我们开发一般只需要关心这个)

image.png

比如这个就是docker部署,一般都要copy三个文件挂载在容器外,别问我为什么要这三个文件,我也不知道,反正我们一般都去修改第二个文件,你记得你一般要修改的文件是copy的一个叫nginx.conf就行了。

3.1配置文件的文件结构

image.png

1)main:
全局配置,用于配置与具体业务无关的参数,例如 worker_processes用来配置要起几个线程;

(2)events:
用于配置影响Nginx服务与用户之间连接的属性,例如 worker_connections 配置最大连接数;

(3)http:
用于配置Nginx的业务功能,除http外,还有email;

(4)server:
server必须位于http内部,用于配置Nginx的一个主机;其中listen指定监听的端口号(比如ningx默认80端口,你可以修改listen去修改他的端口);server_name指定主机名;location用于指定主机上的资源位置。

TIP: “worker_processes”, “events”, “http”, “server”, “worker_connections” 这些配置项的名称,在Nginx源码中都是写死的字符串,在Nginx运行时会根据配置文件中的配置项去源码中查找与之匹配的字符串,并按照给出的配置项值进行服务器配置,所以我们需要做的是熟悉这些常用的配置项的名称及功能、用法.

er  nobody;
worker_processes  1;  #进程数量
events {
    worker_connections  1024;#每个进程最大连接数
}
http {
    include       mime.types;
    default_type  application/octet-stream;
   #上游服务器,注意这里很重要,这玩意就是ningx用于负载均衡的
    upstream{ 
 
    }
    #下面会专门出个章节讲他
    

    #说穿了就是用于长链接的。感兴趣可以去看看HTTP1.0 2.0 3.0 都是什么连接,都有哪些头部字段,比#了解这个有用
    #keepalive:限制nginx某个worker最多空闲连接数,此处不会限制worker与上游服务长连接的总数;
    #keepalive_timeout:nginx与上游长连接最大空闲时间,默认值为60s;
    #keepalive_requests:nginx与上游长连接最大交互请求的次数,默认值为100;
    keepalive_timeout  65;
    #什么时候用?知道用户有下一步动作时.什么时候不用?走缓存时
   
  ##
  # SSL证书配置
 ##
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
  ssl_prefer_server_ciphers on;
  
  ##
  # 日志配置
  ##
  access_log /var/log/nginx/access.log;
  
  
  #总结:其实http里面就几样东西有用,基础配置TCP这些你可以直接复用,一是SSL证明,你的网址如果hhtps需要访问的话你得申请他,二是keepalive长连接相关,三是日志。

    #server:一个虚拟主机的配置,一个http中可以配置多个server
    server {
    #linsten 你可以理解为ningx的端口
    #server_name:就是你电脑访问的网址
    #root:web项目的根目录
    #index:首页
    #charset:编码格式:UTF-8.....
    #总结server你肯定要记住server_name,root你要记住适用于web的根目录,index是首页,charset就编码


   #location指令的作用是根据用户请求的URL来执行不同的作用.
   location / {
      proxy_set_header   X-Real-IP        $remote_addr; #$remote_addr :前一节点的IP
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; #$proxy_add_x_forwarded_for:获取的是前一节点的X-Forwarded-For的值
      proxy_set_header   Host             $http_host;  #$http_host:代理服务器本身IP
      proxy_set_header   Upgrade          $http_upgrade;
      proxy_set_header   X-NginX-Proxy    true;
      proxy_set_header   Connection "upgrade";
      #运许重新定义或者添加发往后端服务器的请求头
      #配合负载均衡和上一个节点使用,具体用法。
      proxy_http_version 1.1;
      proxy_pass         http://localhost:9200; #最终代理的地址,说穿了就是实际访问的地址
   }
   }
}

3.2负载均衡(重要)

方式1: 轮询

**

upstream xxx_server_name{
    server 192.168.10.1:80;
    server 192.168.10.2:80;
    server 192.168.10.3:80;
 }

方式2: 权重轮询

**

upstream xxx_server_name{
    server 192.168.10.1:80 weight=1;
    server 192.168.10.2:80 weight=2;
    server 192.168.10.3:80 weight=3;
}

方式3: ip_hash

每一个请求按访问ip的hash结果分配

**

upstream xxx_server_name{
    ip_hash;
    server 192.168.10.1:80;
    server 192.168.10.2:80;
    server 192.168.10.3:80;
}

方式4: 按后端服务器的响应时间来分配请求。响应时间短的优先分配

fair(第三方), fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。如果需要使用这种调度算法,必须下载Nginx的upstr_fair模块。

**

upstream xxx_server_name{
    server 192.168.10.1:80;
    server 192.168.10.2:80;
    server 192.168.10.3:80;
    fail;
}

方式5:url_hash

目前用consistent_hash替代url_hash与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。

**

upstream xxx_server_name{
    server 192.168.10.1:80;
    server 192.168.10.2:80;
    server 192.168.10.3:80;
    hash $request_uri; 
    hash_method crc32; 
    }

使用方式

将server节点下的location节点中的proxy_pass配置为:http:// + upstream名称,即“
http://xxx_server_name
示例:

**

location / { 
    root  html; 
    index  index.html index.htm; 
    proxy_pass http://xxx_server_name; 
}