Linux基础36 Nginx代理,nginx反向代理(代理配置)

战斗小人 / 2023-08-26 / 原文

Nginx反向代理

什么是代理

正向代理:网络代理(代理客户端访问外网)

 反向代理:用于公司集群架构,代理服务端

正向代理和反向代理的区别

1.区别在于形式上服务的”对象”不一样

2.正向代理代理的对象是客户端,为客户端服务

3.反向代理代理的对象是服务端,为服务端服务

为什么学代理

nginx代理PHP服务(fastcgi_pass:127.0.0.1:9000)

1.代理后端语言的服务(PHP、JAVA、Python...)

2.国外服务器代理国内服务器,方便国外用户上网

反向代理使用的模块

反向代理模式Nginx配置模块
http、websocket、https、tomcat、Java程序 ngx_http_proxy_module
fastcgi(php程序) ngx_http_fastcgi_module
uwsgi(python程序) ngx_http_uwsgi_module
grpc(golang程序) ngx_http_v2_module

 

Nginx配置代理语法

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

 

配置nginx代理实践

1.环境准备

主机外网内网
lb01 10.0.0.4 172.16.1.4
web01 10.0.0.7 172.16.1.7

2.配置web01网站

[root@web01 conf.d]# vim proxy.conf
------------------------------------
server {
    listen 80;
    server_name proxy.linux.com;

    location / {
        root /code/proxy;
        index index.html;
    }
}
------------------------------------
[root@web01 proxy]# systemctl restart nginx

3.编写网站

[root@web01 ~]# cd /code
[root@web01 code]# mkdir proxy
[root@web01 proxy]# vim index.html
web01.............

4.配置代理

# lb01机器做代理
# 安装nginx
# 配置nginx
# 创建用户
[root@lb01 ~]# vim /etc/nginx/conf.d/daili.conf
------------------------------------
server {
    listen 80;
    server_name proxy.linux.com;

    location / {
        proxy_pass http://10.0.0.7;
    }
}
------------------------------------
# 启动nginx

5.配置hosts,域名指向代理服务器

10.0.0.4 proxy.linux.com

6.访问页面查看

访问页面不是域名对应的页面,是web01上面nginx第一个配置文件(当conf配置文件没有一个能匹配地址,就返回nginx配置文件第一个)
使用wireshark抓包分析
可以看出,当我们只用proxy_pass代理的时候,会发现如下问题:
10.0.0.1请求10.0.0.4的时候使用的是域名
10.0.0.1请求10.0.0.7的时候使用的是IP:port

之前课程中讲到,当访问80端口的时候,没有域名的情况下,默认会去找排在最上面的那个配置文件

所以我们需要解决这个问题,保留住最开始的请求头部信息

proxy_set_header,这个模块可以帮我们解决这个问题

优化如下

server {
    listen 80;
    server_name proxy.linux.com;

    location / {
        proxy_pass http://10.0.0.7;
        proxy_set_header Host $http_host;    # 带着域名一起过去
    }
}

 

Nginx代理常用参数

1.添加发往后端服务器的请求头信息

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

# 用户请求的时候HOST的值是www.oldboy.com, 那么代理服务会像后端传递请求的还是www.oldboy.com
proxy_set_header Host $proxy_host;
# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;
# 客户端通过代理服务访问后端服务,后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

日志里面还可以配置 "$httpd_x_real_ip"
# 注:如果经过多次代理,$httpd_x_real_ip只记录最初的用户ip,$proxy_add_x_forwarded_for会记录最初的用户ip和所有经过的代理地址

例:

# 后端服务通过该变量会记录真实客户端地址
# /etc/nginx/conf.d/daili.conf配置文件追加
server {
    listen 80;
    server_name proxy.linux.com;

    location / {
        proxy_pass http://10.0.0.7;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 追加
    }
}
-----------------------------------------
# lb01代理服务器日志(最后的$proxy_add_x_forwarded_for为"-",因无代理,它就是$remote_addr,故不再记录)
10.0.0.1 - - [26/Aug/2023:23:06:27 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" "-"

# web01服务器日志最后开始记录$proxy_add_x_forwarded_for为"10.0.0.1",$remote_addr是代理的ip
10.0.0.4 - - [26/Aug/2023:23:06:26 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" "10.0.0.1"

2.代理到后端的TCP连接、响应、返回等超时时间

#nginx代理与后端服务器连接超时时间(代理超时时间)
Syntax:        proxy_connect_timeout time;
Default:    proxy_connect_timeout 60s;
Context:    http, server, location

#nginx代理等待后端服务器的响应时间
Syntax:        proxy_read_timeout time;
Default:    proxy_read_timeout 60s;
Context:    http, server, location

#后端服务器数据回传给nginx代理超时时间
Syntax:        proxy_send_timeout time;
Default:    proxy_send_timeout 60s;
Context:    http, server, location

3.proxy_buffer代理缓冲区

#代理缓冲区:先把后端返回的数据存缓存区,当缓冲区满了,把里面数据发给客户端,后面的数据继续存在缓冲区
#nginx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传,不是全部接收完再传给客户端
Syntax:        proxy_buffering on | off;
Default:    proxy_buffering on;    # 开启代理缓冲区
Context:    http, server, location

#设置nginx代理保存用户头信息的缓冲区大小
Syntax:        proxy_buffer_size size;
Default:    proxy_buffer_size 4k|8k;    # 保存请求头信息,这里写4k或者8k,不加|
Context:    http, server, location

#proxy_buffers缓冲区
Syntax:        proxy_buffers number size;
Default:    proxy_buffers 8 4k|8k;    # 请求体内容(这里指给8个缓冲区,每个4k/8k,写一个)
Context:    http, server, location

4. 常用的优化配置

loation / {
    proxy_pass http://127.0.0.1:8080;
    include proxy_params;    # 直接include调用,简洁方便
}

[root@lb01 nginx]# vim /etc/nginx/proxy_params
proxy_set_header Host $proxy_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_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;