nginx反向代理
1.什么是反向代理
- 代理:通过客户机的配置,实现让一台服务器代理客户机,客户的所有请求都交给代理服务器处理。
- 反向代理:用一台服务器,代理真实服务器,用户访问时,不再是访问真实服务器,而是代理服务器。
2.nginx可以当做反向代理服务器使用
- 我们需要提前在nginx中配置好反向代理的规则,不同的请求,交给不同的真实服务器处理
- 当请求到达nginx,nginx会根据已经定义的规则进行请求的转发,从而实现路由功能
- 客户端在访问时会先把请求发到nginx,http的默认端口是80,而nginx一直监听80端口,nginx收到请求后根据域名解析,映射到不同路径,实现反向代理。我们在浏览器访问时就不需要再用ip+端口的方式访问而是通过域名的方式,这样就不用暴露ip和端口,肯定更加安全。在架构上可以实现前后端的分离。
反向代理的过程隐藏了真实的服务器,客户不知道真正提供服务的机器是哪台,客户端请求的服务都被代理服务器处理。反向代理代理的是响应方,也就是服务端;
我们请求www.baidu.com时,这www.baidu.com就是反向代理服务器,真实提供服务的服务器有很多台,反向代理服务器会把我们的请求分/转发到真实提供服务的各台服务器。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。
3.nginx Proxy配置
代理配置
代理
Syntax: proxy_pass URL; #代理的后端服务器URL
Default: —
Context: location, if in location, limit_excepthost: www.qf.com
remote_addr: 10.8.165.79
client-->nginx proxy-->real-server头信息
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $proxy_host; #设置真实客户端地址
proxy_set_header Connection close;
Context: http, server, location超时
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s; #链接超时
Context: http, server, locationSyntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, locationSyntax: proxy_send_timeout time; #nginx进程向fastcgi进程发送request的整个过程的超时时间
Default: proxy_send_timeout 60s;
Context: http, server, location
4.启用nginx proxy代理
需要两台安装nginx的虚拟机,一台作为代理服务器:nginx-1,一台作为真实服务器web-1
1.nginx-1启动代理程序
编辑配置文件 我这里是编辑的子配置文件,也可以编辑在主配置文件里
子配置文件 /etc/nginx/conf.d/default.conf 主配置文件 /etc/nginx/nginx.conf
[root@nginx-1 ~]# vim /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://192.168.126.142:80;
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 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
}
2.nginx proxy具体配置详解
proxy_pass :真实服务器的地址,可以是ip也可以是域名和url地址
proxy_set_header:重新定义或者添加发往后端服务器的请求头
proxy_set_header X-Real-IP :启用客户端真实地址(否则日志中显示的是代理在访问网站)
proxy_set_header X-Forwarded-For:记录代理地址proxy_connect_timeout:后端服务器连接的超时时间发起三次握手等候响应超时时间
proxy_send_timeout:后端服务器数据回传时间,就是在规定时间之内后端服务器必须传完所有的数据
proxy_read_timeout :nginx接收upstream(上游/真实) server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭。像长连接
5.配置web-1
为了不影响访问先把主配置文件里的server块注释掉
然后再http块里添加一个加载子配置文件的命令语句 路径一定要是你自己的子配置文件所在路径
include /etc/nginx/conf.d/*.conf;
然后我们设置子配置文件,如果没有可以自己创建目录创建文件,文件一定要以 .conf结尾
[root@web-1 ~]# vim /etc/nginx/conf.d/nginx.conf
server {
listen 80;
server_name 192.168.126.142;
location / {
root /home/www/html;
index index.html index.hml;
}
}
编写index.html,没有文件夹的先自己创建
[root@web-1 ~]# vim /home/www/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World</h1>
<p>This is a paragraph.</p>
<img src="https://ts3.cn.mm.bing.net/th?id=OIP-C.Md86Wi2EYiKHNPldRZiD4gHaEo&w=316&h=197&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2">
</body>
</html>
6.测试
查看访问日志
nginx-1的访问日志
web-1的访问日志
nginx负载均衡
我们需要用到三台机器,代理服务器nginx-1,真实服务器web-1,web-2
上面做好的可以继续使用,在加一台web-2就行
我这里是直接重做一遍
1.负载均衡的作用
如果你的Nginx服务器给2台web服务器做代理,负载均衡算法采用轮询,那么当你的一台机器web程序关闭造成web不能访问,那么Nginx服务器分发请求还是会给这台不能访问的web服务器,如果这里的响应连接时间过长,就会导致客户端的页面一直在等待响应,对用户来说体验就大大折扣
如果负载均衡中其中web2发生这样的情况,Nginx首先会去web1请求,但是Nginx在配置不当的情况下会继续分发请求到web2,然后等待web2响应,直到我们的响应时间超时,才会把请求重新分发给web1,这里的响应时间如果过长,用户等待的时间就会越长。
2.upstream配置
这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法。upstream依照轮询(默认)方式进行负载,每一个请求按时间顺序逐一分配到不同的后端服务器。假设后端服务器down掉。能自己主动剔除。
例如
upstream junheng{
server 192.168.126.142:80;
server 192.168.126.133:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://junheng;
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 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
}
upstream配置必须在http块里,sever块外
我这里的upstream添加在主配置文件里,然后测试用到的server在子配置文件里,也可以都放在主配置文件里
3.配置web-1
为了不影响访问先把主配置文件里的server块注释掉,
然后再http块里添加一个加载子配置文件的命令语句 路径一定要是你自己的子配置文件所在路径
include /etc/nginx/conf.d/*.conf;
然后我们设置子配置文件
[root@web-1 ~]# vim /etc/nginx/conf.d/nginx.conf
如果没有可以自己创建目录创建文件,文件一定要以 .conf结尾
server {
listen 80;
server_name 192.168.126.142;
location / {
root /home/www/html;
index index.html index.hml;
}
}
server_name 后面是web-1的ip
root 后面的路径是访问的index.html的文件路径,可以自己设置,自己写index.html的页面也可以,路径是我自己创建的
编写index.html
没有文件夹的先自己创建
[root@web-1 ~]# vim /home/www/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World</h1>
<p>This is a paragraph.</p>
<img src="https://ts3.cn.mm.bing.net/th?id=OIP-C.Md86Wi2EYiKHNPldRZiD4gHaEo&w=316&h=197&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2">
</body>
</html>
开启或者加载一下nginx,然后进行测试
web-1配置成功
4.配置web-2
和web-1配置一样 先注释掉主配置的server,然后添加加载子配置文件的语句即可
这里我的子配置文件还是在/etc/nginx/conf.d/下。
设置子配置文件
[root@web-2 ~]# vim /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
设置访问页面
[root@web-2 ~]# vim /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World</h1>
<p>This is a paragraph.</p>
<img src="https://ts3.cn.mm.bing.net/th?id=OIP-C.ZkoPhpKfJwsvGmpm8RsragHaFp&w=286&h=218&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2">
</body>
</html>
访问测试
到这里web服务器设置完成,没有出错,如果后面的代理服务器代理失败,那也与web无关,只能是代理服务器的问题
5.配置代理服务器nginx-1
我这里依旧是用子配置文件设置的
先在主配置文件的http块内,server块外添加upstream
[root@nginx-1 ~]# vim /etc/nginx/nginx.conf
upstream junheng{
server 192.168.126.142:80;
server 192.168.126.133:80;
}
然后在主配置文件里添加
[root@nginx-1 ~]# vim /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://junheng;
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 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
}
然后进行测试
在浏览器输入nginx-1的ip
第一次访问
刷新,第二次访问
两次访问,一次分配到web-1,一次分配搭配web-2