1、什么是代理

代理在普通生活中的意义就是本来应该你做的事情,你让别人代你做了,那么那个帮你做的人就是你的代理。而在计算机网络中代理的概念差不多,就是本来要客户端要做的网络访问,现在移交给另外一个机器做,那么那个机器就被称为代理服务器,代理服务器帮你来访问。过程如下:

正常情况:
client —(send request)—> server

代理情况:
client —(send request)—> clinet proxy –(send request)—> server

什么又是反向代理
那什么又是反向代理呢?反向代理可不是说本来代理你事务的人,反过来代理别人。反向代理在计算机网络中是指这么一个过程。一般来说正向代理是客户机找人来代理把自己的请求转发给服务端,但是如果反向代理,找代理的人不再是客户机,而是服务器这边把自己接受的请求转发给背后的其他机器。其主要区别:

正向代理中代理的过程是客户端,代理机器是作为一个访问客户的身份的;而在反向代理中代理机器是作为服务身份。
正向代理中代理的过程是服务端,服务端对代理的存在无感知;而在反向代理中客户机对代理的存在无感知。
反向代理情况:
clinet –(send request)–> server proxy –(send request)–>other
server

2、代理区别

区别在于代理的对象不一样

  • 正向代理代理的对象是客户端

  • 反向代理代理的对象是服务端

3、nginx代理配置语法

1. nginx代理配置语法

Syntax:proxy_pass URL;
Default:—
Context:location, if in location, limit_except

http://localhost:8000/uri/;
http://192.168.1.22:8000/uri/
http://unix:/tmp/backend.socket:/uri/

注意:proxy_pass 后面的路径不带uri时,其会将location的uri传递给后端主机;

2.proxy_set_header field value;    ##设定发往后端主机的请求报文的请求首部的值;

语法:
Syntax:    proxy_set_header field value;
Default:   
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context:    http, server, location

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_X_Forwarded_for;

扩展:proxy_hide_header
             proxy_set_body

proxy常用配置项具体配置如下

proxy_redirect default;
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;

proxy_buffer_size 32k;
proxy_buffering on;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;

##具体location实现
location / {
    proxy_pass http://127.0.0.1:8080;
    include proxy_params;
}

3.proxy_cache_path  #定义可用于proxy功能的缓存;

语法:
Syntax:proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
Default:—
Context:http
   
4.proxy_cache zone |off;
  指明要调用的缓存,或关闭缓存机制; Context:http,server,location
   
5.proxy_cache_key string;
  缓存中用于“键”的内容;
  默认值:proxy_cache_key $scheme$proxy_host$request_uri;
 
6.proxy_cache_valid [code ……] time;定义对特定响应码的响应内容的缓存时长;
    定义http{……}中;
    proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1;
    定义在需要调用缓存功能的配置段  例如:server{……}

7.proxy_cache_use_stale

语法:
Syntax:proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;
Default:proxy_cache_use_stale off;
Context:http, server, location

确定在与代理服务器通信期间可以在哪些情况下使用过时的缓存响应。

8. proxy_cache_methods
   proxy_cache_methods GET | HEAD | POST ...;
   如果此指令中列出了客户端请求方法,则将缓存响应。 “GET”和“HEAD”方法总是添加到列表中,但建议明确指定它们。

9. proxy_hide_header field;
   默认情况下,nginx不会从代理服务器对客户端的响应中传递标题字段“Date”,“Server”,“X-Pad”和“X-Accel -...”。 proxy_hide_header指令设置了不会传递的其他字段。 相反,如果需要允许传递字段,则可以使用proxy_pass_header指令。   

10. proxy_connect_timeout time; #代理到后端的TCP连接超时(默认60S,最长为75S)  
    Syntax:proxy_connect_timeout time;
    Default:proxy_connect_timeout 60s;
    Context:http, server, location

     proxy_read_timeout  ###以及建立
           proxy_send_timeout  ####服务端请求完, 发送给客户端时间
    定义与代理服务器建立连接的超时。 应该注意,此超时通常不会超过75秒。   

11. proxy_read_timeout time;  (默认60S)   

    Syntax:proxy_read_timeout time;
    Default:proxy_read_timeout 60s;
    Context:http, server, location
    定义从代理服务器读取响应的超时。 仅在两个连续的读操作之间设置超时,而不是为整个响应的传输。 如果代理服务器在此时间内未传输任何内容,则关闭连接。

12.proxy_send_timeout time;(默认60S)

语法:
    Syntax:proxy_send_timeout time;
    Default:proxy_send_timeout 60s;
    Context:http, server, location
    设置将请求传输到代理服务器的超时。 仅在两个连续的写操作之间设置超时,而不是为整个请求的传输。 如果代理服务器在此时间内未收到任何内容,则关闭连接。

13.proxy_redirect  #跳转重定向

语法:
Syntax:    proxy_redirect default;
               proxy_redirect off;
               proxy_redirect redirect replacement;
Default:proxy_redirect default;
Context:http, server, location

 

4、Nginx正向代理配置

ngix正向代理配置示例

[root@Nginx ~]# vim /etc/nginx/conf.d/zy_proxy.conf
server {
    listen       80;

    resolver 233.5.5.5;
    location / {
        proxy_pass http://$http_host$request_uri;
        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;
    }
}

 

5、Nginx反向代理配置

Nginx反向代理配置示例

##proxy代理##
[root@proxy ~]# cat /etc/nginx/conf.d/proxy.conf
server {
    listen 80;
    server_name nginx.bjstack.com;
    index index.html;

    location / {
    proxy_pass http://192.168.1.22;
    include proxy_params;
    }
}

 

6、反向代理部署实例

配置前端服务器

1.同步时间

[root@Nginx-Proxy ~]# ntpdate ntp.aliyun.com

2.安装nginx服务

[root@Nginx-Proxy ~]# yum -y install nginx

3.编辑nginx.conf配置文件

[root@Nginx-Proxy ~]# vim /etc/nginx/conf.d/proxy_nginx.conf
server {

    listen 80;
    server_name www.chenjf.com;
   
    location / {
        proxy_pass  http://192.168.1.22:80;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

4.重启nginx服务

[root@Nginx-Proxy ~]# systemctl start nginx
[root@Nginx-Proxy ~]# systemctl enable nginx

配置后端主机Web服务

1.同步时间

[root@Web-Node1 ~]# ntpdate ntp.aliyun.com

2.安装nginx服务

[root@Web-Node1 ~]# yum -y install nginx

3.配置web页面

[root@Web-Node1 ~]# echo "<h1> Web-Node01 192.168.1.22 </h1>" >/usr/share/nginx/html/index.html

3.重启nginx服务

[root@Web-Node1 ~]# systemctl start nginx

[root@Web-Node1 ~]# systemctl enable nginx

客户端访问测试

[root@Client ~]# curl http://www.chenjf.com
<h1> Web-Node01 192.168.1.22 </h1>