zoukankan      html  css  js  c++  java
  • 基于Nginx+redis的Asp.net站点搭建

    剧情介绍

    在传统的信息系统(比如小规模的ERPMES系统),往往只是进行简单的应用服务器和数据库服务器的分布式部署,以此来提高应用系统的负载能力,而伴随着访问的增大,应用服务器层面除了做硬件和网络的扩容,很难应对【套路式开头】。


    当然现在开源技术很多,不就是分布式么,应用服务器分布式、数据库读写分离、缓存服务器、认证服务器。。。的确方法很多。那么不买关子了,今天就应用服务器层面的负载均衡讲讲,可以动手练练的技术:Nginx,当然也包括缓存技术:redis

    初步的设想是这样的:通过nginx对局域网内多个相同应用服务器进行进行负载均衡,并且各个相同应用共享一个缓存服务器【表达的就是这么简单】。拉个效果图:

    开始搭建【折腾】

    1、操作系统准备

    linux一台,当然一般为虚拟机,这里我安装了centos7,配置ip地址为:192.168.110.100,机器名就叫:centos。

    可以运行asp.net mvc站点windows一台,比如windows10+iis8,配置ip地址为:192.168.110.1,机器名无所谓。

    配置两台机器的hosts:

    windows:C:Windowssystem32driversetchosts

    192.168.110.100  cluster.com

    centos: vim /etc/hosts

    192.168.110.100  cluster.com 

     2、安装Nginx

    一般首先需要安装编译环境【反正不搞c,参照其他文章手动安装】,centos支持yum安装,一般就是yum install ,当然先su root下用root用户登录。

    保证虚拟机联网,执行命令:yum install gcc-c++

    本来以为可以直接安装nginx了,没想到还有三个依赖库要下载安装,套路一样:

    下载安装包、解压安装包、进入配置目录,分别执行make 和make install。

    当然这不是重点,直接说明:

    其中本次下载版本:pcre-8.40.tar.gz、zlib-1.2.11.tar.gz、openssl-fips-2.0.10.tar.gz、nginx-1.12.2.tar.gz

     > 安装pcre
             获取pcre编译安装包,ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz,拷贝到centos
             解压缩pcre-xx.tar.gz包。
             进入解压缩目录,分别执行 ./configure 、  make 、  make install

     > 安装openssl
             获取openssl编译安装包,在https://www.openssl.org/source/openssl-fips-2.0.10.tar.gz,拷贝到centos

             解压缩openssl-xx.tar.gz包。
             进入解压缩目录,分别执行./config、make 、  make install

      > 安装zlib
             获取zlib编译安装包,在http://zlib.net/zlib-1.2.11.tar.gz,拷贝到centos
             解压缩openssl-xx.tar.gz包。
             进入解压缩目录,分别执行 ./configure 、 make  、 make install

     > 安装nginx
            获取nginx,在http://nginx.org/download/nginx-1.12.2.tar.gz,拷贝到centos
             解压缩nginx-xx.tar.gz包。
             进入解压缩目录,分别执行 ./configure、  make 、  make install

    3、配置nginx

    按照第2部分,安装好nginx,当然 没有想过其他安装经验的,肯定会出现很多问题,建议百度自己搞定。我们可以在命令行里输入:whereis nginx

    如果正常安装会出现nginx的按照目录:

    [root@centos bin]# whereis nginx
    nginx: /usr/local/nginx
    [root@centos bin]# cd /usr/local/nginx
    [root@centos nginx]# ls -l
    总用量 0
    drwx------ 2 nobody root 6 11月 2 14:08 client_body_temp
    drwxr-xr-x 2 root root 333 11月 2 20:56 conf
    drwx------ 2 nobody root 6 11月 2 14:08 fastcgi_temp
    drwxr-xr-x 2 root root 40 11月 2 11:05 html
    drwxr-xr-x 2 root root 58 11月 2 20:58 logs
    drwx------ 2 nobody root 6 11月 2 14:08 proxy_temp
    drwxr-xr-x 2 root root 19 11月 2 11:05 sbin
    drwx------ 2 nobody root 6 11月 2 14:08 scgi_temp
    drwx------ 2 nobody root 6 11月 2 14:08 uwsgi_temp

    一般配置文件在conf文件夹下,名称叫nginx.conf,本次实验关键就是配置该文件,废话不说打开编辑:

    [root@centos nginx]# vim ./conf/nginx.conf

    我们修改以下点【192.168.110.1:9001和9002站点是 底下第5点部署的应用站点,这里提前说明。那为啥同一个ip呢,本地演示就丢一台IIS上了,端口不同就可以】:

     1 http {
     2 
     3     #....省略一些编码
     4     #我们需要负载均衡的内部应用地址以及端口,其中weight为权重,这里就50% 各占一半了
     5     upstream    cluster.com{
     6        server 192.168.110.1:9001 weight=1;
     7        server 192.168.110.1:9002 weight=1;
     8     }
     9 
    10     server {
    11         listen       80;
    #需要负载的站点,这里就是本机设置的hosts站点
    12 server_name cluster.com; 13 14 #charset koi8-r; 15 16 #access_log logs/host.access.log main; 17 18 location / { 19 root html; 20 index index.html index.htm; 21 proxy_pass http://cluster.com; 22 #设置主机头和客户端真实地址,以便服务器获取客户端真实IP 23 proxy_set_header X-Forwarded-Host $host; 24 proxy_set_header X-Forwarded-Server $host; 25 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 26 proxy_set_header X-Real-IP $remote_addr; 27 } 28 29 #...省略一些编码 30 }

     配置就是这么简单,在启动nginx之前建议关闭下centos的防火墙:

    systemctl stop iptalbes.service

    开启nginx,在nginx目录下执行,顺便检测下是否成功:

     [root@centos nginx]# ./sbin/nginx

     [root@centos nginx]# ps -ef | grep nginx
     root 1485 1 0 08:51 ? 00:00:00 nginx: master process ./sbin/nginx
     nobody 1486 1485 0 08:51 ? 00:00:00 nginx: worker process
     root 1663 1471 0 09:28 pts/0 00:00:00 grep --color=auto nginx

     这个时候我们在windows电脑上 浏览器访问下 cluster.com 应该就可以看到 9001或者9002站点了:

    是不是看不到到底访问了那台电脑,别急,我们先部署好redis再来写几个mvc请求服务就可以。

    4、安装配置redis

    和按照nginx一样的步骤,先下载,这里我下载了比较旧的版本redis-3.0.6.tar.gz,https://redis.io/download,当然你也可以下载最新的。

    三板斧:解压文件、进入解压目录,执行make

    然后进入子目录Src,可以看到一些执行文件【主要:redis-server edis-cli】和一个redis.conf。我们最好在/usr/local下去建个redis目录,然后里面把几个主要的拷贝进去。

    当然这里有个文件配置需要修改下:redis.cong下的是否后台开启:

    vim redis.conf
    #然后修改
    daemonize yes
    #同时注释掉bind 端,保证局域网都可以访问

     开启redis:

     ./redis-server ./redis.conf
    1 [root@centos redis]# redis-cli
    2 127.0.0.1:6379> set test "helloword"
    3 OK
    4 127.0.0.1:6379> get test
    5 "helloword"
    6 127.0.0.1:6379> 

     就是这么简单,测试也成功了,这里再次强调,关闭centos的防火墙。

    5、编写并发布asp.net mvc 站点

    通过上面的一步步安装,终于进入正题了,我们构建一个简单的asp.net mvc站点,这里就不废话了,然后把站点部署到本地iis,部署两个站点,端口后分别为9001和9002。

    这里需要说明的是,windows的防火墙如果开启了,那么请在防火墙里面开启对端口9001和9002的进出站限制。

    同时为了开发连接redis进行缓存服务,还需要安装api包,功能在这里:

    输入:Install-Package StackExchange.Redis

    在HomeController里添加以下服务:

     1 public class HomeController : Controller
     2     {
     3         public ActionResult Index()
     4         {
     5             return View();
     6         }
     7         /// <summary>
     8         /// 获取服务请求地址
     9         /// </summary>
    10         /// <returns></returns>
    11         public JsonResult GetServerInfo()
    12         {
    13             var server = HttpContext.Request.Url.Host + " " + HttpContext.Request.Url.Port;
    14             return Json(server, JsonRequestBehavior.AllowGet);
    15         }
    16         /// <summary>
    17         /// 设置缓存
    18         /// </summary>
    19         /// <param name="key"></param>
    20         /// <param name="value"></param>
    21         /// <returns></returns>
    22         public JsonResult SetRedisValue(string key, string value)
    23         {
    24             RedisClient client = new RedisClient("192.168.110.100", 6379);
    25 
    26             client.SetValue(key,value);
    27 
    28             var server = HttpContext.Request.Url.Host + " " + HttpContext.Request.Url.Port;
    29 
    30             return Json($"访问服务器:{server},设置缓存键{key}的值为{value}", JsonRequestBehavior.AllowGet);
    31         }
    32         /// <summary>
    33         /// 读取缓存
    34         /// </summary>
    35         /// <param name="key"></param>
    36         /// <returns></returns>
    37         public JsonResult GetRedisValue(string key)
    38         {
    39             RedisClient client = new RedisClient("192.168.110.100", 6379);
    40             var v =client.GetValue(key);
    41 
    42             var server = HttpContext.Request.Url.Host + " " + HttpContext.Request.Url.Port;
    43 
    44             return Json($"访问服务器:{server},获取缓存键{key}的值为{v}", JsonRequestBehavior.AllowGet);
    45         }
    View Code

    6、测试运行

     终于开始[项目验收]

    第1步,首先访问地址:http://cluster.com/Home/GetServerInfo,并且不断的F5刷新页面,可以发现,会变化的出现"cluster.com 9002"、"cluster.com 9001"说明负载均衡成功了,9001和9002端口应用不断替换被用户访问。

    第2步,写缓存http://cluster.com/Home/SetRedisValue?key=test&value=helloword  ,可以发现,会提示你:"访问服务器:cluster.com 9001,设置缓存键test的值为helloword"

    第3步,请求缓存http://cluster.com/Home/GetRedisValue?key=test,可以发现,如果多次刷新,会变化出现:

    "访问服务器:cluster.com 9002,获取缓存键test的值为helloword"
    "访问服务器:cluster.com 9001,获取缓存键test的值为helloword"
    说明,我们的试验成功了!

    7、后感

    回顾整个过程,其实真的只是小试验,仅此记录下学习的过程而已。这里当然还没有进行会话状态的同步、数据库层面的分布式。

  • 相关阅读:
    javaweb消息中间件——rabbitmq入门
    virtual box 桥接模式(bridge adapter)下无法获取ip(determine ip failed)的解决方法
    Apache Kylin本地启动
    git操作
    Java学习总结
    Java中同步的几种实现方式
    hibernate exception nested transactions not supported 解决方法
    vue 中解决移动端使用 js sdk 在ios 上一直报invalid signature 的问题解决
    cookie 的使用
    vue 专门为了解决修改微信标题而生的项目
  • 原文地址:https://www.cnblogs.com/blogsfuh/p/7774644.html
Copyright © 2011-2022 走看看