Nginx 动静分离与负载均衡的实现

  • 2019-04-21
  • 0
  • 0

一、前提

企业中,随着用户的增长,数据量也几乎成几何增长,数据越来越大,随之也就出现了各种应用的瓶颈问题。

问题出现了,我们就得想办法解决,一般网站环境,均会使用LAMP或者LNMP,而我们对于网站环境的优化,除了对源代码进行优化、SQL慢查询优化 、SQL创建索引等之外,我们还可以对环境架构进行优化与扩展。

因此,我们引入了 Nginx 对站点实现负载均衡和动静分离,来加快访问速度。

二、Nginx 动静分离与负载均衡的实现机制

Nginx 动静分离与负载均衡的的实现离不开反向代理,什么是反向代理呢?反向代理主要应用于集群环境中,有多个客户端给Nginx服务器发送的请求,当 Nginx 服务器接收到之后,会按照一定的规则将请求分发给了后端的业务处理服务器,此时,请求的来源也就是客户端,是明确的,但是请求具体由哪台服务器处理,并不明确,在这里,Nginx 所扮演的就是一个反向代理角色。通过反向代理,我们无法直接看到后端服务器的服务器信息,因此反向代理具有隐藏业务服务器的作用!

三、Nginx 反向代理实现

1、网络拓扑

2、环境准备

三台CentOS 7.5虚拟机

1、代理服务器:
服务:Nginx,并配置代理与动静分离到后端两台动态与静态服务器上
IP:192.168.24.150
.
2、静态服务器:
服务:Nginx
IP:192.168.24.130
.
.
3、动态服务器:
服务:nginx、PHP,配置好动态页面并让nginx服务支持动态网页,
IP:192.168.24.132
.
.
.

3. Nginx 负载均衡基础知识

Nginx 的 upstream 负载的5种方式,目前最常用 前3 种方式

  1)、轮询(默认)

  每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

  2)、weight

  指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。

  3)、ip_hash

  每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。

  4)、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

  5)、url_hash(第三方)  按访问url的hash结果来分配请求,使同样的url定向到同一个后端服务器,后端服务器为缓存时比较有效

四、配置过程

.
1、三台都要安装Nginx
.
安装epel源
[root@nginx ~]# yum install -y epel-release
安装Nginx
[root@nginx ~]#yum install -y nginx
[root@nginx ~]#rpm -qa nginx
nginx-1.12.2-2.el7.x86_64
.
.
2、防火墙设置
三台服务器都要放行80端口:
[root@nginx ~]#firewall-cmd –zone=public –add-port=80/tcp –permanent
[root@nginx ~]#firewall-cmd –reload
.
.
3、静态服务器
安装lrzsz上传静态文件到服务器测试使用
[root@web30 ~]#yum install -y lrzsz
[root@web30 ~]#rz -E
找到想上传到静态服务器上的图片
.
[root@web30 ~]#ls

e918eadd698507a5fab19ded2d3c1342.jpg anaconda-ks.cfg
.
[root@web30 ~]#cp ./e918eadd698507a5fab19ded2d3c1342.jpg /usr/share/nginx/html/
复制到web根目录下
.
.
4、动态服务器
安装PHP
[root@web32 ~]#yum install php php-fpm -y
.
配置Nginx支持PHP
[root@web32 ~]#rpm -ql nginx
查看文件位置

[root@web32 ~]#vim /etc/nginx/nginx.conf

......
server {
  listen       80;
  server_name  PHPserver;
  root         /usr/share/nginx/html;

  # Load configuration files for the default server block.
  include /etc/nginx/default.d/*.conf;
###<添加的
  location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
  }
###>
  location / {
  }
......

.
.
配置index动态主页
[root@web32 ~]#vi /usr/share/nginx/html/index.php

<?php
phpinfo();
?>

.
启动php-fpm
[root@web32 ~]#systemctl start php-fpm
[root@web32 ~]#ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.1:9000 :
Php-fpm 默认监听在9000端口
.
.
5、Nginx代理服务器
.
修改Nginx配置文件,动静结合
[root@nginx ~]#vi /etc/nginx/nginx.conf

......
# for more information.
    include /etc/nginx/conf.d/*.conf;
####定义负载均衡设备的 Ip ####
###<添加的
    upstream static {
        server    192.168.2.130    max_fails=3 fail_timeout=10s;
        }       
    upstream dynamic {
        server    192.168.24.132    max_fails=3 fail_timeout=10s;
        }

###>

    server {
        listen       80;
        server_name  Nginx;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

###在location / { 。。。} 中添加以下内容  #定义分发策略###
###<添加的 
        location ~\.(php|jsp)?$ {
                proxy_pass http://dynamic;
                              }
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
                proxy_pass http://static;
                                   }
###>

        location / {
        }
......

#注 将默认配置注释掉

.
启动Nginx
[root@nginx ~]#systemctl start nginx

五、测试结果

.
.
打开浏览器,输入Nginx服务器的IP地址
.
.
访问先前上传至静态服务器上的图片,还是Nginx服务器的IP
.
.

访问动态服务器上的PHP页
.
.

至此,测试算是完成,但还有许多配置这里没有用到,这只是一个最基础的框架,还得努力完善

评论

还没有任何评论,你来说两句吧