Linux基础36 Nginx代理,nginx反向代理(代理配置)
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 |
Syntax: proxy_pass URL; Default: — Context: location, if in location, limit_except
外网 | 内网 | |
---|---|---|
lb01 | 10.0.0.4 | 172.16.1.4 |
web01 | 10.0.0.7 | 172.16.1.7 |
[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
[root@web01 ~]# cd /code [root@web01 code]# mkdir proxy [root@web01 proxy]# vim index.html web01.............
# 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
10.0.0.4 proxy.linux.com
访问页面不是域名对应的页面,是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; # 带着域名一起过去 } }
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"
#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
#代理缓冲区:先把后端返回的数据存缓存区,当缓冲区满了,把里面数据发给客户端,后面的数据继续存在缓冲区 #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
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;