04 Nginx 代理服务


Nginx 代理基本概述

在互联网请求里, 客户端⽆法直接向服务端发起请求, 那么就需要用到代理服务, 来实现客户端和服务端通信。

Nginx 作为代理服务可以实现很多的协议代理, 我们主要以 http 代理为主

正向代理(内部上⽹) 客户端<-->代理->服务端

反向代理 客户端->代理<-->服务端

  • 代理区别
  1. 区别在于代理的对象不一样 # 翻墙
  2. 正向代理代理的对象是客户端
  3. 反向代理代理的对象是服务端

Nginx 代理配置语法 proxy_pass

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 编译统一配置 引用文件
[root@nginx-node1 code]# vim /etc/nginx/proxy_params

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 60;
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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 具体location实现引用,不要每个location下都实现一次

[root@nginx-node1 conf.d]# vim game.conf

[root@nginx-node1 conf.d]# vim mygame.conf

server {
listen 80;
server_name localhost;

location / {
proxy_pass http://127.0.0.1:8080;
include proxy_params;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 参数解释

proxy_set_header # 获取真实用户IP 日志如果想拿到 必须这样传 不传拿到的一直是代理服务器IP
proxy_connect_timeout : # nginx与upstream server的连接超时时间
proxy_send_timeout : # nginx发送数据至upstream server超时, 默认60s, 如果连续的60s内没有发送1个字节, 连接关闭
proxy_read_timeout : # nginx接收upstream server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭


如果proxy_buffering开启,nginx假定被代理的后端服务器会以最快速度响应,
并把内容保存在由指令 proxy_buffer_size 和 proxy_buffers 指定的缓冲区里边.
1. 如果响应body无法放在内存里边,那么部分内容会被写到磁盘上。
2. 如果proxy_buffering被关闭了,那么响应body会按照获取body的多少立刻同步传送到客户端。
- nginx不尝试计算被代理服务器整个响应body的大小,
- nginx能从服务器接受的最大数据,是由指令 proxy_buffer_size 指定的。
3. 对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作。
- 但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的


proxy_buffer_size 32k;
# 设置代理服务器(nginx)从后端realserver读取并保存用户头信息的缓冲区大小,默认与proxy_buffers大小相同,其实可以将这个指令值设的小一点

proxy_buffers 4 128k;
# proxy_buffers缓冲区,nginx针对单个连接缓存来自后端realserver的响应,网页平均在128k以下的话,这样设置
# 开辟4个长度为128k大小的read_buf用来存储body

proxy_busy_buffers_size 256k;
# 高负荷下缓冲大小(proxy_buffers*2)

proxy_max_temp_file_size 256k;
# 当 proxy_buffers 放不下后端服务器的响应内容时,会将一部分保存到硬盘的临时文件中,这个值用来设置最大临时文件大小,默认1024M,它与 proxy_cache 没有关系。大于这个值,将从upstream服务器传回。设置为0禁用。

proxy_temp_file_write_size 64k
# 当缓存被代理的服务器响应到临时文件时,这个选项限制每次写临时文件的大小。proxy_temp_path(可以在编译的时候)指定写到哪那个目录。

Nginx 反向代理

准备服务器

1
2
1. 够买两台华北的aliyun主机,一台可以上外网,一台无法出外网
2. 让可以出外网的80作为nginx主机,剩下一台作为web主机,用 ssh 内网地址登录

1
2
3
4
# 使用默认的yum源 安装nginx

yum install -y
systemctl start nginx

Nginx反向代理配置实例

反向道理配置

  1. web配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 在web服务器上创建目录 并 添加nginx配置 
[root@nginx ~]# mkdir -p /soft/code/images

[root@nginx ~]# vim /etc/nginx/conf.d/images.conf

server{
listen 80;
server_name localhost;
root /soft/code;

location / {
root /soft/code;
index index.html;
}

location ~ .*\.(png|jpg|gif)$ {
gzip on;
root /soft/code/images;
}
}



# rz 存储[root@nginx images]# nginx -t图片进入目录

[root@nginx images]# yum install -y lrzsz

[root@nginx images]# ls -l
[root@nginx images]# ls -l
-rw-r--r-- 1 root root 2103 Oct 21 12:43 nginx.png
-rw-r--r-- 1 root root 173005 Oct 12 18:00 timg_02.jpg


# 注释默认配置文件
crtl + v 按下选中要注释的行数
shift + i 再输入# 最后按ESC 多行被注释

# 启动
[root@nginx images]# nginx -t
[root@nginx images]# nginx

[root@nginx images]# curl http://127.0.0.1/nginx.png

  1. proxy配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# proxy配置
[root@proxy ~]# vim /etc/nginx/proxy_params

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 60;
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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# proxy 指向 172.17.70.224 web服务端IP

[root@proxy ~]# vim /etc/nginx/conf.d/proxy.conf

server{
listen 80;
server_name localhost;
index index.html;

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

}


[root@proxy ~]# nginx -t
[root@proxy ~]# nginx -s reload


http://47.95.120.246/nginx.png # 看到图片 代理成功
1
2
3
4
5
6
# 日志
# proxy
114.243.26.3 - - [21/Oct/2019:13:08:24 +0800] "GET /nginx.png HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "-"

# web
172.17.70.225 - - [21/Oct/2019:13:08:24 +0800] "GET /nginx.png HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "114.243.26.3"
1
2
3
4
# 加个首页测试代理也会转发 注意server_name 使用域名的话 需要一致

[root@nginx code]# vim /soft/code/index.html
<h1>Nginx Web Index</h1>