zoukankan      html  css  js  c++  java
  • OpenResty高并发(四)

    在电商项目中所有的访问都是通过首页访问进去的,那么首页门户的访问频率会是非常高的,用我们专业术语来说就是并发量高,这时问题就来了,并发量高我们在做程序时就要保证首页的抗压能力强,而且还要保证抗压的同时数据的加载速度还要保证也能高。这时就要说下OpenResty并发站点架构的思想了。

    一、OpenResty简介

    OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
    OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
    OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及Redis 等都进行一致的高性能响应。这个是官网对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搭建

    关于OpenResty的搭建,可以参考官方提供的网址进行搭建。http://openresty.org/cn/installation.html,还有一个是官方提供了源码安装的方式:http://openresty.org/cn/linux-packages.html;我是用centos8在我云上安装的,教程可以看如下链接http://openresty.org/cn/linux-packages.html

    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 即可。

    上面是官方给出的安装命令,安装完后输入下面命令启动OpenResty
     
    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:WindowsSystem32driversetcHOSTS 文件就可以了,在HOSTS文件最后一行加上ip  域名就行例如

    192.168.32.32  www.ljx.com

    这样页面就加载出来了

     

    这短短的一生我们最终都会失去,不妨大胆一点,爱一个人,攀一座山,追一个梦
  • 相关阅读:
    171 01 Android 零基础入门 03 Java常用工具类02 Java包装类 01 包装类简介 01 Java包装类内容简介
    170 01 Android 零基础入门 03 Java常用工具类01 Java异常 08 Java异常总结 01 异常总结
    169 01 Android 零基础入门 03 Java常用工具类01 Java异常 07 异常链 01 异常链简介
    168 01 Android 零基础入门 03 Java常用工具类01 Java异常 06 自定义异常 01 自定义异常类
    167 01 Android 零基础入门 03 Java常用工具类01 Java异常 05 使用throw和throws实现异常处理 02 使用throw抛出异常对象
    166 01 Android 零基础入门 03 Java常用工具类01 Java异常 05 使用throw和throws实现异常处理 01 使用throws声明异常类型
    165 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 05 return关键字在异常处理中的使用
    DevExpress WPF v20.2版本亮点放送:全新升级的PDF Viewer
    界面控件DevExpress使用教程:Dashboard – 自定义导出
    DevExpress WinForms帮助文档:表单控件
  • 原文地址:https://www.cnblogs.com/xing1/p/14932992.html
Copyright © 2011-2022 走看看