OpenResty高并发(四)
在电商项目中所有的访问都是通过首页访问进去的,那么首页门户的访问频率会是非常高的,用我们专业术语来说就是并发量高,这时问题就来了,并发量高我们在做程序时就要保证首页的抗压能力强,而且还要保证抗压的同时数据的加载速度还要保证也能高。这时就要说下OpenResty并发站点架构的思想了。
一、OpenResty简介
二、OpenResty解决的问题
上面官方的术语说的很官方,可能看完了也不知道这玩意有啥好的,那就用大白话这样说吧!OpenResty解决的是高并发的痛点。现在服务的后台大部分是java写的,但是用java写出稳定的高并发服务是很复杂的一件事,首先是服务器的选择,web服务器有几个选型,tomcat,apache,weblogic,还有商用webphere. 1、tomcat官方宣称的并发量是1000,厉害点的做点参数调优,也不过3000并发,如果要开发一个并发百万的服务,1000000/3000,需要1000台服务器,想想都不可能。 2、apache的并发比tomcat更不堪,200-300 3、weblogic的并发稍好,平均能达到3000左右,但是也没有达到好一个数量级;但是nginx就不一样了,处理几万的请求很轻松,内存占用也不高,在几年前我朋友他们公司把它用作负载均衡,没想过当做一个web服务器,OpenResty的出现解决了享受nginx高并发优势的拦路虎,因为nginx是使用异步事件模型,跟传统的编程思想不一样,而lua是用c解释执行的脚本语言(执行效率很高),可以用传统的同步编程思想上,在nginx请求接进来后处理稍复杂的逻辑。
对于高并发的系统来说,都是基于内存的,或者说是基于缓存的,这时有的人可能会想用mysql支撑高并发,mysql的并发量在4000-8000,超过这个量mysql性能就会急剧下降。一次内存读取的时间是几十纳秒,一次缓存读取是几毫秒,一纳秒等于1秒的1000000000分之一,一毫秒等于1秒的1000分之一,请求过来之后直接走内存读取,在需要和数据库交互的时候把数据写入内存,然后再批量入库,快速响应。
web流量也符合二八原则,百分之八十的流量集中在百分之二十的页面,比如电商的首页,产品详情页,使用openResty支撑产品详情页的高并发访问,在处理订购单,购物车等环节用其他的高并发框架处理,比如java的NIO网络框架netty。
三、OpenResty搭建
CentOS
你可以在你的 CentOS 系统中添加 openresty
仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum check-update
命令)。 运行下面的命令就可以添加我们的仓库(对于 CentOS 8 或以上版本,应将下面的 yum
都替换成 dnf
):
# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/
# update the yum index:
sudo yum check-update
然后就可以像下面这样安装软件包,比如 openresty
:
sudo yum install -y openresty
如果你想安装命令行工具 resty
,那么可以像下面这样安装 openresty-resty
包:
sudo yum install -y openresty-resty
命令行工具 opm
在 openresty-opm
包里,而 restydoc
工具在 openresty-doc
包里头。
列出所有 openresty
仓库里头的软件包:
sudo yum --disablerepo="*" --enablerepo="openresty" list available
参考 OpenResty RPM 包页面获取这些包更多的细节。
对于 CentOS 8 及更新版本,我们只需要将上面的 yum
命令都替换成 dnf
即可。
systemctl start openresty
然后直接在浏览器上打出http://ip/就可以看到页面了
补充内容,建议大家还是不要用我上面的安装过程,我是做到后面才发现问题的,官网上CentOS 方法是默认你所有插件配置都配置好了,因为后面我有用到ngx_cache_purge-2.3导致走了很多坑,建议大家用我下面的配置方法搭建OpenResty
1、下载源码包
wget https://openresty.org/download/openresty-1.17.8.1.tar.gz wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz
2、解压
tar -xzvf openresty-1.17.8.1.tar.gz tar -xzvf ngx_cache_purge-2.3.tar.gz tar -xzvf v0.3.0.tar.gz
3、将ngx_cache_purge和nginx_upstream_check_module移动至openresty-1.17.8.1/bundle下
cp -r ngx_cache_purge-2.3 openresty-1.17.8.1/bundle/ cp -r nginx_upstream_check_module-0.3.0 openresty-1.17.8.1/bundle/
4、进入openresty
cd openresty-1.17.8.1
5、编译安装
./configure --prefix=/usr/local/openresty --with-luajit --with-http_ssl_module --user=root --group=root --with-http_realip_module --add-module=./bundle/ngx_cache_purge-2.3/ --add-module=./bundle/nginx_upstream_check_module-0.3.0/
出现如下所示,表示成功了
出现如下表示OK: Configuration summary + using system PCRE library + using system OpenSSL library + using system zlib library nginx path prefix: "/usr/local/openresty/nginx" nginx binary file: "/usr/local/openresty/nginx/sbin/nginx" nginx modules path: "/usr/local/openresty/nginx/modules" nginx configuration prefix: "/usr/local/openresty/nginx/conf" nginx configuration file: "/usr/local/openresty/nginx/conf/nginx.conf" nginx pid file: "/usr/local/openresty/nginx/logs/nginx.pid" nginx error log file: "/usr/local/openresty/nginx/logs/error.log" nginx http access log file: "/usr/local/openresty/nginx/logs/access.log" nginx http client request body temporary files: "client_body_temp" nginx http proxy temporary files: "proxy_temp" nginx http fastcgi temporary files: "fastcgi_temp" nginx http uwsgi temporary files: "uwsgi_temp" nginx http scgi temporary files: "scgi_temp" cd ../.. Type the following commands to build and install: make make install
接着再执行如下:
make && make install
不报错并再/usr/local/目录下发现openrestry,就表示安装成功。
6、启动
cd /usr/local/openresty/nginx
./sbin/nginx
界面效果,如图所示:
三、静态页面的发布
上面讲了OpenResty的作用以及安装,这个过程看过官网还是比较简单的,接下来就说下作用。在电商平台中很多都是图片,这些图片都是静态资源。可以打开购物平台看下。
可以发现就只查找一个产品请求链接就达到了471个,如果把滚动条向下滚动请求会更多,可以通过控制台发现这里面大部分都是静态资源,很少的动态请求。针对一个网店来说有这么多的静态资源如果都用tomcat去处理的话,tomcat的压力是很大的。用一个例子说明下,前面说过OpenResty的抗压能力非常好,他能非常轻松的达到10K到1000K,前面说过OpenResty里面包含了Nginx,如果一个请求过来先经过Nginx,Nginx并发能力虽然很强,但是如果后端用Tomcat集群承接的话,这时会导致服务很容易挂掉(上面说过Toncat的并发量)。
那么这个问题出现了怎么解决呢,解决思路其实也很简单,那就是让很多Nginx能处理的静态请求直接让Nginx自己直接处理,让需要查询数据库的动态请求交给tomcat处理,这样一来整体抗压能力就提交很多了。这个思想其实就是动静分离的处理思想。
下面就关于动静分离的实践做一个发布,玩过nginx发布vue项目的朋友对这一步来说是很简单的,我把vue打包后的文件通过工具上传到我的linux中了,这一步比较简单我就不说明了。目录如下
接下来要做的就是通过Nginx发布代码。先进入到openresty目录
cd /usr/local/openresty/
然后进入到nginx目录
然后进入他的核心配置文件conf里面修改文件nginx.conf文件
修改红框内的两个内容就可以了,上面那个是要访问的网址,下面那个是打包项目的路径
保存文件后重新加载一下用命令
nginx -s reload
报了个错,这个错是我环境变量没有配置,输入命令
vi /etc/profile
在文件最后一行配置如下配置
export PATH=/usr/local/openresty/nginx/sbin:$PATH
然后再输入下面命令就可以让配置生效了
source /etc/profile
再用nginx -s reload执行一下就不会报错了
现在访问下自己配置的网址www.ljx.com,发现域名没用
这个也简单,花钱买是不可能的,饭都吃不起的人怎么可能浪费钱去买域名。修改本地文件 C:\Windows\System32\drivers\etc\HOSTS 文件就可以了,在HOSTS文件最后一行加上ip 域名就行例如
192.168.32.32 www.ljx.com
这样页面就加载出来了