在互联网请求中,客户端通常无法直接向服务端发起请求,就需要用代理服务,来实现客户端和的交互,起到一个中介的作用。

Nginx代理服务常见模式

Nginx代理按照应用场景模式可以分为正向代理和反向代理。

正向代理是内部上网过程中,客户端经过代理访问服务端。

反向代理是公司集群架构中,客户端通过代理反向返回数据给服务端。反向代理是负载均衡的前身,本篇文章详细给大家介绍Nginx反向代理。

Nginx作为支持的代理协议

超文本传输协议

http/https协议

tcp/dup协议
http1.1长连接通讯协议
go语言远程调用、python语言远程调用
右键收发协议
流媒体、直播、点播

Nginx常用代理协议

http_proxy(Http Server底层和Socket底层)、fastcgi(Nginx转发给PHP,也可以理解成PHP是nginx代理)、uwcgi(python Server)

Nginx反向代理的模式支持的模块

反向代理模式Nginx配置模块
http、websocket、httpsngx_http_proxy_module
tastcgingx_http_fastcgi_module
uwcgingx_http_uwcgi_module
grpcngx_http_v2_module

Nginx反向代理配置语法

[root@Web01 04]# vim /etc/nginx/conf.d/default.conf location / {root /code;index index.php index.html;}location ~ \.php$ {root /code;fastcgi_pass 127.0.0.1:9000;#将当前请求转发给后端代理,后面可以是域名+端口+uri或者是IP地址+端口+urifastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params; }}

用户随机一个端口和代理80建立连接,80又随机了端口又像服务端的80端口重新建立连接,这就出现了端口限制问题,形成了一个瓶颈,80随机的端口最大是65535。

代理会代理用户请求重新向后端发起连接请求

1、代理默认会丢弃头部信息,我们需要把参数添加上

2、代理默认和后端建立连接方式是短链接HTTP1.0

将10.0.0.5作为代理服务器

1、Nginx安装

[root@LB01 ~]# scp 10.0.0.7:/etc/yum.repos.d/nginx.repo /etc/yum.repos.d/#配置yum源The authenticity of host '10.0.0.7 (10.0.0.7)' can't be established.ECDSA key fingerprint is SHA256:zQvI/tCFYssR7l6cr90EtaIA93FXJp8FmUhGtkZshlA.ECDSA key fingerprint is MD5:0b:a1:ee:d2:75:92:1a:62:05:63:5e:d1:e8:42:13:84.Are you sure you want to continue connecting (yes/no)" />

代理信息恢复

代理服务器优化配置(提升客户访问速度)

代理到后端的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

proxy_butter代理缓冲区

//nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端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;Context: http, server, location//proxy_buffers 具体数据缓冲区Syntax: proxy_buffers number size;Default: proxy_buffers 8 4k|8k;Context: http, server, location

优化后配置文件

[root@LB01 ~]# vim /etc/nginx/conf.d/default.conf server {listen 80;server_name blog.koten.com;location / {proxy_pass http://10.0.0.7:80;#指定服务端地址proxy_set_header Host $http_host; #指定携带头部信息proxy_http_version 1.1; #指定http长连接proxy_connect_timeout 30s;#连接超时时间proxy_read_timeout 60s; #等待响应时间proxy_send_timeout 60s; #数据回传等待时间 proxy_buffering on; #缓存区开启proxy_buffer_size 32k;#缓存头部信息大小proxy_buffers 4 128k; #缓存数据大小}<nf.d/default.conf" 22L, 323C written 

扩展

/etc/nginx/nginx.conf中的$http_x_forwarded_for记录真实客户端的IP地址

客户端通过10.0.0.5的代理IP访问10.0.0.7,10.0.0.7会记录10.0.0.5的代理IP,我们想记录客户端真实IP,就需要$http_x_forwarded_for,将这个参数在代理中携带上即可

不加时,服务端10.0.0.7末尾是10.0.0.5

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

添加到 /etc/nginx/conf.d/default.conf 里面

[root@LB01 ~]# vim /etc/nginx/conf.d/default.conf server_name blog.koten.com;location / {proxy_pass http://10.0.0.7:80;proxy_set_header Host $http_host;#头部信息proxy_http_version 1.1;#长连接proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录客户端IPproxy_connect_timeout 30s; #连接超时时间proxy_read_timeout 60s;#响应超时时间proxy_send_timeout 60s;#数据回传超时时间proxy_buffering on;#开启缓冲区proxy_buffer_size 32k; #头部信息缓冲区大小proxy_buffers 4 128k;#数据缓冲区大小<nf.d/default.conf" 25L, 388C written 

发现显示了10.0.0.1的客户端IP


我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!