15分钟从零开始搭建支持10w+用户的生产环境(三)
上一篇文章介绍了这个架构中,选择MongoDB做为数据库的原因,及相关的安装操作。
三、WebServer
在SOA和gRPC大行其道的今天,WebServer在系统中属于重中之重,是一个系统的发动机。
在第一篇文章中我们说过,服务器需要用Linux。
传送门:15分钟从零开始搭建支持10w+用户的生产环境(一)
Java在Linux上,一向做得很好。Apache的安装调试,在网上随便找。再不济,还有各种大牛的一键安装,够了。
但是,今天我不说Java,而要说说Microsoft,说说Dotnet Framework和Dotnet core。
很多人想到Dotnet,就会想到IIS,想到这东西需要跑到Windows上。但实际上,这已经是一个很老很过时的概念了。
Dotnet Framework和Dotnet core,几年前就可以在Linux上开发、调试和应用了。
只不过,两个框架在应用上稍有区别。
Framework需要Mono框架的支持,是Windows下编译的DLL,通过Mono框架在LInux下运行。
而Dotnet core,从第一天就是为跨平台而生的。一套代码,可以跑在Windows、Linux、MacOS、Arm下,不需要任何额外的设置。
Nginx可以支持Dotnet在Linux上运行。不过那个安装过程之复杂,是会让高手都眼晕的。
Dotnet core本身有SelfHost功能,可以直接运行。但是,对于复杂一点的系统,会有多个API应用,因为做不到统一管理,后续操作又会麻烦。
今天我们介绍一个神器,叫Jexus。
Jexus是国内大神「宇内流云」的作品,本身并不开源,但可以免费使用。
Jexus官网:https://linuxdot.net
Jexus完整实现了我们对于WebServer的全部期望:
- 正向代理
- 反向代理
- 负载均衡
- 缓存
同时,实测生产环境的应用,响应效率超过Nginx。
Jexus不仅可以运行在各种版本的Linux下,还可以运行在ARM架构下。国内主流的国产机型,可以完全适用。换句话说,Jexus可以满足国产化的要求。
下面看看Jexus的下载和安装:
可以从官网上直接下载。
另外,贴心的宇大,给了一个更简单的安装脚本:
curl https://jexus.org/release/x64/install.sh | sh
脚本会自动从官网下载最新的Jexus,并安装到/usr/jexus。
脚本运行完成后,安装Jexus就完成了。
我们看一下目录:
$ ls /usr/jexus -l
-rw-r--r-- 1 root root 1015 Jan 1 03:30 def.py
-rwxr-xr-x 1 root root 2691 Jan 1 03:30 jws
-rw-r--r-- 1 root root 37 Jan 1 03:30 JwsAspd.exe
-rwxr-xr-x 1 root root 334928 Mar 16 09:39 JwsAspd.exe.so
-rw-r--r-- 1 root root 688 Jan 30 01:13 jws.conf
-rwxr-xr-x 1 root root 515848 Mar 16 09:39 jwsHttpd.exe.so
-rwxr-xr-x 1 root root 122560 Mar 16 09:39 jwsLog.exe.so
-rwxr-xr-x 1 root root 4861920 Apr 15 15:14 jwss
drwxr-xr-x 2 root root 4096 Apr 15 15:15 log
-rw-r--r-- 1 root root 3810 Jan 1 03:30 mime.conf
-rwxr-xr-x 1 root root 79 Jan 1 03:30 mozroots
-rw-r--r-- 1 root root 211 Apr 27 08:45 os.def
-rw-r--r-- 1 root root 21273 Jan 1 03:30 readme.cn.txt
drwxr-xr-x 5 root root 4096 Jan 1 03:30 runtime
drwxr-xr-x 2 root root 4096 Feb 18 15:13 siteconf
-rw-r--r-- 1 root root 753 Jan 1 03:30 state4.conf
-rw-r--r-- 1 root root 3 Apr 27 08:45 state.pid
这个目录中:
jws 主控程序,网站的启动/停止/重启全靠它
Jws.config 针对操作系统级别的主控程序设置
mime.conf 预定义的mime。绝大多数mime已经定义好了。如果需要,可以直接追加
siteconf 网站应用定义目录。所有的网站应用设置都在这个目录里
log 网站日志目录。各个网站运行的日志都在这里
我们试着启动一下Jexus:
./jws start
一个简单的命令,服务就启动了。
检查网站是否正常运行,可以在浏览器中打开http://your_server_ip/info
或http://your_domain/info
,如果看到下面的网站,就说明网站正常启动了。
发布应用时,每个应用有一个独立的配置文件。
$ cat /usr/jexus/siteconf/default
######################
# Web Site: Default
########################################
port=80
root=/ /var/www/default
hosts=* #OR your.com,*.your.com
# User=www-data
# AspNet.Workers=2 # Set the number of asp.net worker processes. Defauit is 1.
# addr=0.0.0.0
# CheckQuery=false
NoLog=true
# AppHost={cmd=dotnet /usr/local/x/app.dll; root=/usr/local/x; port=5000}
# NoFile=/index.aspx
# Keep_Alive=false
# UseGZIP=false
# UseHttps=true
# ssl.certificate=/x/xxx.crt #or pem
# ssl.certificatekey=/x/xxx.key
# ssl.protocol=TLSv1.0 TLSv1.1 TLSv1.2
# ssl.ciphers=ECDHE-RSA-AES256-GCM-SHA384:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE
# DenyFrom=192.168.0.233, 192.168.1.*, 192.168.2.0/24
# AllowFrom=192.168.*.*
# DenyDirs=~/cgi, ~/upfiles
# indexes=myindex.aspx
# Deny asp ...
rewrite=^/.+?\.(asp|cgi|pl|sh|bash|dll)(\?.*|)$ /.deny->$1
rewrite=.*/editor/.+ /.deny->editor
# reproxy=/bbs/ http://192.168.1.112/bbs/
# host.Redirect=abc.com www.abc.com 301
# ResponseHandler.Add=myKey:myValue
ResponseHandler.Add=X-Frame-Options:SAMEORIGIN
# Jexus php fastcgi address is '/var/run/jexus/phpsvr'
#######################################################
# fastcgi.add=php|socket:/var/run/jexus/phpsvr
# php-fpm listen address is '127.0.0.1:9000'
############################################
# fastcgi.add=php|tcp:127.0.0.1:9000
一般应用时,我们需要关注以下几个参数:
- port,应用的端口号
- root,应用的根目录。应用可以放在任何目录,在设置里指向这个目录就成
- hosts,应用绑定的域名
- AppHost,专用于Dotnet core的指向,指向到core应用的SelfHost
- reproxy,用于负载均衡模式时,指向实际服务器
- UseHttps,决定是否使用https。如果设为true,则下面ssl.certificate和ssl.certificatekey用于设置证书
详细的配置说明,可以参见目录中readme.cn.txt。
看看,WebServer也因为Jexus而变得超级简单。
至此,我们完成了整个架构中主体部分的安装和有效性测试。
四、扩展和延伸
在一个小应用的情况下, 可以直接按上文的内容,做一个简单的架构。
而在应用扩展时,可以依次扩展WebServer和数据库,以达到应用容量的延伸。
- 扩展Jexus
依托Jexus的反代特性,把Jexus扩展到多个服务器,并用一个Jexus做负载均衡,就完成了WebServer的扩展。
- 扩展数据库
依托MongoDB的特性,把MongoDB扩展到集群,即可支持海量的数据和毫秒级的响应。
通过这样简单的扩展配置,这个架构很容易就可以扩展到可以支持千万级用户的应用。
下一篇文章,我会用一个项目来实践这个架构。敬请期待
(未完待续)
微信公众号:老王Plus 扫描二维码,关注个人公众号,可以第一时间得到最新的个人文章和内容推送 本文版权归作者所有,转载请保留此声明和原文链接 |
15分钟从零开始搭建支持10w+用户的生产环境(三)的更多相关文章
- 15分钟从零开始搭建支持10w+用户的生产环境(四)
上一篇文章,介绍了这个架构中,WebServer的选择,以及整个架构中扩展时的思路. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(三) 五.架构实践 前边用了三篇文章,详细介绍了这个 ...
- 15分钟从零开始搭建支持10w+用户的生产环境(二)
上一篇文章,把这个架构的起因,和操作系统的选择进行了详细说明. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(一) 二.数据库的选择 对于一个10W+用户的系统,数据库选择很重要. 一 ...
- 15分钟从零开始搭建支持10w+用户的生产环境(一)
前言 这是一个基于中小型企业或团队的架构设计. 不考虑大厂.有充分的理由相信,大厂有绝对的实力来搭建一个相当复杂的环境. 中小型企业或团队是个什么样子? 开发团队人员配置不全,部分人员身兼开发过程上下 ...
- 从零开始搭建WebAPI Core_SqlSugar管理系统(一) 项目环境需求以及项目搭建
从零开始搭建WebAPI Core_SqlSugar管理系统(一) 项目环境需求以及项目搭建 环境需求 想要使用.NET Core,首先你的Visual Studio(以下简称vs)升级到较高的版本, ...
- 搭建Hadoop集群(生产环境)
1.搭建之前:百度copy一下介绍 (本博客几乎全都是生产环境的配置..包括mongo等hbase其他) Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层 ...
- Centos6.3 下使用 Tomcat-6.0.43 非root用户 部署 生产环境 端口转发方式
一.安装JDK环境 方法一. 官方下载链接 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260 ...
- 从零开始搭建支持http2的web服务
前段时间开始,公司各项业务开始陆续接入http2,关于http2的优点与所适用的场景网上有很多的文档可以查阅,这里我主要是总结分享一下如何从0到1搭建http2服务. 这里先说明一下,要完成http2 ...
- [IOS]从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld
首先这篇文章比较长,若想了解Xcode7的免开发者帐号真机调试运行IOS程序的话,直接转到第五部分. 转载请注明原文地址:http://www.cnblogs.com/litou/p/4843772. ...
- 从零开始搭建django前后端分离项目 系列三(实战之异步任务执行)
前面已经将项目环境搭建好了,下面进入实战环节.这里挑选项目中涉及到的几个重要的功能模块进行讲解. celery执行异步任务和任务管理 Celery 是一个专注于实时处理和任务调度的分布式任务队列.由于 ...
随机推荐
- coding++:TransactionDefinition 接口介绍
TransactionDefinition类结构: 作用: 1.TransactionDefinition接口被用于Spring事物支持的核心PlatformTransactionManager接口, ...
- [算法]合并链表&删除数组重复项
合并链表 题目 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1-> ...
- Django安装和使用
Django安装 安装Django Python3在线安装Django pip3 install Django 验证是否安装成功,并查看当前版本 python -m django --version ...
- RuntimeError: Exception thrown in SimpleITK ReadImage: /tmp/SimpleITK/Code/IO/src/sitkImageReaderBase.cxx:107: sitk::ERROR: Unable to determine ImageIO reader for "./data/.train.txt.swp"问题解决
原因:产生此类错误是因为SimpleITK不能读取ubuntu中的隐藏文件,比如".train.txt.swp",因为此类文件是隐藏文件另外SimpleITK不支持读取此类文件. ...
- 模块 random 随机
random 随机数 0 导入 >>> import random 1 random 随机小数 random.random() # 大于0且小于1之间的小数 0.7664338663 ...
- TCP/IP中的传输层协议TCP、UDP
TCP提供可靠的通信传输,而UDP则常用于让广播和细节控制交给应用的通信传输. 传输层协议根据IP数据报判断最终的接收端应用程序. TCP/IP的众多应用协议大多以客户端/服务端的形式运行.客户端是请 ...
- mybatis诡异的bug
在使用mybatis中使用 foreach 时,出现了一个诡异的bug java文件中是 List<ImportTaskInfoEntity> selectByCalcBatchIds(@ ...
- Spring Boot整合Thymeleaf视图层
目录 Spring Boot整合Thymeleaf Spring Boot整合Thymeleaf 的项目步骤 Thymeleaf 语法详解 Spring Boot整合Thymeleaf Spring ...
- 树形DP——动态规划与数据结构的结合,在树上做DP
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...
- markdown中锚链接实现目录跳转以及注意事项
当文章有分类,需要快速阅读,通常会先在文首部写一个目录,点击可以跳转. 为文章写目录,特别在文章较长的时候,有助于对内容的整体把握,能提高阅读效率. 以下,将写一个基本的锚目录demo,然后特别说明需 ...