在互联网请求中,客户端通常无法直接向服务端发起请求,就需要用代理服务,来实现客户端和的交互,起到一个中介的作用。
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、https | ngx_http_proxy_module |
tastcgi | ngx_http_fastcgi_module |
uwcgi | ngx_http_uwcgi_module |
grpc | ngx_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地址+端口+uri
fastcgi_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)? yes
Warning: Permanently added '10.0.0.7' (ECDSA) to the list of known hosts.
root@10.0.0.7's password:
nginx.repo 100% 192 110.6KB/s 00:00
[root@LB01 ~]# yum -y install nginx #安装配置
2、配置Nginx
[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; #指定服务端IP,因为Nginx是七层,所以前面必须带http
proxy_set_header Host $http_host; #指定host,携带头部信息
proxy_http_version 1.1; #指定http版本号,长连接
}
}
~
~
<nf.d/default.conf" 12L, 105C written
[root@LB01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@LB01 ~]# systemctl start nginx
[root@LB01 ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@LB01 ~]#
代理信息恢复
代理服务器优化配置(提升客户访问速度)
代理到后端的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_fo
rwarded_for; #记录客户端IP
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" 25L, 388C written
发现显示了10.0.0.1的客户端IP
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!