nginx+memcached+ftp上传图片+iis

nginx+memcached+ftp上传图片+iis

自毕业以来,一直在现在公司做订餐系统的开发,那会儿没有口碑,没有饿了么,更别说美团外卖,百度外卖了...因为规模都比较小,都是一个服务器包含数据库,iis...然后就完事儿了。终于等到给窝窝团开发订餐系统时,以为可以了解更多服务器相关东西时,生产环境我又接触不了,但还是了解了好些内容:session怎么用数据库保存,图片如何用单独服务器之类,虽然都是小儿科,但是第一次接触这些时,还是感慨良多:觉得之前都白过了。

  再到后来,终于,我们的一个客户日均订单在5K时(12年时,还是蛮不错的了),我以为机会又来了,正当我满心欢喜的捣鼓两个服务器时,然后,他们告诉我们,他们用别人的系统了,然后,订单就开始少了,然后,美团到了他们的城市,然后,就没有然后了。

  没有观众,再好的表演也没意义了,虽然有时也会一时兴起,搭个环境玩下,但一有问题就放弃了,毕竟没有用武之地。

  终于,一个做配送的客户,每天有2K的订单了,我觉得是时候学习下《负载均衡》了,于是有了下文,鄙人也是第一次真正使用这个,不正之处,欢迎斧正。

nginx安装与配置

  这部分基本操作都是差不多的,博客园也有很多文章讲解得非常详细了, 我之前也是参考这片文章,写得蛮详细的, nginx+iis实现负载均衡

   配置方面,我就是 server 结节下增加了配置 server_name  www.xxx.com a.xxx.com; 方便用域名访问而已。

外网无法访问?

  配置完成后,在服务器上访问非常正常,用ip,域名访问也都正常,防火墙端口中也添加了例外,正当山重水复疑无路之时,才想起,早些时间配置server-u时,(如果安装时没开防火墙)要选择程序添加例外,其实,域名解析早就完成了,ping 测试正常,两个服务器单独访问也是正常,所以只有可能是防火墙的问题了,配置很简单,控制面板---windows防火墙---高级设置---入站规则---新建规则---程序---选择nginx---下一步 ....完成

    

  设置后外网域名访问正常了

session数据库配置

  使用两台服务器后,要考虑session共享的问题,之前开发时,也是使用数据库保存,稍微了解些,所以这次也使用数据库保存。

   要使用数据库保存session,首先要配置数据库(废话了),其次是要在web.config中进行相关配置。

   配置数据库比较简单,定位到指定.net版本,执行以下命令就可以,比如我的服务器是64位操作系统,用的.net 4.0的,以下命令如下

  定位指定文件夹: cd  C:\Windows\Microsoft.NET\Framework64\v4.0.30319

执行命令: aspnet_regsql.exe -S xx\sql2008 -U user -P passward  -d Sessiondb -ssadd -sstype c

上面这个命令 -S 表示服务器名称,也可写ip, -U 表示用户名,-P 表示密码 -d 表示要生成的数据库名称

执行命令时,可能有些服务器会提示要在命令前加  .\ 直接加就可以了, 提示如下表示OK了,这时你发现已经自动生成了一个数据为,名称为-d 后面的名称。

  

  接下来就是web.config配置了 在<system.web> 结点下增加如下内容

   数据库链接串部分为上面生成的数据库相关信息,具体如下图

   

     完成以上操作,就可以正常访问了,然后,搜索商家,添加购物车,提交订单等一系列订餐流程就完成了,为了方便查看,我在一个服务器上首页标题上加了一个“1”,来区分两个服务器,因为没有配置weight

   所以基本是平均每个服务器请求一次。

   

  确实订餐一系列流程都正常了,但是真的就完成了吗?其实还早着呢!

  

图片上传

  以前单个服务器时,上传图片自己到根目录/uplpad/,路径保存成  ~/upload/201601/xxx.png,前台显示时使用 Server.MapPath(图片路径)就可以了。

  分成多个服务器后,以前的方式只能把图片保存到本服务器,别的服务器就无法访问了,我参考了原来 discuz 的代码,使用ftp方式上传到远程服务器,具体操作如下:

  1,选择某个服务器做为图片服务器,选择一个文件夹比如images 做为所有图片的存放的位置。

  2,在IIS里搭建一个站点,根目录就是第一步中创建  images 文件夹,绑定几个域名如:img0.ihangjing.com,img1.ihangjing.com ... 图片保存时,随机选择0-x中的一个数据,这个图片最后保存的路径就是 img(n).ihangjing.com/upload/yyyyMM/xxx.png了。

  3,创建一个ftp站点,根目录也是第一步中创建  images 文件夹,设置好用户名如:ftpuser,密码如:ftppwd。

  4,配置ftp相关信息,具体如下图:

    

  5,上传图片时,调用实现ftp的代码,保存文件就可以了。

      FTPs ftps = new FTPs();

      ftps.UpLoadFile("/"+strDay, DirUrl + "/" + tempFileName, FTPs.FTPUploadEnum.WebImg);

  6,经过上面的过程,图片路径都是保存的绝对路径,这样请求图片时,不管是哪个服务器,显示都正常了。

  

注: ftps的代码基本是参考 discuz,做了一些调整,这里就不贴代码了,有兴趣的自己下载哈。

缓存配置 memcached

  以前缓存是使用的类 System.Web.Caching.Cache 这个是保存本服务器内存的,准确的说应该是(对于每个应用程序域均创建该类的一个实例),多个服务器时,每个服务器都缓存在自己内存里,如果某个服务器数据更新,不能通知到别的服务器,那别的数据库的数据就是“脏数据”

  之前微信站点,与 pc 站点就有缓存更新不及时,后来偷懒用来一个比较简单的方法处理了:pc端更新缓存时,通过http接口更新微信站点的缓存。所以,以前更新缓存要做两步:

  UpdateCacheByKey("WebPromotionConfig"); //更新其他站点缓存
  EasyEatCache.GetCacheService().RemoveObject("/WebPromotionConfig");//更新本站点缓存

  虽然这样确实可以解决大部分的问题,但是麻烦,于是决定用 memcached 做缓存服务器,具体操作如下:

  1,下载安装文件,为了大家方便我这里上传一个文件。点我下载

  2,至于安装,启动这些有很多文章都写得很多详细了,大家自行搜索,我是参考的这这个文章:http://www.tuicool.com/articles/VjEvQb

     其实基本也有两个操作

     安装服务: memcached.exe -d install

     启动服务:memcached.exe -m 1024 -d start

       进入服务列表,看到服务正常运行就OK了,如下图:

    

   因为我使用了两个服务器,所以两个服务器都安装好,并启动服务。

    

  3,实现客户端,我使用的是 Memcached Providers,原来是用的 Memcached.ClientLibrary.dll,网站就一直无法打开,也不出错,后来查了,原来这只能在.net 2.0中使用,才果断放弃了, 通过配置文件配置使用本地缓存,还是Memcached (我们多数客户还是只用一个服务器,有这个配置主方便多了),最后代码缓存层结构如下:

    

  4,web.config 配置 Memcached Providers,写法都差不多,以下是我自己的配置文件(亲自测试是可用的,请放心使用)

    

    

   5,经过以上操作,原来项目的缓存就切换到了Memcached了。 步骤是就这几个,实际操作中还是有碰到不少问题,比如:从 Memcached.ClientLibrary 换成 Memcached Providers 后,数据一直缓存不了,最后

   实在没办法了,才重起了服务,然后就好了,具体什么原因也没弄明白,重起真是个好方法。看数据缓存的日志后,心里总算踏实些了,本想弄个 memcached manager 监控下具体的数据,添加服务器已经提示用户名密码不正确

     ,这个就暂且放一下,后面有空了再好好研究下。如有哪个朋友了解的,请不吝赐教下哈。

   

订单通知商家,配送员

  我们订单通知商家,配送员app是通过iis调用wcf通知到socket服务器,再由服务器推送给相应app, 有兴趣的可以看下,我之前的一个篇文章 《基于SuperSocket的IIS主动推送消息给android客户端》

  现在变成多个服务器后,我只要修改下wcf的服务器ip就可以了。如下图

    

   目前socket服务器,还是用的一个服务器,如果商家和配送员达到一定的量,单个服务器是无法支持的了,我想下一步就要考虑下socket负载均衡方面的东西了,如有哪个朋友了解的,也请不吝赐教下哈。

结语

  我是第一次这样部署,在这之前真是不确定自己是否能完成这个事儿,中途也想放弃(世上无难事,只要肯放弃嘛),最后还是靠着不甘心的劲儿:有困难我们要上,没困难制造困难也要上。

  虽然整理结构已经部署完成了,使用也正常了,但还有相当多的问题等着,比如,session共享用数据库好呢,还是用 Memcached 呢;这样部署后是否能支持现在的我们的客户的订单量呢...

  文章到这里就完成了,觉得有帮助呢,动动手指点个赞,图个高兴;觉得写得不好,也接受拍砖哈;写得不正确的地方,请不吝赐教下哈,共同进步。

  最后再吐槽一下:上次写了一篇文章 《订餐系统之同步饿了么商家订单》 被拿出首页了,一开始说是弄错了,放回去了,后来又说又弄错了,又拿出去了,我也是醉了。如果也有做这块的,大家交流下哦。

时间: 2024-11-05 06:13:32

nginx+memcached+ftp上传图片+iis的相关文章

终于等到你---订餐系统之负载均衡(nginx+memcached+ftp上传图片+iis)

又见毕业 对面工商大学的毕业生叕在拍毕业照了,一个个脸上都挂满了笑容,也许是满意自己四年的修行,也许是期待步入繁华的社会... 恰逢其时的连绵细雨与满天柳絮,似乎也是在映衬他们心中那些离别的忧伤,与对未来的憧憬和彷徨. 想起当年毕业时,来去匆匆,只留下一张全班合影照和寝室好友的一句:再见,珍重!有点小遗憾! 又见毕业,又是一年,感慨两句,珍惜时间,好好加油,废话完结,回到主题. 背景 自毕业以来,一直在现在公司做订餐系统的开发,那会儿没有口碑,没有饿了么,更别说美团外卖,百度外卖了...因为规模

windows使用nginx+memcached实现负载均衡和session或者缓存共享

windows使用nginx+memcached实现负载均衡和session或者缓存共享 两台服务器 服务器1:115.29.186.215 windows2008 64位操作系统 服务器2:114.215.193.64 windows2008 32位操作系统 其中服务器1同时做nginx负载均衡服务器 使用概要:由于两台服务器:所以数据库连接可以使用一台服务器: 由于本人使用的ibatis框架:所以在数据库层使用ibatis Cache 这样就可以使用一台sql服务器:两台服务器访问都是缓存数

nginx、Apache、IIS中413 Request Entity Too Large问题解决方法

分享下nginx.Apache.IIS三种服务器解决413 Request Entity Too Large问题的方法. 一.nginx服务器 nginx出现这个问题的原因是请求实体太长了.一般出现种情况是Post请求时Body内容Post的数据太大了,如上传大文件过大.POST数据比较多. 处理方法在nginx.conf增加 client_max_body_size的相关设置, 这个值默认是1m,可以增加到8m以增加提高文件大小限制:当然可以设置的更大点.# 在http,server或者loc

Nginx+Memcached+Tomcat集群配置

1.   Nginx Nginx是通过将多个Web Server绑定到同一个IP地址下,以实现多个WebServer间的负载均衡,降低单个Web Server的负荷,以提高整体的性能与稳定性. 安装和配置Nginx的简单方式如下: 1)      下载并解压Nginx到本地目录:http://nginx.org/en/download.html 2)      对Nginx的配置主要是对它的配置文件/conf/nginx.conf的修改.如下链接是nginx.conf配置文件各个属性的详细说明:

Nginx + Memcached 实现Session共享的负载均衡

session共享 我们在做站点的试试,通常需要保存用户的一些基本信息,比如登录就会用到Session:当使用Nginx做负载均衡的时候,用户浏览站点的时候会被分配到不同的服务器上,此时如果登录后Session就在不同发服务器上,A记住了用户的登录状态,可是下一次用户请求被分配到B去了怎么办?不可能让用户再登陆一次.所以要实现session共享. 方法 1.ip_hash,这是Nginx的轮询方法,用户登录站点时,就会一直在这台服务器上就不存在Session的问题 优点:不需要采用任何处理: 缺

【原】Nginx搭建FTP服务器的细节问题

关于文件服务器很多实现方法,比如采用阿里的分布式文件系统FastDFS,以及自己内部搭建FTP服务器,这里记录一下关于nginx搭建FTP文件系统流程. ftp服务器搭建的步骤网上也是很多,这里贴一下具体流程,方便以后参考: yum -y install vsftpd useradd ftpuser  (添加用户) passwd ftpuser (对ftpuser添加密码,需要重复输入2次,最好是8位密码) 默认ftp的路径是在/etc/vsftpd,这时候进入 home目录就可以查看到ftpu

nginx+memcached+tomcat集群 session共享完整版

nginx+memcached+tomcat集群 session共享完整版 集群环境 1.nginx版本 nginx-1.6.2.tar.gz 2.jdk 版本 jdk-7u21-linux-x64.tar.gz 3.tomcat 版本  7.0.29 4.memcached 版本 memcached-1.4.22.tar.gz 5. CentOS 6.5 系统采用一台服务做测试 一.nginx安装 安装依赖包 yum -y install gcc gcc-c++ 1.安装pcre库 tar z

nginx memcached模块解析

1nginx memcached模块 1.1概述 nginx memcached是一个使用内存来为访问页面加速的模块,当客户端请求到达nginx服务器时,nginx会先通过键值(比如说uri),去访问memcached服务器,当能从memcached服务器获取到数据时,会直接将数据封装,返回给客户端,否则,则继续访问相关服务如php,从相关应用获取到内容发送给客户端,同时由相关应用主动将内容写入到memcached服务器,以便下次访问时能起到加速的效果. nginx memcached模块与me

windows下nginx代理ftp服务器

我所在的开发环境里,nginx和ftp在同一台服务器. ftp根目录: nginx的配置: 在nginx.conf中加入: server { listen 9090; server_name localhost; location / { root C:/FTPRoot; index *.*; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; ad