nginx负载均衡&反向代理&动静分离
反向代理与负载均衡
nginx
通常被用作后端服务器的反向代理,这样就可以很方便的实现动静分离以及负载均衡,从而大大提高服务器的处理能力。
nginx
实现动静分离,其实就是在反向代理的时候,如果是静态资源,就直接从nginx
发布的路径去读取,而不需要从后台服务器获取了。
但是要注意,这种情况下需要保证后端跟前端的程序保持一致,可以使用Rsync
做服务端自动同步或者使用NFS
、MFS
分布式共享存储。
Http Proxy`模块,功能很多,最常用的是`proxy_pass`和`proxy_cache
如果要使用proxy_cache
,需要集成第三方的ngx_cache_purge
模块,用来清除指定的URL缓存。这个集成需要在安装nginx
的时候去做,如:
./configure --add-module=../ngx_cache_purge-1.0 ......
nginx
通过upstream
模块来实现简单的负载均衡,upstream
需要定义在http
段内
在upstream
段内,定义一个服务器列表,默认的方式是轮询,如果要确定同一个访问者发出的请求总是由同一个后端服务器来处理,可以设置ip_hash,如:
upstream idfsoft.com {
ip_hash;
server 127.0.0.1:9080 weight=5;
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:1111;
}
注意:这个方法本质还是轮询,而且由于客户端的ip可能是不断变化的,比如动态ip,代理,翻墙等,因此ip_hash并不能完全保证同一个客户端总是由同一个服务器来处理。
定义好upstream
后,需要在server
段内添加如下内容:
server {
location / {
proxy_pass http://idfsoft.com;
}
}
环境
主机名 | 角色 | 环境 | ip | 操作系统 |
---|---|---|---|---|
Lb | 负载均衡器 | nginx | 192.168.10.132 | CentOS-8 |
server1 | 动态网站服务器 | lnmp+Discuz论坛 | 192.168.10.130 | CentOS-8 |
server2 | 静态网站服务器 | nginx | 192.168.10.131 | CentOS-8 |
准备工作:
Lb主机部署nginx服务只用来做负载均衡
server1主机lnmp部署动态网页,lnmp部署步骤:部署LNMP ,lnmp部署动态网站步骤:lnmp部署discuz论坛-优快云博客
server2主机部署nginx服务
部署动静分离
在配置了lnmp的server1主机上配置动态网站
[root@server1 ~]# vim /usr/local/nginx/conf/nginx.conf #修改server下的两个location
......
location / {
root html/Discuz/upload; #改为论坛网页的根目录
index index.html index.php index.htm;
}
......
location ~ \.php$ { #把注释去掉
root html/Discuz/upload; #改为论坛网页的根目录
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $Document_Root$fastcgi_script_name;
include fastcgi_params;
}
......
重启nginx服务
[root@server1 ~]# systemctl restart nginx
在server2主机上配置静态网页
创建两个目录,并编辑一个测试用的index.html文件
[root@server2 ~]# cd /usr/local/nginx/html/
[root@server2 html]# ls
50x.html index.html
[root@server2 html]# mkdir www.123.com
[root@server2 html]# mkdir www.456.com
[root@server2 html]# echo "123" > www.123.com/index.html
[root@server2 html]# echo "456" > www.456.com/index.html
[root@server2 html]# cat www.123.com/index.html
123
[root@server2 html]# cat www.456.com/index.html
456
修改配置文件
[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf
......
server { #第一个虚拟主机,直接修改
listen 80;
server_name www.123.com; #虚拟服务器名
location / {
root html/www.123.com; #修改目录为网站文件的目录
index index.html index.htm;
}
......
} #第一个service是配置文件中用来示范的,所以很长,在第一个或者最后一个反括号之外写第二个server
......
server { #第二个虚拟主机
listen 8080; #选择8080端口以区分第一个虚拟主机
server_name www.456.com; #服务器名
location / {
root html/www.456.com; #修改目录为网站文件的目录
index index.html index.htm;
}
}
配置负载均衡器
[root@Lb ~]# vim /usr/local/nginx/conf/nginx.conf
...... #在http段里面设置,与server平级
upstream dynamic { #设置动态态网页组
server 192.168.10.130:80 weight=1; #设置访问动态网页转发到的ip和端口
}
upstream static { #设置静态网页组
server 192.168.10.131:80 weight=1; #设置访问静台网页转发到的ip和端口
server 192.168.10.131:8080 weight=1;
}
#设置的位置是第一个server上面
server {
listen 80;
server_name localhost;
#配置反向代理
location / { #当直接访问根的时候转发给static组
proxy_pass http://static;
}
......
location ~ \.php$ { #当访问的URL以.php结尾的时侯转发到dynamic组
proxy_pass http://dynamic;
}
网页访问测试
直接访问负载均衡器ip地址的根目录会转发到静态网页服务器组
刷新一下
访问负载均衡器的ip后面加.php结尾被转发到动态网页服务器组